From bd4990d0206e2c168beccef9af58be77314506e2 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Fri, 29 Nov 2024 16:04:42 +0800 Subject: [PATCH] Fix checkSimIsReadyAndGoNext() This function is waiting for sim to be enabled, then goto next step. Before this fix, receiver register / unregister is not lifecycle scope awareness, after fix this, use flow, which is cancelled when the coroutine lifecycle scope cancelled. Fix: 381153100 Flag: EXEMPT bug fix Test: manual - switch between two sims (hard code dsds requires reboot) Change-Id: If9cbb0cbf7d460b659d827897306c07d642bb231 --- .../settings/network/SimOnboardingActivity.kt | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt index 8f9cc8f9271..8d8fcba8b8c 100644 --- a/src/com/android/settings/network/SimOnboardingActivity.kt +++ b/src/com/android/settings/network/SimOnboardingActivity.kt @@ -56,6 +56,7 @@ import com.android.settings.R import com.android.settings.SidecarFragment import com.android.settings.network.telephony.SimRepository import com.android.settings.network.telephony.SubscriptionActionDialogActivity +import com.android.settings.network.telephony.SubscriptionRepository import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity import com.android.settings.network.telephony.requireSubscriptionManager import com.android.settings.spa.SpaActivity.Companion.startSpaActivity @@ -79,8 +80,10 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlinx.coroutines.withTimeoutOrNull class SimOnboardingActivity : SpaBaseDialogActivity() { lateinit var scope: CoroutineScope @@ -490,31 +493,25 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { } } - suspend fun checkSimIsReadyAndGoNext() { + private suspend fun checkSimIsReadyAndGoNext() { withContext(Dispatchers.Default) { - val isEnabled = context.requireSubscriptionManager() - .isSubscriptionEnabled(onboardingService.targetSubId) - if (!isEnabled) { - val latch = CountDownLatch(1) - val receiver = CarrierConfigChangedReceiver(latch) - try { - val waitingTimeMillis = - Settings.Global.getLong( - context.contentResolver, - Settings.Global.EUICC_SWITCH_SLOT_TIMEOUT_MILLIS, - UiccSlotUtil.DEFAULT_WAIT_AFTER_SWITCH_TIMEOUT_MILLIS - ) - receiver.registerOn(context) - Log.d(TAG, "Start waiting, waitingTime is $waitingTimeMillis") - latch.await(waitingTimeMillis, TimeUnit.MILLISECONDS) - } catch (e: InterruptedException) { - Thread.currentThread().interrupt() - Log.e(TAG, "Failed switching to physical slot.", e) - } finally { - context.unregisterReceiver(receiver) - } - } - Log.d(TAG, "Sim is ready then go to next") + val waitingTimeMillis = + Settings.Global.getLong( + context.contentResolver, + Settings.Global.EUICC_SWITCH_SLOT_TIMEOUT_MILLIS, + UiccSlotUtil.DEFAULT_WAIT_AFTER_SWITCH_TIMEOUT_MILLIS, + ) + Log.d(TAG, "Start waiting, waitingTime is $waitingTimeMillis") + val isTimeout = + withTimeoutOrNull(waitingTimeMillis) { + SubscriptionRepository(context) + .isSubscriptionEnabledFlow(onboardingService.targetSubId) + .firstOrNull { it } + } == null + Log.d( + TAG, + if (isTimeout) "Sim is not ready after timeout" else "Sim is ready then go to next", + ) callbackListener(CallbackType.CALLBACK_SETUP_NAME) } }