From 252000660a6cd390ca887a3b3c9920bc25bde168 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Mon, 19 Feb 2024 16:58:33 -0500 Subject: [PATCH] CompatibilityCheck: show unknown status when "secure element is not present" Some devices "optimize" their OMAPI by reporting this status when both slots are empty. Even just inserting one SIM would fix this error for both slots. In this case, we should not imply that the device is incompatible. --- .../angry/openeuicc/ui/CompatibilityCheckActivity.kt | 3 +++ .../im/angry/openeuicc/util/CompatibilityCheck.kt | 12 +++++++++++- .../src/main/res/drawable/ic_question_outline.xml | 5 +++++ .../src/main/res/layout/compatibility_check_item.xml | 8 ++++++++ app-unpriv/src/main/res/values/strings.xml | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 app-unpriv/src/main/res/drawable/ic_question_outline.xml diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt index 20e0c5d..0eb433a 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/CompatibilityCheckActivity.kt @@ -64,6 +64,9 @@ class CompatibilityCheckActivity: AppCompatActivity() { CompatibilityCheck.State.FAILURE -> { root.findViewById(R.id.compatibility_check_error).visibility = View.VISIBLE } + CompatibilityCheck.State.FAILURE_UNKNOWN -> { + root.findViewById(R.id.compatibility_check_unknown).visibility = View.VISIBLE + } else -> { root.findViewById(R.id.compatibility_check_progress_bar).visibility = View.VISIBLE } diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/util/CompatibilityCheck.kt b/app-unpriv/src/main/java/im/angry/openeuicc/util/CompatibilityCheck.kt index ad4b423..3d9c47b 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/util/CompatibilityCheck.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/util/CompatibilityCheck.kt @@ -9,6 +9,7 @@ import im.angry.easyeuicc.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.withContext +import java.io.IOException fun getCompatibilityChecks(context: Context): List = listOf( @@ -38,6 +39,7 @@ abstract class CompatibilityCheck(context: Context) { NOT_STARTED, IN_PROGRESS, SUCCESS, + FAILURE_UNKNOWN, // The check technically failed, but no conclusion can be drawn FAILURE } @@ -49,7 +51,7 @@ abstract class CompatibilityCheck(context: Context) { val description: String get() = when { - state == State.FAILURE && this::failureDescription.isInitialized -> failureDescription + (state == State.FAILURE || state == State.FAILURE_UNKNOWN) && this::failureDescription.isInitialized -> failureDescription else -> defaultDescription } @@ -139,6 +141,14 @@ internal class IsdrChannelAccessCheck(private val context: Context): Compatibili // ref: https://android.googlesource.com/platform/frameworks/base/+/4fe64fb4712a99d5da9c9a0eb8fd5169b252e1e1/omapi/java/android/se/omapi/Session.java#305 // SecurityException is only thrown when Channel is constructed, which means everything else needs to succeed Pair(it.slotIndex, State.SUCCESS) + } catch (e: IOException) { + e.printStackTrace() + if (e.message?.contains("Secure Element is not present") == true) { + failureDescription = context.getString(R.string.compatibility_check_isdr_channel_desc_unknown) + Pair(it.slotIndex, State.FAILURE_UNKNOWN) + } else { + Pair(it.slotIndex, State.FAILURE) + } } catch (e: Exception) { e.printStackTrace() Pair(it.slotIndex, State.FAILURE) diff --git a/app-unpriv/src/main/res/drawable/ic_question_outline.xml b/app-unpriv/src/main/res/drawable/ic_question_outline.xml new file mode 100644 index 0000000..8c0d6eb --- /dev/null +++ b/app-unpriv/src/main/res/drawable/ic_question_outline.xml @@ -0,0 +1,5 @@ + + + diff --git a/app-unpriv/src/main/res/layout/compatibility_check_item.xml b/app-unpriv/src/main/res/layout/compatibility_check_item.xml index f75741a..0e46668 100644 --- a/app-unpriv/src/main/res/layout/compatibility_check_item.xml +++ b/app-unpriv/src/main/res/layout/compatibility_check_item.xml @@ -60,6 +60,14 @@ android:layout_width="32dp" android:layout_height="32dp" /> + + \ No newline at end of file diff --git a/app-unpriv/src/main/res/values/strings.xml b/app-unpriv/src/main/res/values/strings.xml index 5d4b9db..3a20af1 100644 --- a/app-unpriv/src/main/res/values/strings.xml +++ b/app-unpriv/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ Only the following SIM slots are accessible via OMAPI: %s. ISD-R Channel Access Does your device support opening an ISD-R (management) channel to eSIMs via OMAPI? + Cannot determine whether ISD-R access through OMAPI is supported. You might want to retry with SIM cards inserted (any SIM card will do) if not already. OMAPI access to ISD-R is only possible on the following SIM slots: %s. Known Broken? Making sure your device is not known to have bugs associated with removable eSIMs.