Merge "Support reset IMS stack in Reset Mobile Network flow" into main

This commit is contained in:
Rambo Wang
2023-12-22 18:19:37 +00:00
committed by Android (Google) Code Review
6 changed files with 134 additions and 12 deletions

View File

@@ -104,6 +104,7 @@ android_library {
"settings-telephony-protos-lite",
"statslog-settings",
"androidx.test.rules",
"telephony_flags_core_java_lib",
],
plugins: ["androidx.room_room-compiler-plugin"],

View File

@@ -44,6 +44,7 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.internal.telephony.flags.Flags;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.network.ResetNetworkRestrictionViewBuilder;
@@ -121,16 +122,22 @@ public class ResetNetwork extends InstrumentedFragment {
void showFinalConfirmation() {
Bundle args = new Bundle();
ResetNetworkRequest request = new ResetNetworkRequest(
ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER |
ResetNetworkRequest.RESET_VPN_MANAGER
);
// TODO(b/317276437) Simplify the logic once flag is released
int resetOptions = ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER
| ResetNetworkRequest.RESET_VPN_MANAGER;
if (Flags.resetMobileNetworkSettings()) {
resetOptions |= ResetNetworkRequest.RESET_IMS_STACK;
}
ResetNetworkRequest request = new ResetNetworkRequest(resetOptions);
if (mSubscriptions != null && mSubscriptions.size() > 0) {
int selectedIndex = mSubscriptionSpinner.getSelectedItemPosition();
SubscriptionInfo subscription = mSubscriptions.get(selectedIndex);
int subId = subscription.getSubscriptionId();
request.setResetTelephonyAndNetworkPolicyManager(subId)
.setResetApn(subId);
if (Flags.resetMobileNetworkSettings()) {
request.setResetImsSubId(subId);
}
}
if (mEsimContainer.getVisibility() == View.VISIBLE && mEsimCheckbox.isChecked()) {
request.setResetEsim(getContext().getPackageName())

View File

@@ -48,11 +48,23 @@ public class ResetNetworkRequest {
/* Reset option - reset BluetoothManager */
public static final int RESET_BLUETOOTH_MANAGER = 0x10;
/* Subscription ID for not performing reset TelephonyAndNetworkPolicy or reset APN */
/* Reset option - reset IMS stack */
public static final int RESET_IMS_STACK = 0x20;
/**
* Subscription ID indicates NOT resetting any of the components below:
* - TelephonyAndNetworkPolicy
* - APN
* - IMS
*/
public static final int INVALID_SUBSCRIPTION_ID = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
/* Subscription ID for performing reset TelephonyAndNetworkPolicy or reset APN
on all subscriptions */
/**
* Subscription ID indicates resetting components below for ALL subscriptions:
* - TelephonyAndNetworkPolicy
* - APN
* - IMS
*/
public static final int ALL_SUBSCRIPTION_ID = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
/* Key within Bundle. To store some connectivity options for reset */
@@ -75,10 +87,14 @@ public class ResetNetworkRequest {
@VisibleForTesting
protected static final String KEY_APN_SUBID = "resetApnSubId";
/** Key within Bundle. To store subscription ID for resetting IMS. */
protected static final String KEY_RESET_IMS_SUBID = "resetImsSubId";
private int mResetOptions = RESET_NONE;
private String mResetEsimPackageName;
private int mResetTelephonyManager = INVALID_SUBSCRIPTION_ID;
private int mResetApn = INVALID_SUBSCRIPTION_ID;
private int mSubscriptionIdToResetIms = INVALID_SUBSCRIPTION_ID;
/**
* Reconstruct based on keys stored within Bundle.
@@ -93,6 +109,8 @@ public class ResetNetworkRequest {
mResetTelephonyManager = optionsFromBundle.getInt(
KEY_TELEPHONY_NET_POLICY_MANAGER_SUBID, INVALID_SUBSCRIPTION_ID);
mResetApn = optionsFromBundle.getInt(KEY_APN_SUBID, INVALID_SUBSCRIPTION_ID);
mSubscriptionIdToResetIms = optionsFromBundle.getInt(KEY_RESET_IMS_SUBID,
INVALID_SUBSCRIPTION_ID);
}
/**
@@ -172,6 +190,29 @@ public class ResetNetworkRequest {
return this;
}
/**
* Get the subscription ID applied for resetting IMS.
* @return subscription ID.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means resetting IMS
* is not part of the option within this request.
*/
public int getResetImsSubId() {
return mSubscriptionIdToResetIms;
}
/**
* Set the subscription ID applied for resetting APN.
* @param subId is the subscription ID referenced from SubscriptionManager.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means resetting IMS will not take place.
* @return this
*/
public ResetNetworkRequest setResetImsSubId(int subId) {
mSubscriptionIdToResetIms = subId;
return this;
}
/**
* Store a copy of this request into Bundle given.
* @param writeToBundle is a Bundle for storing configurations of this request.
@@ -182,6 +223,7 @@ public class ResetNetworkRequest {
writeToBundle.putString(KEY_ESIM_PACKAGE, mResetEsimPackageName);
writeToBundle.putInt(KEY_TELEPHONY_NET_POLICY_MANAGER_SUBID, mResetTelephonyManager);
writeToBundle.putInt(KEY_APN_SUBID, mResetApn);
writeToBundle.putInt(KEY_RESET_IMS_SUBID, mSubscriptionIdToResetIms);
return this;
}
@@ -219,6 +261,9 @@ public class ResetNetworkRequest {
if (mResetApn != INVALID_SUBSCRIPTION_ID) {
builder.resetApn(mResetApn);
}
if ((mResetOptions & RESET_IMS_STACK) != 0) {
builder.resetIms(mSubscriptionIdToResetIms);
}
return builder;
}
}

View File

@@ -23,8 +23,8 @@ import android.util.Log;
import androidx.annotation.VisibleForTesting;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.IntStream;
@@ -53,8 +53,8 @@ public class ResetSubscriptionContract implements AutoCloseable {
mContext = context;
// Only keeps specific subscription ID required to perform reset operation
IntStream subIdStream = IntStream.of(
resetRequest.getResetTelephonyAndNetworkPolicyManager()
, resetRequest.getResetApnSubId());
resetRequest.getResetTelephonyAndNetworkPolicyManager(),
resetRequest.getResetApnSubId(), resetRequest.getResetImsSubId());
mResetSubscriptionIds = subIdStream.sorted().distinct()
.filter(id -> SubscriptionManager.isUsableSubscriptionId(id))
.toArray();

View File

@@ -33,6 +33,7 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.settings.ResetNetworkRequest;
import com.android.settings.network.apn.ApnSettings;
import java.util.ArrayList;
@@ -212,6 +213,32 @@ public class ResetNetworkOperationBuilder {
return this;
}
/**
* Append a step of resetting IMS stack.
*
* @return this
*/
public ResetNetworkOperationBuilder resetIms(int subId) {
attachSystemServiceWork(Context.TELEPHONY_SERVICE,
(Consumer<TelephonyManager>) tm -> {
if (subId == ResetNetworkRequest.INVALID_SUBSCRIPTION_ID) {
// Do nothing
return;
}
if (subId == ResetNetworkRequest.ALL_SUBSCRIPTION_ID) {
// Reset IMS for all slots
for (int slotIndex = 0; slotIndex < tm.getActiveModemCount(); slotIndex++) {
tm.resetIms(slotIndex);
}
} else {
// Reset IMS for the slot specified by the sucriptionId.
final int slotIndex = SubscriptionManager.getSlotIndex(subId);
tm.resetIms(slotIndex);
}
});
return this;
}
/**
* Construct a Runnable containing all operations appended.
* @return Runnable

View File

@@ -16,12 +16,12 @@
package com.android.settings.network;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.net.ConnectivityManager;
@@ -34,6 +34,8 @@ import android.telephony.TelephonyManager;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.ResetNetworkRequest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -129,4 +131,44 @@ public class ResetNetworkOperationBuilderTest {
verify(mTelephonyManager).resetSettings();
verify(mNetworkPolicyManager).factoryReset(imsi);
}
@Test
public void resetIms_performReset_whenBuildAndRun_withSingleValidSubId() {
final int subId = 1;
doReturn(mTelephonyManager).when(mTelephonyManager)
.createForSubscriptionId(anyInt());
doReturn(mTelephonyManager).when(mContext)
.getSystemService(Context.TELEPHONY_SERVICE);
mBuilder.resetIms(subId).build().run();
verify(mTelephonyManager).resetIms(anyInt());
}
@Test
public void resetIms_performReset_whenBuildAndRun_withInvalidSubId() {
final int subId = ResetNetworkRequest.INVALID_SUBSCRIPTION_ID;
doReturn(mTelephonyManager).when(mTelephonyManager)
.createForSubscriptionId(anyInt());
doReturn(mTelephonyManager).when(mContext)
.getSystemService(Context.TELEPHONY_SERVICE);
mBuilder.resetIms(subId).build().run();
verify(mTelephonyManager, never()).resetIms(anyInt());
}
@Test
public void resetIms_performReset_whenBuildAndRun_withAllValidSubId() {
final int subId = ResetNetworkRequest.ALL_SUBSCRIPTION_ID;
doReturn(mTelephonyManager).when(mTelephonyManager)
.createForSubscriptionId(anyInt());
doReturn(mTelephonyManager).when(mContext)
.getSystemService(Context.TELEPHONY_SERVICE);
doReturn(2).when(mTelephonyManager).getActiveModemCount();
mBuilder.resetIms(subId).build().run();
verify(mTelephonyManager, times(2)).resetIms(anyInt());
}
}