Merge "Import translations. DO NOT MERGE ANYWHERE" into tm-dev
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 1027792..4b94c81 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -72,7 +72,7 @@
                 }
             }
             configBuilder.setPassphrase(password, securityType);
-        } catch (IllegalArgumentException e) {
+        } catch (Exception e) {
             return false;
         }
         return true;
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
index 6f86ddd..580bc39 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
@@ -17,6 +17,11 @@
 package com.android.settings.wifi.tether;
 
 import static android.net.ConnectivityManager.TETHERING_WIFI;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLING;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_FAILED;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -51,7 +56,7 @@
     private final WifiManager mWifiManager;
 
     @VisibleForTesting
-    final DataSaverBackend mDataSaverBackend;
+    DataSaverBackend mDataSaverBackend;
     @VisibleForTesting
     final ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
             new ConnectivityManager.OnStartTetheringCallback() {
@@ -75,7 +80,7 @@
         mConnectivityManager =
                 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
-        mSwitchBar.setChecked(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED);
+        mSwitchBar.setChecked(mWifiManager.getWifiApState() == WIFI_AP_STATE_ENABLED);
         updateWifiSwitch();
     }
 
@@ -95,6 +100,9 @@
 
     @Override
     public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        // Filter out unnecessary callbacks when switch is disabled.
+        if (!switchView.isEnabled()) return;
+
         if (isChecked) {
             startTether();
         } else {
@@ -118,39 +126,21 @@
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
-                final int state = intent.getIntExtra(
-                        WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
+                final int state = intent.getIntExtra(EXTRA_WIFI_AP_STATE, WIFI_AP_STATE_FAILED);
                 handleWifiApStateChanged(state);
             }
         }
     };
 
-    private void handleWifiApStateChanged(int state) {
-        switch (state) {
-            case WifiManager.WIFI_AP_STATE_ENABLING:
-                mSwitchBar.setEnabled(false);
-                break;
-            case WifiManager.WIFI_AP_STATE_ENABLED:
-                if (!mSwitch.isChecked()) {
-                    mSwitch.setChecked(true);
-                }
-                updateWifiSwitch();
-                break;
-            case WifiManager.WIFI_AP_STATE_DISABLING:
-                if (mSwitch.isChecked()) {
-                    mSwitch.setChecked(false);
-                }
-                mSwitchBar.setEnabled(false);
-                break;
-            case WifiManager.WIFI_AP_STATE_DISABLED:
-                mSwitch.setChecked(false);
-                updateWifiSwitch();
-                break;
-            default:
-                mSwitch.setChecked(false);
-                updateWifiSwitch();
-                break;
+    @VisibleForTesting
+    void handleWifiApStateChanged(int state) {
+        if (state == WIFI_AP_STATE_ENABLING || state == WIFI_AP_STATE_DISABLING) return;
+
+        final boolean shouldBeChecked = (state == WIFI_AP_STATE_ENABLED);
+        if (mSwitch.isChecked() != shouldBeChecked) {
+            mSwitch.setChecked(shouldBeChecked);
         }
+        updateWifiSwitch();
     }
 
     private void updateWifiSwitch() {
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java
index a27743e..7c17c5f 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSwitchBarControllerTest.java
@@ -16,66 +16,76 @@
 
 package com.android.settings.wifi.tether;
 
-import static android.net.ConnectivityManager.TETHERING_WIFI;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLING;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_FAILED;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
-import android.net.NetworkPolicyManager;
 import android.net.wifi.WifiManager;
 import android.widget.Switch;
 
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.datausage.DataSaverBackend;
 import com.android.settings.widget.SettingsMainSwitchBar;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class WifiTetherSwitchBarControllerTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    Context mContext = ApplicationProvider.getApplicationContext();
     @Mock
     private WifiManager mWifiManager;
     @Mock
     private ConnectivityManager mConnectivityManager;
     @Mock
-    private NetworkPolicyManager mNetworkPolicyManager;
+    private DataSaverBackend mDataSaverBackend;
     @Mock
     private Switch mSwitch;
 
-    private Context mContext;
     private SettingsMainSwitchBar mSwitchBar;
     private WifiTetherSwitchBarController mController;
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(RuntimeEnvironment.application);
         mSwitchBar = new SettingsMainSwitchBar(mContext);
         when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
         when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(
                 mConnectivityManager);
-        when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE)).thenReturn(
-                mNetworkPolicyManager);
+        when(mDataSaverBackend.isDataSaverEnabled()).thenReturn(false);
+        when(mSwitch.isEnabled()).thenReturn(true);
 
         mController = new WifiTetherSwitchBarController(mContext, mSwitchBar);
+        mController.mDataSaverBackend = mDataSaverBackend;
     }
 
     @Test
     public void startTether_fail_resetSwitchBar() {
-        when(mNetworkPolicyManager.getRestrictBackground()).thenReturn(false);
+        when(mDataSaverBackend.isDataSaverEnabled()).thenReturn(false);
 
         mController.startTether();
         mController.mOnStartTetheringCallback.onTetheringFailed();
@@ -89,23 +99,33 @@
         assertThat(mSwitchBar.isEnabled()).isTrue();
 
         // try to turn data saver on
-        when(mNetworkPolicyManager.getRestrictBackground()).thenReturn(true);
+        when(mDataSaverBackend.isDataSaverEnabled()).thenReturn(true);
         mController.onDataSaverChanged(true);
         assertThat(mSwitchBar.isEnabled()).isFalse();
 
         // lets turn data saver off again
-        when(mNetworkPolicyManager.getRestrictBackground()).thenReturn(false);
+        when(mDataSaverBackend.isDataSaverEnabled()).thenReturn(false);
         mController.onDataSaverChanged(false);
         assertThat(mSwitchBar.isEnabled()).isTrue();
     }
 
     @Test
