Update battery states text to support battery feature(1/2)

 - Update progress bar bottom text when receiving battery feature callback

Bug: 183689347
Bug: 177407113
Test: make SettingsRoboTests
Change-Id: Ic8b24cbb149f7e470d28327a9a1dd84bbd5673f7
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index a2cb9ae..d0fa8e9 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -136,9 +136,12 @@
     }
 
     public void updateHeaderPreference(BatteryInfo info) {
+        if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) {
+            mBatteryUsageProgressBarPref.setBottomSummary(generateLabel(info));
+        }
+
         mBatteryUsageProgressBarPref.setUsageSummary(
                 formatBatteryPercentageText(info.batteryLevel));
-        mBatteryUsageProgressBarPref.setBottomSummary(generateLabel(info));
         mBatteryUsageProgressBarPref.setPercent(info.batteryLevel, BATTERY_MAX_LEVEL);
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 038798a..f6c292d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -88,6 +88,8 @@
     private EntityHeaderController mEntityHeaderController;
     @Mock
     private UsageProgressBarPreference mBatteryUsageProgressBarPref;
+    @Mock
+    private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
     private BatteryHeaderPreferenceController mController;
     private Context mContext;
     private ShadowPowerManager mShadowPowerManager;
@@ -123,6 +125,7 @@
         mController.setFragment(mPreferenceFragment);
         mController.setLifecycle(mLifecycle);
         mController.mBatteryUsageProgressBarPref = mBatteryUsageProgressBarPref;
+        mController.mBatteryStatusFeatureProvider = mBatteryStatusFeatureProvider;
     }
 
     @After
@@ -150,7 +153,7 @@
 
     @Test
     public void updatePreference_updateBatteryInfo() {
-        setChargingState(/* isDischarging */ true);
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
 
         mController.updateHeaderPreference(mBatteryInfo);
 
@@ -171,7 +174,7 @@
 
     @Test
     public void updatePreference_charging_showFullText() {
-        setChargingState(/* isDischarging */ false);
+        setChargingState(/* isDischarging */ false, /* updatedByStatusFeature */ false);
 
         mController.updateHeaderPreference(mBatteryInfo);
 
@@ -181,7 +184,7 @@
 
     @Test
     public void updatePreference_powerSaverOn_showPowerSaverOn() {
-        setChargingState(/* isDischarging */ true);
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
         mShadowPowerManager.setIsPowerSaveMode(true);
 
         mController.updateHeaderPreference(mBatteryInfo);
@@ -191,8 +194,48 @@
     }
 
     @Test
+    public void updatePreference_triggerBatteryStatusUpdateTrue_updatePercentageAndUsageOnly() {
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ true);
+
+        mController.updateHeaderPreference(mBatteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setUsageSummary(formatBatteryPercentageText());
+        verify(mBatteryUsageProgressBarPref).setPercent(BATTERY_LEVEL, BATTERY_MAX_LEVEL);
+    }
+
+    @Test
+    public void updatePreference_triggerBatteryStatusUpdateFalse_updateBatteryInfo() {
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
+
+        mController.updateHeaderPreference(mBatteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setUsageSummary(formatBatteryPercentageText());
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(mBatteryInfo.remainingLabel);
+        verify(mBatteryUsageProgressBarPref).setPercent(BATTERY_LEVEL, BATTERY_MAX_LEVEL);
+    }
+
+    @Test
+    public void updateBatteryStatus_nullLabel_updateSummaryOnly() {
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
+
+        mController.updateBatteryStatus(null, mBatteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(mBatteryInfo.remainingLabel);
+    }
+
+    @Test
+    public void updateBatteryStatus_withLabel_showLabelText() {
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
+
+        final String label = "Update by battery status • " + TIME_LEFT;
+        mController.updateBatteryStatus(label, mBatteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(label);
+    }
+
+    @Test
     public void updateHeaderByBatteryTips_lowBatteryTip_showLowBattery() {
-        setChargingState(/* isDischarging */ true);
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
         BatteryTip lowBatteryTip = new LowBatteryTip(
                 BatteryTip.StateType.NEW, /* powerSaveModeOn */false);
 
@@ -204,7 +247,7 @@
 
     @Test
     public void updateHeaderByBatteryTips_notLowBatteryTip_showRemainingLabel() {
-        setChargingState(/* isDischarging */ true);
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
         BatteryTip lowBatteryTip = new SmartBatteryTip(BatteryTip.StateType.NEW);
 
         mController.updateHeaderByBatteryTips(lowBatteryTip, mBatteryInfo);
@@ -214,7 +257,7 @@
 
     @Test
     public void updateHeaderByBatteryTips_noTip_noAction() {
-        setChargingState(/* isDischarging */ true);
+        setChargingState(/* isDischarging */ true, /* updatedByStatusFeature */ false);
 
         mController.updateHeaderByBatteryTips(null, mBatteryInfo);
 
@@ -270,9 +313,12 @@
                 NumberFormat.getIntegerInstance().format(BATTERY_LEVEL));
     }
 
-    private void setChargingState(boolean isDischarging) {
+    private void setChargingState(boolean isDischarging, boolean updatedByStatusFeature) {
         mBatteryInfo.remainingLabel = TIME_LEFT;
         mBatteryInfo.statusLabel = BATTERY_STATUS;
         mBatteryInfo.discharging = isDischarging;
+
+        when(mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(
+                mController, mBatteryInfo)).thenReturn(updatedByStatusFeature);
     }
 }