Loading packages/SettingsLib/res/values/strings.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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> Loading packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java +22 −8 Original line number Diff line number Diff line Loading @@ -129,6 +129,13 @@ public class BatteryInfo { 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); Loading @@ -138,18 +145,25 @@ public class BatteryInfo { 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; Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java +52 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settingslib; 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; Loading @@ -25,14 +26,17 @@ import android.os.SystemClock; 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; Loading @@ -48,13 +52,18 @@ public class BatteryInfoTest { 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() { Loading @@ -81,13 +90,14 @@ public class BatteryInfoTest { 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); } Loading @@ -96,7 +106,7 @@ public class BatteryInfoTest { 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); } Loading @@ -105,7 +115,7 @@ public class BatteryInfoTest { 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); } Loading @@ -113,8 +123,46 @@ public class BatteryInfoTest { @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); } } Loading
packages/SettingsLib/res/values/strings.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
packages/SettingsLib/src/com/android/settingslib/BatteryInfo.java +22 −8 Original line number Diff line number Diff line Loading @@ -129,6 +129,13 @@ public class BatteryInfo { 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); Loading @@ -138,18 +145,25 @@ public class BatteryInfo { 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; Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/BatteryInfoTest.java +52 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settingslib; 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; Loading @@ -25,14 +26,17 @@ import android.os.SystemClock; 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; Loading @@ -48,13 +52,18 @@ public class BatteryInfoTest { 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() { Loading @@ -81,13 +90,14 @@ public class BatteryInfoTest { 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); } Loading @@ -96,7 +106,7 @@ public class BatteryInfoTest { 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); } Loading @@ -105,7 +115,7 @@ public class BatteryInfoTest { 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); } Loading @@ -113,8 +123,46 @@ public class BatteryInfoTest { @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); } }