From 155bf7e3d58a975822ae8c2770083636fd6d3ac5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 01:33:28 +0000 Subject: [PATCH 01/19] Update detekt to v1.23.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4920bd2..5ab19be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ barcodeScanningGms = "18.2.0" materialDesign = "1.9.0" -detekt = "1.22.0" +detekt = "1.23.0" gradleVersions = "0.46.0" dokka = "1.8.10" From 9ab4fc84fba2b715637b51c5715a57d2dd720a90 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Wed, 24 May 2023 20:06:46 +0200 Subject: [PATCH 02/19] Migrate to BundleCompat.getParcelable --- gradle/libs.versions.toml | 2 + quickie/build.gradle.kts | 1 + .../g00fy2/quickie/QRScannerActivity.kt | 10 +-- .../quickie/extensions/IntentExtensions.kt | 83 ++++++++++--------- 4 files changed, 50 insertions(+), 46 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5ab19be..47cf358 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,7 @@ androidGradle = "8.0.1" kotlin = "1.8.21" appcompat = "1.6.1" +core = "1.10.1" cameraX = "1.2.2" @@ -29,6 +30,7 @@ androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "a androidx-camera = { module = "androidx.camera:camera-camera2", version.ref = "cameraX" } androidx-cameraLifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "cameraX" } androidx-cameraPreview = { module = "androidx.camera:camera-view", version.ref = "cameraX" } +androidx-core = { module = "androidx.core:core-ktx", version.ref = "core" } mlkit-barcodeScanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "barcodeScanning" } mlkit-barcodeScanningGms = { module = "com.google.android.gms:play-services-mlkit-barcode-scanning", version.ref = "barcodeScanningGms" } diff --git a/quickie/build.gradle.kts b/quickie/build.gradle.kts index 1f93655..9c6f9db 100644 --- a/quickie/build.gradle.kts +++ b/quickie/build.gradle.kts @@ -30,6 +30,7 @@ android { dependencies { implementation(libs.androidx.appcompat) + implementation(libs.androidx.core) implementation(libs.androidx.camera) implementation(libs.androidx.cameraLifecycle) 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 98ed181..78d0692 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -19,6 +19,7 @@ import androidx.camera.core.Preview import androidx.camera.core.TorchState import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat +import androidx.core.os.BundleCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -143,10 +144,8 @@ internal class QRScannerActivity : AppCompatActivity() { binding.overlayView.isHighlighted = true if (hapticFeedback) { @Suppress("DEPRECATION") - binding.overlayView.performHapticFeedback( - HapticFeedbackConstants.KEYBOARD_TAP, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING or HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING - ) + val flags = HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING or HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING + binding.overlayView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, flags) } setResult( Activity.RESULT_OK, @@ -177,8 +176,7 @@ internal class QRScannerActivity : AppCompatActivity() { } private fun applyScannerConfig() { - @Suppress("DEPRECATION") - intent?.getParcelableExtra(EXTRA_CONFIG)?.let { + intent?.extras?.let { BundleCompat.getParcelable(it, EXTRA_CONFIG, ParcelableScannerConfig::class.java) }?.let { barcodeFormats = it.formats binding.overlayView.setCustomText(it.stringRes) binding.overlayView.setCustomIcon(it.drawableRes) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt index 2f2f9ed..d0b98fc 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt @@ -1,8 +1,8 @@ -@file:Suppress("DEPRECATION") - package io.github.g00fy2.quickie.extensions import android.content.Intent +import android.os.Bundle +import androidx.core.os.BundleCompat import com.google.mlkit.vision.barcode.common.Barcode import io.github.g00fy2.quickie.QRScannerActivity import io.github.g00fy2.quickie.content.AddressParcelable @@ -35,28 +35,29 @@ import io.github.g00fy2.quickie.content.WifiParcelable internal fun Intent?.toQuickieContentType(): QRContent { val rawValue = this?.getStringExtra(QRScannerActivity.EXTRA_RESULT_VALUE).orEmpty() - return this?.toQuickieContentType(rawValue) ?: Plain(rawValue) + return this?.extras?.toQuickieContentType(rawValue) ?: Plain(rawValue) } @Suppress("LongMethod") -private fun Intent.toQuickieContentType(rawValue: String): QRContent? { - return when (getIntExtra(QRScannerActivity.EXTRA_RESULT_TYPE, Barcode.TYPE_UNKNOWN)) { +private fun Bundle.toQuickieContentType(rawValue: String): QRContent? { + return when (getInt(QRScannerActivity.EXTRA_RESULT_TYPE, Barcode.TYPE_UNKNOWN)) { Barcode.TYPE_CONTACT_INFO -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { - ContactInfo( - rawValue = rawValue, - addresses = addressParcelables.map { it.toAddress() }, - emails = emailParcelables.map { it.toEmail(rawValue) }, - name = nameParcelable.toPersonName(), - organization = organization, - phones = phoneParcelables.map { it.toPhone(rawValue) }, - title = title, - urls = urls - ) - } + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, ContactInfoParcelable::class.java) + ?.run { + ContactInfo( + rawValue = rawValue, + addresses = addressParcelables.map { it.toAddress() }, + emails = emailParcelables.map { it.toEmail(rawValue) }, + name = nameParcelable.toPersonName(), + organization = organization, + phones = phoneParcelables.map { it.toPhone(rawValue) }, + title = title, + urls = urls + ) + } } Barcode.TYPE_EMAIL -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, EmailParcelable::class.java)?.run { Email( rawValue = rawValue, address = address, @@ -67,52 +68,54 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { } } Barcode.TYPE_PHONE -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, PhoneParcelable::class.java)?.run { Phone(rawValue = rawValue, number = number, type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN }) } } Barcode.TYPE_SMS -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, SmsParcelable::class.java)?.run { Sms(rawValue = rawValue, message = message, phoneNumber = phoneNumber) } } Barcode.TYPE_URL -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { - Url(rawValue = rawValue, title = title, url = url) - } + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, UrlBookmarkParcelable::class.java) + ?.run { + Url(rawValue = rawValue, title = title, url = url) + } } Barcode.TYPE_WIFI -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, WifiParcelable::class.java)?.run { Wifi(rawValue = rawValue, encryptionType = encryptionType, password = password, ssid = ssid) } } Barcode.TYPE_GEO -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, GeoPointParcelable::class.java)?.run { GeoPoint(rawValue = rawValue, lat = lat, lng = lng) } } Barcode.TYPE_CALENDAR_EVENT -> { - getParcelableExtra(QRScannerActivity.EXTRA_RESULT_PARCELABLE)?.run { - CalendarEvent( - rawValue = rawValue, - description = description, - end = end.toCalendarEvent(), - location = location, - organizer = organizer, - start = start.toCalendarEvent(), - status = status, - summary = summary - ) - } + BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, CalendarEventParcelable::class.java) + ?.run { + CalendarEvent( + rawValue = rawValue, + description = description, + end = end.toCalendarEvent(), + location = location, + organizer = organizer, + start = start.toCalendarEvent(), + status = status, + summary = summary + ) + } } else -> null } } internal fun Intent?.getRootException(): Exception { - this?.getSerializableExtra(QRScannerActivity.EXTRA_RESULT_EXCEPTION).let { - return if (it is Exception) it else IllegalStateException("Could retrieve root exception") - } + return this?.extras?.let { + BundleCompat.getParcelable(it, QRScannerActivity.EXTRA_RESULT_EXCEPTION, Exception::class.java) + } ?: IllegalStateException("Could retrieve root exception") } private fun PhoneParcelable.toPhone(rawValue: String) = From b15da458dd682ef22a374f90ea85459a2854e21d Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Wed, 24 May 2023 20:07:09 +0200 Subject: [PATCH 03/19] Update CameraX version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 47cf358..8248a2e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ kotlin = "1.8.21" appcompat = "1.6.1" core = "1.10.1" -cameraX = "1.2.2" +cameraX = "1.2.3" barcodeScanning = "17.1.0" barcodeScanningGms = "18.2.0" From ccc033f46e3e4e8d6dbecd892ef1b4e290b0307b Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Wed, 24 May 2023 20:07:28 +0200 Subject: [PATCH 04/19] Use previous when linebreak style --- .editorconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/.editorconfig b/.editorconfig index 5dc1241..aee9023 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,6 +14,7 @@ indent_style=space ij_kotlin_name_count_to_use_star_import=2147483647 ij_kotlin_name_count_to_use_star_import_for_members=2147483647 ij_kotlin_imports_layout=*,java.**,javax.**,kotlin.**,^ +ij_kotlin_line_break_after_multiline_when_entry=false [*.xml] ij_continuation_indent_size=4 From 53c1516eaf38431664e1547ffde3c2b4ccc23a5b Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Wed, 24 May 2023 20:07:55 +0200 Subject: [PATCH 05/19] Replace deprecated detekt config setup --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index db08979..f11b1f5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,7 @@ subprojects { apply(plugin = rootProject.libs.plugins.misc.detekt.get().pluginId) extensions.configure { toolVersion = rootProject.libs.versions.detekt.get() - config = files("$rootDir/detekt.yml") + config.setFrom(files("$rootDir/detekt.yml")) buildUponDefaultConfig = true ignoredBuildTypes = listOf("release") } From a6944aaf55624358124935c77d236b2aed3d3ef4 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Wed, 24 May 2023 20:15:25 +0200 Subject: [PATCH 06/19] Change markdown to make intellij linter happy --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f0b724e..e1829aa 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,9 @@ The activity result is a subclass of the sealed `QRResult` class: 1. `QRSuccess` when ML Kit successfully detected a QR code * wraps a `QRContent` object -1. `QRUserCanceled` when the Activity got canceled by the user -1. `QRMissingPermission` when the user didn't accept the camera permission -1. `QRError` when CameraX or ML Kit threw an exception +2. `QRUserCanceled` when the Activity got canceled by the user +3. `QRMissingPermission` when the user didn't accept the camera permission +4. `QRError` when CameraX or ML Kit threw an exception * wraps the `exception` #### Content From e58af14cab5e2ef8e219f227ff175eeb57444e32 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 May 2023 20:35:39 +0000 Subject: [PATCH 07/19] Update androidGradle to v8.0.2 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8248a2e..b2e9491 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ androidconfig-compileSdk = "33" androidconfig-targetSdk = "33" androidconfig-buildTools = "33.0.2" -androidGradle = "8.0.1" +androidGradle = "8.0.2" kotlin = "1.8.21" appcompat = "1.6.1" From 4c56bcf516487431926197752c9e7afc10d76824 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Thu, 25 May 2023 19:45:33 +0200 Subject: [PATCH 08/19] Replace BundleCompat with IntentCompat and reformat mapping --- .../g00fy2/quickie/QRScannerActivity.kt | 4 +- .../quickie/extensions/IntentExtensions.kt | 134 +++++++++++------- 2 files changed, 82 insertions(+), 56 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 78d0692..4a22e3f 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -19,7 +19,7 @@ import androidx.camera.core.Preview import androidx.camera.core.TorchState import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.core.os.BundleCompat +import androidx.core.content.IntentCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -176,7 +176,7 @@ internal class QRScannerActivity : AppCompatActivity() { } private fun applyScannerConfig() { - intent?.extras?.let { BundleCompat.getParcelable(it, EXTRA_CONFIG, ParcelableScannerConfig::class.java) }?.let { + intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_CONFIG, ParcelableScannerConfig::class.java) }?.let { barcodeFormats = it.formats binding.overlayView.setCustomText(it.stringRes) binding.overlayView.setCustomIcon(it.drawableRes) diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt index d0b98fc..215fddb 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt @@ -1,10 +1,12 @@ package io.github.g00fy2.quickie.extensions import android.content.Intent -import android.os.Bundle -import androidx.core.os.BundleCompat +import androidx.core.content.IntentCompat import com.google.mlkit.vision.barcode.common.Barcode import io.github.g00fy2.quickie.QRScannerActivity +import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_EXCEPTION +import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_PARCELABLE +import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_VALUE import io.github.g00fy2.quickie.content.AddressParcelable import io.github.g00fy2.quickie.content.CalendarDateTimeParcelable import io.github.g00fy2.quickie.content.CalendarEventParcelable @@ -34,92 +36,113 @@ import io.github.g00fy2.quickie.content.UrlBookmarkParcelable import io.github.g00fy2.quickie.content.WifiParcelable internal fun Intent?.toQuickieContentType(): QRContent { - val rawValue = this?.getStringExtra(QRScannerActivity.EXTRA_RESULT_VALUE).orEmpty() - return this?.extras?.toQuickieContentType(rawValue) ?: Plain(rawValue) + val rawValue = this?.getStringExtra(EXTRA_RESULT_VALUE).orEmpty() + return this?.toQuickieContentType(rawValue) ?: Plain(rawValue) } @Suppress("LongMethod") -private fun Bundle.toQuickieContentType(rawValue: String): QRContent? { - return when (getInt(QRScannerActivity.EXTRA_RESULT_TYPE, Barcode.TYPE_UNKNOWN)) { +private fun Intent.toQuickieContentType(rawValue: String): QRContent? { + return when (extras?.getInt(QRScannerActivity.EXTRA_RESULT_TYPE, Barcode.TYPE_UNKNOWN)) { Barcode.TYPE_CONTACT_INFO -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, ContactInfoParcelable::class.java) - ?.run { - ContactInfo( - rawValue = rawValue, - addresses = addressParcelables.map { it.toAddress() }, - emails = emailParcelables.map { it.toEmail(rawValue) }, - name = nameParcelable.toPersonName(), - organization = organization, - phones = phoneParcelables.map { it.toPhone(rawValue) }, - title = title, - urls = urls - ) - } + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, ContactInfoParcelable::class.java)?.let { + ContactInfo( + rawValue = rawValue, + addresses = it.addressParcelables.map { address -> address.toAddress() }, + emails = it.emailParcelables.map { mail -> mail.toEmail(rawValue) }, + name = it.nameParcelable.toPersonName(), + organization = it.organization, + phones = it.phoneParcelables.map { phone -> phone.toPhone(rawValue) }, + title = it.title, + urls = it.urls + ) + } } Barcode.TYPE_EMAIL -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, EmailParcelable::class.java)?.run { + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, EmailParcelable::class.java)?.let { Email( rawValue = rawValue, - address = address, - body = body, - subject = subject, - type = EmailType.values().getOrElse(type) { EmailType.UNKNOWN } + address = it.address, + body = it.body, + subject = it.subject, + type = EmailType.values().getOrElse(it.type) { EmailType.UNKNOWN } ) } } Barcode.TYPE_PHONE -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, PhoneParcelable::class.java)?.run { - Phone(rawValue = rawValue, number = number, type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN }) + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, PhoneParcelable::class.java)?.let { + Phone( + rawValue = rawValue, + number = it.number, + type = PhoneType.values().getOrElse(it.type) { PhoneType.UNKNOWN } + ) } } Barcode.TYPE_SMS -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, SmsParcelable::class.java)?.run { - Sms(rawValue = rawValue, message = message, phoneNumber = phoneNumber) + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, SmsParcelable::class.java)?.let { + Sms( + rawValue = rawValue, + message = it.message, + phoneNumber = it.phoneNumber + ) } } Barcode.TYPE_URL -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, UrlBookmarkParcelable::class.java) - ?.run { - Url(rawValue = rawValue, title = title, url = url) - } + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, UrlBookmarkParcelable::class.java)?.let { + Url( + rawValue = rawValue, + title = it.title, + url = it.url + ) + } } Barcode.TYPE_WIFI -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, WifiParcelable::class.java)?.run { - Wifi(rawValue = rawValue, encryptionType = encryptionType, password = password, ssid = ssid) + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, WifiParcelable::class.java)?.let { + Wifi( + rawValue = rawValue, + encryptionType = it.encryptionType, + password = it.password, + ssid = it.ssid + ) } } Barcode.TYPE_GEO -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, GeoPointParcelable::class.java)?.run { - GeoPoint(rawValue = rawValue, lat = lat, lng = lng) + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, GeoPointParcelable::class.java)?.let { + GeoPoint( + rawValue = rawValue, + lat = it.lat, + lng = it.lng + ) } } Barcode.TYPE_CALENDAR_EVENT -> { - BundleCompat.getParcelable(this, QRScannerActivity.EXTRA_RESULT_PARCELABLE, CalendarEventParcelable::class.java) - ?.run { - CalendarEvent( - rawValue = rawValue, - description = description, - end = end.toCalendarEvent(), - location = location, - organizer = organizer, - start = start.toCalendarEvent(), - status = status, - summary = summary - ) - } + IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, CalendarEventParcelable::class.java)?.let { + CalendarEvent( + rawValue = rawValue, + description = it.description, + end = it.end.toCalendarEvent(), + location = it.location, + organizer = it.organizer, + start = it.start.toCalendarEvent(), + status = it.status, + summary = it.summary + ) + } } else -> null } } internal fun Intent?.getRootException(): Exception { - return this?.extras?.let { - BundleCompat.getParcelable(it, QRScannerActivity.EXTRA_RESULT_EXCEPTION, Exception::class.java) - } ?: IllegalStateException("Could retrieve root exception") + return this?.let { IntentCompat.getParcelableExtra(it, EXTRA_RESULT_EXCEPTION, Exception::class.java) } + ?: IllegalStateException("Could retrieve root exception") } private fun PhoneParcelable.toPhone(rawValue: String) = - Phone(rawValue = rawValue, number = number, type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN }) + Phone( + rawValue = rawValue, + number = number, + type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN } + ) private fun EmailParcelable.toEmail(rawValue: String) = Email( @@ -131,7 +154,10 @@ private fun EmailParcelable.toEmail(rawValue: String) = ) private fun AddressParcelable.toAddress() = - Address(addressLines = addressLines, type = AddressType.values().getOrElse(type) { AddressType.UNKNOWN }) + Address( + addressLines = addressLines, + type = AddressType.values().getOrElse(type) { AddressType.UNKNOWN } + ) private fun PersonNameParcelable.toPersonName() = PersonName( From 8507d1cf59431bb4b2619b5c37486d07601cff4a Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 30 May 2023 09:14:28 +0200 Subject: [PATCH 09/19] Disable renovate dependency dashboard --- .github/renovate.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/renovate.json b/.github/renovate.json index 97dc8aa..2a011b9 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,8 +1,9 @@ { "extends": [ - "config:base" + "config:base", + ":disableDependencyDashboard" ], "baseBranches": [ "develop" ] -} \ No newline at end of file +} From 9a806e38514827f304ddee030201725c2ad90537 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 18:16:57 +0000 Subject: [PATCH 10/19] Update dependency org.jetbrains.dokka to v1.8.20 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b2e9491..17664af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ materialDesign = "1.9.0" detekt = "1.23.0" gradleVersions = "0.46.0" -dokka = "1.8.10" +dokka = "1.8.20" junit = "5.9.3" From 59566ab6e1c3cfcb8a573ab78f7af3dce8de2e21 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Jun 2023 12:58:12 +0000 Subject: [PATCH 11/19] Update dependency com.github.ben-manes.versions to v0.47.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17664af..23ed056 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,7 @@ barcodeScanningGms = "18.2.0" materialDesign = "1.9.0" detekt = "1.23.0" -gradleVersions = "0.46.0" +gradleVersions = "0.47.0" dokka = "1.8.20" junit = "5.9.3" From 608d982fb8d506a213e74147fed0f625aad6bc54 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 20:07:54 +0000 Subject: [PATCH 12/19] Update dependency gradle to v8.2 --- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 16170 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 delta 14892 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..62f495d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cb..fcb6fca 100755 --- a/gradlew +++ b/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. From 62bf4304a8b2f428c62d5e1810f2d12987f4d90b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 07:59:51 +0000 Subject: [PATCH 13/19] Update kotlin monorepo to v1.9.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 23ed056..91b1320 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ androidconfig-targetSdk = "33" androidconfig-buildTools = "33.0.2" androidGradle = "8.0.2" -kotlin = "1.8.21" +kotlin = "1.9.0" appcompat = "1.6.1" core = "1.10.1" From 1339d1a4ece9aa580b3c08427618fa9550a0335c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 13:55:25 +0000 Subject: [PATCH 14/19] Update dependency gradle to v8.2.1 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 62f495d..9f4197d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From c9cb4c34fc59d5f1803d099a406738e7d10bf85b Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Fri, 14 Jul 2023 17:11:46 +0200 Subject: [PATCH 15/19] Remove gradle versions plugin and cleanup build config --- build.gradle.kts | 43 +++++++++++++-------------------------- gradle/libs.versions.toml | 6 ++---- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f11b1f5..b2b33a8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,24 +11,10 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.parcelize) apply false alias(libs.plugins.kotlin.dokka) apply false - alias(libs.plugins.misc.detekt) apply false - alias(libs.plugins.misc.gradleVersions) + alias(libs.plugins.detekt) apply false } subprojects { - apply(plugin = rootProject.libs.plugins.misc.detekt.get().pluginId) - extensions.configure { - toolVersion = rootProject.libs.versions.detekt.get() - config.setFrom(files("$rootDir/detekt.yml")) - buildUponDefaultConfig = true - ignoredBuildTypes = listOf("release") - } - dependencies { - add("detektPlugins", rootProject.libs.misc.detektFormatting) - } - tasks.withType().configureEach { - jvmTarget = "11" - } tasks.withType().configureEach { compilerOptions { allWarningsAsErrors.set(true) @@ -41,6 +27,7 @@ subprojects { jvmTarget.set(JvmTarget.JVM_11) } } + plugins.withType().configureEach { extensions.configure { compileSdkVersion(libs.versions.androidconfig.compileSdk.get().toInt()) @@ -55,20 +42,18 @@ subprojects { } } } -} - -tasks.dependencyUpdates.configure { - gradleReleaseChannel = "current" - fun releaseType(version: String): Int { - val qualifiers = listOf("alpha", "beta", "m", "rc") - val index = qualifiers.indexOfFirst { version.matches(".*[.\\-]$it[.\\-\\d]*".toRegex(RegexOption.IGNORE_CASE)) } - return if (index < 0) qualifiers.size else index + apply(plugin = rootProject.libs.plugins.detekt.get().pluginId) + extensions.configure { + toolVersion = rootProject.libs.versions.detekt.get() + config.setFrom(files("$rootDir/detekt.yml")) + buildUponDefaultConfig = true + ignoredBuildTypes = listOf("release") + } + dependencies { + add("detektPlugins", rootProject.libs.detektFormatting) + } + tasks.withType().configureEach { + jvmTarget = JvmTarget.JVM_11.target } - - rejectVersionIf { releaseType(candidate.version) < releaseType(currentVersion) } -} - -tasks.register("clean") { - delete(buildDir) } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 23ed056..e59394f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,6 @@ barcodeScanningGms = "18.2.0" materialDesign = "1.9.0" detekt = "1.23.0" -gradleVersions = "0.47.0" dokka = "1.8.20" junit = "5.9.3" @@ -40,7 +39,7 @@ google-materialDesign = { module = "com.google.android.material:material", versi test-junitApi = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" } test-junitEngine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } -misc-detektFormatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } +detektFormatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradle" } @@ -50,5 +49,4 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -misc-detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } -misc-gradleVersions = { id = "com.github.ben-manes.versions", version.ref = "gradleVersions" } \ No newline at end of file +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } \ No newline at end of file From 9cb719d4d3b0ec884cd6a6007504225188f126f0 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Tue, 18 Jul 2023 21:06:29 +0200 Subject: [PATCH 16/19] Feature/add rawbytes (#119) * Add rawBytes to result and change rawValue to original nullability * Convert file line separators to LF * Update readme * Remove explicit charset in sample * Fix sample snackbar action * Add comment to sample result handling * Reformat sample code --- README.md | 2 +- gradlew.bat | 184 +++++++++--------- .../g00fy2/quickie/QRScannerActivity.kt | 2 + .../g00fy2/quickie/content/QRContent.kt | 62 ++++-- .../quickie/extensions/IntentExtensions.kt | 26 ++- .../g00fy2/quickiesample/MainActivity.kt | 17 +- 6 files changed, 168 insertions(+), 125 deletions(-) diff --git a/README.md b/README.md index e1829aa..7c93bd1 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ The activity result is a subclass of the sealed `QRResult` class: * wraps the `exception` #### Content -The content type of the QR code detected by ML Kit is wrapped inside a subclass of the sealed `QRContent` class which always provides a `rawValue`. +The content type of the QR code detected by ML Kit is wrapped inside a subclass of the sealed `QRContent` class which always provides a `rawBytes` and `rawValue` (will only be `null` for non-UTF8 barcodes). Currently, supported subtypes are: `Plain`, `Wifi`, `Url`, `Sms`, `GeoPoint`, `Email`, `Phone`, `ContactInfo`, `CalendarEvent` diff --git a/gradlew.bat b/gradlew.bat index 6689b85..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega 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 4a22e3f..8393658 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/QRScannerActivity.kt @@ -150,6 +150,7 @@ internal class QRScannerActivity : AppCompatActivity() { setResult( Activity.RESULT_OK, Intent().apply { + putExtra(EXTRA_RESULT_BYTES, result.rawBytes) putExtra(EXTRA_RESULT_VALUE, result.rawValue) putExtra(EXTRA_RESULT_TYPE, result.valueType) putExtra(EXTRA_RESULT_PARCELABLE, result.toParcelableContentType()) @@ -198,6 +199,7 @@ internal class QRScannerActivity : AppCompatActivity() { companion object { const val EXTRA_CONFIG = "quickie-config" + const val EXTRA_RESULT_BYTES = "quickie-bytes" const val EXTRA_RESULT_VALUE = "quickie-value" const val EXTRA_RESULT_TYPE = "quickie-type" const val EXTRA_RESULT_PARCELABLE = "quickie-parcelable" diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/content/QRContent.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/content/QRContent.kt index 37d7e08..c0e7894 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/content/QRContent.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/content/QRContent.kt @@ -1,55 +1,71 @@ package io.github.g00fy2.quickie.content -public sealed class QRContent(public open val rawValue: String) { - - override fun toString(): String = rawValue +@Suppress("ArrayInDataClass") +public sealed class QRContent( + public open val rawBytes: ByteArray?, + public open val rawValue: String?, +) { /** * Plain text or unknown content QR Code type. */ - public data class Plain internal constructor(override val rawValue: String) : QRContent(rawValue) + public data class Plain internal constructor( + override val rawBytes: ByteArray?, + override val rawValue: String? + ) : QRContent(rawBytes, rawValue) /** * Wi-Fi access point details from a 'WIFI:' or similar QR Code type. */ public data class Wifi internal constructor( - override val rawValue: String, + override val rawBytes: ByteArray?, + override val rawValue: String?, val encryptionType: Int, val password: String, val ssid: String - ) : QRContent(rawValue) + ) : QRContent(rawBytes, rawValue) /** * A URL or URL bookmark from a 'MEBKM:' or similar QR Code type. */ - public data class Url internal constructor(override val rawValue: String, val title: String, val url: String) : - QRContent(rawValue) + public data class Url internal constructor( + override val rawBytes: ByteArray?, + override val rawValue: String?, + val title: String, + val url: String + ) : QRContent(rawBytes, rawValue) /** * An SMS message from an 'SMS:' or similar QR Code type. */ public data class Sms internal constructor( - override val rawValue: String, + override val rawBytes: ByteArray?, + override val rawValue: String?, val message: String, val phoneNumber: String - ) : QRContent(rawValue) + ) : QRContent(rawBytes, rawValue) /** * GPS coordinates from a 'GEO:' or similar QR Code type. */ - public data class GeoPoint internal constructor(override val rawValue: String, val lat: Double, val lng: Double) : - QRContent(rawValue) + public data class GeoPoint internal constructor( + override val rawBytes: ByteArray?, + override val rawValue: String?, + val lat: Double, + val lng: Double + ) : QRContent(rawBytes, rawValue) /** * An email message from a 'MAILTO:' or similar QR Code type. */ public data class Email internal constructor( - override val rawValue: String, + override val rawBytes: ByteArray?, + override val rawValue: String?, val address: String, val body: String, val subject: String, val type: EmailType - ) : QRContent(rawValue) { + ) : QRContent(rawBytes, rawValue) { public enum class EmailType { UNKNOWN, WORK, HOME } @@ -58,8 +74,12 @@ public sealed class QRContent(public open val rawValue: String) { /** * A phone number from a 'TEL:' or similar QR Code type. */ - public data class Phone internal constructor(override val rawValue: String, val number: String, val type: PhoneType) : - QRContent(rawValue) { + public data class Phone internal constructor( + override val rawBytes: ByteArray?, + override val rawValue: String?, + val number: String, + val type: PhoneType + ) : QRContent(rawBytes, rawValue) { public enum class PhoneType { UNKNOWN, WORK, HOME, FAX, MOBILE } @@ -69,7 +89,8 @@ public sealed class QRContent(public open val rawValue: String) { * A person's or organization's business card. */ public data class ContactInfo internal constructor( - override val rawValue: String, + override val rawBytes: ByteArray?, + override val rawValue: String?, val addresses: List
, val emails: List, val name: PersonName, @@ -77,7 +98,7 @@ public sealed class QRContent(public open val rawValue: String) { val phones: List, val title: String, val urls: List - ) : QRContent(rawValue) { + ) : QRContent(rawBytes, rawValue) { public data class Address internal constructor(val addressLines: List, val type: AddressType) { public enum class AddressType { @@ -100,7 +121,8 @@ public sealed class QRContent(public open val rawValue: String) { * A calendar event extracted from a QR Code. */ public data class CalendarEvent internal constructor( - override val rawValue: String, + override val rawBytes: ByteArray?, + override val rawValue: String?, val description: String, val end: CalendarDateTime, val location: String, @@ -108,7 +130,7 @@ public sealed class QRContent(public open val rawValue: String) { val start: CalendarDateTime, val status: String, val summary: String - ) : QRContent(rawValue) { + ) : QRContent(rawBytes, rawValue) { public data class CalendarDateTime internal constructor( val day: Int, diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt index 215fddb..f29c7b8 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt @@ -4,6 +4,7 @@ import android.content.Intent import androidx.core.content.IntentCompat import com.google.mlkit.vision.barcode.common.Barcode import io.github.g00fy2.quickie.QRScannerActivity +import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_BYTES import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_EXCEPTION import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_PARCELABLE import io.github.g00fy2.quickie.QRScannerActivity.Companion.EXTRA_RESULT_VALUE @@ -36,22 +37,24 @@ import io.github.g00fy2.quickie.content.UrlBookmarkParcelable import io.github.g00fy2.quickie.content.WifiParcelable internal fun Intent?.toQuickieContentType(): QRContent { - val rawValue = this?.getStringExtra(EXTRA_RESULT_VALUE).orEmpty() - return this?.toQuickieContentType(rawValue) ?: Plain(rawValue) + val rawBytes = this?.getByteArrayExtra(EXTRA_RESULT_BYTES) + val rawValue = this?.getStringExtra(EXTRA_RESULT_VALUE) + return this?.toQuickieContentType(rawBytes, rawValue) ?: Plain(rawBytes, rawValue) } @Suppress("LongMethod") -private fun Intent.toQuickieContentType(rawValue: String): QRContent? { +private fun Intent.toQuickieContentType(rawBytes: ByteArray?, rawValue: String?): QRContent? { return when (extras?.getInt(QRScannerActivity.EXTRA_RESULT_TYPE, Barcode.TYPE_UNKNOWN)) { Barcode.TYPE_CONTACT_INFO -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, ContactInfoParcelable::class.java)?.let { ContactInfo( + rawBytes = rawBytes, rawValue = rawValue, addresses = it.addressParcelables.map { address -> address.toAddress() }, - emails = it.emailParcelables.map { mail -> mail.toEmail(rawValue) }, + emails = it.emailParcelables.map { mail -> mail.toEmail(rawBytes, rawValue) }, name = it.nameParcelable.toPersonName(), organization = it.organization, - phones = it.phoneParcelables.map { phone -> phone.toPhone(rawValue) }, + phones = it.phoneParcelables.map { phone -> phone.toPhone(rawBytes, rawValue) }, title = it.title, urls = it.urls ) @@ -60,6 +63,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_EMAIL -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, EmailParcelable::class.java)?.let { Email( + rawBytes = rawBytes, rawValue = rawValue, address = it.address, body = it.body, @@ -71,6 +75,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_PHONE -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, PhoneParcelable::class.java)?.let { Phone( + rawBytes = rawBytes, rawValue = rawValue, number = it.number, type = PhoneType.values().getOrElse(it.type) { PhoneType.UNKNOWN } @@ -80,6 +85,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_SMS -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, SmsParcelable::class.java)?.let { Sms( + rawBytes = rawBytes, rawValue = rawValue, message = it.message, phoneNumber = it.phoneNumber @@ -89,6 +95,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_URL -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, UrlBookmarkParcelable::class.java)?.let { Url( + rawBytes = rawBytes, rawValue = rawValue, title = it.title, url = it.url @@ -98,6 +105,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_WIFI -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, WifiParcelable::class.java)?.let { Wifi( + rawBytes = rawBytes, rawValue = rawValue, encryptionType = it.encryptionType, password = it.password, @@ -108,6 +116,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_GEO -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, GeoPointParcelable::class.java)?.let { GeoPoint( + rawBytes = rawBytes, rawValue = rawValue, lat = it.lat, lng = it.lng @@ -117,6 +126,7 @@ private fun Intent.toQuickieContentType(rawValue: String): QRContent? { Barcode.TYPE_CALENDAR_EVENT -> { IntentCompat.getParcelableExtra(this, EXTRA_RESULT_PARCELABLE, CalendarEventParcelable::class.java)?.let { CalendarEvent( + rawBytes = rawBytes, rawValue = rawValue, description = it.description, end = it.end.toCalendarEvent(), @@ -137,15 +147,17 @@ internal fun Intent?.getRootException(): Exception { ?: IllegalStateException("Could retrieve root exception") } -private fun PhoneParcelable.toPhone(rawValue: String) = +private fun PhoneParcelable.toPhone(rawBytes: ByteArray?, rawValue: String?) = Phone( + rawBytes = rawBytes, rawValue = rawValue, number = number, type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN } ) -private fun EmailParcelable.toEmail(rawValue: String) = +private fun EmailParcelable.toEmail(rawBytes: ByteArray?, rawValue: String?) = Email( + rawBytes = rawBytes, rawValue = rawValue, address = address, body = body, 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 7da3266..b0da253 100644 --- a/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt +++ b/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt @@ -58,7 +58,11 @@ class MainActivity : AppCompatActivity() { private fun showSnackbar(result: QRResult) { val text = when (result) { - is QRSuccess -> result.content.rawValue + is QRSuccess -> { + result.content.rawValue + // decoding with default UTF-8 charset when rawValue is null will not result in meaningful output, demo purpose + ?: result.content.rawBytes?.let { String(it) }.orEmpty() + } QRUserCanceled -> "User canceled" QRMissingPermission -> "Missing permission" is QRError -> "${result.exception.javaClass.simpleName}: ${result.exception.localizedMessage}" @@ -69,11 +73,14 @@ class MainActivity : AppCompatActivity() { maxLines = 5 setTextIsSelectable(true) } - if (result is QRSuccess && result.content is QRContent.Url) { - setAction(R.string.open_action) { openUrl(result.content.rawValue) } - } else { - setAction(R.string.ok_action) { } + if (result is QRSuccess) { + val content = result.content + if (content is QRContent.Url) { + setAction(R.string.open_action) { openUrl(content.url) } + return@apply + } } + setAction(R.string.ok_action) { } }.show() } From 9b5e583a46653dbf730c7a2a09e6f051286463b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 23 Jul 2023 17:56:21 +0200 Subject: [PATCH 17/19] Update junit5 monorepo to v5.10.0 (#120) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e59394f..6e2ff37 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ materialDesign = "1.9.0" detekt = "1.23.0" dokka = "1.8.20" -junit = "5.9.3" +junit = "5.10.0" [libraries] androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } From 742d8bfeae8fd7e160781a3c0ab5599707e7f334 Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Sun, 23 Jul 2023 18:47:53 +0200 Subject: [PATCH 18/19] Migrate to Kotlin 1.9 APIs --- build.gradle.kts | 11 +++++------ .../g00fy2/quickie/extensions/IntentExtensions.kt | 10 +++++----- .../io/github/g00fy2/quickie/BarcodeFormatsTest.kt | 2 +- .../io/github/g00fy2/quickiesample/MainActivity.kt | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b2b33a8..7822f92 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,7 @@ import com.android.build.gradle.BaseExtension import com.android.build.gradle.BasePlugin import io.gitlab.arturbosch.detekt.Detekt import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -18,14 +19,12 @@ subprojects { tasks.withType().configureEach { compilerOptions { allWarningsAsErrors.set(true) - freeCompilerArgs.addAll( - listOfNotNull( - "-progressive", - "-Xexplicit-api=strict".takeIf { (this@subprojects.name != "sample") }, - ) - ) + progressiveMode.set(true) jvmTarget.set(JvmTarget.JVM_11) } + if ((this@subprojects.name != "sample")) { + explicitApiMode.set(ExplicitApiMode.Strict) + } } plugins.withType().configureEach { diff --git a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt index f29c7b8..92709e7 100644 --- a/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt +++ b/quickie/src/main/kotlin/io/github/g00fy2/quickie/extensions/IntentExtensions.kt @@ -68,7 +68,7 @@ private fun Intent.toQuickieContentType(rawBytes: ByteArray?, rawValue: String?) address = it.address, body = it.body, subject = it.subject, - type = EmailType.values().getOrElse(it.type) { EmailType.UNKNOWN } + type = EmailType.entries.getOrElse(it.type) { EmailType.UNKNOWN } ) } } @@ -78,7 +78,7 @@ private fun Intent.toQuickieContentType(rawBytes: ByteArray?, rawValue: String?) rawBytes = rawBytes, rawValue = rawValue, number = it.number, - type = PhoneType.values().getOrElse(it.type) { PhoneType.UNKNOWN } + type = PhoneType.entries.getOrElse(it.type) { PhoneType.UNKNOWN } ) } } @@ -152,7 +152,7 @@ private fun PhoneParcelable.toPhone(rawBytes: ByteArray?, rawValue: String?) = rawBytes = rawBytes, rawValue = rawValue, number = number, - type = PhoneType.values().getOrElse(type) { PhoneType.UNKNOWN } + type = PhoneType.entries.getOrElse(type) { PhoneType.UNKNOWN } ) private fun EmailParcelable.toEmail(rawBytes: ByteArray?, rawValue: String?) = @@ -162,13 +162,13 @@ private fun EmailParcelable.toEmail(rawBytes: ByteArray?, rawValue: String?) = address = address, body = body, subject = subject, - type = EmailType.values().getOrElse(type) { EmailType.UNKNOWN } + type = EmailType.entries.getOrElse(type) { EmailType.UNKNOWN } ) private fun AddressParcelable.toAddress() = Address( addressLines = addressLines, - type = AddressType.values().getOrElse(type) { AddressType.UNKNOWN } + type = AddressType.entries.getOrElse(type) { AddressType.UNKNOWN } ) private fun PersonNameParcelable.toPersonName() = diff --git a/quickie/src/test/kotlin/io/github/g00fy2/quickie/BarcodeFormatsTest.kt b/quickie/src/test/kotlin/io/github/g00fy2/quickie/BarcodeFormatsTest.kt index 15db7eb..f9c45b5 100644 --- a/quickie/src/test/kotlin/io/github/g00fy2/quickie/BarcodeFormatsTest.kt +++ b/quickie/src/test/kotlin/io/github/g00fy2/quickie/BarcodeFormatsTest.kt @@ -15,7 +15,7 @@ internal class BarcodeFormatsTest { .filter { it.name != "FORMAT_UNKNOWN" } .associate { it.name to it.getInt(null) } - val quickieBarcodeFormats: Map = BarcodeFormat.values().associate { it.name to it.value } + val quickieBarcodeFormats: Map = BarcodeFormat.entries.associate { it.name to it.value } assertEquals(mlKitBarcodeFormats, quickieBarcodeFormats) } 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 b0da253..1142eee 100644 --- a/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt +++ b/sample/src/main/kotlin/io/github/g00fy2/quickiesample/MainActivity.kt @@ -93,12 +93,12 @@ class MainActivity : AppCompatActivity() { } private fun setBarcodeFormatDropdown() { - ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, BarcodeFormat.values().map { it.name }).let { + ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, BarcodeFormat.entries.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] + selectedBarcodeFormat = BarcodeFormat.entries[position] } } From 9ee26bef5a10cf6522ee412134c46edeed472a1f Mon Sep 17 00:00:00 2001 From: Thomas Wirth Date: Sun, 23 Jul 2023 18:57:18 +0200 Subject: [PATCH 19/19] Bump version to 1.8.0 --- README.md | 4 ++-- gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7c93bd1..67595fd 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,10 @@ There are two different flavors available on `mavenCentral()`: ```kotlin // bundled: -implementation("io.github.g00fy2.quickie:quickie-bundled:1.7.0") +implementation("io.github.g00fy2.quickie:quickie-bundled:1.8.0") // unbundled: -implementation("io.github.g00fy2.quickie:quickie-unbundled:1.7.0") +implementation("io.github.g00fy2.quickie:quickie-unbundled:1.8.0") ``` ## Quick Start diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c226b8b..63c8d6b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -quickie = "1.7.0" +quickie = "1.8.0" androidconfig-minSdk = "21" androidconfig-compileSdk = "33"