From 9f5b092a0737cca418610eacdc99524c2a320a2a Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 30 Dec 2024 21:54:50 +0800 Subject: [PATCH 1/5] feat: if qrcode need confirmation code then alert dialog --- .../openeuicc/ui/wizard/ActivationCode.kt | 34 +++++++++++++++++++ .../DownloadWizardMethodSelectFragment.kt | 21 ++++++++---- app-common/src/main/res/values/strings.xml | 2 ++ 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt new file mode 100644 index 0000000..5896f89 --- /dev/null +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt @@ -0,0 +1,34 @@ +package im.angry.openeuicc.ui.wizard + + +data class ActivationCode( + val address: String, + val matchingId: String? = null, + val oid: String? = null, + val requiredConfirmationCode: Boolean = false, +) { + companion object { + private const val SCHEME = "LPA:" + private const val DELIMITER = '$' + + fun fromString(input: String): ActivationCode { + if (input.isBlank()) { + throw IllegalArgumentException("Activation code cannot be empty") + } else if (!input.startsWith(SCHEME)) { + throw IllegalArgumentException("Activation code cannot be $SCHEME") + } + val components = input.removePrefix(SCHEME).split(DELIMITER) + if (components.size < 2) { + throw IllegalArgumentException("Invalid activation code format") + } else if (components[0] != "1") { + throw IllegalArgumentException("Invalid activation code AC_FORMAT") + } + return ActivationCode( + address = components[1], + matchingId = components.getOrNull(2), + oid = components.getOrNull(3), + requiredConfirmationCode = components.getOrNull(4) == "1" + ) + } + } +} diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 6203364..1f1a125 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -124,9 +124,21 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard processLpaString(text.toString()) } - private fun processLpaString(s: String) { - val components = s.split("$") - if (components.size < 3 || components[0] != "LPA:1") { + private fun processLpaString(input: String) { + try { + val parsed = ActivationCode.fromString(input) + state.smdp = parsed.address + state.matchingId = parsed.matchingId + if (parsed.requiredConfirmationCode) { + AlertDialog.Builder(requireContext()).apply { + setTitle(R.string.profile_download_required_confirmation_code) + setMessage(R.string.profile_download_required_confirmation_code_message) + setCancelable(true) + setNegativeButton(android.R.string.cancel, null) + show() + } + } + } catch (e: IllegalArgumentException) { AlertDialog.Builder(requireContext()).apply { setTitle(R.string.profile_download_incorrect_lpa_string) setMessage(R.string.profile_download_incorrect_lpa_string_message) @@ -134,10 +146,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard setNegativeButton(android.R.string.cancel, null) show() } - return } - state.smdp = components[1] - state.matchingId = components[2] gotoNextFragment(DownloadWizardDetailsFragment()) } diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index d3bce00..de59c31 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -57,6 +57,8 @@ This download may fail This download may fail due to low remaining capacity. No LPA code found in clipboard + Require Confirmation Code + This QR code or clipboard content requires a confirmation code Unable to parse Could not parse QR code or clipboard content as a LPA code. -- 2.45.3 From 4612480d05657723a27fb41c5e1284026eabbecc Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 30 Dec 2024 22:38:01 +0800 Subject: [PATCH 2/5] fix: error message --- .../main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt index 5896f89..9682a65 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt @@ -15,7 +15,7 @@ data class ActivationCode( if (input.isBlank()) { throw IllegalArgumentException("Activation code cannot be empty") } else if (!input.startsWith(SCHEME)) { - throw IllegalArgumentException("Activation code cannot be $SCHEME") + throw IllegalArgumentException("Invalid activation code format") } val components = input.removePrefix(SCHEME).split(DELIMITER) if (components.size < 2) { -- 2.45.3 From 321d9ca3f78216a9783ab4ea8294a8b149eb5dd6 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 30 Dec 2024 22:45:32 +0800 Subject: [PATCH 3/5] chore: simplify logic --- .../openeuicc/ui/wizard/ActivationCode.kt | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt index 9682a65..88e5d51 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt @@ -8,26 +8,16 @@ data class ActivationCode( val requiredConfirmationCode: Boolean = false, ) { companion object { - private const val SCHEME = "LPA:" - private const val DELIMITER = '$' - fun fromString(input: String): ActivationCode { - if (input.isBlank()) { - throw IllegalArgumentException("Activation code cannot be empty") - } else if (!input.startsWith(SCHEME)) { + val components = input.removePrefix("LPA:").split('$') + if (components.size < 2 || components[0] != "1") { throw IllegalArgumentException("Invalid activation code format") } - val components = input.removePrefix(SCHEME).split(DELIMITER) - if (components.size < 2) { - throw IllegalArgumentException("Invalid activation code format") - } else if (components[0] != "1") { - throw IllegalArgumentException("Invalid activation code AC_FORMAT") - } return ActivationCode( - address = components[1], - matchingId = components.getOrNull(2), - oid = components.getOrNull(3), - requiredConfirmationCode = components.getOrNull(4) == "1" + address = components[1].trim(), + matchingId = components.getOrNull(2)?.trim()?.ifBlank { null }, + oid = components.getOrNull(3)?.trim()?.ifBlank { null }, + requiredConfirmationCode = components.getOrNull(4)?.trim() == "1" ) } } -- 2.45.3 From 3ce3a79946d812eb5551dc48751f2581b3802a21 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 30 Dec 2024 22:47:38 +0800 Subject: [PATCH 4/5] fix: alert dialog --- .../openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 1f1a125..df49568 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -134,7 +134,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard setTitle(R.string.profile_download_required_confirmation_code) setMessage(R.string.profile_download_required_confirmation_code_message) setCancelable(true) - setNegativeButton(android.R.string.cancel, null) + setPositiveButton(android.R.string.ok, null) show() } } -- 2.45.3 From 86994836a0eb4f639d2e9b172e241c2701a96077 Mon Sep 17 00:00:00 2001 From: septs Date: Tue, 31 Dec 2024 01:16:25 +0800 Subject: [PATCH 5/5] fix: flow control --- .../openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index df49568..26a69a1 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -138,6 +138,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard show() } } + gotoNextFragment(DownloadWizardDetailsFragment()) } catch (e: IllegalArgumentException) { AlertDialog.Builder(requireContext()).apply { setTitle(R.string.profile_download_incorrect_lpa_string) @@ -147,7 +148,6 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard show() } } - gotoNextFragment(DownloadWizardDetailsFragment()) } private class DownloadMethodViewHolder(private val root: View) : ViewHolder(root) { -- 2.45.3