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

Commit fa00f329 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add Battery Saver Schedule screen logic"

parents bc0bfe84 5bb0a63b
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -26,18 +26,6 @@
        android:title="@string/battery_saver_schedule_settings_title"
        settings:controller="com.android.settings.fuelgauge.batterysaver.BatterySaverSchedulePreferenceController"/>

    <!-- Turn on automatically -->
    <SwitchPreference
        android:key="auto_battery_saver"
        android:title="@string/battery_saver_auto_title"
        settings:controller="com.android.settings.fuelgauge.batterysaver.AutoBatterySaverPreferenceController" />

    <com.android.settings.widget.SeekBarPreference
        android:key="battery_saver_seek_bar"
        android:title="@string/battery_saver_seekbar_title_placeholder"
        android:max="15"
        android:min="1" />

    <com.android.settings.widget.TwoStateButtonPreference
        android:key="battery_saver"
        android:title="@string/battery_saver"
+16 −5
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.settings.fuelgauge;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
@@ -22,6 +23,7 @@ import android.os.Looper;
import android.os.PowerManager;
import android.provider.Settings;

import android.provider.Settings.Global;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

@@ -31,6 +33,7 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
import com.android.settingslib.fuelgauge.BatterySaverUtils;

public class BatterySaverController extends BasePreferenceController
        implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
@@ -45,6 +48,7 @@ public class BatterySaverController extends BasePreferenceController
        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
        mBatteryStateChangeReceiver.setBatterySaverListener(this);
        BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
    }

    @Override
