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.