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?