Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7681f7ee authored by ykhung's avatar ykhung Committed by Automerger Merge Worker
Browse files

Log battery saver schedule type and percentage when its value is changed am: aa73e489

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/16101562

Change-Id: I7f555cccd53ae5c6e9e564d339042264e0601208
parents 96c6fcb7 aa73e489
Loading
Loading
Loading
Loading
+47 −1
Original line number Original line Diff line number Diff line
@@ -16,17 +16,20 @@


package com.android.settings.fuelgauge.batterysaver;
package com.android.settings.fuelgauge.batterysaver;


import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Context;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.provider.Settings;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.TextUtils;
import android.view.View;
import android.view.View;
import android.util.Pair;


import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
@@ -34,6 +37,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceScreen;


import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.fuelgauge.BatterySaverUtils;
import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.CandidateInfo;
@@ -58,6 +62,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
    public BatterySaverScheduleRadioButtonsController mRadioButtonController;
    public BatterySaverScheduleRadioButtonsController mRadioButtonController;
    @VisibleForTesting
    @VisibleForTesting
    Context mContext;
    Context mContext;
    private int mSaverPercentage;
    private String mSaverScheduleKey;
    private BatterySaverScheduleSeekBarController mSeekBarController;
    private BatterySaverScheduleSeekBarController mSeekBarController;


    @VisibleForTesting
    @VisibleForTesting
@@ -90,6 +96,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
                Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
                Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
                false,
                false,
                mSettingsObserver);
                mSettingsObserver);
        mSaverScheduleKey = mRadioButtonController.getDefaultKey();
        mSaverPercentage = getSaverPercentage();
    }
    }


    @Override
    @Override
@@ -107,6 +115,7 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
    @Override
    @Override
    public void onPause() {
    public void onPause() {
        mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
        mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
        AsyncTask.execute(() -> logPowerSaver());
        super.onPause();
        super.onPause();
    }
    }


@@ -174,6 +183,43 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
        return 0;
        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 {
    static class BatterySaverScheduleCandidateInfo extends CandidateInfo {


        private final CharSequence mLabel;
        private final CharSequence mLabel;
+119 −0
Original line number Original line Diff line number Diff line
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) {
        }
    }
}