Loading src/java/com/android/internal/telephony/metrics/MetricsCollector.java +2 −2 Original line number Diff line number Diff line Loading @@ -666,8 +666,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { perSimStatus.dataRoamingEnabled, // dataRoamingEnabled perSimStatus.preferredNetworkType, // allowedNetworksByUser perSimStatus.disabled2g, // is2gDisabled false, // TODO(b/215758472): isPin1Enabled 0); // TODO(b/215758472): simVoltageClass perSimStatus.pin1Enabled, // isPin1Enabled perSimStatus.minimumVoltageClass); // simVoltageClass data.add(statsEvent); result = StatsManager.PULL_SUCCESS; } Loading src/java/com/android/internal/telephony/metrics/PerSimStatus.java +36 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,10 @@ import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_IMS; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_UICC; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_C; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__CELLULAR_PREFERRED; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__WIFI_ONLY; Loading @@ -33,8 +37,11 @@ import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; import android.text.TextUtils; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.Phone; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.uicc.UiccSlot; import java.util.Optional; Loading @@ -59,6 +66,8 @@ public class PerSimStatus { public final boolean dataRoamingEnabled; public final long preferredNetworkType; public final boolean disabled2g; public final boolean pin1Enabled; public final int minimumVoltageClass; /** Returns the current sim status of the given {@link Phone}. */ @Nullable Loading @@ -66,6 +75,7 @@ public class PerSimStatus { int[] numberState = getNumberState(phone); if (numberState == null) return null; ImsMmTelManager imsMmTelManager = getImsMmTelManager(phone); IccCard iccCard = phone.getIccCard(); return new PerSimStatus( phone.getCarrierId(), numberState[0], Loading @@ -82,7 +92,9 @@ public class PerSimStatus { imsMmTelManager == null ? false : imsMmTelManager.isVtSettingEnabled(), phone.getDataRoamingEnabled(), phone.getAllowedNetworkTypes(TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER), is2gDisabled(phone)); is2gDisabled(phone), iccCard == null ? false : iccCard.getIccLockEnabled(), getMinimumVoltageClass(phone)); } private PerSimStatus( Loading @@ -97,7 +109,9 @@ public class PerSimStatus { boolean vtSettingEnabled, boolean dataRoamingEnabled, long preferredNetworkType, boolean disabled2g) { boolean disabled2g, boolean pin1Enabled, int minimumVoltageClass) { this.carrierId = carrierId; this.phoneNumberSourceUicc = phoneNumberSourceUicc; this.phoneNumberSourceCarrier = phoneNumberSourceCarrier; Loading @@ -110,6 +124,8 @@ public class PerSimStatus { this.dataRoamingEnabled = dataRoamingEnabled; this.preferredNetworkType = preferredNetworkType; this.disabled2g = disabled2g; this.pin1Enabled = pin1Enabled; this.minimumVoltageClass = minimumVoltageClass; } @Nullable Loading Loading @@ -196,4 +212,22 @@ public class PerSimStatus { return PER_SIM_STATUS__WFC_MODE__UNKNOWN; } } /** Returns the minimum voltage class supported by the UICC. */ private static int getMinimumVoltageClass(Phone phone) { UiccSlot uiccSlot = UiccController.getInstance().getUiccSlotForPhone(phone.getPhoneId()); if (uiccSlot == null) { return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; } switch (uiccSlot.getMinimumVoltageClass()) { case UiccSlot.VOLTAGE_CLASS_A: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; case UiccSlot.VOLTAGE_CLASS_B: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; case UiccSlot.VOLTAGE_CLASS_C: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_C; default: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; } } } src/java/com/android/internal/telephony/uicc/UiccSlot.java +52 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony.uicc; import android.annotation.IntDef; import android.annotation.NonNull; import android.app.AlertDialog; import android.content.ActivityNotFoundException; Loading Loading @@ -43,9 +44,12 @@ import com.android.internal.telephony.uicc.IccCardStatus.CardState; import com.android.internal.telephony.uicc.euicc.EuiccCard; import com.android.telephony.Rlog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; Loading @@ -60,6 +64,17 @@ public class UiccSlot extends Handler { "com.android.internal.telephony.uicc.ICC_CARD_ADDED"; public static final int INVALID_PHONE_ID = -1; @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"VOLTAGE_CLASS_"}, value = {VOLTAGE_CLASS_UNKNOWN, VOLTAGE_CLASS_A, VOLTAGE_CLASS_B, VOLTAGE_CLASS_C}) public @interface VoltageClass {} public static final int VOLTAGE_CLASS_UNKNOWN = 0; public static final int VOLTAGE_CLASS_A = 1; public static final int VOLTAGE_CLASS_B = 2; public static final int VOLTAGE_CLASS_C = 3; private final Object mLock = new Object(); private boolean mActive; private boolean mStateIsUnknown = true; Loading @@ -67,6 +82,7 @@ public class UiccSlot extends Handler { private Context mContext; private UiccCard mUiccCard; private boolean mIsEuicc; private @VoltageClass int mMinimumVoltageClass; private String mEid; private AnswerToReset mAtr; private boolean mIsRemovable; Loading Loading @@ -357,15 +373,51 @@ public class UiccSlot extends Handler { log(" checkIsEuiccSupported : " + mIsEuicc); } private void checkMinimumVoltageClass() { mMinimumVoltageClass = VOLTAGE_CLASS_UNKNOWN; if (mAtr == null) { return; } // Supported voltage classes are stored in the 5 least significant bits of the TA byte for // global interface. List<AnswerToReset.InterfaceByte> interfaceBytes = mAtr.getInterfaceBytes(); for (int i = 0; i < interfaceBytes.size() - 1; i++) { if (interfaceBytes.get(i).getTD() != null && (interfaceBytes.get(i).getTD() & AnswerToReset.T_MASK) == AnswerToReset.T_VALUE_FOR_GLOBAL_INTERFACE && interfaceBytes.get(i + 1).getTA() != null) { byte ta = interfaceBytes.get(i + 1).getTA(); if ((ta & 0x01) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_A; } if ((ta & 0x02) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_B; } if ((ta & 0x04) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_C; } return; } } // Use default value - only class A mMinimumVoltageClass = VOLTAGE_CLASS_A; } private void parseAtr(String atr) { mAtr = AnswerToReset.parseAtr(atr); checkIsEuiccSupported(); checkMinimumVoltageClass(); } public boolean isEuicc() { return mIsEuicc; } @VoltageClass public int getMinimumVoltageClass() { return mMinimumVoltageClass; } public boolean isActive() { return mActive; } Loading tests/telephonytests/src/com/android/internal/telephony/metrics/PerSimStatusTest.java +94 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_IMS; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_UICC; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__CELLULAR_PREFERRED; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__WIFI_ONLY; Loading @@ -36,10 +39,12 @@ import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.uicc.UiccSlot; import org.junit.After; import org.junit.Before; Loading Loading @@ -103,7 +108,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard1 = mock(IccCard.class); doReturn(true).when(iccCard1).getIccLockEnabled(); doReturn(iccCard1).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); // phone 1 setup doReturn(mContext).when(mSecondPhone).getContext(); doReturn(1).when(mSecondPhone).getPhoneId(); Loading Loading @@ -136,6 +146,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mSecondPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard2 = mock(IccCard.class); doReturn(false).when(iccCard2).getIccLockEnabled(); doReturn(iccCard2).when(mSecondPhone).getIccCard(); UiccSlot uiccSlot2 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_B).when(uiccSlot2).getMinimumVoltageClass(); doReturn(uiccSlot2).when(mUiccController).getUiccSlotForPhone(1); PerSimStatus perSimStatus1 = PerSimStatus.getCurrentState(mPhone); PerSimStatus perSimStatus2 = PerSimStatus.getCurrentState(mSecondPhone); Loading @@ -154,6 +170,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus1.dataRoamingEnabled); assertEquals(1L, perSimStatus1.preferredNetworkType); assertEquals(true, perSimStatus1.disabled2g); assertEquals(true, perSimStatus1.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus1.minimumVoltageClass); assertEquals(101, perSimStatus2.carrierId); assertEquals(1, perSimStatus2.phoneNumberSourceUicc); assertEquals(2, perSimStatus2.phoneNumberSourceCarrier); Loading @@ -167,6 +187,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus2.dataRoamingEnabled); assertEquals(1L, perSimStatus2.preferredNetworkType); assertEquals(false, perSimStatus2.disabled2g); assertEquals(false, perSimStatus2.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B, perSimStatus2.minimumVoltageClass); } @Test Loading Loading @@ -203,7 +227,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); Loading @@ -219,6 +248,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus.minimumVoltageClass); } @Test Loading Loading @@ -247,6 +280,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); Loading @@ -262,5 +301,58 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus.minimumVoltageClass); } @Test @SmallTest public void onPullAtom_perSimStatus_noUiccSlot() throws Exception { doReturn(0).when(mPhone).getPhoneId(); doReturn(1).when(mPhone).getSubId(); doReturn(100).when(mPhone).getCarrierId(); doReturn("6506953210") .when(mSubscriptionController) .getPhoneNumber(1, PHONE_NUMBER_SOURCE_UICC); doReturn("").when(mSubscriptionController).getPhoneNumber(1, PHONE_NUMBER_SOURCE_CARRIER); doReturn("+16506953210") .when(mSubscriptionController) .getPhoneNumber(1, PHONE_NUMBER_SOURCE_IMS); SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class); doReturn("us").when(subscriptionInfo).getCountryIso(); doReturn(subscriptionInfo).when(mSubscriptionController).getSubscriptionInfo(1); doReturn(null).when(mContext).getSystemService(ImsManager.class); doReturn(1L) .when(mPhone) .getAllowedNetworkTypes(TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER); doReturn(0L) .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); doReturn(null).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); assertEquals(100, perSimStatus.carrierId); assertEquals(1, perSimStatus.phoneNumberSourceUicc); assertEquals(0, perSimStatus.phoneNumberSourceCarrier); assertEquals(1, perSimStatus.phoneNumberSourceIms); assertEquals(false, perSimStatus.advancedCallingSettingEnabled); assertEquals(false, perSimStatus.voWiFiSettingEnabled); assertEquals(PER_SIM_STATUS__WFC_MODE__UNKNOWN, perSimStatus.voWiFiModeSetting); assertEquals(PER_SIM_STATUS__WFC_MODE__UNKNOWN, perSimStatus.voWiFiRoamingModeSetting); assertEquals(false, perSimStatus.vtSettingEnabled); assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN, perSimStatus.minimumVoltageClass); } } tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java +140 −0 Original line number Diff line number Diff line Loading @@ -232,6 +232,146 @@ public class UiccSlotTest extends TelephonyTest { assertFalse(mUiccSlot.isEuicc()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassA() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F018031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(mUiccSlot.getMinimumVoltageClass(), UiccSlot.VOLTAGE_CLASS_A); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassANoTa() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795800F048031A073BE2115"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_A, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassB() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F428031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_B, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassC() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F048031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_C, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateAbsentState() { Loading Loading
src/java/com/android/internal/telephony/metrics/MetricsCollector.java +2 −2 Original line number Diff line number Diff line Loading @@ -666,8 +666,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { perSimStatus.dataRoamingEnabled, // dataRoamingEnabled perSimStatus.preferredNetworkType, // allowedNetworksByUser perSimStatus.disabled2g, // is2gDisabled false, // TODO(b/215758472): isPin1Enabled 0); // TODO(b/215758472): simVoltageClass perSimStatus.pin1Enabled, // isPin1Enabled perSimStatus.minimumVoltageClass); // simVoltageClass data.add(statsEvent); result = StatsManager.PULL_SUCCESS; } Loading
src/java/com/android/internal/telephony/metrics/PerSimStatus.java +36 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,10 @@ import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_IMS; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_UICC; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_C; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__CELLULAR_PREFERRED; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__WIFI_ONLY; Loading @@ -33,8 +37,11 @@ import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; import android.text.TextUtils; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.Phone; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.uicc.UiccSlot; import java.util.Optional; Loading @@ -59,6 +66,8 @@ public class PerSimStatus { public final boolean dataRoamingEnabled; public final long preferredNetworkType; public final boolean disabled2g; public final boolean pin1Enabled; public final int minimumVoltageClass; /** Returns the current sim status of the given {@link Phone}. */ @Nullable Loading @@ -66,6 +75,7 @@ public class PerSimStatus { int[] numberState = getNumberState(phone); if (numberState == null) return null; ImsMmTelManager imsMmTelManager = getImsMmTelManager(phone); IccCard iccCard = phone.getIccCard(); return new PerSimStatus( phone.getCarrierId(), numberState[0], Loading @@ -82,7 +92,9 @@ public class PerSimStatus { imsMmTelManager == null ? false : imsMmTelManager.isVtSettingEnabled(), phone.getDataRoamingEnabled(), phone.getAllowedNetworkTypes(TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER), is2gDisabled(phone)); is2gDisabled(phone), iccCard == null ? false : iccCard.getIccLockEnabled(), getMinimumVoltageClass(phone)); } private PerSimStatus( Loading @@ -97,7 +109,9 @@ public class PerSimStatus { boolean vtSettingEnabled, boolean dataRoamingEnabled, long preferredNetworkType, boolean disabled2g) { boolean disabled2g, boolean pin1Enabled, int minimumVoltageClass) { this.carrierId = carrierId; this.phoneNumberSourceUicc = phoneNumberSourceUicc; this.phoneNumberSourceCarrier = phoneNumberSourceCarrier; Loading @@ -110,6 +124,8 @@ public class PerSimStatus { this.dataRoamingEnabled = dataRoamingEnabled; this.preferredNetworkType = preferredNetworkType; this.disabled2g = disabled2g; this.pin1Enabled = pin1Enabled; this.minimumVoltageClass = minimumVoltageClass; } @Nullable Loading Loading @@ -196,4 +212,22 @@ public class PerSimStatus { return PER_SIM_STATUS__WFC_MODE__UNKNOWN; } } /** Returns the minimum voltage class supported by the UICC. */ private static int getMinimumVoltageClass(Phone phone) { UiccSlot uiccSlot = UiccController.getInstance().getUiccSlotForPhone(phone.getPhoneId()); if (uiccSlot == null) { return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; } switch (uiccSlot.getMinimumVoltageClass()) { case UiccSlot.VOLTAGE_CLASS_A: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; case UiccSlot.VOLTAGE_CLASS_B: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; case UiccSlot.VOLTAGE_CLASS_C: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_C; default: return PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; } } }
src/java/com/android/internal/telephony/uicc/UiccSlot.java +52 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony.uicc; import android.annotation.IntDef; import android.annotation.NonNull; import android.app.AlertDialog; import android.content.ActivityNotFoundException; Loading Loading @@ -43,9 +44,12 @@ import com.android.internal.telephony.uicc.IccCardStatus.CardState; import com.android.internal.telephony.uicc.euicc.EuiccCard; import com.android.telephony.Rlog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; Loading @@ -60,6 +64,17 @@ public class UiccSlot extends Handler { "com.android.internal.telephony.uicc.ICC_CARD_ADDED"; public static final int INVALID_PHONE_ID = -1; @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = {"VOLTAGE_CLASS_"}, value = {VOLTAGE_CLASS_UNKNOWN, VOLTAGE_CLASS_A, VOLTAGE_CLASS_B, VOLTAGE_CLASS_C}) public @interface VoltageClass {} public static final int VOLTAGE_CLASS_UNKNOWN = 0; public static final int VOLTAGE_CLASS_A = 1; public static final int VOLTAGE_CLASS_B = 2; public static final int VOLTAGE_CLASS_C = 3; private final Object mLock = new Object(); private boolean mActive; private boolean mStateIsUnknown = true; Loading @@ -67,6 +82,7 @@ public class UiccSlot extends Handler { private Context mContext; private UiccCard mUiccCard; private boolean mIsEuicc; private @VoltageClass int mMinimumVoltageClass; private String mEid; private AnswerToReset mAtr; private boolean mIsRemovable; Loading Loading @@ -357,15 +373,51 @@ public class UiccSlot extends Handler { log(" checkIsEuiccSupported : " + mIsEuicc); } private void checkMinimumVoltageClass() { mMinimumVoltageClass = VOLTAGE_CLASS_UNKNOWN; if (mAtr == null) { return; } // Supported voltage classes are stored in the 5 least significant bits of the TA byte for // global interface. List<AnswerToReset.InterfaceByte> interfaceBytes = mAtr.getInterfaceBytes(); for (int i = 0; i < interfaceBytes.size() - 1; i++) { if (interfaceBytes.get(i).getTD() != null && (interfaceBytes.get(i).getTD() & AnswerToReset.T_MASK) == AnswerToReset.T_VALUE_FOR_GLOBAL_INTERFACE && interfaceBytes.get(i + 1).getTA() != null) { byte ta = interfaceBytes.get(i + 1).getTA(); if ((ta & 0x01) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_A; } if ((ta & 0x02) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_B; } if ((ta & 0x04) != 0) { mMinimumVoltageClass = VOLTAGE_CLASS_C; } return; } } // Use default value - only class A mMinimumVoltageClass = VOLTAGE_CLASS_A; } private void parseAtr(String atr) { mAtr = AnswerToReset.parseAtr(atr); checkIsEuiccSupported(); checkMinimumVoltageClass(); } public boolean isEuicc() { return mIsEuicc; } @VoltageClass public int getMinimumVoltageClass() { return mMinimumVoltageClass; } public boolean isActive() { return mActive; } Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/PerSimStatusTest.java +94 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_IMS; import static android.telephony.SubscriptionManager.PHONE_NUMBER_SOURCE_UICC; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__CELLULAR_PREFERRED; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__UNKNOWN; import static com.android.internal.telephony.TelephonyStatsLog.PER_SIM_STATUS__WFC_MODE__WIFI_ONLY; Loading @@ -36,10 +39,12 @@ import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.uicc.UiccSlot; import org.junit.After; import org.junit.Before; Loading Loading @@ -103,7 +108,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard1 = mock(IccCard.class); doReturn(true).when(iccCard1).getIccLockEnabled(); doReturn(iccCard1).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); // phone 1 setup doReturn(mContext).when(mSecondPhone).getContext(); doReturn(1).when(mSecondPhone).getPhoneId(); Loading Loading @@ -136,6 +146,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mSecondPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard2 = mock(IccCard.class); doReturn(false).when(iccCard2).getIccLockEnabled(); doReturn(iccCard2).when(mSecondPhone).getIccCard(); UiccSlot uiccSlot2 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_B).when(uiccSlot2).getMinimumVoltageClass(); doReturn(uiccSlot2).when(mUiccController).getUiccSlotForPhone(1); PerSimStatus perSimStatus1 = PerSimStatus.getCurrentState(mPhone); PerSimStatus perSimStatus2 = PerSimStatus.getCurrentState(mSecondPhone); Loading @@ -154,6 +170,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus1.dataRoamingEnabled); assertEquals(1L, perSimStatus1.preferredNetworkType); assertEquals(true, perSimStatus1.disabled2g); assertEquals(true, perSimStatus1.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus1.minimumVoltageClass); assertEquals(101, perSimStatus2.carrierId); assertEquals(1, perSimStatus2.phoneNumberSourceUicc); assertEquals(2, perSimStatus2.phoneNumberSourceCarrier); Loading @@ -167,6 +187,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus2.dataRoamingEnabled); assertEquals(1L, perSimStatus2.preferredNetworkType); assertEquals(false, perSimStatus2.disabled2g); assertEquals(false, perSimStatus2.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_B, perSimStatus2.minimumVoltageClass); } @Test Loading Loading @@ -203,7 +227,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); Loading @@ -219,6 +248,10 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus.minimumVoltageClass); } @Test Loading Loading @@ -247,6 +280,12 @@ public class PerSimStatusTest extends TelephonyTest { .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); UiccSlot uiccSlot1 = mock(UiccSlot.class); doReturn(UiccSlot.VOLTAGE_CLASS_A).when(uiccSlot1).getMinimumVoltageClass(); doReturn(uiccSlot1).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); Loading @@ -262,5 +301,58 @@ public class PerSimStatusTest extends TelephonyTest { assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_A, perSimStatus.minimumVoltageClass); } @Test @SmallTest public void onPullAtom_perSimStatus_noUiccSlot() throws Exception { doReturn(0).when(mPhone).getPhoneId(); doReturn(1).when(mPhone).getSubId(); doReturn(100).when(mPhone).getCarrierId(); doReturn("6506953210") .when(mSubscriptionController) .getPhoneNumber(1, PHONE_NUMBER_SOURCE_UICC); doReturn("").when(mSubscriptionController).getPhoneNumber(1, PHONE_NUMBER_SOURCE_CARRIER); doReturn("+16506953210") .when(mSubscriptionController) .getPhoneNumber(1, PHONE_NUMBER_SOURCE_IMS); SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class); doReturn("us").when(subscriptionInfo).getCountryIso(); doReturn(subscriptionInfo).when(mSubscriptionController).getSubscriptionInfo(1); doReturn(null).when(mContext).getSystemService(ImsManager.class); doReturn(1L) .when(mPhone) .getAllowedNetworkTypes(TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER); doReturn(0L) .when(mPhone) .getAllowedNetworkTypes( TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G & ENABLED_2G); IccCard iccCard = mock(IccCard.class); doReturn(true).when(iccCard).getIccLockEnabled(); doReturn(iccCard).when(mPhone).getIccCard(); doReturn(null).when(mUiccController).getUiccSlotForPhone(0); PerSimStatus perSimStatus = PerSimStatus.getCurrentState(mPhone); assertEquals(100, perSimStatus.carrierId); assertEquals(1, perSimStatus.phoneNumberSourceUicc); assertEquals(0, perSimStatus.phoneNumberSourceCarrier); assertEquals(1, perSimStatus.phoneNumberSourceIms); assertEquals(false, perSimStatus.advancedCallingSettingEnabled); assertEquals(false, perSimStatus.voWiFiSettingEnabled); assertEquals(PER_SIM_STATUS__WFC_MODE__UNKNOWN, perSimStatus.voWiFiModeSetting); assertEquals(PER_SIM_STATUS__WFC_MODE__UNKNOWN, perSimStatus.voWiFiRoamingModeSetting); assertEquals(false, perSimStatus.vtSettingEnabled); assertEquals(false, perSimStatus.dataRoamingEnabled); assertEquals(1L, perSimStatus.preferredNetworkType); assertEquals(true, perSimStatus.disabled2g); assertEquals(true, perSimStatus.pin1Enabled); assertEquals( PER_SIM_STATUS__SIM_VOLTAGE_CLASS__VOLTAGE_CLASS_UNKNOWN, perSimStatus.minimumVoltageClass); } }
tests/telephonytests/src/com/android/internal/telephony/uicc/UiccSlotTest.java +140 −0 Original line number Diff line number Diff line Loading @@ -232,6 +232,146 @@ public class UiccSlotTest extends TelephonyTest { assertFalse(mUiccSlot.isEuicc()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassA() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F018031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(mUiccSlot.getMinimumVoltageClass(), UiccSlot.VOLTAGE_CLASS_A); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassANoTa() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795800F048031A073BE2115"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_A, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassB() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F428031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_B, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateSlotStatusVoltageClassC() { IccSlotStatus iss = new IccSlotStatus(); IccSimPortInfo simPortInfo = new IccSimPortInfo(); simPortInfo.mPortActive = false; simPortInfo.mLogicalSlotIndex = 0; simPortInfo.mIccId = "fake-iccid"; iss.mSimPortInfos = new IccSimPortInfo[] {simPortInfo}; iss.cardState = IccCardStatus.CardState.CARDSTATE_PRESENT; iss.atr = "3b9795801F048031A073BE211500"; // initial state assertTrue(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_ABSENT, mUiccSlot.getCardState()); // update slot to inactive mUiccSlot.update(null, iss, 0 /* slotIndex */); // assert on updated values assertFalse(mUiccSlot.isActive()); assertNull(mUiccSlot.getUiccCard()); assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUiccSlot.getCardState()); iss.mSimPortInfos[0].mPortActive = true; // update slot to active mUiccSlot.update(new CommandsInterface[] {mSimulatedCommands}, iss, 0 /* slotIndex */); // assert on updated values assertTrue(mUiccSlot.isActive()); assertEquals(UiccSlot.VOLTAGE_CLASS_C, mUiccSlot.getMinimumVoltageClass()); } @Test @SmallTest public void testUpdateAbsentState() { Loading