| /* | |
| * 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; | |
| } | |
| } |