Update getBatteryInfo to allow drain time override

When requesting battery info from settings lib
there was no way to specify another source as the source for the
time remaining estimate so this CL adds the ability to do that.
Similar functionality is also removed from settings since it is
no longer needed.

Test: robotests
Bug: 38399275
Change-Id: I5bf613897ea778f933464c7c22013a50f790fd2f
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 044392c..ead08e8 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -789,15 +789,22 @@
 
     <!-- [CHAR_LIMIT=40] Label for estimated remaining duration of battery discharging -->
     <string name="power_remaining_duration_only">About <xliff:g id="time">%1$s</xliff:g> left</string>
+    <!-- [CHAR_LIMIT=60] Label for estimated remaining duration of battery discharging -->
+    <string name="power_remaining_duration_only_enhanced">About <xliff:g id="time">%1$s</xliff:g> left based on your usage</string>
     <!-- [CHAR_LIMIT=40] Label for estimated remaining duration of battery charging -->
     <string name="power_remaining_charging_duration_only"><xliff:g id="time">%1$s</xliff:g> left until fully charged</string>
 
     <!-- [CHAR_LIMIT=40] Short label for estimated remaining duration of battery charging/discharging -->
     <string name="power_remaining_duration_only_short"><xliff:g id="time">%1$s</xliff:g> left</string>
+    <!-- [CHAR_LIMIT=60] Short label for estimated remaining duration of battery charging/discharging -->
+    <string name="power_remaining_duration_only_short_enhanced"><xliff:g id="time">%1$s</xliff:g> left based on your usage</string>
 
     <!-- [CHAR_LIMIT=40] Label for battery level chart when discharging with duration -->
     <string name="power_discharging_duration"><xliff:g id="level">%1$s</xliff:g>
         - about <xliff:g id="time">%2$s</xliff:g> left</string>
+    <!-- [CHAR_LIMIT=60] Label for battery level chart when discharging with duration and using enhanced estimate -->
+    <string name="power_discharging_duration_enhanced"><xliff:g id="level">%1$s</xliff:g>
+        - about <xliff:g id="time">%2$s</xliff:g> left based on your usage</string>
 
     <!-- [CHAR_LIMIT=40] Label for battery level chart when discharging with duration -->
     <string name="power_discharging_duration_short"><xliff:g id="level">%1$s</xliff:g>
diff --git a/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java b/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
index 2d8defa..b237021 100644
--- a/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
+++ b/packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java
@@ -129,6 +129,13 @@
 
     public static BatteryInfo getBatteryInfo(Context context, Intent batteryBroadcast,
             BatteryStats stats, long elapsedRealtimeUs, boolean shortString) {
+        return getBatteryInfo(context, batteryBroadcast, stats, elapsedRealtimeUs, shortString,
+                stats.computeBatteryTimeRemaining(elapsedRealtimeUs), false);
+    }
+
+    public static BatteryInfo getBatteryInfo(Context context, Intent batteryBroadcast,
+            BatteryStats stats, long elapsedRealtimeUs, boolean shortString, long drainTimeUs,
+            boolean basedOnUsage) {
         BatteryInfo info = new BatteryInfo();
         info.mStats = stats;
         info.batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
@@ -138,18 +145,25 @@
 
         info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
         if (!info.mCharging) {
-            final long drainTime = stats.computeBatteryTimeRemaining(elapsedRealtimeUs);
-            if (drainTime > 0) {
-                info.remainingTimeUs = drainTime;
+            if (drainTimeUs > 0) {
+                info.remainingTimeUs = drainTimeUs;
                 String timeString = Formatter.formatShortElapsedTime(context,
-                        drainTime / 1000);
+                        drainTimeUs / 1000);
                 info.remainingLabel = resources.getString(
-                        shortString ? R.string.power_remaining_duration_only_short
-                                : R.string.power_remaining_duration_only,
+                        shortString ?
+                                (basedOnUsage ?
+                                        R.string.power_remaining_duration_only_short_enhanced :
+                                        R.string.power_remaining_duration_only_short) :
+                                (basedOnUsage ?
+                                        R.string.power_remaining_duration_only_enhanced :
+                                        R.string.power_remaining_duration_only),
                         timeString);
                 info.chargeLabelString = resources.getString(
-                        shortString ? R.string.power_discharging_duration_short
-                                : R.string.power_discharging_duration,
+                        shortString ?
+                                R.string.power_discharging_duration_short :
+                                basedOnUsage ?
+                                        R.string.power_discharging_duration_enhanced :
+                                        R.string.power_discharging_duration,
                         info.batteryPercentString, timeString);
             } else {
                 info.remainingLabel = null;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java
index 69efc9e..cffece4 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.os.BatteryManager;
 import android.os.BatteryStats;
 import android.os.SystemClock;
@@ -25,14 +26,17 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.AdditionalMatchers;
 import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.AdditionalMatchers.*;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.eq;
@@ -48,13 +52,18 @@
     private static final int PLUGGED_IN = 1;
     private static final long REMAINING_TIME_NULL = -1;
     private static final long REMAINING_TIME = 2;
+    public static final String ENHANCED_STRING_SUFFIX = "left based on your usage";
     private Intent mDisChargingBatteryBroadcast;
     private Intent mChargingBatteryBroadcast;
+    private Context mRealContext;
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private BatteryStats mBatteryStats;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Resources mResources;
+
 
     @Before
     public void setUp() {
@@ -81,13 +90,14 @@
                 any())).thenReturn(STATUS_CHARGING_NO_TIME);
         when(mContext.getResources().getString(eq(R.string.power_charging_duration), any(),
                 any())).thenReturn(STATUS_CHARGING_TIME);
+        mRealContext = RuntimeEnvironment.application;
     }
 
     @Test
     public void testGetBatteryInfo_hasStatusLabel() {
         doReturn(REMAINING_TIME_NULL).when(mBatteryStats).computeBatteryTimeRemaining(anyLong());
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
-                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true);
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */);
 
         assertThat(info.statusLabel).isEqualTo(STATUS_FULL);
     }
