Log battery saver schedule type and percentage when its value is changed am: aa73e48950 am: 7681f7ee7f
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/16101562
Change-Id: I03f16dc4154ffdbe086c652fcea0353dd1661312
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
index afe5853..6411446 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java
@@ -16,17 +16,20 @@
package com.android.settings.fuelgauge.batterysaver;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
+import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -34,6 +37,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.widget.CandidateInfo;
@@ -58,6 +62,8 @@
public BatterySaverScheduleRadioButtonsController mRadioButtonController;
@VisibleForTesting
Context mContext;
+ private int mSaverPercentage;
+ private String mSaverScheduleKey;
private BatterySaverScheduleSeekBarController mSeekBarController;
@VisibleForTesting
@@ -90,6 +96,8 @@
Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
false,
mSettingsObserver);
+ mSaverScheduleKey = mRadioButtonController.getDefaultKey();
+ mSaverPercentage = getSaverPercentage();
}
@Override
@@ -107,6 +115,7 @@
@Override
public void onPause() {
mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
+ AsyncTask.execute(() -> logPowerSaver());
super.onPause();
}
@@ -174,6 +183,43 @@
return 0;
}
+ private void logPowerSaver() {
+ int currentSaverPercentage = getSaverPercentage();
+ String currentSaverScheduleKey = mRadioButtonController.getDefaultKey();
+ if (mSaverScheduleKey.equals(currentSaverScheduleKey)
+ && mSaverPercentage == currentSaverPercentage) {
+ return;
+ }
+ int scheduleType = -1;
+ int schedulePercentage = -1;
+ switch (currentSaverScheduleKey) {
+ case BatterySaverScheduleRadioButtonsController.KEY_NO_SCHEDULE:
+ scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
+ break;
+ case BatterySaverScheduleRadioButtonsController.KEY_ROUTINE:
+ scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
+ break;
+ case BatterySaverScheduleRadioButtonsController.KEY_PERCENTAGE:
+ scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
+ schedulePercentage = currentSaverPercentage;
+ break;
+ // Unknown schedule type.
+ default:
+ return;
+ }
+ FeatureFactory.getFactory(mContext).getMetricsFeatureProvider()
+ .action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ scheduleType),
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+ schedulePercentage));
+ }
+
+ private int getSaverPercentage() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1);
+ }
+
static class BatterySaverScheduleCandidateInfo extends CandidateInfo {
private final CharSequence mLabel;
@@ -207,4 +253,4 @@
return mSummary;
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
new file mode 100644
index 0000000..afd7f66
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java
@@ -0,0 +1,119 @@
+package com.android.settings.fuelgauge.batterysaver;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.os.PowerManager;
+import android.provider.Settings;
+import android.util.Pair;
+
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public final class BatterySaverScheduleSettingsTest {
+
+ private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private BatterySaverScheduleSettings mBatterySaverScheduleSettings;
+
+ @Before
+ public void setUp() {
+ mContext = spy(RuntimeEnvironment.application);
+ mBatterySaverScheduleSettings = new BatterySaverScheduleSettings();
+ mBatterySaverScheduleSettings.onAttach(mContext);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
+
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 1);
+ mBatterySaverScheduleSettings.onResume();
+ }
+
+ @Test
+ public void onPause_withNoScheduleType_logExpectedData() {
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 0);
+
+ mBatterySaverScheduleSettings.onPause();
+
+ verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE,
+ /* schedulePercentage= */ -1);
+ }
+
+ @Test
+ public void onPause_withRoutineScheduleType_logExpectedData() {
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC, 0);
+
+ mBatterySaverScheduleSettings.onPause();
+
+ verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE,
+ /* schedulePercentage= */ -1);
+ }
+
+ @Test
+ public void onPause_withPercentageScheduleType_logExpectedData() {
+ int expectedPercentage = 10;
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, expectedPercentage);
+
+ mBatterySaverScheduleSettings.onPause();
+
+ verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE,
+ expectedPercentage);
+ }
+
+ @Test
+ public void onPause_scheduleTypeAndPercentageAreNotChanged_notLogAnyData() {
+ mBatterySaverScheduleSettings.onResume();
+ mBatterySaverScheduleSettings.onPause();
+
+ waitAWhile();
+ verifyNoMoreInteractions(mMetricsFeatureProvider);
+ }
+
+ @Test
+ public void onPause_multipleScheduleTypeChanges_logLastChangedData() {
+ int expectedPercentage = 10;
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 0);
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC, 0);
+ setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, expectedPercentage);
+
+ mBatterySaverScheduleSettings.onPause();
+
+ verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE,
+ expectedPercentage);
+ }
+
+ private void setSchedule(int scheduleType, int schedulePercentage) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE, scheduleType);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, schedulePercentage);
+ }
+
+ private void verifySchedule(int scheduleType, int schedulePercentage) {
+ waitAWhile();
+ verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ scheduleType),
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+ schedulePercentage));
+ }
+
+ private void waitAWhile() {
+ try {
+ Thread.sleep(200);
+ } catch (Exception e) {
+ }
+ }
+}