Add BatterySaver as SettingSlice

Convert BatterySaverController to TogglePrefController.
This was the first MasterSwitchController, so we needed
to add the preference case to updateState.

Test: Robotests
Change-Id: I32f3dee0b183807c66c19513b8b064af8f369c2a
Fixes: 67996992
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index fbe4e0d..d89653a 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -36,7 +36,8 @@
         <com.android.settings.widget.MasterSwitchPreference
             android:fragment="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings"
             android:key="battery_saver_summary"
-            android:title="@string/battery_saver"/>
+            android:title="@string/battery_saver"
+            settings:controller="com.android.settings.fuelgauge.BatterySaverController"/>
 
         <Preference
             android:fragment="com.android.settings.fuelgauge.SmartBatterySettings"
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index 5431f4d..1cf4289 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -17,6 +17,8 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.TwoStatePreference;
 
+import com.android.settings.widget.MasterSwitchPreference;
+
 /**
  * Abstract class that consolidates logic for updating toggle controllers.
  * It automatically handles the getting and setting of the switch UI element.
@@ -46,7 +48,11 @@
 
     @Override
     public final void updateState(Preference preference) {
-        ((TwoStatePreference) preference).setChecked(isChecked());
+        if (preference instanceof TwoStatePreference) {
+            ((TwoStatePreference) preference).setChecked(isChecked());
+        } if (preference instanceof MasterSwitchPreference) {
+            ((MasterSwitchPreference) preference).setChecked(isChecked());
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 85fb9f5..58b7d13 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -21,42 +21,36 @@
 import android.os.PowerManager;
 import android.provider.Settings;
 import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
+
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.dashboard.conditional.BatterySaverCondition;
 import com.android.settings.dashboard.conditional.ConditionManager;
 import com.android.settings.widget.MasterSwitchPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
-import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING;
-
-public class BatterySaverController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
-        LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
+public class BatterySaverController extends TogglePreferenceController
+        implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
     private static final String KEY_BATTERY_SAVER = "battery_saver_summary";
     private final BatterySaverReceiver mBatteryStateChangeReceiver;
     private final PowerManager mPowerManager;
     private MasterSwitchPreference mBatterySaverPref;
 
-    public BatterySaverController(Context context, Lifecycle lifecycle) {
-        super(context);
+    public BatterySaverController(Context context) {
+        super(context, KEY_BATTERY_SAVER);
 
-        lifecycle.addObserver(this);
         mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
         mBatteryStateChangeReceiver.setBatterySaverListener(this);
     }
 
     @Override
-    public boolean isAvailable() {
-        return true;
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
     }
 
     @Override
@@ -71,17 +65,9 @@
     }
 
     @Override
-    public void updateState(Preference preference) {
-        mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode());
-        updateSummary();
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        final boolean saverOn = (Boolean) newValue;
-        if (saverOn != mPowerManager.isPowerSaveMode()
-                && !mPowerManager.setPowerSaveMode(saverOn)) {
-            // Do nothing if power save mode doesn't set correctly
+    public boolean setChecked(boolean isChecked) {
+        mBatterySaverPref.setChecked(isChecked);
+        if (!mPowerManager.setPowerSaveMode(isChecked)) {
             return false;
         }
 
@@ -91,6 +77,11 @@
     }
 
     @Override
+    public boolean isChecked() {
+        return mPowerManager.isPowerSaveMode();
+    }
+
+    @Override
     public void onStart() {
         mContext.getContentResolver().registerContentObserver(
                 Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL)
@@ -110,7 +101,8 @@
         ConditionManager.get(mContext).getCondition(BatterySaverCondition.class).refreshState();
     }
 
-    private void updateSummary() {
+    @Override
+    public String getSummary() {
         final boolean mode = mPowerManager.isPowerSaveMode();
         final int format = mode ? R.string.battery_saver_on_summary
                 : R.string.battery_saver_off_summary;
@@ -119,10 +111,12 @@
         final int percentFormat = percent > 0 ? R.string.battery_saver_desc_turn_on_auto_pct
                 : R.string.battery_saver_desc_turn_on_auto_never;
 
-        final String summary = mContext.getString(format, mContext.getString(percentFormat,
+        return mContext.getString(format, mContext.getString(percentFormat,
                 Utils.formatPercentage(percent)));
+    }
 
-        mBatterySaverPref.setSummary(summary);
+    private void updateSummary() {
+        mBatterySaverPref.setSummary(getSummary());
     }
 
     private final ContentObserver mObserver = new ContentObserver(new Handler()) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 659166a..e6fd449 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -59,6 +59,7 @@
 
 import com.android.settingslib.utils.PowerUtil;
 import com.android.settingslib.utils.StringUtil;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -232,17 +233,20 @@
         final SettingsActivity activity = (SettingsActivity) getActivity();
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController(
-                context, activity, this /* host */, getLifecycle());
+                context, activity, this /* host */, lifecycle);
         controllers.add(mBatteryHeaderPreferenceController);
         mBatteryAppListPreferenceController = new BatteryAppListPreferenceController(context,
                 KEY_APP_LIST, lifecycle, activity, this);
         controllers.add(mBatteryAppListPreferenceController);
         mBatteryTipPreferenceController = new BatteryTipPreferenceController(context,
-                KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this, this);
+                KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this /* fragment */, this /*
+                BatteryTipListener */);
         controllers.add(mBatteryTipPreferenceController);
-        controllers.add(new BatterySaverController(context, getLifecycle()));
+        BatterySaverController batterySaverController = new BatterySaverController(context);
+        controllers.add(batterySaverController);
         controllers.add(new BatteryPercentagePreferenceController(context));
 
+        lifecycle.addObserver(batterySaverController);
         return controllers;
     }
 
@@ -322,7 +326,8 @@
 
     @VisibleForTesting
     void updateLastFullChargePreference(long timeMs) {
-        final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
+        final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs,
+                false);
         mLastFullChargePref.setSubtitle(timeSequence);
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index e6c4923..14a445b 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -313,12 +313,14 @@
         controllers.add(mBatteryHeaderPreferenceController);
         controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS));
         controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT));
-        controllers.add(new BatterySaverController(context, getLifecycle()));
         controllers.add(new BatteryPercentagePreferenceController(context));
         controllers.add(new AmbientDisplayPreferenceController(
                 context,
                 new AmbientDisplayConfiguration(context),
                 KEY_AMBIENT_DISPLAY));
+        BatterySaverController batterySaverController = new BatterySaverController(context);
+        controllers.add(batterySaverController);
+        getLifecycle().addObserver(batterySaverController);
         return controllers;
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index c75a6a6..6cc3310 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -53,7 +53,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mBatterySaverController = spy(new BatterySaverController(mContext, mLifecycle));
+        mBatterySaverController = spy(new BatterySaverController(mContext));
         ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
         ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
         doNothing().when(mBatterySaverController).refreshConditionManager();