Update triggering to not double trigger at severe threshold

If the low threshold is not shown for any reason and we reach the
severe threshold and it does show it will double trigger. This CL
just makes it so both are marked as "shown" if the severe warning
is shown regardless of whether the low warning was shown or not.

Test: runtest systemui
Bug: 116716293
Change-Id: I7fff2d7beba7b37312b9a4c4951a68c3d1f1ba3f
This commit is contained in:
Salvador Martinez
2018-10-01 11:31:43 -07:00
parent 960165c0d7
commit 88b0d501de
2 changed files with 34 additions and 2 deletions

View File

@@ -301,9 +301,10 @@ public class PowerUI extends SystemUI {
// mark if we've already shown a warning this cycle. This will prevent the notification
// trigger from spamming users by only showing low/critical warnings once per cycle
if (hybridEnabled) {
if (mTimeRemaining < mEnhancedEstimates.getSevereWarningThreshold()
|| mBatteryLevel < mLowBatteryReminderLevels[1]) {
if (mTimeRemaining <= mEnhancedEstimates.getSevereWarningThreshold()
|| mBatteryLevel <= mLowBatteryReminderLevels[1]) {
mSevereWarningShownThisChargeCycle = true;
mLowWarningShownThisChargeCycle = true;
} else {
mLowWarningShownThisChargeCycle = true;
}

View File

@@ -65,10 +65,12 @@ public class PowerUITest extends SysuiTestCase {
private static final long ONE_HOUR_MILLIS = Duration.ofHours(1).toMillis();
public static final int BELOW_WARNING_BUCKET = -1;
public static final long BELOW_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(2);
public static final long BELOW_SEVERE_HYBRID_THRESHOLD = TimeUnit.MINUTES.toMillis(30);
public static final long ABOVE_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(4);
private static final long ABOVE_CHARGE_CYCLE_THRESHOLD = Duration.ofHours(8).toMillis();
private static final int OLD_BATTERY_LEVEL_NINE = 9;
private static final int OLD_BATTERY_LEVEL_10 = 10;
private static final long VERY_BELOW_SEVERE_HYBRID_THRESHOLD = TimeUnit.MINUTES.toMillis(15);
private HardwarePropertiesManager mHardProps;
private WarningsUI mMockWarnings;
private PowerUI mPowerUI;
@@ -466,6 +468,35 @@ public class PowerUITest extends SysuiTestCase {
verify(mMockWarnings, never()).dismissLowBatteryWarning();
}
@Test
public void testSevereWarning_countsAsLowAndSevere_WarningOnlyShownOnce() {
mPowerUI.start();
when(mEnhancedEstimates.isHybridNotificationEnabled()).thenReturn(true);
when(mEnhancedEstimates.getLowWarningThreshold()).thenReturn(PowerUI.THREE_HOURS_IN_MILLIS);
when(mEnhancedEstimates.getSevereWarningThreshold()).thenReturn(ONE_HOUR_MILLIS);
when(mEnhancedEstimates.getEstimate())
.thenReturn(new Estimate(BELOW_SEVERE_HYBRID_THRESHOLD, true));
mPowerUI.mBatteryStatus = BatteryManager.BATTERY_HEALTH_GOOD;
// reduce battery level to handle time based trigger -> level trigger interactions
mPowerUI.mBatteryLevel = 5;
boolean shouldShow =
mPowerUI.shouldShowLowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
ABOVE_WARNING_BUCKET, BELOW_SEVERE_HYBRID_THRESHOLD,
POWER_SAVER_OFF, BatteryManager.BATTERY_HEALTH_GOOD);
assertTrue(shouldShow);
// actually run the end to end since it handles changing the internal state.
mPowerUI.maybeShowBatteryWarning(OLD_BATTERY_LEVEL_10, UNPLUGGED, UNPLUGGED,
ABOVE_WARNING_BUCKET, ABOVE_WARNING_BUCKET);
shouldShow =
mPowerUI.shouldShowLowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
ABOVE_WARNING_BUCKET, VERY_BELOW_SEVERE_HYBRID_THRESHOLD,
POWER_SAVER_OFF, BatteryManager.BATTERY_HEALTH_GOOD);
assertFalse(shouldShow);
}
@Test
public void testMaybeShowBatteryWarning_onlyQueriesEstimateOnBatteryLevelChangeOrNull() {
mPowerUI.start();