From 7ab547f1b8f8a2d459ca2f9ada1c68fad0ffa395 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Fri, 18 Feb 2022 19:29:16 +0800 Subject: [PATCH] [MEP] The subscriptionInfo's getSimSlotIndex is logical slotId 1. The subscriptionInfo's getSimSlotIndex is logical slotId. The code should compare it with uiccSlotMapping.getLogicalSlotIndex() 2. Rename the parameters for the readability. 3. The mobile network selection dialog did not be closed after user clicked. Bug: 219951253 Test: manual test. Change-Id: I7fef78547f4e6283791cd15a03275eaefeb50e3c Merged-In: I7fef78547f4e6283791cd15a03275eaefeb50e3c --- .../settings/network/SwitchSlotSidecar.java | 14 +++- .../network/SwitchToRemovableSlotSidecar.java | 2 +- .../settings/network/UiccSlotUtil.java | 84 ++++++++----------- .../settings/sim/SimListDialogFragment.java | 1 + 4 files changed, 46 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/network/SwitchSlotSidecar.java b/src/com/android/settings/network/SwitchSlotSidecar.java index abf8842c738..7005452581e 100644 --- a/src/com/android/settings/network/SwitchSlotSidecar.java +++ b/src/com/android/settings/network/SwitchSlotSidecar.java @@ -78,11 +78,19 @@ public class SwitchSlotSidecar super.run(param); } - /** Starts switching to the removable slot. */ - public void runSwitchToEuiccSlot(int id, int port, SubscriptionInfo removedSubInfo) { + /** + * Start the SimSlotMapping process if the euicc slot is not in SimSlotMapping list. + * @param physicalSlotId The physical slot id. + * @param port The port id. + * @param removedSubInfo The subscriptionInfo which is selected by the user to disable when all + * of sim slots are full in the device. If all of slots are not full in + * the device, then this is null. + */ + public void runSwitchToEuiccSlot(int physicalSlotId, int port, + SubscriptionInfo removedSubInfo) { Param param = new Param(); param.command = Command.SWITCH_TO_EUICC_SIM; - param.slotId = id; + param.slotId = physicalSlotId; param.removedSubInfo = removedSubInfo; param.port = port; super.run(param); diff --git a/src/com/android/settings/network/SwitchToRemovableSlotSidecar.java b/src/com/android/settings/network/SwitchToRemovableSlotSidecar.java index e98b405ee3d..a870f3bf9fc 100644 --- a/src/com/android/settings/network/SwitchToRemovableSlotSidecar.java +++ b/src/com/android/settings/network/SwitchToRemovableSlotSidecar.java @@ -101,7 +101,7 @@ public class SwitchToRemovableSlotSidecar extends EuiccOperationSidecar // Use INVALID_SUBSCRIPTION_ID to disable the only active profile. mSwitchToSubscriptionSidecar.run(SubscriptionManager.INVALID_SUBSCRIPTION_ID, 0, null); } else if (mTelephonyManager.isMultiSimEnabled() && mRemovedSubInfo != null) { - // In DSDS mode+MEP, if the replaced esim is active, then it should be disabled esim + // In DSDS mode+MEP, if the replaced esim is active, then it should disable that esim // profile before changing SimSlotMapping process. // Use INVALID_SUBSCRIPTION_ID to disable the esim profile. mSwitchToSubscriptionSidecar.run(SubscriptionManager.INVALID_SUBSCRIPTION_ID, diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java index 2765b3eb6bd..d28d93a8474 100644 --- a/src/com/android/settings/network/UiccSlotUtil.java +++ b/src/com/android/settings/network/UiccSlotUtil.java @@ -113,9 +113,21 @@ public class UiccSlotUtil { } TelephonyManager telMgr = context.getSystemService(TelephonyManager.class); int inactiveRemovableSlot = getInactiveRemovableSlot(telMgr.getUiccSlotsInfo(), slotId); + Log.i(TAG, "The InactiveRemovableSlot: " + inactiveRemovableSlot); + + Collection uiccSlotMappings = telMgr.getSimSlotMapping(); + Log.i(TAG, "The SimSlotMapping: " + uiccSlotMappings); + + if (inactiveRemovableSlot == INVALID_PHYSICAL_SLOT_ID) { + // The slot is invalid slot id, then to skip this. + // The slot is active, then the sim can enable directly. + return; + } + performSwitchToSlot(telMgr, - prepareUiccSlotMappingsForRemovableSlot(telMgr.getSimSlotMapping(), - inactiveRemovableSlot, removedSubInfo, telMgr.isMultiSimEnabled()), + prepareUiccSlotMappings(uiccSlotMappings, + inactiveRemovableSlot, /*removable sim's port Id*/ 0, removedSubInfo, + telMgr.isMultiSimEnabled()), context); } @@ -123,7 +135,7 @@ public class UiccSlotUtil { * Switches to the Euicc slot. It waits for SIM_STATE_LOADED after switch. * * @param context the application context. - * @param slotId the Euicc slot id. + * @param physicalSlotId the Euicc slot id. * @param port the Euicc slot port id. * @param removedSubInfo In the DSDS+MEP mode, if the all of slots have sims, it should * remove the one of active sim. @@ -131,7 +143,7 @@ public class UiccSlotUtil { * The default value is the esim slot and portId 0. * @throws UiccSlotsException if there is an error. */ - public static synchronized void switchToEuiccSlot(Context context, int slotId, int port, + public static synchronized void switchToEuiccSlot(Context context, int physicalSlotId, int port, SubscriptionInfo removedSubInfo) throws UiccSlotsException { if (ThreadUtils.isMainThread()) { throw new IllegalThreadStateException( @@ -141,38 +153,15 @@ public class UiccSlotUtil { Collection uiccSlotMappings = telMgr.getSimSlotMapping(); Log.i(TAG, "The SimSlotMapping: " + uiccSlotMappings); - if (isTargetSlotActive(uiccSlotMappings, slotId, port)) { + if (isTargetSlotActive(uiccSlotMappings, physicalSlotId, port)) { Log.i(TAG, "The slot is active, then the sim can enable directly."); return; } - Collection newUiccSlotMappings = new ArrayList<>(); - if (!telMgr.isMultiSimEnabled()) { - // In the 'SS mode', the port is 0. - newUiccSlotMappings.add(new UiccSlotMapping(port, slotId, 0)); - } else { - // DSDS+MEP - // The target slot+port is not active, but the all of logical slots are full. It - // needs to replace one of logical slots. - int removedSlot = - (removedSubInfo != null) ? removedSubInfo.getSimSlotIndex() : slotId; - int removedPort = (removedSubInfo != null) ? removedSubInfo.getPortIndex() : 0; - Log.i(TAG, - String.format("Start to set SimSlotMapping from slot%d-port%d to slot%d-port%d", - slotId, port, removedSlot, removedPort)); - newUiccSlotMappings = - uiccSlotMappings.stream().map(uiccSlotMapping -> { - if (uiccSlotMapping.getPhysicalSlotIndex() == removedSlot - && uiccSlotMapping.getPortIndex() == removedPort) { - return new UiccSlotMapping(port, slotId, - uiccSlotMapping.getLogicalSlotIndex()); - } - return uiccSlotMapping; - }).collect(Collectors.toList()); - } - - Log.i(TAG, "The SimSlotMapping: " + newUiccSlotMappings); - performSwitchToSlot(telMgr, newUiccSlotMappings, context); + performSwitchToSlot(telMgr, + prepareUiccSlotMappings(uiccSlotMappings, + physicalSlotId, port, removedSubInfo, telMgr.isMultiSimEnabled()), + context); } /** @@ -198,10 +187,10 @@ public class UiccSlotUtil { } private static boolean isTargetSlotActive(Collection uiccSlotMappings, - int slotId, int port) { + int physicalSlotId, int port) { return uiccSlotMappings.stream() .anyMatch( - uiccSlotMapping -> uiccSlotMapping.getPhysicalSlotIndex() == slotId + uiccSlotMapping -> uiccSlotMapping.getPhysicalSlotIndex() == physicalSlotId && uiccSlotMapping.getPortIndex() == port); } @@ -262,37 +251,30 @@ public class UiccSlotUtil { return INVALID_PHYSICAL_SLOT_ID; } - private static Collection prepareUiccSlotMappingsForRemovableSlot( - Collection uiccSlotMappings, int slotId, + private static Collection prepareUiccSlotMappings( + Collection uiccSlotMappings, int physicalSlotId, int port, SubscriptionInfo removedSubInfo, boolean isMultiSimEnabled) { - if (slotId == INVALID_PHYSICAL_SLOT_ID - || uiccSlotMappings.stream().anyMatch(uiccSlotMapping -> - uiccSlotMapping.getPhysicalSlotIndex() == slotId - && uiccSlotMapping.getPortIndex() == 0)) { - // The slot is invalid slot id, then to skip this. - // The slot is active, then the sim can enable directly. - return uiccSlotMappings; - } - Collection newUiccSlotMappings = new ArrayList<>(); if (!isMultiSimEnabled) { // In the 'SS mode', the port is 0. - newUiccSlotMappings.add(new UiccSlotMapping(0, slotId, 0)); + newUiccSlotMappings.add(new UiccSlotMapping(port, physicalSlotId, 0)); } else if (removedSubInfo != null) { // DSDS+MEP // The target slot+port is not active, but the all of logical slots are full. It // needs to replace one of logical slots. Log.i(TAG, - String.format("Start to set SimSlotMapping from slot%d-port%d to slot%d-port%d", - slotId, 0, removedSubInfo.getSimSlotIndex(), - removedSubInfo.getPortIndex())); + String.format( + "Start to set SimSlotMapping from subId%d(LogicalSlot%d-Port%d) to " + + "PhysicalSlotId%d-Port%d", + removedSubInfo.getSubscriptionId(), removedSubInfo.getSimSlotIndex(), + removedSubInfo.getPortIndex(), physicalSlotId, port)); newUiccSlotMappings = uiccSlotMappings.stream().map(uiccSlotMapping -> { - if (uiccSlotMapping.getPhysicalSlotIndex() + if (uiccSlotMapping.getLogicalSlotIndex() == removedSubInfo.getSimSlotIndex() && uiccSlotMapping.getPortIndex() == removedSubInfo.getPortIndex()) { - return new UiccSlotMapping(0, slotId, + return new UiccSlotMapping(port, physicalSlotId, uiccSlotMapping.getLogicalSlotIndex()); } return uiccSlotMapping; diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java index b1aa7f3f95c..b8fef8a63e6 100644 --- a/src/com/android/settings/sim/SimListDialogFragment.java +++ b/src/com/android/settings/sim/SimListDialogFragment.java @@ -116,6 +116,7 @@ public class SimListDialogFragment extends SimDialogFragment { final SimDialogActivity activity = (SimDialogActivity) getActivity(); activity.onSubscriptionSelected(getDialogType(), subId); } + dismiss(); } protected List getCurrentSubscriptions() {