+    public void onSwitchChanged_switchNotEnabled_doNothingForTethering() {
+        when(mSwitch.isEnabled()).thenReturn(false);
+
+        mController.onSwitchChanged(mSwitch, mSwitch.isChecked());
+
+        verify(mConnectivityManager, never()).startTethering(anyInt(), anyBoolean(), any(), any());
+        verify(mConnectivityManager, never()).stopTethering(anyInt());
+    }
+
+    @Test
     public void onSwitchChanged_isChecked_startTethering() {
         when(mSwitch.isChecked()).thenReturn(true);
 
         mController.onSwitchChanged(mSwitch, mSwitch.isChecked());
 
-        verify(mConnectivityManager).startTethering(eq(TETHERING_WIFI), anyBoolean(), any(), any());
+        verify(mConnectivityManager).startTethering(anyInt(), anyBoolean(), any(), any());
     }
 
     @Test
@@ -114,6 +134,57 @@
 
         mController.onSwitchChanged(mSwitch, mSwitch.isChecked());
 
-        verify(mConnectivityManager).stopTethering(TETHERING_WIFI);
+        verify(mConnectivityManager).stopTethering(anyInt());
+    }
+
+    @Test
+    public void handleWifiApStateChanged_stateIsEnabling_notEnabledSwitchBar() {
+        mSwitchBar.setEnabled(false);
+
+        mController.handleWifiApStateChanged(WIFI_AP_STATE_ENABLING);
+
+        assertThat(mSwitchBar.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void handleWifiApStateChanged_stateIsDisabling_notEnabledSwitchBar() {
+        mSwitchBar.setEnabled(false);
+
+        mController.handleWifiApStateChanged(WIFI_AP_STATE_DISABLING);
+
+        assertThat(mSwitchBar.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void handleWifiApStateChanged_stateIsEnabled_enabledAndCheckedSwitchBar() {
+        mSwitchBar.setEnabled(false);
+        mSwitchBar.setChecked(false);
+
+        mController.handleWifiApStateChanged(WIFI_AP_STATE_ENABLED);
+
+        assertThat(mSwitchBar.isEnabled()).isTrue();
+        assertThat(mSwitchBar.isChecked()).isTrue();
+    }
+
+    @Test
+    public void handleWifiApStateChanged_stateIsDisabled_enabledAndUncheckedSwitchBar() {
+        mSwitchBar.setEnabled(false);
+        mSwitchBar.setChecked(true);
+
+        mController.handleWifiApStateChanged(WIFI_AP_STATE_DISABLED);
+
+        assertThat(mSwitchBar.isEnabled()).isTrue();
+        assertThat(mSwitchBar.isChecked()).isFalse();
+    }
+
+    @Test
+    public void handleWifiApStateChanged_stateIsFailed_enabledAndUncheckedSwitchBar() {
+        mSwitchBar.setEnabled(false);
+        mSwitchBar.setChecked(true);
+
+        mController.handleWifiApStateChanged(WIFI_AP_STATE_FAILED);
+
+        assertThat(mSwitchBar.isEnabled()).isTrue();
+        assertThat(mSwitchBar.isChecked()).isFalse();
     }
 }