From ad2ed3d69c5879552d7b578c9fec07132bf48524 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Mon, 24 May 2021 13:22:09 +0200 Subject: [PATCH 01/13] Update kotlin --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 565f759a..092cc9b2 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -6,7 +6,7 @@ object Versions { const val androidBuildTools = "30.0.3" const val androidGradle = "4.2.1" - const val kotlin = "1.5.0" + const val kotlin = "1.5.10" const val appcompat = "1.3.0" From 9c4c554f997be1b6f21896c35f080567147885da Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 25 May 2021 10:40:17 +0200 Subject: [PATCH 02/13] Cleanup sample app --- buildSrc/src/main/kotlin/Deps.kt | 2 +- sample/build.gradle.kts | 2 +- .../g00fy2/quickiesample/MainActivity.kt | 19 +++++++------------ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index 32e96360..ee516349 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -8,7 +8,7 @@ object Deps { const val cameraPreview = "androidx.camera:camera-view:${Versions.cameraView}" } - object Mdc { + object UI { const val materialDesign = "com.google.android.material:material:${Versions.materialDesign}" } diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 57a188d7..6f06c37c 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -42,5 +42,5 @@ android { dependencies { implementation(project(":quickie")) - implementation(Deps.Mdc.materialDesign) + implementation(Deps.UI.materialDesign) } \ No newline at end of file diff --git a/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt b/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt index d78e3b5e..b590a982 100644 --- a/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt +++ b/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt @@ -23,7 +23,6 @@ import io.github.g00fy2.quickiesample.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - private var snackbar: Snackbar? = null private var selectedBarcodeFormat = BarcodeFormat.FORMAT_ALL_FORMATS private val scanQrCode = registerForActivityResult(ScanQRCode(), ::showSnackbar) @@ -33,16 +32,13 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - - setupBarcodeFormatDropdown() + setBarcodeFormatDropdown() binding.qrScannerButton.setOnClickListener { - snackbar?.dismiss() scanQrCode.launch(null) } binding.customScannerButton.setOnClickListener { - snackbar?.dismiss() scanCustomCode.launch( ScannerConfig.build { setBarcodeFormats(listOf(selectedBarcodeFormat)) @@ -53,13 +49,13 @@ class MainActivity : AppCompatActivity() { } } - private fun setupBarcodeFormatDropdown() { + private fun setBarcodeFormatDropdown() { ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, BarcodeFormat.values().map { it.name }).let { binding.barcodeFormatsAutoCompleteTextView.setAdapter(it) binding.barcodeFormatsAutoCompleteTextView.setText(it.getItem(it.getPosition(selectedBarcodeFormat.name)), false) - binding.barcodeFormatsAutoCompleteTextView.setOnItemClickListener { _, _, position, _ -> - selectedBarcodeFormat = BarcodeFormat.values()[position] - } + } + binding.barcodeFormatsAutoCompleteTextView.setOnItemClickListener { _, _, position, _ -> + selectedBarcodeFormat = BarcodeFormat.values()[position] } } @@ -71,15 +67,14 @@ class MainActivity : AppCompatActivity() { is QRError -> "${result.exception.javaClass.simpleName}: ${result.exception.localizedMessage}" } - snackbar = Snackbar.make(binding.root, text, Snackbar.LENGTH_INDEFINITE).apply { + Snackbar.make(binding.root, text, Snackbar.LENGTH_INDEFINITE).apply { view.findViewById(com.google.android.material.R.id.snackbar_text)?.maxLines = 5 if (result is QRSuccess && result.content is QRContent.Url) { setAction(R.string.open_action) { openUrl(result.content.rawValue) } } else { setAction(R.string.ok_action) { } } - } - snackbar?.show() + }.show() } private fun openUrl(url: String) { From 511e117f0bbfd16a105ebfcc2336aa7d4bed7471 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 25 May 2021 19:03:19 +0200 Subject: [PATCH 03/13] Fix github actions branch naming --- .github/workflows/android.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 2f9b895d..32cecce2 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -4,11 +4,11 @@ on: push: branches: - develop - - master + - main pull_request: branches: - develop - - master + - main jobs: detekt: From b0ce825fa90171c05f4af785773a32373d7a0cef Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 25 May 2021 19:21:11 +0200 Subject: [PATCH 04/13] Update ml kit --- buildSrc/src/main/kotlin/Versions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 092cc9b2..9aec7649 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -15,8 +15,8 @@ object Versions { const val materialDesign = "1.3.0" - const val barcodeScanning = "16.1.1" - const val barcodeScanningGms = "16.1.4" + const val barcodeScanning = "16.1.2" + const val barcodeScanningGms = "16.1.5" const val detekt = "1.17.1" const val gradleVersions = "0.38.0" From 8ff6a54cfd92a5e3aac96b4b79d37278180bfb86 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Thu, 27 May 2021 01:02:31 +0200 Subject: [PATCH 05/13] Change code formatting --- .../main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt index 7ab0d273..f5fa240b 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt @@ -137,8 +137,11 @@ internal class QROverlayView @JvmOverloads constructor( private fun Drawable.limitDrawableSize(maxDpHeight: Int): Drawable { val scale = (maxDpHeight * resources.displayMetrics.density) / minimumHeight - if (scale < 1) setBounds(0, 0, (minimumWidth * scale).roundToInt(), (minimumHeight * scale).roundToInt()) - else setBounds(0, 0, minimumWidth, minimumHeight) + if (scale < 1) { + setBounds(0, 0, (minimumWidth * scale).roundToInt(), (minimumHeight * scale).roundToInt()) + } else { + setBounds(0, 0, minimumWidth, minimumHeight) + } return this } From 0110be248be038ba1dd8ace4f170a2c486898ebf Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Thu, 27 May 2021 01:04:26 +0200 Subject: [PATCH 06/13] Remove completion check since CameraX defaults STRATEGY_KEEP_ONLY_LATEST --- .../main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt index a3e5b3e0..898141b5 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt @@ -3,7 +3,6 @@ package io.github.g00fy2.quickie import androidx.camera.core.ExperimentalGetImage import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageProxy -import com.google.android.gms.tasks.Task import com.google.mlkit.vision.barcode.Barcode import com.google.mlkit.vision.barcode.BarcodeScannerOptions import com.google.mlkit.vision.barcode.BarcodeScanning @@ -16,7 +15,6 @@ internal class QRCodeAnalyzer( private val onFailure: ((Exception) -> Unit) ) : ImageAnalysis.Analyzer { - private var pendingTask: Task>? = null private val barcodeScanner by lazy { val optionsBuilder = if (barcodeFormats.size > 1) { BarcodeScannerOptions.Builder().setBarcodeFormats(barcodeFormats.first(), *barcodeFormats.drop(1).toIntArray()) @@ -27,9 +25,9 @@ internal class QRCodeAnalyzer( } override fun analyze(imageProxy: ImageProxy) { - if (pendingTask?.isComplete == false || imageProxy.image == null) return + if (imageProxy.image == null) return - pendingTask = barcodeScanner.process(imageProxy.toInputImage()) + barcodeScanner.process(imageProxy.toInputImage()) .addOnSuccessListener { codes -> codes.mapNotNull { it }.firstOrNull()?.let { onSuccess(it) } } .addOnFailureListener { onFailure(it) } .addOnCompleteListener { imageProxy.close() } From 673663f92a92b9f74ba82a9b8a5fb0e10c70a3ce Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Thu, 27 May 2021 09:21:34 +0200 Subject: [PATCH 07/13] Rename analyzer executor --- .../kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt index d3753266..7f9fbf02 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -32,7 +32,7 @@ import java.util.concurrent.Executors internal class QRScannerActivity : AppCompatActivity() { private lateinit var binding: QuickieScannerActivityBinding - private lateinit var cameraExecutor: ExecutorService + private lateinit var analysisExecutor: ExecutorService private var barcodeFormats = intArrayOf(Barcode.FORMAT_QR_CODE) override fun onCreate(savedInstanceState: Bundle?) { @@ -46,7 +46,7 @@ internal class QRScannerActivity : AppCompatActivity() { setupEdgeToEdgeUI() applyScannerConfig() - cameraExecutor = Executors.newSingleThreadExecutor() + analysisExecutor = Executors.newSingleThreadExecutor() requestCameraPermissionIfMissing { granted -> if (granted) { @@ -60,7 +60,7 @@ internal class QRScannerActivity : AppCompatActivity() { override fun onDestroy() { super.onDestroy() - cameraExecutor.shutdown() + analysisExecutor.shutdown() } private fun startCamera() { @@ -74,7 +74,7 @@ internal class QRScannerActivity : AppCompatActivity() { .setTargetResolution(Size(1280, 720)) .build() .also { - it.setAnalyzer(cameraExecutor, + it.setAnalyzer(analysisExecutor, QRCodeAnalyzer( barcodeFormats, { barcode -> From a6bab50c570e28ab57f673fc7250f6829ebd120c Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Thu, 27 May 2021 09:51:56 +0200 Subject: [PATCH 08/13] Update Readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 661c4e9c..529a19d6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ fun handleResult(result: QRResult) { ``` ⚠️ **You can't register the ActivityResultContract inside the OnClickListener lambda. This will fail since the code gets executed after the onCreate lifecycle!** -Check out the [sample](https://github.com/G00fY2/quickie/tree/develop/sample) inside this repo or visit the [Activity Result API documentation](https://developer.android.com/training/basics/intents/result) for more information. +Check out the [sample](https://github.com/G00fY2/quickie/tree/develop/sample) inside this repo or visit the official [Activity Result API documentation](https://developer.android.com/training/basics/intents/result) for more information. ### Responses The callback you add to the `registerForActivityResult` will receive a subclass of the sealed `QRResult` class: @@ -112,7 +112,7 @@ You can find the sample app APKs inside the [release](https://github.com/G00fY2/ ## Requirements * AndroidX -* Min SDK 21+ +* Min SDK 21+ (required by CameraX) * (Google Play Services available on the end device if using `quickie-unbundled`) ## License From a5a6493b60b45357d0e03975c94e376a61c316b6 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Fri, 28 May 2021 00:20:15 +0200 Subject: [PATCH 09/13] Update gradle versions plugin --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 9aec7649..58b43d98 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -19,7 +19,7 @@ object Versions { const val barcodeScanningGms = "16.1.5" const val detekt = "1.17.1" - const val gradleVersions = "0.38.0" + const val gradleVersions = "0.39.0" const val dokka = "1.4.32" const val junit = "5.7.2" From 70b772f7045a9e047c4d38b1a576d9273dff6482 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Fri, 28 May 2021 11:08:37 +0200 Subject: [PATCH 10/13] Update Readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 529a19d6..d7395ab6 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ override fun onCreate(savedInstanceState: Bundle?) { fun handleResult(result: QRResult) { … ``` +:bulb: You can optionally [pass in an ActivityOptionsCompat object](https://developer.android.com/reference/androidx/activity/result/ActivityResultLauncher#launch(I,%20androidx.core.app.ActivityOptionsCompat)) when launching the ActivityResultLauncher to control the scanner launch animation. ## Screenshots / Sample App You can find the sample app APKs inside the [release](https://github.com/G00fY2/quickie/releases) assets. From 7a74db342535365d38980066d717a0a179c8ab84 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Sun, 30 May 2021 13:11:18 +0200 Subject: [PATCH 11/13] Reformat code and narrow down annotation scope --- .../main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt | 3 ++- .../kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt index 898141b5..1b192531 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRCodeAnalyzer.kt @@ -8,7 +8,6 @@ import com.google.mlkit.vision.barcode.BarcodeScannerOptions import com.google.mlkit.vision.barcode.BarcodeScanning import com.google.mlkit.vision.common.InputImage -@ExperimentalGetImage internal class QRCodeAnalyzer( private val barcodeFormats: IntArray, private val onSuccess: ((Barcode) -> Unit), @@ -24,6 +23,7 @@ internal class QRCodeAnalyzer( BarcodeScanning.getClient(optionsBuilder.build()) } + @ExperimentalGetImage override fun analyze(imageProxy: ImageProxy) { if (imageProxy.image == null) return @@ -33,5 +33,6 @@ internal class QRCodeAnalyzer( .addOnCompleteListener { imageProxy.close() } } + @ExperimentalGetImage private fun ImageProxy.toInputImage() = InputImage.fromMediaImage(image!!, imageInfo.rotationDegrees) } \ No newline at end of file diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt index 7f9fbf02..78850239 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -12,7 +12,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ContextThemeWrapper import androidx.camera.core.CameraSelector -import androidx.camera.core.ExperimentalGetImage import androidx.camera.core.ImageAnalysis import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider @@ -28,7 +27,6 @@ import io.github.g00fy2.quickie.utils.PlayServicesValidator import java.util.concurrent.ExecutorService import java.util.concurrent.Executors -@ExperimentalGetImage internal class QRScannerActivity : AppCompatActivity() { private lateinit var binding: QuickieScannerActivityBinding @@ -80,7 +78,8 @@ internal class QRScannerActivity : AppCompatActivity() { { barcode -> it.clearAnalyzer() onSuccess(barcode) - }, { exception -> + }, + { exception -> it.clearAnalyzer() onFailure(exception) } From 205edd00983bdaf57265fddab0d0001acd7f52c5 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Sun, 30 May 2021 14:49:19 +0200 Subject: [PATCH 12/13] Refactor dp conversion --- .../kotlin/io/github/g00fy2/quickie/QROverlayView.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt index f5fa240b..bcc2c9cb 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QROverlayView.kt @@ -88,7 +88,7 @@ internal class QROverlayView @JvmOverloads constructor( } if (drawableRes != 0) { try { - ResourcesCompat.getDrawable(resources, drawableRes, null)?.limitDrawableSize(ICON_DP_MAX_HEIGHT)?.let { + ResourcesCompat.getDrawable(resources, drawableRes, null)?.limitDrawableSize()?.let { titleTextView.setCompoundDrawables(null, it, null, null) } } catch (ignore: NotFoundException) { @@ -135,8 +135,9 @@ internal class QROverlayView @JvmOverloads constructor( layoutParams = params } - private fun Drawable.limitDrawableSize(maxDpHeight: Int): Drawable { - val scale = (maxDpHeight * resources.displayMetrics.density) / minimumHeight + private fun Drawable.limitDrawableSize(): Drawable { + val heightLimit = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ICON_MAX_HEIGHT, resources.displayMetrics) + val scale = heightLimit / minimumHeight if (scale < 1) { setBounds(0, 0, (minimumWidth * scale).roundToInt(), (minimumHeight * scale).roundToInt()) } else { @@ -150,6 +151,6 @@ internal class QROverlayView @JvmOverloads constructor( private const val STROKE_WIDTH = 4f private const val OUT_RADIUS = 16f private const val FRAME_MARGIN_RATIO = 1f / 4 - private const val ICON_DP_MAX_HEIGHT = 56 + private const val ICON_MAX_HEIGHT = 56f } } \ No newline at end of file From 022d4edd1610a087eb99268be40f354b30a2edc2 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 1 Jun 2021 00:51:45 +0200 Subject: [PATCH 13/13] Bump version to 1.1.1 --- README.md | 4 ++-- quickie/build.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d7395ab6..dee7ac6d 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,10 @@ There are two different flavors available on `mavenCentral()`: | V2 model is used (possibly faster, more accurate) | currently V1 model will be downloaded ```kotlin // bundled: -implementation("io.github.g00fy2.quickie:quickie-bundled:1.1.0") +implementation("io.github.g00fy2.quickie:quickie-bundled:1.1.1") // unbundled: -implementation("io.github.g00fy2.quickie:quickie-unbundled:1.1.0") +implementation("io.github.g00fy2.quickie:quickie-unbundled:1.1.1") ``` ## Quick Start diff --git a/quickie/build.gradle.kts b/quickie/build.gradle.kts index 4614c7b1..2c054b22 100644 --- a/quickie/build.gradle.kts +++ b/quickie/build.gradle.kts @@ -43,7 +43,7 @@ dependencies { } group = "io.github.g00fy2.quickie" -version = "1.1.0" +version = "1.1.1" tasks.register("androidJavadocJar") { archiveClassifier.set("javadoc")