From 98efa5168104fd19c82128d1413176f9a48ef7af Mon Sep 17 00:00:00 2001 From: songferngwang Date: Tue, 28 May 2024 06:31:46 +0000 Subject: [PATCH] The pages of sim onboarding flow is wrong. Switch from SS mode to DSDS mode, the esim status will use the last status. It causes the condition of page selection is wrong. Bug: 342972402 Test: atest SimOnboardingPageProviderTest Change-Id: I8bb0b5f2802ec24f10467bac179ce54d13a9755e --- .../settings/network/SimOnboardingActivity.kt | 5 ++ .../settings/network/SimOnboardingService.kt | 53 ++++++++++++------- .../spa/network/SimOnboardingPageProvider.kt | 3 +- .../network/SimOnboardingPageProviderTest.kt | 1 + 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt index 481dc205f70..3a210493785 100644 --- a/src/com/android/settings/network/SimOnboardingActivity.kt +++ b/src/com/android/settings/network/SimOnboardingActivity.kt @@ -401,6 +401,11 @@ class SimOnboardingActivity : SpaBaseDialogActivity() { Log.d(TAG, "startSimSwitching:") var targetSubInfo = onboardingService.targetSubInfo + if(onboardingService.doesTargetSimActive) { + Log.d(TAG, "target subInfo is already active") + callbackListener(CallbackType.CALLBACK_SETUP_NAME) + return + } targetSubInfo?.let { var removedSubInfo = onboardingService.getRemovedSim() if (targetSubInfo.isEmbedded) { diff --git a/src/com/android/settings/network/SimOnboardingService.kt b/src/com/android/settings/network/SimOnboardingService.kt index b7df7548f69..f6c6065e40d 100644 --- a/src/com/android/settings/network/SimOnboardingService.kt +++ b/src/com/android/settings/network/SimOnboardingService.kt @@ -16,6 +16,9 @@ package com.android.settings.network +import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID +import android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX + import android.content.Context import android.telephony.SubscriptionInfo import android.telephony.SubscriptionManager @@ -40,26 +43,26 @@ class SimOnboardingService { var subscriptionManager:SubscriptionManager? = null var telephonyManager:TelephonyManager? = null - var targetSubId: Int = INVALID + var targetSubId: Int = INVALID_SUBSCRIPTION_ID var targetSubInfo: SubscriptionInfo? = null var availableSubInfoList: List = listOf() var activeSubInfoList: List = listOf() var slotInfoList: List = listOf() var uiccCardInfoList: List = listOf() - var targetPrimarySimCalls: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID - var targetPrimarySimTexts: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID - var targetPrimarySimMobileData: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID + var targetPrimarySimCalls: Int = INVALID_SUBSCRIPTION_ID + var targetPrimarySimTexts: Int = INVALID_SUBSCRIPTION_ID + var targetPrimarySimMobileData: Int = INVALID_SUBSCRIPTION_ID val targetPrimarySimAutoDataSwitch = MutableStateFlow(false) - var targetNonDds: Int = SubscriptionManager.INVALID_SUBSCRIPTION_ID + var targetNonDds: Int = INVALID_SUBSCRIPTION_ID get() { - if(targetPrimarySimMobileData == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if(targetPrimarySimMobileData == INVALID_SUBSCRIPTION_ID) { Log.w(TAG, "No DDS") - return SubscriptionManager.INVALID_SUBSCRIPTION_ID + return INVALID_SUBSCRIPTION_ID } return userSelectedSubInfoList .filter { info -> info.subscriptionId != targetPrimarySimMobileData } .map { it.subscriptionId } - .firstOrNull() ?: SubscriptionManager.INVALID_SUBSCRIPTION_ID + .firstOrNull() ?: INVALID_SUBSCRIPTION_ID } var callback: (CallbackType) -> Unit = {} @@ -84,6 +87,11 @@ class SimOnboardingService { activeSubInfoList.stream().anyMatch { it.isEmbedded } return false } + var doesTargetSimActive = false + get() { + return targetSubInfo?.getSimSlotIndex() ?: INVALID_SIM_SLOT_INDEX >= 0 + } + var doesTargetSimHaveEsimOperation = false get() { return targetSubInfo?.isEmbedded ?: false @@ -95,7 +103,7 @@ class SimOnboardingService { } var getActiveModemCount = 0 get() { - return telephonyManager?.getActiveModemCount() ?: 0 + return (telephonyManager?.getActiveModemCount() ?: 0) } var renameMutableMap : MutableMap = mutableMapOf() @@ -103,16 +111,18 @@ class SimOnboardingService { var isSimSelectionFinished = false get() { - return getActiveModemCount != 0 && userSelectedSubInfoList.size == getActiveModemCount + val activeModem = getActiveModemCount + return activeModem != 0 && userSelectedSubInfoList.size == activeModem } var isAllOfSlotAssigned = false get() { - if(getActiveModemCount == 0){ + val activeModem = getActiveModemCount + if(activeModem == 0){ Log.e(TAG, "isAllOfSlotAssigned: getActiveModemCount is 0") return true } - return getActiveModemCount != 0 && activeSubInfoList.size == getActiveModemCount + return getActiveModemCount != 0 && activeSubInfoList.size == activeModem } var isMultiSimEnabled = false get() { @@ -129,7 +139,7 @@ class SimOnboardingService { } fun isValid(): Boolean { - return targetSubId != INVALID + return targetSubId != INVALID_SUBSCRIPTION_ID && targetSubInfo != null && activeSubInfoList.isNotEmpty() && slotInfoList.isNotEmpty() @@ -156,14 +166,15 @@ class SimOnboardingService { fun initData(inputTargetSubId: Int, context: Context, callback: (CallbackType) -> Unit) { + clear() this.callback = callback targetSubId = inputTargetSubId subscriptionManager = context.getSystemService(SubscriptionManager::class.java) telephonyManager = context.getSystemService(TelephonyManager::class.java) + activeSubInfoList = SubscriptionUtil.getActiveSubscriptions(subscriptionManager) Log.d( TAG, "startInit: targetSubId:$targetSubId, activeSubInfoList: $activeSubInfoList" ) - activeSubInfoList = SubscriptionUtil.getActiveSubscriptions(subscriptionManager) ThreadUtils.postOnBackgroundThread { availableSubInfoList = SubscriptionUtil.getAvailableSubscriptions(context) @@ -242,14 +253,19 @@ class SimOnboardingService { fun addCurrentItemForSelectedSim() { if (userSelectedSubInfoList.size < getActiveModemCount) { - userSelectedSubInfoList.addAll(activeSubInfoList) - Log.d(TAG, "addCurrentItemForSelectedSim: userSelectedSubInfoList:" + - ", $userSelectedSubInfoList") + userSelectedSubInfoList.addAll( + activeSubInfoList.filter { !userSelectedSubInfoList.contains(it) } + ) + Log.d(TAG, + "addCurrentItemForSelectedSim: userSelectedSubInfoList: $userSelectedSubInfoList" + ) } } fun addItemForSelectedSim(selectedSubInfo: SubscriptionInfo) { - userSelectedSubInfoList.add(selectedSubInfo) + if (!userSelectedSubInfoList.contains(selectedSubInfo)) { + userSelectedSubInfoList.add(selectedSubInfo) + } } fun removeItemForSelectedSim(selectedSubInfo: SubscriptionInfo) { @@ -370,7 +386,6 @@ class SimOnboardingService { companion object{ private const val TAG = "SimOnboardingService" - private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID const val NUM_OF_SIMS_FOR_DSDS = 2 } } \ No newline at end of file diff --git a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt index fab9c12e8ac..028b50ddce2 100644 --- a/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt +++ b/src/com/android/settings/spa/network/SimOnboardingPageProvider.kt @@ -107,7 +107,8 @@ fun PageImpl(onboardingService:SimOnboardingService,navHostController: NavHostCo composable(route = SimOnboardingScreen.LabelSim.name) { val nextPage = if (onboardingService.isMultipleEnabledProfilesSupported - && onboardingService.isAllOfSlotAssigned) { + && onboardingService.isAllOfSlotAssigned + && !onboardingService.doesTargetSimActive) { SimOnboardingScreen.SelectSim.name } else { LaunchedEffect(Unit) { diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt index d1847c8d48f..1395ed4b373 100644 --- a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingPageProviderTest.kt @@ -91,6 +91,7 @@ class SimOnboardingPageProviderTest { mockSimOnboardingService.stub { on { isMultipleEnabledProfilesSupported }.thenReturn(true) on { isAllOfSlotAssigned }.thenReturn(true) + on { doesTargetSimActive }.thenReturn(false) } composeTestRule.setContent {