Loading src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java +30 −1 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import android.app.PendingIntent; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Binder; Loading Loading @@ -528,6 +530,13 @@ public class SubscriptionManagerService extends ISub.Stub { } }); mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateEmbeddedSubscriptions(); } }, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); SubscriptionManager.invalidateSubscriptionManagerServiceCaches(); SubscriptionManager.invalidateSubscriptionManagerServiceEnabledCaches(); } Loading Loading @@ -960,7 +969,7 @@ public class SubscriptionManagerService extends ISub.Stub { for (int cardId : cardIds) { GetEuiccProfileInfoListResult result = mEuiccController .blockingGetEuiccProfileInfoList(cardId); log("updateEmbeddedSubscriptions: cardId=" + cardId + ", result=" + result); logl("updateEmbeddedSubscriptions: cardId=" + cardId + ", result=" + result); if (result.getResult() != EuiccService.RESULT_OK) { loge("Failed to get euicc profile info. result=" Loading Loading @@ -1047,6 +1056,26 @@ public class SubscriptionManagerService extends ISub.Stub { } } /** * Update embedded subscriptions from {@link EuiccController}. */ private void updateEmbeddedSubscriptions() { UiccSlot[] uiccSlots = mUiccController.getUiccSlots(); if (uiccSlots != null) { List<Integer> cardIds = new ArrayList<>(); for (UiccSlot uiccSlot : uiccSlots) { if (uiccSlot != null && uiccSlot.isEuicc() && uiccSlot.getUiccCard() != null) { int cardId = mUiccController.convertToPublicCardId( uiccSlot.getUiccCard().getCardId()); cardIds.add(cardId); } } if (!cardIds.isEmpty()) { updateEmbeddedSubscriptions(cardIds, null); } } } /** * Check if the SIM application is enabled on the card or not. * Loading tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java +52 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,8 @@ import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.euicc.EuiccController; import com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.SubscriptionProvider; import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionManagerServiceCallback; import com.android.internal.telephony.uicc.UiccCard; import com.android.internal.telephony.uicc.UiccSlot; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; Loading Loading @@ -128,6 +130,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { // mocked private SubscriptionManagerServiceCallback mMockedSubscriptionManagerServiceCallback; private EuiccController mEuiccController; private UiccSlot mUiccSlot; private UiccCard mUiccCard; @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); Loading @@ -146,8 +150,13 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { doReturn(true).when(mTelephonyManager).isVoiceCapable(); mEuiccController = Mockito.mock(EuiccController.class); replaceInstance(EuiccController.class, "sInstance", null, mEuiccController); mUiccSlot = Mockito.mock(UiccSlot.class); mUiccCard = Mockito.mock(UiccCard.class); mMockedSubscriptionManagerServiceCallback = Mockito.mock( SubscriptionManagerServiceCallback.class); doReturn(mUiccCard).when(mUiccSlot).getUiccCard(); doReturn(FAKE_ICCID1).when(mUiccCard).getCardId(); ((MockContentResolver) mContext.getContentResolver()).addProvider( Telephony.Carriers.CONTENT_URI.getAuthority(), mSubscriptionProvider); mSubscriptionManagerServiceUT = new SubscriptionManagerService(mContext, Looper.myLooper()); Loading Loading @@ -1694,4 +1703,47 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { assertThat(mSubscriptionManagerServiceUT.getAllSubInfoList( CALLING_PACKAGE, CALLING_FEATURE).isEmpty()).isTrue(); } @Test public void testUserUnlockUpdateEmbeddedSubscriptions() { doReturn(true).when(mUiccSlot).isEuicc(); doReturn(1).when(mUiccController).convertToPublicCardId(FAKE_ICCID1); doReturn(new UiccSlot[]{mUiccSlot}).when(mUiccController).getUiccSlots(); EuiccProfileInfo profileInfo1 = new EuiccProfileInfo.Builder(FAKE_ICCID1) .setIccid(FAKE_ICCID1) .setNickname(FAKE_CARRIER_NAME1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL) .setCarrierIdentifier(new CarrierIdentifier(FAKE_MCC1, FAKE_MNC1, null, null, null, null, FAKE_CARRIER_ID1, FAKE_CARRIER_ID1)) .setUiccAccessRule(Arrays.asList(UiccAccessRule.decodeRules( FAKE_NATIVE_ACCESS_RULES1))) .build(); GetEuiccProfileInfoListResult result = new GetEuiccProfileInfoListResult( EuiccService.RESULT_OK, new EuiccProfileInfo[]{profileInfo1}, false); doReturn(result).when(mEuiccController).blockingGetEuiccProfileInfoList(eq(1)); doReturn(FAKE_ICCID1).when(mUiccController).convertToCardString(eq(1)); mContext.sendBroadcast(new Intent(Intent.ACTION_USER_UNLOCKED)); processAllMessages(); verify(mEuiccController).blockingGetEuiccProfileInfoList(eq(1)); SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT .getSubscriptionInfoInternal(1); assertThat(subInfo.getSubscriptionId()).isEqualTo(1); assertThat(subInfo.getSimSlotIndex()).isEqualTo(SubscriptionManager.INVALID_SIM_SLOT_INDEX); assertThat(subInfo.getIccId()).isEqualTo(FAKE_ICCID1); assertThat(subInfo.getDisplayName()).isEqualTo(FAKE_CARRIER_NAME1); assertThat(subInfo.getDisplayNameSource()).isEqualTo( SubscriptionManager.NAME_SOURCE_CARRIER); assertThat(subInfo.getMcc()).isEqualTo(FAKE_MCC1); assertThat(subInfo.getMnc()).isEqualTo(FAKE_MNC1); assertThat(subInfo.getProfileClass()).isEqualTo( SubscriptionManager.PROFILE_CLASS_OPERATIONAL); assertThat(subInfo.isEmbedded()).isTrue(); assertThat(subInfo.isRemovableEmbedded()).isFalse(); assertThat(subInfo.getNativeAccessRules()).isEqualTo(FAKE_NATIVE_ACCESS_RULES1); } } Loading
src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java +30 −1 Original line number Diff line number Diff line Loading @@ -27,8 +27,10 @@ import android.app.PendingIntent; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Binder; Loading Loading @@ -528,6 +530,13 @@ public class SubscriptionManagerService extends ISub.Stub { } }); mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateEmbeddedSubscriptions(); } }, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); SubscriptionManager.invalidateSubscriptionManagerServiceCaches(); SubscriptionManager.invalidateSubscriptionManagerServiceEnabledCaches(); } Loading Loading @@ -960,7 +969,7 @@ public class SubscriptionManagerService extends ISub.Stub { for (int cardId : cardIds) { GetEuiccProfileInfoListResult result = mEuiccController .blockingGetEuiccProfileInfoList(cardId); log("updateEmbeddedSubscriptions: cardId=" + cardId + ", result=" + result); logl("updateEmbeddedSubscriptions: cardId=" + cardId + ", result=" + result); if (result.getResult() != EuiccService.RESULT_OK) { loge("Failed to get euicc profile info. result=" Loading Loading @@ -1047,6 +1056,26 @@ public class SubscriptionManagerService extends ISub.Stub { } } /** * Update embedded subscriptions from {@link EuiccController}. */ private void updateEmbeddedSubscriptions() { UiccSlot[] uiccSlots = mUiccController.getUiccSlots(); if (uiccSlots != null) { List<Integer> cardIds = new ArrayList<>(); for (UiccSlot uiccSlot : uiccSlots) { if (uiccSlot != null && uiccSlot.isEuicc() && uiccSlot.getUiccCard() != null) { int cardId = mUiccController.convertToPublicCardId( uiccSlot.getUiccCard().getCardId()); cardIds.add(cardId); } } if (!cardIds.isEmpty()) { updateEmbeddedSubscriptions(cardIds, null); } } } /** * Check if the SIM application is enabled on the card or not. * Loading
tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java +52 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,8 @@ import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.euicc.EuiccController; import com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.SubscriptionProvider; import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionManagerServiceCallback; import com.android.internal.telephony.uicc.UiccCard; import com.android.internal.telephony.uicc.UiccSlot; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; Loading Loading @@ -128,6 +130,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { // mocked private SubscriptionManagerServiceCallback mMockedSubscriptionManagerServiceCallback; private EuiccController mEuiccController; private UiccSlot mUiccSlot; private UiccCard mUiccCard; @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); Loading @@ -146,8 +150,13 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { doReturn(true).when(mTelephonyManager).isVoiceCapable(); mEuiccController = Mockito.mock(EuiccController.class); replaceInstance(EuiccController.class, "sInstance", null, mEuiccController); mUiccSlot = Mockito.mock(UiccSlot.class); mUiccCard = Mockito.mock(UiccCard.class); mMockedSubscriptionManagerServiceCallback = Mockito.mock( SubscriptionManagerServiceCallback.class); doReturn(mUiccCard).when(mUiccSlot).getUiccCard(); doReturn(FAKE_ICCID1).when(mUiccCard).getCardId(); ((MockContentResolver) mContext.getContentResolver()).addProvider( Telephony.Carriers.CONTENT_URI.getAuthority(), mSubscriptionProvider); mSubscriptionManagerServiceUT = new SubscriptionManagerService(mContext, Looper.myLooper()); Loading Loading @@ -1694,4 +1703,47 @@ public class SubscriptionManagerServiceTest extends TelephonyTest { assertThat(mSubscriptionManagerServiceUT.getAllSubInfoList( CALLING_PACKAGE, CALLING_FEATURE).isEmpty()).isTrue(); } @Test public void testUserUnlockUpdateEmbeddedSubscriptions() { doReturn(true).when(mUiccSlot).isEuicc(); doReturn(1).when(mUiccController).convertToPublicCardId(FAKE_ICCID1); doReturn(new UiccSlot[]{mUiccSlot}).when(mUiccController).getUiccSlots(); EuiccProfileInfo profileInfo1 = new EuiccProfileInfo.Builder(FAKE_ICCID1) .setIccid(FAKE_ICCID1) .setNickname(FAKE_CARRIER_NAME1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL) .setCarrierIdentifier(new CarrierIdentifier(FAKE_MCC1, FAKE_MNC1, null, null, null, null, FAKE_CARRIER_ID1, FAKE_CARRIER_ID1)) .setUiccAccessRule(Arrays.asList(UiccAccessRule.decodeRules( FAKE_NATIVE_ACCESS_RULES1))) .build(); GetEuiccProfileInfoListResult result = new GetEuiccProfileInfoListResult( EuiccService.RESULT_OK, new EuiccProfileInfo[]{profileInfo1}, false); doReturn(result).when(mEuiccController).blockingGetEuiccProfileInfoList(eq(1)); doReturn(FAKE_ICCID1).when(mUiccController).convertToCardString(eq(1)); mContext.sendBroadcast(new Intent(Intent.ACTION_USER_UNLOCKED)); processAllMessages(); verify(mEuiccController).blockingGetEuiccProfileInfoList(eq(1)); SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT .getSubscriptionInfoInternal(1); assertThat(subInfo.getSubscriptionId()).isEqualTo(1); assertThat(subInfo.getSimSlotIndex()).isEqualTo(SubscriptionManager.INVALID_SIM_SLOT_INDEX); assertThat(subInfo.getIccId()).isEqualTo(FAKE_ICCID1); assertThat(subInfo.getDisplayName()).isEqualTo(FAKE_CARRIER_NAME1); assertThat(subInfo.getDisplayNameSource()).isEqualTo( SubscriptionManager.NAME_SOURCE_CARRIER); assertThat(subInfo.getMcc()).isEqualTo(FAKE_MCC1); assertThat(subInfo.getMnc()).isEqualTo(FAKE_MNC1); assertThat(subInfo.getProfileClass()).isEqualTo( SubscriptionManager.PROFILE_CLASS_OPERATIONAL); assertThat(subInfo.isEmbedded()).isTrue(); assertThat(subInfo.isRemovableEmbedded()).isFalse(); assertThat(subInfo.getNativeAccessRules()).isEqualTo(FAKE_NATIVE_ACCESS_RULES1); } }