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

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

Merge "Convert BatterySaverButton controller to Slice compatible." into pi-dev

parents c7b90ee9 db03de4e
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/battery_saver"
    android:key="battery_saver">
    android:key="battery_saver_page">

    <!-- Turn on automatically -->
    <SwitchPreference
@@ -33,10 +33,13 @@
        android:min="5" />

    <com.android.settings.widget.TwoStateButtonPreference
        android:key="battery_saver_button_container"
        android:key="battery_saver"
        android:title="@string/battery_saver"
        android:selectable="false"
        settings:textOn="@string/battery_saver_button_turn_on"
        settings:textOff="@string/battery_saver_button_turn_off"/>
        settings:textOff="@string/battery_saver_button_turn_off"
        settings:platform_slice="true"
        settings:controller="com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController" />

    <PreferenceCategory
        android:key="battery_saver_footer">
+44 −22
Original line number Diff line number Diff line
@@ -18,12 +18,12 @@ package com.android.settings.fuelgauge.batterysaver;

import android.content.Context;
import android.os.PowerManager;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settings.core.TogglePreferenceController;
import com.android.settings.fuelgauge.BatterySaverReceiver;
import com.android.settings.widget.TwoStateButtonPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settings.widget.TwoStateButtonPreference;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -33,21 +33,29 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
 * Controller to update the battery saver button
 */
