Loading src/java/com/android/internal/telephony/uicc/UiccController.java +22 −7 Original line number Diff line number Diff line Loading @@ -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"); Loading tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -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()); } } Loading
src/java/com/android/internal/telephony/uicc/UiccController.java +22 −7 Original line number Diff line number Diff line Loading @@ -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"); Loading
tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -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()); } }