Merge "Log Battery Saver states." into sc-dev
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 15070c3..8fec9b4 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.fuelgauge;
 
+import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
@@ -23,6 +24,7 @@
 import android.os.PowerManager;
 import android.provider.Settings;
 import android.provider.Settings.Global;
+import android.util.Pair;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -30,6 +32,8 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -44,6 +48,7 @@
     private final BatterySaverReceiver mBatteryStateChangeReceiver;
     private final PowerManager mPowerManager;
     private Preference mBatterySaverPref;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final ContentObserver mObserver = new ContentObserver(
             new Handler(Looper.getMainLooper())) {
         @Override
@@ -56,6 +61,7 @@
         super(context, KEY_BATTERY_SAVER);
 
         mPowerManager = mContext.getSystemService(PowerManager.class);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
         mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
         mBatteryStateChangeReceiver.setBatterySaverListener(this);
         BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
@@ -121,9 +127,43 @@
         }
     }
 
+    private void logPowerSaver() {
+        if (!mPowerManager.isPowerSaveMode()) {
+            // Power saver is off, so don't do anything.
+            return;
+        }
+
+        final ContentResolver resolver = mContext.getContentResolver();
+        final int mode = Global.getInt(resolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+        int fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
+        switch (mode) {
+            case PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE:
+                fuelgaugeScheduleType =
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
+                final int powerLevelTriggerPercentage = Global.getInt(resolver,
+                        Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+                mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                        Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                                fuelgaugeScheduleType),
+                        Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+                                powerLevelTriggerPercentage));
+                break;
+            case PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC:
+                fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
+                break;
+            default:
+                // empty
+        }
+        mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        fuelgaugeScheduleType));
+    }
+
     @Override
     public void onPowerSaveModeChanged() {
         updateSummary();
+        logPowerSaver();
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index 52f682c..cee1160 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -21,12 +21,17 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.PowerManager;
 import android.provider.Settings;
+import android.util.Pair;
 
 import androidx.preference.Preference;
 
+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;
@@ -46,12 +51,16 @@
 
     private BatterySaverController mBatterySaverController;
     private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
         mContext = RuntimeEnvironment.application;
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mBatterySaverController = spy(new BatterySaverController(mContext));
         ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
         ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
@@ -73,6 +82,49 @@
     }
 
     @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_manualTrigger_logsType() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE, -1);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE));
+    }
+
+    @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_triggerPercent_logsTypeAndPercentage() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+        final int percentageVal = 15;
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, percentageVal);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE),
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+                        percentageVal));
+    }
+
+    @Test
+    public void onPreferenceChange_onPowerSaveModeChanged_triggerDynamic_logsType() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+                PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
+
+        mBatterySaverController.onPowerSaveModeChanged();
+        verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+                Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+                        SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE));
+    }
+
+    @Test
     public void getSummary_batterySaverOn_showSummaryOn() {
         when(mPowerManager.isPowerSaveMode()).thenReturn(true);