@@ -96,7 +106,7 @@
     public void testGetBatteryInfo_doNotShowChargingMethod_hasRemainingTime() {
         doReturn(REMAINING_TIME).when(mBatteryStats).computeChargeTimeRemaining(anyLong());
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
-                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false);
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */);
 
         assertThat(info.chargeLabelString).isEqualTo(STATUS_CHARGING_TIME);
     }
@@ -105,7 +115,7 @@
     public void testGetBatteryInfo_doNotShowChargingMethod_noRemainingTime() {
         doReturn(REMAINING_TIME_NULL).when(mBatteryStats).computeChargeTimeRemaining(anyLong());
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
-                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false);
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */);
 
         assertThat(info.chargeLabelString).isEqualTo(STATUS_CHARGING_NO_TIME);
     }
@@ -113,8 +123,46 @@
     @Test
     public void testGetBatteryInfo_pluggedIn_dischargingFalse() {
         BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
-                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true);
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */);
 
         assertThat(info.discharging).isEqualTo(false);
     }
+
+    @Test
+    public void testGetBatteryInfo_basedOnUsageTrue_usesUsageString() {
+        doReturn(mResources).when(mContext).getResources();
+        when(mResources.getString(eq(R.string.battery_info_status_full))).thenReturn("");
+        when(mResources.getString(eq(R.string.power_remaining_duration_only_enhanced), any()))
+                .thenReturn(ENHANCED_STRING_SUFFIX);
+        when(mResources.getString(eq(R.string.power_remaining_duration_only_short_enhanced), any()))
+                .thenReturn(ENHANCED_STRING_SUFFIX);
+        BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+                1000, true /* basedOnUsage */);
+        BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
+                1000, true /* basedOnUsage */);
+
+        assertThat(info.remainingLabel).contains(ENHANCED_STRING_SUFFIX);
+        assertThat(info2.remainingLabel).contains(ENHANCED_STRING_SUFFIX);
+    }
+
+    @Test
+    public void testGetBatteryInfo_basedOnUsageFalse_usesDefaultString() {
+        doReturn(mResources).when(mContext).getResources();
+        when(mResources.getString(eq(R.string.battery_info_status_full))).thenReturn("");
+        when(mResources.getString(not(eq(R.string.power_remaining_duration_only_enhanced)), any()))
+                .thenReturn(ENHANCED_STRING_SUFFIX);
+        when(mResources.getString(not(eq(R.string.power_remaining_duration_only_short_enhanced)),
+                any())).thenReturn("");
+        BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, false /* shortString */,
+                1000, false /* basedOnUsage */);
+        BatteryInfo info2 = BatteryInfo.getBatteryInfo(mContext, mDisChargingBatteryBroadcast,
+                mBatteryStats, SystemClock.elapsedRealtime() * 1000, true /* shortString */,
+                1000, false /* basedOnUsage */);
+
+        assertThat(info.remainingLabel).doesNotContain(ENHANCED_STRING_SUFFIX);
+        assertThat(info2.remainingLabel).doesNotContain(ENHANCED_STRING_SUFFIX);
+    }
 }