@@ -81,17 +85,24 @@ public class BatterySaverController extends BasePreferenceController

    @Override
    public CharSequence getSummary() {
        final ContentResolver resolver = mContext.getContentResolver();
        final boolean isPowerSaveOn = mPowerManager.isPowerSaveMode();
        final int percent = Settings.Global.getInt(mContext.getContentResolver(),
        final int percent = Settings.Global.getInt(resolver,
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
        final int mode = Settings.Global.getInt(resolver,
                Global.AUTOMATIC_POWER_SAVER_MODE, PowerManager.POWER_SAVER_MODE_PERCENTAGE);
        if (isPowerSaveOn) {
            return mContext.getString(R.string.battery_saver_on_summary);
        } else if (percent != 0) {
        } else if (mode == PowerManager.POWER_SAVER_MODE_PERCENTAGE) {
            if (percent != 0) {
                return mContext.getString(R.string.battery_saver_off_scheduled_summary,
                        Utils.formatPercentage(percent));
            } else {
                return mContext.getString(R.string.battery_saver_off_summary);
            }
        } else {
            return mContext.getString(R.string.battery_saver_auto_routine);
        }
    }

    private void updateSummary() {
+0 −70
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.fuelgauge.batterysaver;

import android.content.Context;
import android.provider.Settings;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;

import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.fuelgauge.BatterySaverUtils;

/**
 * Controller that update whether to turn on battery saver automatically
 */
public class AutoBatterySaverPreferenceController extends TogglePreferenceController implements
        Preference.OnPreferenceChangeListener {

    /**
     * Default value for {@link Settings.Global#LOW_POWER_MODE_TRIGGER_LEVEL}.
     */
    static final int DEFAULT_TRIGGER_LEVEL = 0;

    /**
     * The default value to set to {@link Settings.Global#LOW_POWER_MODE_TRIGGER_LEVEL} when the
     * user enables battery saver.
     */
    private final int mDefaultTriggerLevelForOn;

    @VisibleForTesting
    static final String KEY_AUTO_BATTERY_SAVER = "auto_battery_saver";

    public AutoBatterySaverPreferenceController(Context context) {
        super(context, KEY_AUTO_BATTERY_SAVER);
        mDefaultTriggerLevelForOn = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_lowBatteryWarningLevel);
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public boolean isChecked() {
        return Settings.Global.getInt(mContext.getContentResolver(),
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, DEFAULT_TRIGGER_LEVEL) != 0;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        BatterySaverUtils.setAutoBatterySaverTriggerLevel(mContext,
                isChecked ? mDefaultTriggerLevelForOn : 0);
        return true;
    }
}
+0 −166
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.fuelgauge.batterysaver;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.widget.SeekBarPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

/**
 * Controller that update the battery saver seekbar
 */
public class AutoBatterySeekBarPreferenceController extends BasePreferenceController implements
        LifecycleObserver, OnStart, OnStop, SeekBarPreference.OnPreferenceChangeListener {
    private static final String TAG = "AutoBatterySeekBarPreferenceController";
    private static final int INTERVAL = 5;
    @VisibleForTesting
    static final String KEY_AUTO_BATTERY_SEEK_BAR = "battery_saver_seek_bar";
    private SeekBarPreference mPreference;
    private AutoBatterySaverSettingObserver mContentObserver;

    public AutoBatterySeekBarPreferenceController(Context context, Lifecycle lifecycle) {
        super(context, KEY_AUTO_BATTERY_SEEK_BAR);
        mContentObserver = new AutoBatterySaverSettingObserver(new Handler(Looper.getMainLooper()));
        if (lifecycle != null) {
            lifecycle.addObserver(this);
        }
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = (SeekBarPreference) screen.findPreference(
                KEY_AUTO_BATTERY_SEEK_BAR);
        mPreference.setContinuousUpdates(true);
        mPreference.setAccessibilityRangeInfoType(
                AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_PERCENT);
        updatePreference(mPreference);
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        updatePreference(preference);
    }

    @Override
    public void onStart() {
        mContentObserver.registerContentObserver();
    }

    @Override
    public void onStop() {
        mContentObserver.unRegisterContentObserver();
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final int progress = (int) newValue;
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, progress * INTERVAL);
        return true;
    }

    @VisibleForTesting
    void updatePreference(Preference preference) {
        final ContentResolver contentResolver = mContext.getContentResolver();

        // Override the max value with LOW_POWER_MODE_TRIGGER_LEVEL_MAX, if set.
        final int maxLevel = Settings.Global.getInt(contentResolver,
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX, 0) / INTERVAL;
        if (maxLevel > 0) {
            if (!(preference instanceof SeekBarPreference)) {
                Log.e(TAG, "Unexpected preference class: " + preference.getClass());
            } else {
                final SeekBarPreference seekBarPreference = (SeekBarPreference) preference;
                if (maxLevel < seekBarPreference.getMin()) {
                    Log.e(TAG, "LOW_POWER_MODE_TRIGGER_LEVEL_MAX too low; ignored.");
                } else {
                    seekBarPreference.setMax(maxLevel);
                }
            }
        }

        // Set the current value.
        final int level = Settings.Global.getInt(contentResolver,
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
                AutoBatterySaverPreferenceController.DEFAULT_TRIGGER_LEVEL);
        if (level == 0) {
            preference.setVisible(false);
        } else {
            preference.setVisible(true);
            preference.setTitle(mContext.getString(R.string.battery_saver_seekbar_title,
                    Utils.formatPercentage(level)));
            SeekBarPreference seekBarPreference = (SeekBarPreference) preference;
            seekBarPreference.setProgress(level / INTERVAL);
            seekBarPreference.setSeekBarContentDescription(
                    mContext.getString(R.string.battery_saver_turn_on_automatically_title));
        }
    }

    /**
     * Observer that listens to change from {@link Settings.Global#LOW_POWER_MODE_TRIGGER_LEVEL}
     */
    private final class AutoBatterySaverSettingObserver extends ContentObserver {
        private final Uri mUri = Settings.Global.getUriFor(
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL);
        private final ContentResolver mContentResolver;

        public AutoBatterySaverSettingObserver(Handler handler) {
            super(handler);
            mContentResolver = mContext.getContentResolver();
        }

        public void registerContentObserver() {
            mContentResolver.registerContentObserver(mUri, false, this);
        }

        public void unRegisterContentObserver() {
            mContentResolver.unregisterContentObserver(this);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri, int userId) {
            if (mUri.equals(uri)) {
                updatePreference(mPreference);
            }
        }
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -26,7 +26,13 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.fuelgauge.BatterySaverUtils;

/**
 * Simple controller to navigate users to the scheduling page from
 * "Settings > Battery > Battery Saver". Also updates the summary for preference based on
 * the currently selected settings.
 */
public class BatterySaverSchedulePreferenceController extends BasePreferenceController {

    @VisibleForTesting
@@ -36,6 +42,7 @@ public class BatterySaverSchedulePreferenceController extends BasePreferenceCont

    public BatterySaverSchedulePreferenceController(Context context) {
        super(context, KEY_BATTERY_SAVER_SCHEDULE);
        BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
    }

    @Override
Loading