diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java index 7d8295b7822..7b52680a0dc 100644 --- a/src/com/android/settings/network/UiccSlotUtil.java +++ b/src/com/android/settings/network/UiccSlotUtil.java @@ -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; @@ -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) { @@ -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 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; + } } diff --git a/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java b/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java index a878cb3ebd3..6fa803d0433 100644 --- a/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java +++ b/src/com/android/settings/network/telephony/ToggleSubscriptionDialogActivity.java @@ -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; @@ -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; @@ -586,18 +583,7 @@ public class ToggleSubscriptionDialogActivity extends SubscriptionActionDialogAc } private boolean isRemovableSimEnabled() { - ImmutableList 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() { diff --git a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java index 526fc0c8d18..887f3004618 100644 --- a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java +++ b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java @@ -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 testUiccSlotMappings, Collection verifyUiccSlotMappings) { assertThat(testUiccSlotMappings.size()).isEqualTo(verifyUiccSlotMappings.size()); @@ -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), @@ -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), @@ -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 */))); + } }