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..88e5d51 --- /dev/null +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/ActivationCode.kt @@ -0,0 +1,24 @@ +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 { + fun fromString(input: String): ActivationCode { + val components = input.removePrefix("LPA:").split('$') + if (components.size < 2 || components[0] != "1") { + throw IllegalArgumentException("Invalid activation code format") + } + return ActivationCode( + address = components[1].trim(), + matchingId = components.getOrNull(2)?.trim()?.ifBlank { null }, + oid = components.getOrNull(3)?.trim()?.ifBlank { null }, + requiredConfirmationCode = components.getOrNull(4)?.trim() == "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..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 @@ -124,9 +124,22 @@ 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) + setPositiveButton(android.R.string.ok, null) + show() + } + } + gotoNextFragment(DownloadWizardDetailsFragment()) + } 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,11 +147,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard setNegativeButton(android.R.string.cancel, null) show() } - return } - state.smdp = components[1] - state.matchingId = components[2] - gotoNextFragment(DownloadWizardDetailsFragment()) } private class DownloadMethodViewHolder(private val root: View) : ViewHolder(root) { 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.