From a29b06803572d56477ea33dec661b6a2911ea14e Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 26 Jun 2024 21:20:53 -0400 Subject: [PATCH 1/2] ui: Prevent crash after a profile switch that timed out ...and improve the prompt when this happens. --- .../java/im/angry/openeuicc/ui/EuiccManagementFragment.kt | 7 +++++++ app-common/src/main/res/values/strings.xml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt index 96c0949..551f0c2 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt @@ -47,6 +47,10 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, private val adapter = EuiccProfileAdapter() + // Marker for when this fragment might enter an invalid state + // e.g. after a failed enable / disable operation + private var invalid = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) @@ -106,6 +110,7 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, @SuppressLint("NotifyDataSetChanged") private fun refresh() { + if (invalid) return swipeRefresh.isRefreshing = true lifecycleScope.launch { @@ -151,6 +156,8 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, euiccChannelManager.waitForReconnect(slotId, portId, timeoutMillis = 30 * 1000) } catch (e: TimeoutCancellationException) { withContext(Dispatchers.Main) { + // Prevent this Fragment from being used again + invalid = true // Timed out waiting for SIM to come back online, we can no longer assume that the LPA is still valid AlertDialog.Builder(requireContext()).apply { setMessage(R.string.enable_disable_timeout) diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index a2424e5..2920bfa 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -16,7 +16,7 @@ Delete Rename - Timed out waiting for the eSIM chip to switch profiles. You might want to restart the application or even the phone. + Timed out waiting for the eSIM chip to switch profiles. This may be a bug in your phone\'s modem firmware. Try toggling airplane mode, restarting the application, or rebooting the phone. Cannot switch to new eSIM profile. Nickname cannot be longer than 64 characters From 4790f87b65c3b5c70b20b8b6a10767d9bcf877a7 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 26 Jun 2024 21:23:10 -0400 Subject: [PATCH 2/2] ui: Prevent users from doing multiple things at once --- .../main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt index 551f0c2..cff6e89 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt @@ -254,6 +254,9 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener, } private fun showOptionsMenu() { + // Prevent users from doing multiple things at once + if (invalid || swipeRefresh.isRefreshing) return + PopupMenu(root.context, profileMenu).apply { setOnMenuItemClickListener(::onMenuItemClicked) populatePopupWithProfileActions(this, profile)