Files
app_Settings/src/com/android/settings/ResetNetworkRequest.java
Rambo Wang a07738266b Fix Settings restart during Reset mobile nework settings flow
This CL avoids restarting Settings in the reset mobile flow when phone
process is restarted, by switching the usage of the stable content
provider connection to the unstable client.

The CL also arranges restarting phone process as the last reset
operation in the flow (later than RILD reset) to avoid any reset
operation get impacted by phone process restarting.

Since the permission to protect the TelephonyContentProvider has been
renamed, the CL also renames the requsted permision.

Bug: 347047105
Test: atest ResetNetworkOperationBuilderTest
Test: Reset mobile network feature test
Flag: EXEMPT resource update with minor refactoring
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5ac9d9c8fa0005f787b75052010dcc9935efcb4f)
Merged-In: I7bfa79bc9d7451a4a03269704b0009a3730e287f
Change-Id: I7bfa79bc9d7451a4a03269704b0009a3730e287f
2024-07-26 02:03:55 +00:00

283 lines
11 KiB
Java

/*
* Copyright (C) 2022 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;
import android.content.Context;
import android.os.Bundle;
import android.os.Looper;
import android.telephony.SubscriptionManager;
import androidx.annotation.VisibleForTesting;
import com.android.settings.network.ResetNetworkOperationBuilder;
/**
* A request which contains options required for resetting network.
*/
public class ResetNetworkRequest {
/* Reset option - nothing get reset */
public static final int RESET_NONE = 0x00;
/* Reset option - reset ConnectivityManager */
public static final int RESET_CONNECTIVITY_MANAGER = 0x01;
/* Reset option - reset VpnManager */
public static final int RESET_VPN_MANAGER = 0x02;
/* Reset option - reset WiFiManager */
public static final int RESET_WIFI_MANAGER = 0x04;
/* Reset option - reset WifiP2pManager */
public static final int RESET_WIFI_P2P_MANAGER = 0x08;
/* Reset option - reset BluetoothManager */
public static final int RESET_BLUETOOTH_MANAGER = 0x10;
/* Reset option - reset IMS stack */
public static final int RESET_IMS_STACK = 0x20;
/* Reset option - reset phone process */
public static final int RESET_PHONE_PROCESS = 0x40;
/* Reset option - reset RILD */
public static final int RESET_RILD = 0x80;
/**
* 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 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 */
@VisibleForTesting
protected static final String KEY_RESET_OPTIONS = "resetNetworkOptions";
/* Key within Bundle. To store package name for resetting eSIM */
@VisibleForTesting
protected static final String KEY_ESIM_PACKAGE = "resetEsimPackage";
/**
* Key within Bundle. To store subscription ID for resetting
* telephony manager and network and network policy manager.
*/
@VisibleForTesting
protected static final String KEY_TELEPHONY_NET_POLICY_MANAGER_SUBID =
"resetTelephonyNetPolicySubId";
/* Key within Bundle. To store subscription ID for resetting APN. */
@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.
* @param optionsFromBundle is a Bundle which previously stored through #writeIntoBundle()
*/
public ResetNetworkRequest(Bundle optionsFromBundle) {
if (optionsFromBundle == null) {
return;
}
mResetOptions = optionsFromBundle.getInt(KEY_RESET_OPTIONS, RESET_NONE);
mResetEsimPackageName = optionsFromBundle.getString(KEY_ESIM_PACKAGE);
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);
}
/**
* Construct of class
* @param resetOptions is a binary combination(OR logic operation) of constants
* comes with RESET_ prefix. Which are the reset options comes within.
*/
public ResetNetworkRequest(int resetOptions) {
mResetOptions = resetOptions;
}
/**
* Get the package name applied for resetting eSIM.
* @return package name. {@code null} means resetting eSIM is not part of the
* option within this request.
*/
public String getResetEsimPackageName() {
return mResetEsimPackageName;
}
/**
* Set the package name for resetting eSIM.
* @param packageName is the package name for resetting eSIM.
* {@code null} will remove the resetting eSIM option out of this request.
* @return this request
*/
public ResetNetworkRequest setResetEsim(String packageName) {
mResetEsimPackageName = packageName;
return this;
}
/**
* Get the subscription ID applied for resetting Telephony and NetworkPolicy.
* @return subscription ID.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means
* resetting Telephony and NetworkPolicy is not part of the option
* within this request.
*/
public int getResetTelephonyAndNetworkPolicyManager() {
return mResetTelephonyManager;
}
/**
* Set the subscription ID applied for resetting Telephony and NetworkPolicy.
* @param subscriptionId is the subscription ID referenced fron SubscriptionManager.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means resetting Telephony and NetworkPolicy
* will not take place.
* @return this request
*/
public ResetNetworkRequest setResetTelephonyAndNetworkPolicyManager(int subscriptionId) {
mResetTelephonyManager = subscriptionId;
return this;
}
/**
* Get the subscription ID applied for resetting APN.
* @return subscription ID.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means resetting APN
* is not part of the option within this request.
*/
public int getResetApnSubId() {
return mResetApn;
}
/**
* Set the subscription ID applied for resetting APN.
* @param subscriptionId is the subscription ID referenced fron SubscriptionManager.
* {@code ALL_SUBSCRIPTION_ID} for applying to all subscriptions.
* {@code INVALID_SUBSCRIPTION_ID} means resetting APN will not take place.
* @return this request
*/
public ResetNetworkRequest setResetApn(int subscriptionId) {
mResetApn = subscriptionId;
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.
* @return this request
*/
public ResetNetworkRequest writeIntoBundle(Bundle writeToBundle) {
writeToBundle.putInt(KEY_RESET_OPTIONS, mResetOptions);
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;
}
/**
* Build a ResetNetworkOperationBuilder based on configurations within this request.
* @param context required by ResetNetworkOperationBuilder
* @param looper required by ResetNetworkOperationBuilder for callback support
* @return a ResetNetworkOperationBuilder
*/
public ResetNetworkOperationBuilder toResetNetworkOperationBuilder(Context context,
Looper looper) {
// Follow specific order based on previous design within file ResetNetworkConfirm.java
ResetNetworkOperationBuilder builder = new ResetNetworkOperationBuilder(context);
if ((mResetOptions & RESET_CONNECTIVITY_MANAGER) != 0) {
builder.resetConnectivityManager();
}
if ((mResetOptions & RESET_VPN_MANAGER) != 0) {
builder.resetVpnManager();
}
if ((mResetOptions & RESET_WIFI_MANAGER) != 0) {
builder.resetWifiManager();
}
if ((mResetOptions & RESET_WIFI_P2P_MANAGER) != 0) {
builder.resetWifiP2pManager(looper);
}
if (mResetEsimPackageName != null) {
builder.resetEsim(mResetEsimPackageName);
}
if (mResetTelephonyManager != INVALID_SUBSCRIPTION_ID) {
builder.resetTelephonyAndNetworkPolicyManager(mResetTelephonyManager);
}
if ((mResetOptions & RESET_BLUETOOTH_MANAGER) != 0) {
builder.resetBluetoothManager();
}
if (mResetApn != INVALID_SUBSCRIPTION_ID) {
builder.resetApn(mResetApn);
}
if ((mResetOptions & RESET_IMS_STACK) != 0) {
builder.resetIms(mSubscriptionIdToResetIms);
}
// Reset phone process and RILD may impact above components, keep them at the end
if ((mResetOptions & RESET_RILD) != 0) {
builder.restartRild();
}
if ((mResetOptions & RESET_PHONE_PROCESS) != 0) {
builder.restartPhoneProcess();
}
return builder;
}
}