public class BatterySaverButtonPreferenceController extends
        TwoStateButtonPreferenceController implements
        TogglePreferenceController implements
        LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
    private static final String KEY = "battery_saver_button_container";
    private BatterySaverReceiver mBatterySaverReceiver;
    @VisibleForTesting
    PowerManager mPowerManager;

    public BatterySaverButtonPreferenceController(Context context, Lifecycle lifecycle) {
        super(context, KEY);
    private final BatterySaverReceiver mBatterySaverReceiver;
    private final PowerManager mPowerManager;

    private TwoStateButtonPreference mPreference;

    public BatterySaverButtonPreferenceController(Context context, String key) {
        super(context, key);
        mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mBatterySaverReceiver = new BatterySaverReceiver(context);
        mBatterySaverReceiver.setBatterySaverListener(this);
        if (lifecycle != null) {
            lifecycle.addObserver(this);
    }

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

    @Override
    public boolean isSliceable() {
        return true;
    }

    @Override
@@ -61,29 +69,43 @@ public class BatterySaverButtonPreferenceController extends
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        setButtonVisibility(!mPowerManager.isPowerSaveMode());
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = (TwoStateButtonPreference) screen.findPreference(getPreferenceKey());
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    public boolean isChecked() {
        return mPowerManager.isPowerSaveMode();
    }

    @Override
    public void onButtonClicked(boolean stateOn) {
    public boolean setChecked(boolean stateOn) {
        // This screen already shows a warning, so we don't need another warning.
        BatterySaverUtils.setPowerSaveMode(mContext,  stateOn, /*needFirstTimeWarning*/ false);
        return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
                false /* needFirstTimeWarning */);
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        if (mPreference != null) {
            mPreference.setChecked(isChecked());
        }
    }

    @Override
    public void onPowerSaveModeChanged() {
        setButtonVisibility(!mPowerManager.isPowerSaveMode());
        final boolean isChecked = isChecked();
        if (mPreference != null && mPreference.isChecked() != isChecked) {
            mPreference.setChecked(isChecked);
        }
    }

    @Override
    public void onBatteryChanged(boolean pluggedIn) {
        setButtonEnabled(!pluggedIn);
        if (mPreference != null) {
            mPreference.setButtonEnabled(!pluggedIn);
        }
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ public class BatterySaverSettings extends DashboardFragment {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        controllers.add(new AutoBatterySaverPreferenceController(context));
        controllers.add(new AutoBatterySeekBarPreferenceController(context, lifecycle));
        controllers.add(new BatterySaverButtonPreferenceController(context, lifecycle));
        return controllers;
    }

+53 −9
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@ package com.android.settings.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.VisibleForTesting;
import android.support.v4.content.res.TypedArrayUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;

import com.android.settings.R;
@@ -28,12 +30,21 @@ import com.android.settings.applications.LayoutPreference;
/**
 * Preference that presents a button with two states(On vs Off)
 */
public class TwoStateButtonPreference extends LayoutPreference {
public class TwoStateButtonPreference extends LayoutPreference implements
        View.OnClickListener {

    private boolean mIsChecked;
    private final Button mButtonOn;
    private final Button mButtonOff;

    public TwoStateButtonPreference(Context context, AttributeSet attrs) {
        super(context, attrs, TypedArrayUtils.getAttr(
                context, R.attr.twoStateButtonPreferenceStyle, android.R.attr.preferenceStyle));

        if (attrs != null) {
        if (attrs == null) {
            mButtonOn = null;
            mButtonOff = null;
        } else {
            final TypedArray styledAttrs = context.obtainStyledAttributes(attrs,
                    R.styleable.TwoStateButtonPreference);
            final int textOnId = styledAttrs.getResourceId(
@@ -44,19 +55,52 @@ public class TwoStateButtonPreference extends LayoutPreference {
                    R.string.summary_placeholder);
            styledAttrs.recycle();

            final Button buttonOn = getStateOnButton();
            buttonOn.setText(textOnId);
            final Button buttonOff = getStateOffButton();
            buttonOff.setText(textOffId);
            mButtonOn = findViewById(R.id.state_on_button);
            mButtonOn.setText(textOnId);
            mButtonOn.setOnClickListener(this);
            mButtonOff = findViewById(R.id.state_off_button);
            mButtonOff.setText(textOffId);
            mButtonOff.setOnClickListener(this);
            setChecked(isChecked());
        }
    }

    public Button getStateOnButton() {
        return findViewById(R.id.state_on_button);
    @Override
    public void onClick(View v) {
        final boolean stateOn = v.getId() == R.id.state_on_button;
        setChecked(stateOn);
        callChangeListener(stateOn);
    }

    public void setChecked(boolean checked) {
        // Update state
        mIsChecked = checked;
        // And update UI
        if (checked) {
            mButtonOn.setVisibility(View.GONE);
            mButtonOff.setVisibility(View.VISIBLE);
        } else {
            mButtonOn.setVisibility(View.VISIBLE);
            mButtonOff.setVisibility(View.GONE);
        }
    }

    public boolean isChecked() {
        return mIsChecked;
    }

    public void setButtonEnabled(boolean enabled) {
        mButtonOn.setEnabled(enabled);
        mButtonOff.setEnabled(enabled);
    }

    @VisibleForTesting
    public Button getStateOnButton() {
        return mButtonOn;
    }

    @VisibleForTesting
    public Button getStateOffButton() {
        return findViewById(R.id.state_off_button);
        return mButtonOff;
    }
}
 No newline at end of file
+0 −78
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.widget;

import android.content.Context;
import android.support.v7.preference.PreferenceScreen;
import android.view.View;
import android.widget.Button;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;

/**
 * Controller to update the button with two states(On vs Off).
 */
public abstract class TwoStateButtonPreferenceController extends BasePreferenceController
        implements View.OnClickListener {
    private Button mButtonOn;
    private Button mButtonOff;

    public TwoStateButtonPreferenceController(Context context, String key) {
        super(context, key);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        final TwoStateButtonPreference preference =
                (TwoStateButtonPreference) screen.findPreference(getPreferenceKey());
        mButtonOn = preference.getStateOnButton();
        mButtonOn.setOnClickListener(this);
        mButtonOff = preference.getStateOffButton();
        mButtonOff.setOnClickListener(this);
    }

    protected void setButtonVisibility(boolean stateOn) {
        if (stateOn) {
            mButtonOff.setVisibility(View.GONE);
            mButtonOn.setVisibility(View.VISIBLE);
        } else {
            mButtonOff.setVisibility(View.VISIBLE);
            mButtonOn.setVisibility(View.GONE);
        }
    }

    protected void setButtonEnabled(boolean enabled) {
        mButtonOn.setEnabled(enabled);
        mButtonOff.setEnabled(enabled);
    }

    @Override
    public void onClick(View v) {
        final boolean stateOn = v.getId() == R.id.state_on_button;
        onButtonClicked(stateOn);
    }

    /**
     * Callback when button is clicked
     *
     * @param stateOn {@code true} if stateOn button is clicked, otherwise it means stateOff
     *                button is clicked
     */
    public abstract void onButtonClicked(boolean stateOn);
}
 No newline at end of file
Loading