Files
app_Settings/src/com/android/settings/network/SwitchToRemovableSlotSidecar.java
SongFerngWang eaec059551 [MEP] disable enabled esim profile before set simSlotMapping
This is the modem request to disable enabled esim profile before
set simSlotMapping.
Since the framework still do API refactor ag/16494924. The
switchToSub API will be changed, so here modify two callback.
the one of callback will be removed after the framework complete
the API refactor.

Bug: 210063749
Test: Build pass. Local test: do sim switch in SS mode and DSDS mode.
Change-Id: Iee650897b81c96b5febb0413649629b1a1971b18
Merged-In: Iee650897b81c96b5febb0413649629b1a1971b18
2022-03-25 17:04:33 +00:00

146 lines
5.9 KiB
Java

/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.network;
import android.app.FragmentManager;
import android.os.Bundle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.util.Log;
import com.android.settings.SidecarFragment;
import com.android.settings.network.telephony.EuiccOperationSidecar;
/**
* This sidecar is responsible for switching to the removable slot. It disables the active eSIM
* profile before switching if there is one.
*/
public class SwitchToRemovableSlotSidecar extends EuiccOperationSidecar
implements SidecarFragment.Listener {
private static final String TAG = "SwitchRemovableSidecar";
private static final String ACTION_DISABLE_SUBSCRIPTION_AND_SWITCH_SLOT =
"disable_subscription_and_switch_slot_sidecar";
// Stateless members.
private SwitchToEuiccSubscriptionSidecar mSwitchToSubscriptionSidecar;
private int mPhysicalSlotId;
private SubscriptionInfo mRemovedSubInfo;
/** Returns a SwitchToRemovableSlotSidecar sidecar instance. */
public static SwitchToRemovableSlotSidecar get(FragmentManager fm) {
return SidecarFragment.get(fm, TAG, SwitchToRemovableSlotSidecar.class, null /* args */);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSwitchToSubscriptionSidecar =
SwitchToEuiccSubscriptionSidecar.get(getChildFragmentManager());
}
@Override
public void onResume() {
super.onResume();
mSwitchToSubscriptionSidecar.addListener(this);
}
@Override
public void onPause() {
mSwitchToSubscriptionSidecar.removeListener(this);
super.onPause();
}
@Override
protected String getReceiverAction() {
return ACTION_DISABLE_SUBSCRIPTION_AND_SWITCH_SLOT;
}
@Override
public void onStateChange(SidecarFragment fragment) {
if (fragment == mSwitchToSubscriptionSidecar) {
onSwitchToSubscriptionSidecarStateChange();
} else if (fragment == mSwitchSlotSidecar) {
onSwitchSlotSidecarStateChange();
} else {
Log.wtf(TAG, "Received state change from a sidecar not expected.");
}
}
/**
* Starts switching to the removable slot.
*
* @param physicalSlotId removable physical SIM slot ID.
* @param removedSubInfo if the all of slots have sims, it should remove the one of active sim.
* If the removedSubInfo is null, then use the default value.
* The default value is the removable physical SIM slot and portId 0.
*/
public void run(int physicalSlotId, SubscriptionInfo removedSubInfo) {
mPhysicalSlotId = physicalSlotId;
mRemovedSubInfo = removedSubInfo;
SubscriptionManager subscriptionManager =
getContext().getSystemService(SubscriptionManager.class);
if (!mTelephonyManager.isMultiSimEnabled()
&& SubscriptionUtil.getActiveSubscriptions(subscriptionManager).stream().anyMatch(
SubscriptionInfo::isEmbedded)) {
// In SS mode, the esim is active, then inactivate the esim.
Log.i(TAG, "There is an active eSIM profile. Disable the profile first.");
// 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 disable that esim
// profile before changing SimSlotMapping process.
// Use INVALID_SUBSCRIPTION_ID to disable the esim profile.
mSwitchToSubscriptionSidecar.run(SubscriptionManager.INVALID_SUBSCRIPTION_ID,
mRemovedSubInfo.getPortIndex(), null);
} else {
Log.i(TAG, "Start to switch to removable slot.");
mSwitchSlotSidecar.runSwitchToRemovableSlot(mPhysicalSlotId, mRemovedSubInfo);
}
}
private void onSwitchToSubscriptionSidecarStateChange() {
switch (mSwitchToSubscriptionSidecar.getState()) {
case State.SUCCESS:
mSwitchToSubscriptionSidecar.reset();
Log.i(TAG,
"Successfully disabled eSIM profile. Start to switch to Removable slot.");
mSwitchSlotSidecar.runSwitchToRemovableSlot(mPhysicalSlotId, mRemovedSubInfo);
break;
case State.ERROR:
mSwitchToSubscriptionSidecar.reset();
Log.i(TAG, "Failed to disable the active eSIM profile.");
setState(State.ERROR, Substate.UNUSED);
break;
}
}
private void onSwitchSlotSidecarStateChange() {
switch (mSwitchSlotSidecar.getState()) {
case State.SUCCESS:
mSwitchSlotSidecar.reset();
Log.i(TAG, "Successfully switched to removable slot.");
setState(State.SUCCESS, Substate.UNUSED);
break;
case State.ERROR:
mSwitchSlotSidecar.reset();
Log.i(TAG, "Failed to switch to removable slot.");
setState(State.ERROR, Substate.UNUSED);
break;
}
}
}