Loading src/com/android/settings/network/UiccSlotUtil.java +26 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.telephony.UiccSlotMapping; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.uicc.UiccController; import com.android.settingslib.utils.ThreadUtils; import com.google.common.collect.ImmutableList; Loading Loading @@ -273,6 +272,7 @@ public class UiccSlotUtil { if (slotId == INVALID_PHYSICAL_SLOT_ID) { for (int i = 0; i < slots.length; i++) { if (slots[i].isRemovable() && !slots[i].getIsEuicc() && !slots[i].getPorts().stream().findFirst().get().isActive() && slots[i].getCardStateInfo() != UiccSlotInfo.CARD_STATE_INFO_ERROR && slots[i].getCardStateInfo() != UiccSlotInfo.CARD_STATE_INFO_RESTRICTED) { Loading Loading @@ -413,4 +413,29 @@ public class UiccSlotUtil { .findFirst() .orElse(INVALID_LOGICAL_SLOT_ID); } /** * Return whether the removable psim is enabled. * * @param telMgr is a TelephonyManager. * @return whether the removable psim is enabled. */ public static boolean isRemovableSimEnabled(TelephonyManager telMgr) { if (telMgr == null) { return false; } ImmutableList<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(telMgr); boolean isRemovableSimEnabled = slotInfos.stream() .anyMatch( slot -> slot != null && slot.isRemovable() && !slot.getIsEuicc() && slot.getPorts().stream().anyMatch( port -> port.isActive()) && slot.getCardStateInfo() == UiccSlotInfo.CARD_STATE_INFO_PRESENT); Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled); return isRemovableSimEnabled; } } src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java +1 −15 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UiccCardInfo; import android.telephony.UiccSlotInfo; import android.text.TextUtils; import android.util.Log; import android.view.View; Loading @@ -39,8 +38,6 @@ import com.android.settings.network.SwitchToRemovableSlotSidecar; import com.android.settings.network.UiccSlotUtil; import com.android.settings.sim.SimActivationNotifier; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; Loading Loading @@ -586,18 +583,7 @@ public class ToggleSubscriptionDialogActivity extends SubscriptionActionDialogAc } private boolean isRemovableSimEnabled() { ImmutableList<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(mTelMgr); boolean isRemovableSimEnabled = slotInfos.stream() .anyMatch( slot -> slot != null && slot.isRemovable() && slot.getPorts().stream().anyMatch( port -> port.isActive()) && slot.getCardStateInfo() == UiccSlotInfo.CARD_STATE_INFO_PRESENT); Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled); return isRemovableSimEnabled; return UiccSlotUtil.isRemovableSimEnabled(mTelMgr); } private boolean isMultipleEnabledProfilesSupported() { Loading tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java +144 −0 Original line number Diff line number Diff line Loading @@ -632,6 +632,106 @@ public class UiccSlotUtilTest { assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex); } @Test public void isRemovableSimEnabled_noPsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeRemovableEsimAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActiveRemovableEsimInactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeRemovableEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActivePsimActiveRemovableEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_inactiveRemovableEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceInactiveRemovableEsimActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_twoActiveRemovableEsimsAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceTwoActiveRemovableEsimsInactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_oneActiveOneInactiveRemovableEsimActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceOneActiveOneInactiveRemovableEsimsActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_activePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_inactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceinactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActivePsimActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_activeEsimAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceInactivePsimActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } private void compareTwoUiccSlotMappings(Collection<UiccSlotMapping> testUiccSlotMappings, Collection<UiccSlotMapping> verifyUiccSlotMappings) { assertThat(testUiccSlotMappings.size()).isEqualTo(verifyUiccSlotMappings.size()); Loading Loading @@ -786,6 +886,10 @@ public class UiccSlotUtilTest { return new UiccSlotInfo[]{createUiccSlotInfo(true, false, 1, true)}; } private UiccSlotInfo[] oneSimSlotDeviceinactivePsim() { return new UiccSlotInfo[]{createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceActivePsimActiveEsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(false, true, 0, true), Loading @@ -804,6 +908,30 @@ public class UiccSlotUtilTest { createUiccSlotInfo(true, true, 1, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceActiveRemovableEsimInactivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, true, 0, true), createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceInactiveRemovableEsimActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, true, -1, false), createUiccSlotInfo(false, true, 0, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceTwoActiveRemovableEsimsInactivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfoForRemovableEsimMep(0, true, 1, true), createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceOneActiveOneInactiveRemovableEsimsActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfoForRemovableEsimMep(1, true, -1, false), createUiccSlotInfo(false, true, 0, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceActiveEsimActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, false, 0, true), Loading Loading @@ -866,4 +994,20 @@ public class UiccSlotUtilTest { logicalSlotIdx2 /* logicalSlotIdx */, isActiveEsim2 /* isActive */))); } private UiccSlotInfo createUiccSlotInfoForRemovableEsimMep(int logicalSlotIdx1, boolean isActiveEsim1, int logicalSlotIdx2, boolean isActiveEsim2) { return new UiccSlotInfo( true, /* isEuicc */ "123", /* cardId */ CARD_STATE_INFO_PRESENT, /* cardStateInfo */ true, /* isExtendApduSupported */ true, /* isRemovable */ Arrays.asList( new UiccPortInfo("" /* iccId */, 0 /* portIdx */, logicalSlotIdx1 /* logicalSlotIdx */, isActiveEsim1 /* isActive */), new UiccPortInfo("" /* iccId */, 1 /* portIdx */, logicalSlotIdx2 /* logicalSlotIdx */, isActiveEsim2 /* isActive */))); } } Loading
src/com/android/settings/network/UiccSlotUtil.java +26 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.telephony.UiccSlotMapping; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.uicc.UiccController; import com.android.settingslib.utils.ThreadUtils; import com.google.common.collect.ImmutableList; Loading Loading @@ -273,6 +272,7 @@ public class UiccSlotUtil { if (slotId == INVALID_PHYSICAL_SLOT_ID) { for (int i = 0; i < slots.length; i++) { if (slots[i].isRemovable() && !slots[i].getIsEuicc() && !slots[i].getPorts().stream().findFirst().get().isActive() && slots[i].getCardStateInfo() != UiccSlotInfo.CARD_STATE_INFO_ERROR && slots[i].getCardStateInfo() != UiccSlotInfo.CARD_STATE_INFO_RESTRICTED) { Loading Loading @@ -413,4 +413,29 @@ public class UiccSlotUtil { .findFirst() .orElse(INVALID_LOGICAL_SLOT_ID); } /** * Return whether the removable psim is enabled. * * @param telMgr is a TelephonyManager. * @return whether the removable psim is enabled. */ public static boolean isRemovableSimEnabled(TelephonyManager telMgr) { if (telMgr == null) { return false; } ImmutableList<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(telMgr); boolean isRemovableSimEnabled = slotInfos.stream() .anyMatch( slot -> slot != null && slot.isRemovable() && !slot.getIsEuicc() && slot.getPorts().stream().anyMatch( port -> port.isActive()) && slot.getCardStateInfo() == UiccSlotInfo.CARD_STATE_INFO_PRESENT); Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled); return isRemovableSimEnabled; } }
src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java +1 −15 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UiccCardInfo; import android.telephony.UiccSlotInfo; import android.text.TextUtils; import android.util.Log; import android.view.View; Loading @@ -39,8 +38,6 @@ import com.android.settings.network.SwitchToRemovableSlotSidecar; import com.android.settings.network.UiccSlotUtil; import com.android.settings.sim.SimActivationNotifier; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; Loading Loading @@ -586,18 +583,7 @@ public class ToggleSubscriptionDialogActivity extends SubscriptionActionDialogAc } private boolean isRemovableSimEnabled() { ImmutableList<UiccSlotInfo> slotInfos = UiccSlotUtil.getSlotInfos(mTelMgr); boolean isRemovableSimEnabled = slotInfos.stream() .anyMatch( slot -> slot != null && slot.isRemovable() && slot.getPorts().stream().anyMatch( port -> port.isActive()) && slot.getCardStateInfo() == UiccSlotInfo.CARD_STATE_INFO_PRESENT); Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled); return isRemovableSimEnabled; return UiccSlotUtil.isRemovableSimEnabled(mTelMgr); } private boolean isMultipleEnabledProfilesSupported() { Loading
tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java +144 −0 Original line number Diff line number Diff line Loading @@ -632,6 +632,106 @@ public class UiccSlotUtilTest { assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex); } @Test public void isRemovableSimEnabled_noPsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeRemovableEsimAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActiveRemovableEsimInactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeRemovableEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActivePsimActiveRemovableEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_inactiveRemovableEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceInactiveRemovableEsimActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_twoActiveRemovableEsimsAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceTwoActiveRemovableEsimsInactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_oneActiveOneInactiveRemovableEsimActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceOneActiveOneInactiveRemovableEsimsActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_activePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceActivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_inactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( oneSimSlotDeviceinactivePsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } @Test public void isRemovableSimEnabled_activeEsimAndActivePsim_returnsTrue() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceActivePsimActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isTrue(); } @Test public void isRemovableSimEnabled_activeEsimAndInactivePsim_returnsFalse() { when(mTelephonyManager.getUiccSlotsInfo()).thenReturn( twoSimSlotsDeviceInactivePsimActiveEsim()); boolean testSlot = UiccSlotUtil.isRemovableSimEnabled(mTelephonyManager); assertThat(testSlot).isFalse(); } private void compareTwoUiccSlotMappings(Collection<UiccSlotMapping> testUiccSlotMappings, Collection<UiccSlotMapping> verifyUiccSlotMappings) { assertThat(testUiccSlotMappings.size()).isEqualTo(verifyUiccSlotMappings.size()); Loading Loading @@ -786,6 +886,10 @@ public class UiccSlotUtilTest { return new UiccSlotInfo[]{createUiccSlotInfo(true, false, 1, true)}; } private UiccSlotInfo[] oneSimSlotDeviceinactivePsim() { return new UiccSlotInfo[]{createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceActivePsimActiveEsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(false, true, 0, true), Loading @@ -804,6 +908,30 @@ public class UiccSlotUtilTest { createUiccSlotInfo(true, true, 1, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceActiveRemovableEsimInactivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, true, 0, true), createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceInactiveRemovableEsimActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, true, -1, false), createUiccSlotInfo(false, true, 0, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceTwoActiveRemovableEsimsInactivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfoForRemovableEsimMep(0, true, 1, true), createUiccSlotInfo(false, true, -1, false)}; } private UiccSlotInfo[] twoSimSlotsDeviceOneActiveOneInactiveRemovableEsimsActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfoForRemovableEsimMep(1, true, -1, false), createUiccSlotInfo(false, true, 0, true)}; } private UiccSlotInfo[] twoSimSlotsDeviceActiveEsimActivePsim() { return new UiccSlotInfo[]{ createUiccSlotInfo(true, false, 0, true), Loading Loading @@ -866,4 +994,20 @@ public class UiccSlotUtilTest { logicalSlotIdx2 /* logicalSlotIdx */, isActiveEsim2 /* isActive */))); } private UiccSlotInfo createUiccSlotInfoForRemovableEsimMep(int logicalSlotIdx1, boolean isActiveEsim1, int logicalSlotIdx2, boolean isActiveEsim2) { return new UiccSlotInfo( true, /* isEuicc */ "123", /* cardId */ CARD_STATE_INFO_PRESENT, /* cardStateInfo */ true, /* isExtendApduSupported */ true, /* isRemovable */ Arrays.asList( new UiccPortInfo("" /* iccId */, 0 /* portIdx */, logicalSlotIdx1 /* logicalSlotIdx */, isActiveEsim1 /* isActive */), new UiccPortInfo("" /* iccId */, 1 /* portIdx */, logicalSlotIdx2 /* logicalSlotIdx */, isActiveEsim2 /* isActive */))); } }