Use BatterySaverReceiver in battery saver settings

Use this receiver to listen to following updates:
1. Plug state: if it is plugged in, disable this two state
button, otherwise make it enabled
2. low power mode: If mode on, show "turn off" otherwise show
"turn on"

Bug: 72228477
Test: RunSettingsRoboTests
Change-Id: Ib3d3df9f9a5fbac8b1b876c9e193beb75f522ebd
diff --git a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
index 2254438..300dc0f 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
@@ -69,7 +69,7 @@
         mBatterySaverListener = lsn;
     }
 
-    interface BatterySaverListener {
+    public interface BatterySaverListener {
         void onPowerSaveModeChanged();
         void onBatteryChanged(boolean pluggedIn);
     }
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
index 17b42b8..1d427c9 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
@@ -22,6 +22,7 @@
 import android.support.v7.preference.Preference;
 
 import com.android.settings.fuelgauge.BatteryBroadcastReceiver;
+import com.android.settings.fuelgauge.BatterySaverReceiver;
 import com.android.settings.widget.TwoStateButtonPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -31,20 +32,19 @@
 /**
  * Controller to update the battery saver button
  */
-//TODO(b/72228477): disable the button if device is charging.
 public class BatterySaverButtonPreferenceController extends
         TwoStateButtonPreferenceController implements
-        LifecycleObserver, OnStart, OnStop, BatteryBroadcastReceiver.OnBatteryChangedListener {
+        LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
     private static final String KEY = "battery_saver_button_container";
-    private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
+    private BatterySaverReceiver mBatterySaverReceiver;
     @VisibleForTesting
     PowerManager mPowerManager;
 
     public BatterySaverButtonPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY);
         mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-        mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(context);
-        mBatteryBroadcastReceiver.setBatteryChangedListener(this);
+        mBatterySaverReceiver = new BatterySaverReceiver(context);
+        mBatterySaverReceiver.setBatterySaverListener(this);
         if (lifecycle != null) {
             lifecycle.addObserver(this);
         }
@@ -52,19 +52,18 @@
 
     @Override
     public void onStart() {
-        mBatteryBroadcastReceiver.register();
+        mBatterySaverReceiver.setListening(true);
     }
 
     @Override
     public void onStop() {
-        mBatteryBroadcastReceiver.unRegister();
+        mBatterySaverReceiver.setListening(false);
     }
 
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        final boolean lowPowerModeOn = mPowerManager.isPowerSaveMode();
-        updateButton(!lowPowerModeOn);
+        setButtonVisibility(!mPowerManager.isPowerSaveMode());
     }
 
     @Override
@@ -73,13 +72,17 @@
     }
 
     @Override
-    public void onBatteryChanged() {
-        final boolean lowPowerModeOn = mPowerManager.isPowerSaveMode();
-        updateButton(!lowPowerModeOn);
+    public void onButtonClicked(boolean stateOn) {
+        mPowerManager.setPowerSaveMode(stateOn);
     }
 
     @Override
-    public void onButtonClicked(boolean stateOn) {
-        mPowerManager.setPowerSaveMode(stateOn);
+    public void onPowerSaveModeChanged() {
+        setButtonVisibility(!mPowerManager.isPowerSaveMode());
+    }
+
+    @Override
+    public void onBatteryChanged(boolean pluggedIn) {
+        setButtonEnabled(!pluggedIn);
     }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/widget/TwoStateButtonPreferenceController.java b/src/com/android/settings/widget/TwoStateButtonPreferenceController.java
index 5f5e098..47699ef 100644
--- a/src/com/android/settings/widget/TwoStateButtonPreferenceController.java
+++ b/src/com/android/settings/widget/TwoStateButtonPreferenceController.java
@@ -47,7 +47,7 @@
         mButtonOff.setOnClickListener(this);
     }
 
-    protected void updateButton(boolean stateOn) {
+    protected void setButtonVisibility(boolean stateOn) {
         if (stateOn) {
             mButtonOff.setVisibility(View.GONE);
             mButtonOn.setVisibility(View.VISIBLE);
@@ -57,6 +57,11 @@
         }
     }
 
+    protected void setButtonEnabled(boolean enabled) {
+        mButtonOn.setEnabled(enabled);
+        mButtonOff.setEnabled(enabled);
+    }
+
     @Override
     public void onClick(View v) {
         final boolean stateOn = v.getId() == R.id.state_on_button;
diff --git a/tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceControllerTest.java
index b160888..a289815 100644
--- a/tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/TwoStateButtonPreferenceControllerTest.java
@@ -67,21 +67,37 @@
     }
 
     @Test
-    public void testUpdateButtons_stateOn_onlyShowButtonOn() {
-        mController.updateButton(true /* stateOn */);
+    public void testSetButtonVisibility_stateOn_onlyShowButtonOn() {
+        mController.setButtonVisibility(true /* stateOn */);
 
         assertThat(mButtonOn.getVisibility()).isEqualTo(View.VISIBLE);
         assertThat(mButtonOff.getVisibility()).isEqualTo(View.GONE);
     }
 
     @Test
-    public void testUpdateButtons_stateOff_onlyShowButtonOff() {
-        mController.updateButton(false /* stateOn */);
+    public void testSetButtonVisibility_stateOff_onlyShowButtonOff() {
+        mController.setButtonVisibility(false /* stateOn */);
 
         assertThat(mButtonOn.getVisibility()).isEqualTo(View.GONE);
         assertThat(mButtonOff.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
+    @Test
+    public void testSetButtonEnabled_enabled_buttonEnabled() {
+        mController.setButtonEnabled(true /* enabled */);
+
+        assertThat(mButtonOn.isEnabled()).isTrue();
+        assertThat(mButtonOff.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void testSetButtonEnabled_disabled_buttonDisabled() {
+        mController.setButtonEnabled(false /* enabled */);
+
+        assertThat(mButtonOn.isEnabled()).isFalse();
+        assertThat(mButtonOff.isEnabled()).isFalse();
+    }
+
     /**
      * Controller to test methods in {@link TwoStateButtonPreferenceController}
      */