diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt index 44b7479..dfbe17d 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt @@ -35,6 +35,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() { var downloadTaskID: Long, var downloadError: LocalProfileAssistant.ProfileDownloadException?, var skipMethodSelect: Boolean, + var confirmationCodeRequired: Boolean, ) private lateinit var state: DownloadWizardState @@ -72,7 +73,8 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() { downloadStarted = false, downloadTaskID = -1, downloadError = null, - skipMethodSelect = false + skipMethodSelect = false, + confirmationCodeRequired = false, ) handleDeepLink() @@ -125,6 +127,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() { val parsed = ActivationCode.parse(uri.schemeSpecificPart) state.smdp = parsed.address state.matchingId = parsed.matchingId + state.confirmationCodeRequired = parsed.confirmationCodeRequired state.skipMethodSelect = true } } @@ -154,6 +157,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() { outState.putString("imei", state.imei) outState.putBoolean("downloadStarted", state.downloadStarted) outState.putLong("downloadTaskID", state.downloadTaskID) + outState.putBoolean("confirmationCodeRequired", state.confirmationCodeRequired) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { @@ -170,6 +174,8 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() { state.downloadStarted = savedInstanceState.getBoolean("downloadStarted", state.downloadStarted) state.downloadTaskID = savedInstanceState.getLong("downloadTaskID", state.downloadTaskID) + state.confirmationCode = savedInstanceState.getString("confirmationCode", state.confirmationCode) + state.confirmationCodeRequired = savedInstanceState.getBoolean("confirmationCodeRequired", state.confirmationCodeRequired) } private fun onPrevPressed() { diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt index 4a852ec..402e7a5 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDetailsFragment.kt @@ -5,6 +5,7 @@ import android.util.Patterns import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.core.widget.addTextChangedListener import com.google.android.material.textfield.TextInputLayout import im.angry.openeuicc.common.R @@ -55,6 +56,9 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF smdp.editText!!.addTextChangedListener { updateInputCompleteness() } + confirmationCode.editText!!.addTextChangedListener { + updateInputCompleteness() + } return view } @@ -65,6 +69,15 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF confirmationCode.editText!!.setText(state.confirmationCode) imei.editText!!.setText(state.imei) updateInputCompleteness() + + if (state.confirmationCodeRequired) { + confirmationCode.editText!!.requestFocus() + confirmationCode.editText!!.hint = + getString(R.string.profile_download_confirmation_code_required) + } else { + confirmationCode.editText!!.hint = + getString(R.string.profile_download_confirmation_code) + } } override fun onPause() { @@ -74,6 +87,9 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF private fun updateInputCompleteness() { inputComplete = Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches() + if (state.confirmationCodeRequired) { + inputComplete = inputComplete && confirmationCode.editText!!.text.isNotEmpty() + } refreshButtons() } } \ No newline at end of file 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 452f1e1..85d75b3 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 @@ -129,15 +129,7 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard val parsed = ActivationCode.parse(input) state.smdp = parsed.address state.matchingId = parsed.matchingId - if (parsed.confirmationCodeRequired) { - 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() - } - } + state.confirmationCodeRequired = parsed.confirmationCodeRequired gotoNextFragment(DownloadWizardDetailsFragment()) } catch (e: IllegalArgumentException) { AlertDialog.Builder(requireContext()).apply { @@ -150,14 +142,19 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard } } - private class DownloadMethodViewHolder(private val root: View) : ViewHolder(root) { + private inner class DownloadMethodViewHolder(private val root: View) : ViewHolder(root) { private val icon = root.requireViewById(R.id.download_method_icon) private val title = root.requireViewById(R.id.download_method_title) fun bind(item: DownloadMethod) { icon.setImageResource(item.iconRes) title.setText(item.titleRes) - root.setOnClickListener { item.onClick() } + root.setOnClickListener { + // If the user elected to use another download method, reset the confirmation code flag + // too + state.confirmationCodeRequired = false + item.onClick() + } } } diff --git a/app-common/src/main/res/values-ja/strings.xml b/app-common/src/main/res/values-ja/strings.xml index e4969c1..df72674 100644 --- a/app-common/src/main/res/values-ja/strings.xml +++ b/app-common/src/main/res/values-ja/strings.xml @@ -42,12 +42,11 @@ サーバー (RSP / SM-DP+) アクティベーションコード 確認コード (オプション) + 確認コード (必須) IMEI (オプション) ダウンロードに失敗する可能性があります 残り容量が少ないため、ダウンロードに失敗する可能性があります。 クリップボードに LPA コードがありません - 確認コードが必要です - クリップボードからスキャンした QR コードまたは LPA コードに必要な確認コードを入力してください。 解析できません QR コードまたはクリップボードの内容を LPA コードとして解析できませんでした。 ダウンロードウィザード diff --git a/app-common/src/main/res/values-zh-rCN/strings.xml b/app-common/src/main/res/values-zh-rCN/strings.xml index 2cadc03..de02046 100644 --- a/app-common/src/main/res/values-zh-rCN/strings.xml +++ b/app-common/src/main/res/values-zh-rCN/strings.xml @@ -37,6 +37,7 @@ 服务器 (RSP / SM-DP+) 激活码 确认码 (可选) + 确认码 (必需) IMEI (可选) 本次下载可能会失败 当前芯片的剩余空间不足,可能导致配置下载失败。\n是否继续下载? @@ -144,6 +145,4 @@ 无视 SM-DP+ 的 TLS 证书 允许 RSP 服务器使用任意证书 无信息 - 需要确认码 - 您扫描的二维码或粘贴的 LPA 码需要一个额外的确认码 \ No newline at end of file diff --git a/app-common/src/main/res/values-zh-rTW/strings.xml b/app-common/src/main/res/values-zh-rTW/strings.xml index 28691a0..d133d2b 100644 --- a/app-common/src/main/res/values-zh-rTW/strings.xml +++ b/app-common/src/main/res/values-zh-rTW/strings.xml @@ -37,6 +37,7 @@ 伺服器 (RSP / SM-DP+) 啟用碼 確認碼 (可選) + 確認碼 (必需) IMEI (可選) 本次下載可能會失敗 目前晶片的剩餘空間不足,可能導致配置下載失敗。\n是否繼續下載? diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index a45ce1f..990e629 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -53,13 +53,12 @@ Server (RSP / SM-DP+) Activation Code Confirmation Code (Optional) + Confirmation Code (Required) IMEI (Optional) This download may fail This download may fail due to low remaining capacity. No LPA code found in clipboard - Confirmation Code Required - Please provide a confirmation code as required by the scanned QR code or LPA code from clipboard. Unable to parse Could not parse QR code or clipboard content as a LPA code.