Disable tethering when Data Saver mode is on.

BUG: 28313291
Change-Id: Idbedd440a1baa41f1407b32e86f5ae0080e60798
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index fa9f545..86fb1d3 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -39,7 +39,9 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.settings.datausage.DataSaverBackend;
 import com.android.settings.wifi.WifiApDialog;
 import com.android.settings.wifi.WifiApEnabler;
 import com.android.settingslib.TetherUtil;
@@ -56,12 +58,14 @@
  * Displays preferences for Tethering.
  */
 public class TetherSettings extends RestrictedSettingsFragment
-        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener {
+        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener,
+        DataSaverBackend.Listener {
 
     private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
     private static final String ENABLE_WIFI_AP = "enable_wifi_ap";
     private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
     private static final String TETHER_CHOICE = "TETHER_TYPE";
+    private static final String DATA_SAVER_FOOTER = "disabled_on_data_saver";
 
     private static final int DIALOG_AP_SETTINGS = 1;
 
@@ -110,6 +114,10 @@
 
     private boolean mUnavailable;
 
+    private DataSaverBackend mDataSaverBackend;
+    private boolean mDataSaverEnabled;
+    private Preference mDataSaverFooter;
+
     @Override
     protected int getMetricsCategory() {
         return MetricsEvent.TETHER;
@@ -125,6 +133,10 @@
 
         addPreferencesFromResource(R.xml.tether_prefs);
 
+        mDataSaverBackend = new DataSaverBackend(getContext());
+        mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled();
+        mDataSaverFooter = findPreference(DATA_SAVER_FOOTER);
+
         setIfOnlyAvailableForAdmins(true);
         if (isUiRestricted()) {
             mUnavailable = true;
@@ -145,6 +157,8 @@
         mUsbTether = (SwitchPreference) findPreference(USB_TETHER_SETTINGS);
         mBluetoothTether = (SwitchPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
 
+        mDataSaverBackend.addListener(this);
+
         mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
 
@@ -161,7 +175,7 @@
         }
 
         if (wifiAvailable && !Utils.isMonkeyRunning()) {
-            mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
+            mWifiApEnabler = new WifiApEnabler(activity, mDataSaverBackend, mEnableWifiAp);
             initWifiTethering();
         } else {
             getPreferenceScreen().removePreference(mEnableWifiAp);
@@ -178,6 +192,31 @@
                 mBluetoothTether.setChecked(false);
             }
         }
+        // Set initial state based on Data Saver mode.
+        onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled());
+    }
+
+    @Override
+    public void onDestroy() {
+        mDataSaverBackend.remListener(this);
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDataSaverChanged(boolean isDataSaving) {
+        mDataSaverEnabled = isDataSaving;
+        mEnableWifiAp.setEnabled(!mDataSaverEnabled);
+        mUsbTether.setEnabled(!mDataSaverEnabled);
+        mBluetoothTether.setEnabled(!mDataSaverEnabled);
+        mDataSaverFooter.setVisible(mDataSaverEnabled);
+    }
+
+    @Override
+    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
+    }
+
+    @Override
+    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted)  {
     }
 
     private void initWifiTethering() {
@@ -368,7 +407,7 @@
 
         if (usbTethered) {
             mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
-            mUsbTether.setEnabled(true);
+            mUsbTether.setEnabled(!mDataSaverEnabled);
             mUsbTether.setChecked(true);
         } else if (usbAvailable) {
             if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
@@ -376,7 +415,7 @@
             } else {
                 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
             }
-            mUsbTether.setEnabled(true);
+            mUsbTether.setEnabled(!mDataSaverEnabled);
             mUsbTether.setChecked(false);
         } else if (usbErrored) {
             mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
@@ -418,7 +457,7 @@
             if (btState == BluetoothAdapter.STATE_ON && bluetoothPan != null
                     && bluetoothPan.isTetheringOn()) {
                 mBluetoothTether.setChecked(true);
-                mBluetoothTether.setEnabled(true);
+                mBluetoothTether.setEnabled(!mDataSaverEnabled);
                 int bluetoothTethered = bluetoothPan.getConnectedDevices().size();
                 if (bluetoothTethered > 1) {
                     String summary = getString(
@@ -434,7 +473,7 @@
                     mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
                 }
             } else {
-                mBluetoothTether.setEnabled(true);
+                mBluetoothTether.setEnabled(!mDataSaverEnabled);
                 mBluetoothTether.setChecked(false);
                 mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
             }