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 {