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 cd758c3..88567c2 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,36 +68,28 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF } private fun updateInputCompleteness() { - validate() - val errors = arrayOf( - smdp.editText!!.error, - imei.editText!!.error, - ) - inputComplete = errors.all { it == null } + inputComplete = runCatching(::validate).isSuccess refreshButtons() } private fun validate() { - 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(Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()) { + "Invalid SM-DP+ address" } - imei.editText!!.error = imei.editText!!.text?.let { - if (it.isEmpty() || luhnValid(it)) return@let null - getString(R.string.download_wizard_error_invalid_imei_format) + check(imei.editText!!.text.let { it.isEmpty() || isValidIMEI(it) }) { + "Invalid IMEI" } } } -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' +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() } - 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 + + val sum = input.dropLast(1).map(Char::digitToInt).sumOf(::sumOfDigits) + return (sum * 9) % 10 == input.last().digitToInt() +} diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 94f7f7a..a45ce1f 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -98,8 +98,6 @@ 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?