diff --git a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java index 0b39d6ac0b7..935e235aeaf 100644 --- a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java +++ b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java @@ -21,12 +21,14 @@ import android.app.PendingIntent; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.UiccCardInfo; +import android.telephony.UiccSlotMapping; import android.telephony.euicc.EuiccManager; import android.util.Log; import com.android.settings.SidecarFragment; import com.android.settings.network.telephony.EuiccOperationSidecar; +import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -94,7 +96,7 @@ public class SwitchToEuiccSubscriptionSidecar extends EuiccOperationSidecar { // To check whether the esim slot's port is active. If yes, skip setSlotMapping. If no, // set this slot+port into setSimSlotMapping. - mPort = (port < 0) ? getTargetPortId(removedSubInfo) : port; + mPort = (port < 0) ? getTargetPortId(targetSlot, removedSubInfo) : port; mRemovedSubInfo = removedSubInfo; Log.d(TAG, String.format("set esim into the SubId%d Slot%d:Port%d", @@ -114,12 +116,24 @@ public class SwitchToEuiccSubscriptionSidecar extends EuiccOperationSidecar { } } - private int getTargetPortId(SubscriptionInfo removedSubInfo) { - if (!mTelephonyManager.isMultiSimEnabled() || !isMultipleEnabledProfilesSupported()) { - // In the 'SS mode' or 'DSDS+no MEP', the port is 0. + private int getTargetPortId(int physicalEsimSlotIndex, SubscriptionInfo removedSubInfo) { + if (!isMultipleEnabledProfilesSupported()) { + Log.d(TAG, "The device is no MEP, port is 0"); return 0; } + if (!mTelephonyManager.isMultiSimEnabled()) { + // In the 'SS mode' + // If there is the esim slot is active, the port is from the current esim slot. + // If there is no esim slot in device, then the esim's port is 0. + Collection uiccSlotMappings = mTelephonyManager.getSimSlotMapping(); + Log.d(TAG, "In SS mode, the UiccSlotMapping: " + uiccSlotMappings); + return uiccSlotMappings.stream() + .filter(i -> i.getPhysicalSlotIndex() == physicalEsimSlotIndex) + .mapToInt(i -> i.getPortIndex()) + .findFirst().orElse(0); + } + // In the 'DSDS+MEP', if the removedSubInfo is esim, then the port is // removedSubInfo's port. if (removedSubInfo != null && removedSubInfo.isEmbedded()) { diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java index c27621a06dd..c9c52cb5c99 100644 --- a/src/com/android/settings/network/UiccSlotUtil.java +++ b/src/com/android/settings/network/UiccSlotUtil.java @@ -282,6 +282,21 @@ public class UiccSlotUtil { // 1. pSIM's logical slots always is [RIL 0]. // 2. assign the new active port to the same stack that will be de-activated // For example: mode#3->mode#4 + // 3. Add an eSIM carrier or enable eSIM carrier. The cases are at the below. + // 1) 1 => 2 / 2.1 / 3 / 3.1 + // 2) 2 => 1 / 3 / 3.2 + // 3) 2.1 => 3.1 / 4 + // 4) 3 => 4 + // 5) 3.1 => 3.2 + // Note: + // 1) 2 <=> 2.1 blocked by LPA (reason: existing active port in SS so just re-use) + // 2) 3 <=> 3.1 blocked by LPA (reason: if pSIM+an active port, re-use the active port) + // 4. pSIM insertion or enabling + // 1) 2 => 1 / 3 + // 2) 2.1 => 1 / 3.1 + // 3) 3.2 => 3 / 3.1 + // 4) 4 => 3 / 3.1 + @VisibleForTesting static Collection prepareUiccSlotMappings(