Make AOD battery text field support BatteryDefender

 - Add overheat flag into BatteryStatus
 - Update AOD battery indication to support new state when BatteryDefender is enable
 Screenshot: https://screenshot.googleplex.com/BYyUYS7VGtyG3i7.png

Bug: 173080412
Test: atest SystemUITests:com.android.systemui.statusbar.KeyguardIndicationControllerTest
Merged-In: I74f32136ba034d2dea19f71e1e7cecc022cd9fa9
Change-Id: I9aee4e6408d762639818e7aac42a781f12cd69ff
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
index bc40903..ce60faf 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.fuelgauge;
 
+import static android.os.BatteryManager.BATTERY_HEALTH_OVERHEAT;
 import static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN;
 import static android.os.BatteryManager.BATTERY_STATUS_FULL;
 import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
@@ -124,6 +125,15 @@
     }
 
     /**
+     * Whether battery is overheated.
+     *
+     * @return true if battery is overheated
+     */
+    public boolean isOverheated() {
+        return health == BATTERY_HEALTH_OVERHEAT;
+    }
+
+    /**
      * Return current chargin speed is fast, slow or normal.
      *
      * @return the charing speed
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 60541eb..60cd240 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -2579,6 +2579,11 @@
             return true;
         }
 
+        // change in battery overheat
+        if (current.health != old.health) {
+            return true;
+        }
+
         return false;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 7e1dc66..39d2f71 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -118,6 +118,8 @@
     private boolean mPowerPluggedIn;
     private boolean mPowerPluggedInWired;
     private boolean mPowerCharged;
+    private boolean mBatteryOverheated;
+    private boolean mEnableBatteryDefender;
     private int mChargingSpeed;
     private int mChargingWattage;
     private int mBatteryLevel;
@@ -401,7 +403,7 @@
                 } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
                     mTextView.switchIndication(mAlignmentIndication);
                     mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color));
-                } else if (mPowerPluggedIn) {
+                } else if (mPowerPluggedIn || mEnableBatteryDefender) {
                     String indication = computePowerIndication();
                     if (animate) {
                         animateText(mTextView, indication);
@@ -421,7 +423,7 @@
             String trustManagedIndication = getTrustManagedIndication();
 
             String powerIndication = null;
-            if (mPowerPluggedIn) {
+            if (mPowerPluggedIn || mEnableBatteryDefender) {
                 powerIndication = computePowerIndication();
             }
 
@@ -451,7 +453,7 @@
             } else if (!TextUtils.isEmpty(mAlignmentIndication)) {
                 mTextView.switchIndication(mAlignmentIndication);
                 isError = true;
-            } else if (mPowerPluggedIn) {
+            } else if (mPowerPluggedIn || mEnableBatteryDefender) {
                 if (DEBUG_CHARGING_SPEED) {
                     powerIndication += ",  " + (mChargingWattage / 1000) + " mW";
                 }
@@ -528,8 +530,15 @@
             return mContext.getResources().getString(R.string.keyguard_charged);
         }
 
-        final boolean hasChargingTime = mChargingTimeRemaining > 0;
         int chargingId;
+        String percentage = NumberFormat.getPercentInstance().format(mBatteryLevel / 100f);
+
+        if (mBatteryOverheated) {
+            chargingId = R.string.keyguard_plugged_in_charging_limited;
+            return mContext.getResources().getString(chargingId, percentage);
+        }
+
+        final boolean hasChargingTime = mChargingTimeRemaining > 0;
         if (mPowerPluggedInWired) {
             switch (mChargingSpeed) {
                 case BatteryStatus.CHARGING_FAST:
@@ -554,8 +563,6 @@
                     : R.string.keyguard_plugged_in_wireless;
         }
 
-        String percentage = NumberFormat.getPercentInstance()
-                .format(mBatteryLevel / 100f);
         if (hasChargingTime) {
             // We now have battery percentage in these strings and it's expected that all
             // locales will also have it in the future. For now, we still have to support the old
@@ -685,6 +692,8 @@
             mChargingWattage = status.maxChargingWattage;
             mChargingSpeed = status.getChargingSpeed(mContext);
             mBatteryLevel = status.level;
+            mBatteryOverheated = status.isOverheated();
+            mEnableBatteryDefender = mBatteryOverheated && status.isPluggedIn();
             try {
                 mChargingTimeRemaining = mPowerPluggedIn
                         ? mBatteryInfo.computeChargeTimeRemaining() : -1;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index e0d2681..052f338 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -82,6 +82,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.text.NumberFormat;
 import java.util.Collections;
 
 @SmallTest
@@ -546,4 +547,65 @@
                 pluggedIndication, powerIndication);
         assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
     }
+
+    @Test
+    public void onRefreshBatteryInfo_chargingWithOverheat_presentChargingLimited() {
+        createController();
+        BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
+                80 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
+                BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+
+        mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+        mController.setVisible(true);
+
+        String percentage = NumberFormat.getPercentInstance().format(80 / 100f);
+        String pluggedIndication = mContext.getString(
+                R.string.keyguard_plugged_in_charging_limited, percentage);
+        assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
+    }
+
+    @Test
+    public void onRefreshBatteryInfo_pluggedWithOverheat_presentChargingLimited() {
+        createController();
+        BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
+                80 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
+                BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+
+        mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+        mController.setVisible(true);
+
+        String percentage = NumberFormat.getPercentInstance().format(80 / 100f);
+        String pluggedIndication = mContext.getString(
+                R.string.keyguard_plugged_in_charging_limited, percentage);
+        assertThat(mTextView.getText()).isEqualTo(pluggedIndication);
+    }
+
+    @Test
+    public void onRefreshBatteryInfo_fullChargedWithOverheat_presentCharged() {
+        createController();
+        BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING,
+                100 /* level */, BatteryManager.BATTERY_PLUGGED_AC,
+                BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */);
+
+        mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+        mController.setVisible(true);
+
+        String chargedIndication = mContext.getString(R.string.keyguard_charged);
+        assertThat(mTextView.getText()).isEqualTo(chargedIndication);
+    }
+
+    @Test
+    public void onRefreshBatteryInfo_dischargingWithOverheat_presentBatteryPercentage() {
+        createController();
+        BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING,
+                90 /* level */, 0 /* plugged */, BatteryManager.BATTERY_HEALTH_OVERHEAT,
+                0 /* maxChargingWattage */);
+
+        mController.getKeyguardCallback().onRefreshBatteryInfo(status);
+        mController.setDozing(true);
+        mController.setVisible(true);
+
+        String percentage = NumberFormat.getPercentInstance().format(90 / 100f);
+        assertThat(mTextView.getText()).isEqualTo(percentage);
+    }
 }