Compare commits

...

2 commits

Author SHA1 Message Date
4790f87b65 ui: Prevent users from doing multiple things at once
All checks were successful
/ build-debug (push) Successful in 5m7s
2024-06-26 21:23:10 -04:00
a29b068035 ui: Prevent crash after a profile switch that timed out
...and improve the prompt when this happens.
2024-06-26 21:20:53 -04:00
2 changed files with 11 additions and 1 deletions

View file

@ -47,6 +47,10 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
private val adapter = EuiccProfileAdapter() 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setHasOptionsMenu(true) setHasOptionsMenu(true)
@ -106,6 +110,7 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun refresh() { private fun refresh() {
if (invalid) return
swipeRefresh.isRefreshing = true swipeRefresh.isRefreshing = true
lifecycleScope.launch { lifecycleScope.launch {
@ -151,6 +156,8 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
euiccChannelManager.waitForReconnect(slotId, portId, timeoutMillis = 30 * 1000) euiccChannelManager.waitForReconnect(slotId, portId, timeoutMillis = 30 * 1000)
} catch (e: TimeoutCancellationException) { } catch (e: TimeoutCancellationException) {
withContext(Dispatchers.Main) { 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 // Timed out waiting for SIM to come back online, we can no longer assume that the LPA is still valid
AlertDialog.Builder(requireContext()).apply { AlertDialog.Builder(requireContext()).apply {
setMessage(R.string.enable_disable_timeout) setMessage(R.string.enable_disable_timeout)
@ -247,6 +254,9 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
} }
private fun showOptionsMenu() { private fun showOptionsMenu() {
// Prevent users from doing multiple things at once
if (invalid || swipeRefresh.isRefreshing) return
PopupMenu(root.context, profileMenu).apply { PopupMenu(root.context, profileMenu).apply {
setOnMenuItemClickListener(::onMenuItemClicked) setOnMenuItemClickListener(::onMenuItemClicked)
populatePopupWithProfileActions(this, profile) populatePopupWithProfileActions(this, profile)

View file

@ -16,7 +16,7 @@
<string name="delete">Delete</string> <string name="delete">Delete</string>
<string name="rename">Rename</string> <string name="rename">Rename</string>
<string name="enable_disable_timeout">Timed out waiting for the eSIM chip to switch profiles. You might want to restart the application or even the phone.</string> <string name="enable_disable_timeout">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.</string>
<string name="toast_profile_enable_failed">Cannot switch to new eSIM profile.</string> <string name="toast_profile_enable_failed">Cannot switch to new eSIM profile.</string>
<string name="toast_profile_name_too_long">Nickname cannot be longer than 64 characters</string> <string name="toast_profile_name_too_long">Nickname cannot be longer than 64 characters</string>