Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f8be069 authored by Jack Yu's avatar Jack Yu
Browse files

Query embedded subscriptions after user unlock

Migrated the old code from SubscriptionInfoUpdater
to SubscriptionManagerService. There is no logic change.

Fix: 267124129
Test: Basic telephony testing + atest SubscriptionManagerServiceTest
Merged-In: If6b4685f3453f0cdcdf61f5d32a45740af28587f
Change-Id: If6b4685f3453f0cdcdf61f5d32a45740af28587f
parent dc3e3b02
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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();
    }
@@ -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="
@@ -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.
     *
+52 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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();
@@ -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());
@@ -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);
    }
}