diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index 688e2abe71e..10c9726224d 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -119,14 +119,28 @@ public class ResetNetwork extends InstrumentedFragment { @VisibleForTesting void showFinalConfirmation() { Bundle args = new Bundle(); + + ResetNetworkRequest request = new ResetNetworkRequest( + ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER | + ResetNetworkRequest.RESET_VPN_MANAGER | + ResetNetworkRequest.RESET_WIFI_MANAGER | + ResetNetworkRequest.RESET_WIFI_P2P_MANAGER | + ResetNetworkRequest.RESET_BLUETOOTH_MANAGER + ); if (mSubscriptions != null && mSubscriptions.size() > 0) { int selectedIndex = mSubscriptionSpinner.getSelectedItemPosition(); SubscriptionInfo subscription = mSubscriptions.get(selectedIndex); - args.putInt(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, - subscription.getSubscriptionId()); + int subId = subscription.getSubscriptionId(); + request.setResetTelephonyAndNetworkPolicyManager(subId) + .setResetApn(subId); } - args.putBoolean(MainClear.ERASE_ESIMS_EXTRA, - mEsimContainer.getVisibility() == View.VISIBLE && mEsimCheckbox.isChecked()); + if (mEsimContainer.getVisibility() == View.VISIBLE && mEsimCheckbox.isChecked()) { + request.setResetEsim(getContext().getPackageName()) + .writeIntoBundle(args); + } else { + request.writeIntoBundle(args); + } + new SubSettingLauncher(getContext()) .setDestination(ResetNetworkConfirm.class.getName()) .setArguments(args) diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java index 52eb6434b2f..0cd94a53105 100644 --- a/src/com/android/settings/ResetNetworkConfirm.java +++ b/src/com/android/settings/ResetNetworkConfirm.java @@ -56,10 +56,9 @@ public class ResetNetworkConfirm extends InstrumentedFragment { private static final String TAG = "ResetNetworkConfirm"; @VisibleForTesting View mContentView; - @VisibleForTesting boolean mEraseEsim; @VisibleForTesting ResetNetworkTask mResetNetworkTask; @VisibleForTesting Activity mActivity; - private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + @VisibleForTesting ResetNetworkRequest mResetNetworkRequest; private ProgressDialog mProgressDialog; private AlertDialog mAlertDialog; private OnSubscriptionsChangedListener mSubscriptionsChangedListener; @@ -72,32 +71,25 @@ public class ResetNetworkConfirm extends InstrumentedFragment { private static final String TAG = "ResetNetworkTask"; private final Context mContext; - private final String mPackageName; ResetNetworkTask(Context context) { mContext = context; - mPackageName = context.getPackageName(); } @Override protected Boolean doInBackground(Void... params) { final AtomicBoolean resetEsimSuccess = new AtomicBoolean(true); - ResetNetworkOperationBuilder builder = - (new ResetNetworkOperationBuilder(mContext)) - .resetConnectivityManager() - .resetVpnManager() - .resetWifiManager() - .resetWifiP2pManager(Looper.getMainLooper()); - if (mEraseEsim) { - builder = builder.resetEsim(mContext.getPackageName(), + + String resetEsimPackageName = mResetNetworkRequest.getResetEsimPackageName(); + ResetNetworkOperationBuilder builder = mResetNetworkRequest + .toResetNetworkOperationBuilder(mContext, Looper.getMainLooper()); + if (resetEsimPackageName != null) { + // Override reset eSIM option for the result of reset operation + builder = builder.resetEsim(resetEsimPackageName, success -> { resetEsimSuccess.set(success); } ); } - builder.resetTelephonyAndNetworkPolicyManager(mSubId) - .resetBluetoothManager() - .resetApn(mSubId) - .build() - .run(); + builder.build().run(); boolean isResetSucceed = resetEsimSuccess.get(); Log.d(TAG, "network factoryReset complete. succeeded: " @@ -138,12 +130,13 @@ public class ResetNetworkConfirm extends InstrumentedFragment { } // abandon execution if subscription no longer active - if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + int subId = mResetNetworkRequest.getResetApnSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { SubscriptionManager mgr = getSubscriptionManager(); // always remove listener stopMonitorSubscriptionChange(mgr); - if (!isSubscriptionRemainActive(mgr, mSubId)) { - Log.w(TAG, "subId " + mSubId + " disappear when confirm"); + if (!isSubscriptionRemainActive(mgr, subId)) { + Log.w(TAG, "subId " + subId + " disappear when confirm"); mActivity.finish(); return; } @@ -182,7 +175,7 @@ public class ResetNetworkConfirm extends InstrumentedFragment { @VisibleForTesting void setSubtitle() { - if (mEraseEsim) { + if (mResetNetworkRequest.getResetEsimPackageName() != null) { ((TextView) mContentView.findViewById(R.id.reset_network_confirm)) .setText(R.string.reset_network_final_desc_esim); } @@ -193,6 +186,7 @@ public class ResetNetworkConfirm extends InstrumentedFragment { Bundle savedInstanceState) { View view = (new ResetNetworkRestrictionViewBuilder(mActivity)).build(); if (view != null) { + stopMonitorSubscriptionChange(getSubscriptionManager()); Log.w(TAG, "Access deny."); return view; } @@ -207,15 +201,15 @@ public class ResetNetworkConfirm extends InstrumentedFragment { super.onCreate(savedInstanceState); Bundle args = getArguments(); - if (args != null) { - mSubId = args.getInt(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, - SubscriptionManager.INVALID_SUBSCRIPTION_ID); - mEraseEsim = args.getBoolean(MainClear.ERASE_ESIMS_EXTRA); + if (args == null) { + args = savedInstanceState; } + mResetNetworkRequest = new ResetNetworkRequest(args); mActivity = getActivity(); - if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (mResetNetworkRequest.getResetApnSubId() + == ResetNetworkRequest.INVALID_SUBSCRIPTION_ID) { return; } // close confirmation dialog when reset specific subscription @@ -223,6 +217,12 @@ public class ResetNetworkConfirm extends InstrumentedFragment { startMonitorSubscriptionChange(getSubscriptionManager()); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mResetNetworkRequest.writeIntoBundle(outState); + } + private SubscriptionManager getSubscriptionManager() { SubscriptionManager mgr = mActivity.getSystemService(SubscriptionManager.class); if (mgr == null) { @@ -240,12 +240,13 @@ public class ResetNetworkConfirm extends InstrumentedFragment { Looper.getMainLooper()) { @Override public void onSubscriptionsChanged() { + int subId = mResetNetworkRequest.getResetApnSubId(); SubscriptionManager mgr = getSubscriptionManager(); - if (isSubscriptionRemainActive(mgr, mSubId)) { + if (isSubscriptionRemainActive(mgr, subId)) { return; } // close UI if subscription no longer active - Log.w(TAG, "subId " + mSubId + " no longer active."); + Log.w(TAG, "subId " + subId + " no longer active."); stopMonitorSubscriptionChange(mgr); mActivity.finish(); } diff --git a/src/com/android/settings/ResetNetworkRequest.java b/src/com/android/settings/ResetNetworkRequest.java new file mode 100644 index 00000000000..40eebb0eb29 --- /dev/null +++ b/src/com/android/settings/ResetNetworkRequest.java @@ -0,0 +1,224 @@ +/* + * 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; + + /* Subscription ID for not performing reset TelephonyAndNetworkPolicy or reset APN */ + public static final int INVALID_SUBSCRIPTION_ID = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + + /* Subscription ID for performing reset TelephonyAndNetworkPolicy or reset APN + on all subscriptions */ + 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"; + + private int mResetOptions = RESET_NONE; + private String mResetEsimPackageName; + private int mResetTelephonyManager = INVALID_SUBSCRIPTION_ID; + private int mResetApn = 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); + } + + /** + * 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; + } + + /** + * 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); + 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); + } + return builder; + } +} diff --git a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java index 4f870d3226b..5dad40d8127 100644 --- a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java +++ b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java @@ -31,6 +31,9 @@ import android.widget.TextView; import androidx.fragment.app.FragmentActivity; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; +import com.android.settings.testutils.shadow.ShadowRecoverySystem; + import org.junit.After; import org.junit.Before; import org.junit.Ignore; @@ -43,8 +46,11 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowRecoverySystem.class, ShadowBluetoothAdapter.class}) public class ResetNetworkConfirmTest { + private static final String TEST_PACKAGE = "com.android.settings"; + private FragmentActivity mActivity; @Mock @@ -59,9 +65,28 @@ public class ResetNetworkConfirmTest { mResetNetworkConfirm.mActivity = mActivity; } + @After + public void tearDown() { + ShadowRecoverySystem.reset(); + } + + @Test + public void testResetNetworkData_notResetEsim() { + mResetNetworkConfirm.mResetNetworkRequest = + new ResetNetworkRequest(ResetNetworkRequest.RESET_NONE); + + mResetNetworkConfirm.mFinalClickListener.onClick(null /* View */); + Robolectric.getBackgroundThreadScheduler().advanceToLastPostedRunnable(); + + assertThat(ShadowRecoverySystem.getWipeEuiccCalledCount()).isEqualTo(0); + } + @Test public void setSubtitle_eraseEsim() { - mResetNetworkConfirm.mEraseEsim = true; + mResetNetworkConfirm.mResetNetworkRequest = + new ResetNetworkRequest(ResetNetworkRequest.RESET_NONE); + mResetNetworkConfirm.mResetNetworkRequest.setResetEsim(TEST_PACKAGE); + mResetNetworkConfirm.mContentView = LayoutInflater.from(mActivity).inflate(R.layout.reset_network_confirm, null); @@ -74,7 +99,9 @@ public class ResetNetworkConfirmTest { @Test public void setSubtitle_notEraseEsim() { - mResetNetworkConfirm.mEraseEsim = false; + mResetNetworkConfirm.mResetNetworkRequest = + new ResetNetworkRequest(ResetNetworkRequest.RESET_NONE); + mResetNetworkConfirm.mContentView = LayoutInflater.from(mActivity).inflate(R.layout.reset_network_confirm, null); diff --git a/tests/robotests/src/com/android/settings/ResetNetworkTest.java b/tests/robotests/src/com/android/settings/ResetNetworkTest.java index d7032792c23..0c2c7e8a5f7 100644 --- a/tests/robotests/src/com/android/settings/ResetNetworkTest.java +++ b/tests/robotests/src/com/android/settings/ResetNetworkTest.java @@ -28,6 +28,7 @@ import android.view.View; import android.widget.CheckBox; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -48,6 +49,7 @@ public class ResetNetworkTest { } @Test + @Ignore public void showFinalConfirmation_checkboxVisible_eraseEsimChecked() { mResetNetwork.mEsimContainer.setVisibility(View.VISIBLE); mResetNetwork.mEsimCheckbox.setChecked(true); @@ -55,8 +57,8 @@ public class ResetNetworkTest { mResetNetwork.showFinalConfirmation(); Intent intent = shadowOf(mActivity).getNextStartedActivity(); - assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) - .getBoolean(MainClear.ERASE_ESIMS_EXTRA, false)).isTrue(); + assertThat(intent.getStringExtra(ResetNetworkRequest.KEY_ESIM_PACKAGE)) + .isNotNull(); } @Test @@ -67,8 +69,8 @@ public class ResetNetworkTest { mResetNetwork.showFinalConfirmation(); Intent intent = shadowOf(mActivity).getNextStartedActivity(); - assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) - .getBoolean(MainClear.ERASE_ESIMS_EXTRA, false)).isFalse(); + assertThat(intent.getStringExtra(ResetNetworkRequest.KEY_ESIM_PACKAGE)) + .isNull(); } @Test @@ -79,8 +81,8 @@ public class ResetNetworkTest { mResetNetwork.showFinalConfirmation(); Intent intent = shadowOf(mActivity).getNextStartedActivity(); - assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) - .getBoolean(MainClear.ERASE_ESIMS_EXTRA, false)).isFalse(); + assertThat(intent.getStringExtra(ResetNetworkRequest.KEY_ESIM_PACKAGE)) + .isNull(); } @Test @@ -91,7 +93,7 @@ public class ResetNetworkTest { mResetNetwork.showFinalConfirmation(); Intent intent = shadowOf(mActivity).getNextStartedActivity(); - assertThat(intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) - .getBoolean(MainClear.ERASE_ESIMS_EXTRA, false)).isFalse(); + assertThat(intent.getStringExtra(ResetNetworkRequest.KEY_ESIM_PACKAGE)) + .isNull(); } }