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

Commit c27b674e authored by SongFerngWang's avatar SongFerngWang
Browse files

[MEP] the user can't enable the psim when revmovable esim is enabled

The isRemovableSimEnabled method at ToggleSubscriptionDialogActivity
UI is for psim, not esim. It should skip the revmovable esim slot.

Bug: 251384644
Test: build pass. atest UiccSlotUtilTest
Change-Id: I11d0f9528961ec5e47cd8682cf9b6bb988a5700f
parent a94259a7
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -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;
@@ -270,6 +269,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) {
@@ -410,4 +410,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;
    }
}
+1 −15
Original line number Diff line number Diff line
@@ -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<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() {
+144 −0
Original line number Diff line number Diff line
@@ -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());
@@ -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 */)));
    }
}