diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverLogging.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverLogging.java index 5326e73a3f821..daa3616037e79 100644 --- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverLogging.java +++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverLogging.java @@ -32,9 +32,13 @@ public final class BatterySaverLogging { public static final String EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED_REASON = "extra_power_save_mode_manual_enabled_reason"; + /** Record the event while enabling power save mode manually. */ + public static final String EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED = + "extra_power_save_mode_manual_enabled"; + /** Broadcast action to record battery saver manual enabled reason. */ - public static final String ACTION_SAVER_MANUAL_ENABLED_REASON = - "com.android.settingslib.fuelgauge.ACTION_SAVER_MANUAL_ENABLED_REASON"; + public static final String ACTION_SAVER_STATE_MANUAL_UPDATE = + "com.android.settingslib.fuelgauge.ACTION_SAVER_STATE_MANUAL_UPDATE"; /** An interface for the battery saver manual enable reason. */ @Retention(RetentionPolicy.SOURCE) diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java index e28ada4771c9f..c9540c747650d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java @@ -16,7 +16,8 @@ package com.android.settingslib.fuelgauge; -import static com.android.settingslib.fuelgauge.BatterySaverLogging.ACTION_SAVER_MANUAL_ENABLED_REASON; +import static com.android.settingslib.fuelgauge.BatterySaverLogging.ACTION_SAVER_STATE_MANUAL_UPDATE; +import static com.android.settingslib.fuelgauge.BatterySaverLogging.EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED; import static com.android.settingslib.fuelgauge.BatterySaverLogging.EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED_REASON; import static com.android.settingslib.fuelgauge.BatterySaverLogging.SaverManualEnabledReason; @@ -152,9 +153,8 @@ public class BatterySaverUtils { sendSystemUiBroadcast(context, ACTION_SHOW_AUTO_SAVER_SUGGESTION, confirmationExtras); } - recordBatterySaverEnabledReason(context, reason); } - + recordBatterySaverEnabledReason(context, enable, reason); return true; } return false; @@ -185,11 +185,12 @@ public class BatterySaverUtils { return true; } - private static void recordBatterySaverEnabledReason(Context context, + private static void recordBatterySaverEnabledReason(Context context, boolean enable, @SaverManualEnabledReason int reason) { - final Bundle enabledReasonExtras = new Bundle(1); + final Bundle enabledReasonExtras = new Bundle(2); enabledReasonExtras.putInt(EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED_REASON, reason); - sendSystemUiBroadcast(context, ACTION_SAVER_MANUAL_ENABLED_REASON, enabledReasonExtras); + enabledReasonExtras.putBoolean(EXTRA_POWER_SAVE_MODE_MANUAL_ENABLED, enable); + sendSystemUiBroadcast(context, ACTION_SAVER_STATE_MANUAL_UPDATE, enabledReasonExtras); } private static void sendSystemUiBroadcast(Context context, String action, Bundle extras) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java index 7a26f76894cd4..80301c02dd6a7 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java @@ -16,14 +16,16 @@ package com.android.settingslib.fuelgauge; +import static com.android.settingslib.fuelgauge.BatterySaverLogging.ACTION_SAVER_STATE_MANUAL_UPDATE; import static com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_UNKNOWN; +import static com.android.settingslib.fuelgauge.BatterySaverUtils.ACTION_SHOW_AUTO_SAVER_SUGGESTION; +import static com.android.settingslib.fuelgauge.BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION; import static com.android.settingslib.fuelgauge.BatterySaverUtils.KEY_NO_SCHEDULE; import static com.android.settingslib.fuelgauge.BatterySaverUtils.KEY_PERCENTAGE; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; @@ -40,10 +42,13 @@ import android.provider.Settings.Secure; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import java.util.List; + @RunWith(RobolectricTestRunner.class) public class BatterySaverUtilsTest { private static final int BATTERY_SAVER_THRESHOLD_1 = 15; @@ -68,7 +73,7 @@ public class BatterySaverUtilsTest { } @Test - public void testSetPowerSaveMode_enable_firstCall_needWarning() { + public void testSetPowerSaveMode_enableWithWarning_firstCall_needConfirmationWarning() { Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null"); Secure.putString(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, "null"); Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null"); @@ -76,9 +81,12 @@ public class BatterySaverUtilsTest { assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, true, true, SAVER_ENABLED_UNKNOWN)).isFalse(); - verify(mMockContext, times(1)).sendBroadcast(any(Intent.class)); + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(1)).sendBroadcast(intentCaptor.capture()); verify(mMockPowerManager, times(0)).setPowerSaveModeEnabled(anyBoolean()); + assertThat(intentCaptor.getValue().getAction()).isEqualTo( + ACTION_SHOW_START_SAVER_CONFIRMATION); // They shouldn't have changed. assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); assertEquals(-1, @@ -88,7 +96,7 @@ public class BatterySaverUtilsTest { } @Test - public void testSetPowerSaveMode_enable_secondCall_needWarning() { + public void testSetPowerSaveMode_enableWithWarning_secondCall_expectUpdateIntent() { // Already acked. Secure.putInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1); Secure.putInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, 1); @@ -97,8 +105,12 @@ public class BatterySaverUtilsTest { assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, true, true, SAVER_ENABLED_UNKNOWN)).isTrue(); + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(1)).sendBroadcast(intentCaptor.capture()); verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(true)); + assertThat(intentCaptor.getValue().getAction()).isEqualTo( + ACTION_SAVER_STATE_MANUAL_UPDATE); assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); assertEquals(1, Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); @@ -107,7 +119,7 @@ public class BatterySaverUtilsTest { } @Test - public void testSetPowerSaveMode_enable_thridCall_needWarning() { + public void testSetPowerSaveMode_enableWithWarning_thirdCall_expectUpdateIntent() { // Already acked. Secure.putInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1); Secure.putInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, 1); @@ -116,8 +128,12 @@ public class BatterySaverUtilsTest { assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, true, true, SAVER_ENABLED_UNKNOWN)).isTrue(); + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(1)).sendBroadcast(intentCaptor.capture()); verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(true)); + assertThat(intentCaptor.getValue().getAction()).isEqualTo( + ACTION_SAVER_STATE_MANUAL_UPDATE); assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); assertEquals(1, Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); @@ -126,7 +142,31 @@ public class BatterySaverUtilsTest { } @Test - public void testSetPowerSaveMode_enable_firstCall_noWarning() { + public void testSetPowerSaveMode_enableWithWarning_5thCall_needAutoSuggestionWarning() { + // Already acked. + Secure.putInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1); + Secure.putInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, 1); + Secure.putInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 3); + + assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, true, true, + SAVER_ENABLED_UNKNOWN)).isTrue(); + + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(2)).sendBroadcast(intentCaptor.capture()); + verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(true)); + + List values = intentCaptor.getAllValues(); + assertThat(values.get(0).getAction()).isEqualTo(ACTION_SHOW_AUTO_SAVER_SUGGESTION); + assertThat(values.get(1).getAction()).isEqualTo(ACTION_SAVER_STATE_MANUAL_UPDATE); + assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); + assertEquals(1, + Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); + assertEquals(4, + Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2)); + } + + @Test + public void testSetPowerSaveMode_enableWithoutWarning_expectUpdateIntent() { Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null"); Secure.putString(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, "null"); Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null"); @@ -134,8 +174,12 @@ public class BatterySaverUtilsTest { assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, true, false, SAVER_ENABLED_UNKNOWN)).isTrue(); + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(1)).sendBroadcast(intentCaptor.capture()); verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(true)); + assertThat(intentCaptor.getValue().getAction()).isEqualTo( + ACTION_SAVER_STATE_MANUAL_UPDATE); assertEquals(1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); assertEquals(1, Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); @@ -143,43 +187,13 @@ public class BatterySaverUtilsTest { } @Test - public void testSetPowerSaveMode_disable_firstCall_noWarning() { - Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null"); - Secure.putString(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, "null"); - Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null"); - - // When disabling, needFirstTimeWarning doesn't matter. - assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, false, false, - SAVER_ENABLED_UNKNOWN)).isTrue(); - - verify(mMockContext, times(0)).sendBroadcast(any(Intent.class)); - verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(false)); - - assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); - assertEquals(-1, - Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); - assertEquals(-2, - Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2)); + public void testSetPowerSaveMode_disableWithoutWarning_expectUpdateIntent() { + verifyDisablePowerSaveMode(/* needFirstTimeWarning= */ false); } @Test - public void testSetPowerSaveMode_disable_firstCall_needWarning() { - Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null"); - Secure.putString(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, "null"); - Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null"); - - // When disabling, needFirstTimeWarning doesn't matter. - assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, false, true, - SAVER_ENABLED_UNKNOWN)).isTrue(); - - verify(mMockContext, times(0)).sendBroadcast(any(Intent.class)); - verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(false)); - - assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); - assertEquals(-1, - Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); - assertEquals(-2, - Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2)); + public void testSetPowerSaveMode_disableWithWarning_expectUpdateIntent() { + verifyDisablePowerSaveMode(/* needFirstTimeWarning= */ true); } @Test @@ -256,4 +270,26 @@ public class BatterySaverUtilsTest { .isEqualTo(20); } + + private void verifyDisablePowerSaveMode(boolean needFirstTimeWarning) { + Secure.putString(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, "null"); + Secure.putString(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, "null"); + Secure.putString(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, "null"); + + // When disabling, needFirstTimeWarning doesn't matter. + assertThat(BatterySaverUtils.setPowerSaveMode(mMockContext, false, needFirstTimeWarning, + SAVER_ENABLED_UNKNOWN)).isTrue(); + + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, times(1)).sendBroadcast(intentCaptor.capture()); + verify(mMockPowerManager, times(1)).setPowerSaveModeEnabled(eq(false)); + + assertThat(intentCaptor.getValue().getAction()).isEqualTo( + ACTION_SAVER_STATE_MANUAL_UPDATE); + assertEquals(-1, Secure.getInt(mMockResolver, Secure.LOW_POWER_WARNING_ACKNOWLEDGED, -1)); + assertEquals(-1, + Secure.getInt(mMockResolver, Secure.EXTRA_LOW_POWER_WARNING_ACKNOWLEDGED, -1)); + assertEquals(-2, + Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2)); + } }