[Settings] BT and WiFi reset menu might covers VPN

VPN would be reset by BT and WiFi reset menu under device without a SIM
available.

Bug: 260034791
Test: local and auto
Change-Id: I3c66cd629977cc11172758ebbe314167b5220419
diff --git a/src/com/android/settings/network/BluetoothWiFiResetPreferenceController.java b/src/com/android/settings/network/BluetoothWiFiResetPreferenceController.java
index c469304..6eb470b 100644
--- a/src/com/android/settings/network/BluetoothWiFiResetPreferenceController.java
+++ b/src/com/android/settings/network/BluetoothWiFiResetPreferenceController.java
@@ -125,7 +125,7 @@
             final AtomicReference<Exception> exceptionDuringReset =
                     new AtomicReference<Exception>();
             try {
-                resetOperation();
+                resetOperation().run();
             } catch (Exception exception) {
                 exceptionDuringReset.set(exception);
             }
@@ -144,13 +144,28 @@
     }
 
     @VisibleForTesting
-    protected void resetOperation() throws Exception {
-        new ResetNetworkRequest(
+    protected Runnable resetOperation() throws Exception {
+        if (SubscriptionUtil.isSimHardwareVisible(mContext)) {
+            return new ResetNetworkRequest(
+                    ResetNetworkRequest.RESET_WIFI_MANAGER |
+                    ResetNetworkRequest.RESET_WIFI_P2P_MANAGER |
+                    ResetNetworkRequest.RESET_BLUETOOTH_MANAGER)
+                .toResetNetworkOperationBuilder(mContext, Looper.getMainLooper())
+                .build();
+        }
+
+        /**
+         * For device without SIMs visible to the user
+         */
+        return new ResetNetworkRequest(
+                ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER |
+                ResetNetworkRequest.RESET_VPN_MANAGER |
                 ResetNetworkRequest.RESET_WIFI_MANAGER |
                 ResetNetworkRequest.RESET_WIFI_P2P_MANAGER |
-                ResetNetworkRequest.RESET_BLUETOOTH_MANAGER
-        ).toResetNetworkOperationBuilder(mContext, Looper.getMainLooper())
-                .build().run();
+                ResetNetworkRequest.RESET_BLUETOOTH_MANAGER)
+            .toResetNetworkOperationBuilder(mContext, Looper.getMainLooper())
+            .resetTelephonyAndNetworkPolicyManager(ResetNetworkRequest.ALL_SUBSCRIPTION_ID)
+            .build();
     }
 
     @VisibleForTesting
diff --git a/tests/robotests/src/com/android/settings/network/BluetoothWiFiResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/BluetoothWiFiResetPreferenceControllerTest.java
index 4714afe..3aea4a8 100644
--- a/tests/robotests/src/com/android/settings/network/BluetoothWiFiResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/BluetoothWiFiResetPreferenceControllerTest.java
@@ -17,15 +17,24 @@
 package com.android.settings.network;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.os.UserManager;
+import android.telephony.TelephonyManager;
 
 import com.android.settings.R;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
@@ -36,23 +45,69 @@
 
     private static final String PREFERENCE_KEY = "network_reset_bluetooth_wifi_pref";
 
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private ConnectivityManager mConnectivityManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+
     private Context mContext;
-    private BluetoothWiFiResetPreferenceController mTarget;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getResources()).thenReturn(mResources);
 
-        mTarget = spy(new BluetoothWiFiResetPreferenceController(mContext, PREFERENCE_KEY));
+        mockService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class,
+                mConnectivityManager);
+        mockService(Context.TELEPHONY_SERVICE, TelephonyManager.class, mTelephonyManager);
+    }
+
+    @Test
+    public void getAvailabilityStatus_returnAvailable_asOwnerUser() {
+        mockService(Context.USER_SERVICE, UserManager.class, mUserManager);
+        doReturn(true).when(mUserManager).isAdminUser();
+
+        BluetoothWiFiResetPreferenceController target =
+                new BluetoothWiFiResetPreferenceController(mContext, PREFERENCE_KEY);
+
+        assertThat(target.getAvailabilityStatus()).isEqualTo(
+                BluetoothWiFiResetPreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void resetOperation_notResetConnectivity_onDeviceWithSimVisible() {
+        mockService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class,
+                mConnectivityManager);
+        when(mResources.getBoolean(R.bool.config_show_sim_info)).thenReturn(true);
+
+        BluetoothWiFiResetPreferenceController target =
+                new BluetoothWiFiResetPreferenceController(mContext, PREFERENCE_KEY);
+
+        try {
+            target.resetOperation().run();
+        } catch (Exception exception) {}
+        verify(mConnectivityManager, never()).factoryReset();
     }
 
     @Test
     public void endOfReset_toastMessage_whenSuccess() {
-        mTarget.endOfReset(null);
+        String testText = "reset_bluetooth_wifi_complete_toast";
+        when(mResources.getString(R.string.reset_bluetooth_wifi_complete_toast)).thenReturn(testText);
+        BluetoothWiFiResetPreferenceController target =
+                new BluetoothWiFiResetPreferenceController(mContext, PREFERENCE_KEY);
 
-        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
-                mContext.getString(R.string.reset_bluetooth_wifi_complete_toast));
+        target.endOfReset(null);
+
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(testText);
     }
 
+    private <T> void mockService(String serviceName, Class<T> serviceClass, T service) {
+        when(mContext.getSystemServiceName(serviceClass)).thenReturn(serviceName);
+        when(mContext.getSystemService(serviceName)).thenReturn(service);
+    }
 }