Loading src/java/com/android/internal/telephony/MultiSimSettingController.java +13 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.internal.telephony; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING; import static android.telephony.TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED; import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE; import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL; Loading Loading @@ -632,7 +633,9 @@ public class MultiSimSettingController extends Handler { if (hasData()) mSubscriptionManagerService.setDefaultDataSubId(subId); if (hasCalling()) mSubscriptionManagerService.setDefaultVoiceSubId(subId); if (hasMessaging()) mSubscriptionManagerService.setDefaultSmsSubId(subId); if (!mSubscriptionManagerService.isEsimBootStrapProvisioningActivated()) { sendDefaultSubConfirmedNotification(subId); } return; } Loading Loading @@ -685,7 +688,9 @@ public class MultiSimSettingController extends Handler { // Update mPrimarySubList. Opportunistic subscriptions can't be default // data / voice / sms subscription. List<Integer> prevPrimarySubList = mPrimarySubList; mPrimarySubList = activeSubList.stream().filter(info -> !info.isOpportunistic()) mPrimarySubList = activeSubList.stream() .filter(info -> !info.isOpportunistic()) .filter(info -> info.getProfileClass() != PROFILE_CLASS_PROVISIONING) .map(info -> info.getSubscriptionId()) .collect(Collectors.toList()); Loading Loading @@ -751,6 +756,12 @@ public class MultiSimSettingController extends Handler { private void sendSubChangeNotificationIfNeeded(int change, boolean dataSelected, boolean voiceSelected, boolean smsSelected) { if (mSubscriptionManagerService.isEsimBootStrapProvisioningActivated()) { log("esim bootstrap activation in progress, skip notification"); return; } @TelephonyManager.DefaultSubscriptionSelectType int simSelectDialogType = getSimSelectDialogType( change, dataSelected, voiceSelected, smsSelected); Loading src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java +37 −0 Original line number Diff line number Diff line Loading @@ -4421,6 +4421,43 @@ public class SubscriptionManagerService extends ISub.Stub { Collectors.toList()); } /** * checks whether esim bootstrap is activated for any of the available active subscription info * list. * * @return {@code true} if esim bootstrap is activated for any of the active subscription, * else {@code false} * */ public boolean isEsimBootStrapProvisioningActivated() { if (!mFeatureFlags.esimBootstrapProvisioningFlag()) { return false; } List<SubscriptionInfo> activeSubInfos = getActiveSubscriptionInfoList(mContext.getOpPackageName(), mContext.getAttributionTag(), true/*isForAllProfile*/); return activeSubInfos.stream().anyMatch(subInfo -> subInfo != null && subInfo.getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING); } /** * checks whether esim bootstrap is activated for the subscription. * * @return {@code true} if esim bootstrap is activated for sub id else {@code false} * */ public boolean isEsimBootStrapProvisioningActiveForSubId(int subId) { if (!mFeatureFlags.esimBootstrapProvisioningFlag()) { return false; } SubscriptionInfoInternal subInfo = getSubscriptionInfoInternal(subId); return subInfo != null && subInfo.getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING; } /** * Get the current calling package name. * @return the current calling package name Loading tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -1007,4 +1007,57 @@ public class MultiSimSettingControllerTest extends TelephonyTest { // Default data is set to sub1 verify(mSubscriptionManagerService).syncGroupedSetting(1); } @Test public void testDailogsAndWarnings_WithBootstrapSim() { doReturn(true).when(mFeatureFlags).esimBootstrapProvisioningFlag(); // Mark sub 2 as inactive. markSubscriptionInactive(2); mMultiSimSettingControllerUT.notifyAllSubscriptionLoaded(); sendCarrierConfigChanged(0, 1); processAllMessages(); // Sub 1 should be default sub silently. verify(mSubscriptionManagerService).setDefaultDataSubId(1); verify(mSubscriptionManagerService).setDefaultVoiceSubId(1); verify(mSubscriptionManagerService).setDefaultSmsSubId(1); verifyDismissIntentSent(); // Mark sub 2 bootstrap sim as active in phone[1]. doReturn(true).when(mSubscriptionManagerService).isEsimBootStrapProvisioningActivated(); setSimSlotIndex(2, 1); clearInvocations(mSubscriptionManagerService); clearInvocations(mContext); mSubInfo[2] = new SubscriptionInfoInternal.Builder().setId(2).setSimSlotIndex(1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build(); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(1, 2); processAllMessages(); // Taking out SIM 1. clearInvocations(mSubscriptionManagerService); markSubscriptionInactive(1/*subid*/); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(0/*phoneid*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID); processAllMessages(); // No user selection needed, no intent should be sent for notification verify(mContext, never()).sendBroadcast(any()); //Insert back sim1 and switch from sub 1 to sub 3 in phone[0]. clearInvocations(mSubscriptionManagerService); markSubscriptionInactive(1); setSimSlotIndex(3, 0); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(0/*phoneid*/, 3/*subid*/); processAllMessages(); // Sub 3 should be default sub. verify(mSubscriptionManagerService).setDefaultDataSubId(3); verify(mSubscriptionManagerService).setDefaultVoiceSubId(3); verify(mSubscriptionManagerService).setDefaultSmsSubId(3); verify(mContext, never()).sendBroadcast(any()); } } Loading
src/java/com/android/internal/telephony/MultiSimSettingController.java +13 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.internal.telephony; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING; import static android.telephony.TelephonyManager.ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED; import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE; import static android.telephony.TelephonyManager.EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL; Loading Loading @@ -632,7 +633,9 @@ public class MultiSimSettingController extends Handler { if (hasData()) mSubscriptionManagerService.setDefaultDataSubId(subId); if (hasCalling()) mSubscriptionManagerService.setDefaultVoiceSubId(subId); if (hasMessaging()) mSubscriptionManagerService.setDefaultSmsSubId(subId); if (!mSubscriptionManagerService.isEsimBootStrapProvisioningActivated()) { sendDefaultSubConfirmedNotification(subId); } return; } Loading Loading @@ -685,7 +688,9 @@ public class MultiSimSettingController extends Handler { // Update mPrimarySubList. Opportunistic subscriptions can't be default // data / voice / sms subscription. List<Integer> prevPrimarySubList = mPrimarySubList; mPrimarySubList = activeSubList.stream().filter(info -> !info.isOpportunistic()) mPrimarySubList = activeSubList.stream() .filter(info -> !info.isOpportunistic()) .filter(info -> info.getProfileClass() != PROFILE_CLASS_PROVISIONING) .map(info -> info.getSubscriptionId()) .collect(Collectors.toList()); Loading Loading @@ -751,6 +756,12 @@ public class MultiSimSettingController extends Handler { private void sendSubChangeNotificationIfNeeded(int change, boolean dataSelected, boolean voiceSelected, boolean smsSelected) { if (mSubscriptionManagerService.isEsimBootStrapProvisioningActivated()) { log("esim bootstrap activation in progress, skip notification"); return; } @TelephonyManager.DefaultSubscriptionSelectType int simSelectDialogType = getSimSelectDialogType( change, dataSelected, voiceSelected, smsSelected); Loading
src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java +37 −0 Original line number Diff line number Diff line Loading @@ -4421,6 +4421,43 @@ public class SubscriptionManagerService extends ISub.Stub { Collectors.toList()); } /** * checks whether esim bootstrap is activated for any of the available active subscription info * list. * * @return {@code true} if esim bootstrap is activated for any of the active subscription, * else {@code false} * */ public boolean isEsimBootStrapProvisioningActivated() { if (!mFeatureFlags.esimBootstrapProvisioningFlag()) { return false; } List<SubscriptionInfo> activeSubInfos = getActiveSubscriptionInfoList(mContext.getOpPackageName(), mContext.getAttributionTag(), true/*isForAllProfile*/); return activeSubInfos.stream().anyMatch(subInfo -> subInfo != null && subInfo.getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING); } /** * checks whether esim bootstrap is activated for the subscription. * * @return {@code true} if esim bootstrap is activated for sub id else {@code false} * */ public boolean isEsimBootStrapProvisioningActiveForSubId(int subId) { if (!mFeatureFlags.esimBootstrapProvisioningFlag()) { return false; } SubscriptionInfoInternal subInfo = getSubscriptionInfoInternal(subId); return subInfo != null && subInfo.getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING; } /** * Get the current calling package name. * @return the current calling package name Loading
tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -1007,4 +1007,57 @@ public class MultiSimSettingControllerTest extends TelephonyTest { // Default data is set to sub1 verify(mSubscriptionManagerService).syncGroupedSetting(1); } @Test public void testDailogsAndWarnings_WithBootstrapSim() { doReturn(true).when(mFeatureFlags).esimBootstrapProvisioningFlag(); // Mark sub 2 as inactive. markSubscriptionInactive(2); mMultiSimSettingControllerUT.notifyAllSubscriptionLoaded(); sendCarrierConfigChanged(0, 1); processAllMessages(); // Sub 1 should be default sub silently. verify(mSubscriptionManagerService).setDefaultDataSubId(1); verify(mSubscriptionManagerService).setDefaultVoiceSubId(1); verify(mSubscriptionManagerService).setDefaultSmsSubId(1); verifyDismissIntentSent(); // Mark sub 2 bootstrap sim as active in phone[1]. doReturn(true).when(mSubscriptionManagerService).isEsimBootStrapProvisioningActivated(); setSimSlotIndex(2, 1); clearInvocations(mSubscriptionManagerService); clearInvocations(mContext); mSubInfo[2] = new SubscriptionInfoInternal.Builder().setId(2).setSimSlotIndex(1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING).build(); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(1, 2); processAllMessages(); // Taking out SIM 1. clearInvocations(mSubscriptionManagerService); markSubscriptionInactive(1/*subid*/); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(0/*phoneid*/, SubscriptionManager.INVALID_SUBSCRIPTION_ID); processAllMessages(); // No user selection needed, no intent should be sent for notification verify(mContext, never()).sendBroadcast(any()); //Insert back sim1 and switch from sub 1 to sub 3 in phone[0]. clearInvocations(mSubscriptionManagerService); markSubscriptionInactive(1); setSimSlotIndex(3, 0); mMultiSimSettingControllerUT.notifySubscriptionInfoChanged(); sendCarrierConfigChanged(0/*phoneid*/, 3/*subid*/); processAllMessages(); // Sub 3 should be default sub. verify(mSubscriptionManagerService).setDefaultDataSubId(3); verify(mSubscriptionManagerService).setDefaultVoiceSubId(3); verify(mSubscriptionManagerService).setDefaultSmsSubId(3); verify(mContext, never()).sendBroadcast(any()); } }