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 88567c2..cd758c3 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
@@ -68,28 +68,36 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF
}
private fun updateInputCompleteness() {
- inputComplete = runCatching(::validate).isSuccess
+ validate()
+ val errors = arrayOf(
+ smdp.editText!!.error,
+ imei.editText!!.error,
+ )
+ inputComplete = errors.all { it == null }
refreshButtons()
}
private fun validate() {
- check(Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()) {
- "Invalid SM-DP+ address"
+ smdp.editText!!.error = smdp.editText!!.text?.let {
+ if (Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()) return@let null
+ getString(R.string.download_wizard_error_invalid_address_format)
}
- check(imei.editText!!.text.let { it.isEmpty() || isValidIMEI(it) }) {
- "Invalid IMEI"
+ imei.editText!!.error = imei.editText!!.text?.let {
+ if (it.isEmpty() || luhnValid(it)) return@let null
+ getString(R.string.download_wizard_error_invalid_imei_format)
}
}
}
-private fun isValidIMEI(input: CharSequence): Boolean {
- if (input.length != 15 || !input.all(Char::isDigit)) return false
-
- fun sumOfDigits(input: Int): Int {
- if (input % 2 == 0) return input
- return (input * 2).toString().map(Char::digitToInt).sum()
+private fun luhnValid(number: CharSequence, mod: Int = 10): Boolean {
+ if (!number.all(Char::isDigit)) return false
+ var checksum = 0
+ for (i in number.length - 1 downTo 0 step 2) {
+ checksum += number[i] - '0'
}
-
- val sum = input.dropLast(1).map(Char::digitToInt).sumOf(::sumOfDigits)
- return (sum * 9) % 10 == input.last().digitToInt()
-}
+ for (i in number.length - 2 downTo 0 step 2) {
+ val n: Int = (number[i] - '0') * 2
+ checksum += if (n > 9) n - 9 else n
+ }
+ return checksum % mod == 0
+}
\ No newline at end of file
diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml
index a45ce1f..94f7f7a 100644
--- a/app-common/src/main/res/values/strings.xml
+++ b/app-common/src/main/res/values/strings.xml
@@ -98,6 +98,8 @@
Last APDU exception:
Save
Diagnostics at %s
+ Invalid SM-DP+ address
+ Invalid IMEI format
Logs have been saved to the selected path. Would you like to share the log through another app?