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

Commit 9109c269 authored by Jordan Liu's avatar Jordan Liu
Browse files

Use known EID in IccCardStatus update

If the EID is known in IccCardStatus update, use it to set
mDefaultEuiccCardId. This is needed in cases where slot status doesn't
include EID and we don't want to register for EID from APDU because we
already know it from ap revious APDU

Bug: 147230215
Test: manual and UiccControllerTest
Change-Id: I34f40309a5d0bb5e4450d260782aa3ddf0d0d80d
parent 032d415f
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -696,15 +696,30 @@ public class UiccController extends Handler {
            cardString = card.getIccId();
        }

        // EID may be unpopulated if RadioConfig<1.2
        if (cardString != null) {
            addCardId(cardString);
        }

        // EID is unpopulated if Radio HAL < 1.4 (RadioConfig < 1.2)
        // If so, just register for EID loaded and skip this stuff
        if (isEuicc && cardString == null
                && mDefaultEuiccCardId != UNSUPPORTED_CARD_ID) {
        if (isEuicc && mDefaultEuiccCardId != UNSUPPORTED_CARD_ID) {
            if (cardString == null) {
                ((EuiccCard) card).registerForEidReady(this, EVENT_EID_READY, index);
            } else {
                // If we know the EID from IccCardStatus, just use it to set mDefaultEuiccCardId if
                // it's not already set.
                // This is needed in cases where slot status doesn't include EID, and we don't want
                // to register for EID from APDU because we already know cardString from a previous
                // APDU
                if (mDefaultEuiccCardId == UNINITIALIZED_CARD_ID
                        || mDefaultEuiccCardId == TEMPORARILY_UNSUPPORTED_CARD_ID) {
                    mDefaultEuiccCardId = convertToPublicCardId(cardString);
                    String logStr = "IccCardStatus eid=" + cardString + " slot=" + slotId
                            + " mDefaultEuiccCardId=" + mDefaultEuiccCardId;
                    sLocalLog.log(logStr);
                    log(logStr);
                }
            }

        if (cardString != null) {
            addCardId(cardString);
        }

        if (DBG) log("Notifying IccChangedRegistrants");
+38 −0
Original line number Diff line number Diff line
@@ -593,4 +593,42 @@ public class UiccControllerTest extends TelephonyTest {
        assertEquals(mUiccControllerUT.convertToPublicCardId(eidForRemovableEuicc),
                mUiccControllerUT.getCardIdForDefaultEuicc());
    }

    /**
     * When IccCardStatus is received, if the EID is known from previous APDU, use it to set the
     * mDefaultEuiccCardId.
     */
    @Test
    public void testEidFromPreviousApduSetsDefaultEuicc() {
        // Give UiccController a real context so it can use shared preferences
        mUiccControllerUT.mContext = InstrumentationRegistry.getContext();

        // Mock out UiccSlots
        mUiccControllerUT.mUiccSlots[0] = mMockSlot;
        doReturn(true).when(mMockSlot).isEuicc();
        doReturn(null).when(mMockSlot).getUiccCard();
        doReturn("123451234567890").when(mMockSlot).getIccId();
        doReturn(false).when(mMockSlot).isRemovable();

        // If APDU has already happened, the EuiccCard already knows EID
        String knownEidFromApdu = "A1B2C3D4E5";
        doReturn(mMockEuiccCard).when(mMockSlot).getUiccCard();
        doReturn(knownEidFromApdu).when(mMockEuiccCard).getEid();

        // simulate card status loaded so that the UiccController sets the card ID
        IccCardStatus ics = new IccCardStatus();
        ics.setCardState(1 /* present */);
        ics.setUniversalPinState(3 /* disabled */);
        ics.atr = "abcdef0123456789abcdef";
        ics.iccid = "123451234567890";
        // the IccCardStatus does not contain EID, but it is known from previous APDU
        ics.eid = null;
        AsyncResult ar = new AsyncResult(null, ics, null);
        Message msg = Message.obtain(mUiccControllerUT, EVENT_GET_ICC_STATUS_DONE, ar);
        mUiccControllerUT.handleMessage(msg);

        // since EID is known and we've gotten card status, the default eUICC card ID should be set
        assertEquals(mUiccControllerUT.convertToPublicCardId(knownEidFromApdu),
                mUiccControllerUT.getCardIdForDefaultEuicc());
    }
}