Merge changes Ib3d3df9f,Iae9096a1

* changes:
  Use BatterySaverReceiver in battery saver settings
  Add controller for battery saver button
This commit is contained in:
TreeHugger Robot
2018-02-09 01:35:18 +00:00
committed by Android (Google) Code Review
15 changed files with 551 additions and 20 deletions

View File

@@ -42,6 +42,24 @@ public class LayoutPreference extends Preference {
public LayoutPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0 /* defStyleAttr */);
}
public LayoutPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
public LayoutPreference(Context context, int resource) {
this(context, LayoutInflater.from(context).inflate(resource, null, false));
}
public LayoutPreference(Context context, View view) {
super(context);
setView(view);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Preference);
mAllowDividerAbove = TypedArrayUtils.getBoolean(a, R.styleable.Preference_allowDividerAbove,
R.styleable.Preference_allowDividerAbove, false);
@@ -50,7 +68,7 @@ public class LayoutPreference extends Preference {
a.recycle();
a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.Preference, 0, 0);
attrs, com.android.internal.R.styleable.Preference, defStyleAttr, 0);
int layoutResource = a.getResourceId(com.android.internal.R.styleable.Preference_layout,
0);
if (layoutResource == 0) {
@@ -64,15 +82,6 @@ public class LayoutPreference extends Preference {
setView(view);
}
public LayoutPreference(Context context, int resource) {
this(context, LayoutInflater.from(context).inflate(resource, null, false));
}
public LayoutPreference(Context context, View view) {
super(context);
setView(view);
}
private void setView(View view) {
setLayoutResource(R.layout.layout_preference_frame);
final ViewGroup allDetails = view.findViewById(R.id.all_details);
@@ -106,4 +115,4 @@ public class LayoutPreference extends Preference {
return mRootView.findViewById(id);
}
}
}

View File

@@ -27,7 +27,7 @@ import com.android.settings.Utils;
/**
* Use this broadcastReceiver to listen to the battery change, and it will invoke
* {@link OnBatteryChangedListener} if any of the followings has been changed:
* {@link OnBatteryChangedListener} if any of the following has been changed:
*
* 1. Battery level(e.g. 100%->99%)
* 2. Battery status(e.g. plugged->unplugged)
@@ -35,7 +35,14 @@ import com.android.settings.Utils;
*/
public class BatteryBroadcastReceiver extends BroadcastReceiver {
interface OnBatteryChangedListener {
/**
* Callback when the following has been changed:
*
* Battery level(e.g. 100%->99%)
* Battery status(e.g. plugged->unplugged)
* Battery saver(e.g. off->on)
*/
public interface OnBatteryChangedListener {
void onBatteryChanged();
}

View File

@@ -69,7 +69,7 @@ public class BatterySaverReceiver extends BroadcastReceiver {
mBatterySaverListener = lsn;
}
interface BatterySaverListener {
public interface BatterySaverListener {
void onPowerSaveModeChanged();
void onBatteryChanged(boolean pluggedIn);
}

View File

@@ -0,0 +1,88 @@
/*
* 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.os.PowerManager;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import com.android.settings.fuelgauge.BatteryBroadcastReceiver;
import com.android.settings.fuelgauge.BatterySaverReceiver;
import com.android.settings.widget.TwoStateButtonPreferenceController;
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 to update the battery saver button
*/
public class BatterySaverButtonPreferenceController extends
TwoStateButtonPreferenceController 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);
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mBatterySaverReceiver = new BatterySaverReceiver(context);
mBatterySaverReceiver.setBatterySaverListener(this);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void onStart() {
mBatterySaverReceiver.setListening(true);
}
@Override
public void onStop() {
mBatterySaverReceiver.setListening(false);
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
setButtonVisibility(!mPowerManager.isPowerSaveMode());
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public void onButtonClicked(boolean stateOn) {
mPowerManager.setPowerSaveMode(stateOn);
}
@Override
public void onPowerSaveModeChanged() {
setButtonVisibility(!mPowerManager.isPowerSaveMode());
}
@Override
public void onBatteryChanged(boolean pluggedIn) {
setButtonEnabled(!pluggedIn);
}
}

View File

@@ -78,6 +78,7 @@ 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;
}

View File

@@ -0,0 +1,62 @@
/*
* 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.content.res.TypedArray;
import android.support.v4.content.res.TypedArrayUtils;
import android.util.AttributeSet;
import android.widget.Button;
import com.android.settings.R;
import com.android.settings.applications.LayoutPreference;
/**
* Preference that presents a button with two states(On vs Off)
*/
public class TwoStateButtonPreference extends LayoutPreference {
public TwoStateButtonPreference(Context context, AttributeSet attrs) {
super(context, attrs, TypedArrayUtils.getAttr(
context, R.attr.twoStateButtonPreferenceStyle, android.R.attr.preferenceStyle));
if (attrs != null) {
final TypedArray styledAttrs = context.obtainStyledAttributes(attrs,
R.styleable.TwoStateButtonPreference);
final int textOnId = styledAttrs.getResourceId(
R.styleable.TwoStateButtonPreference_textOn,
R.string.summary_placeholder);
final int textOffId = styledAttrs.getResourceId(
R.styleable.TwoStateButtonPreference_textOff,
R.string.summary_placeholder);
styledAttrs.recycle();
final Button buttonOn = getStateOnButton();
buttonOn.setText(textOnId);
final Button buttonOff = getStateOffButton();
buttonOff.setText(textOffId);
}
}
public Button getStateOnButton() {
return findViewById(R.id.state_on_button);
}
public Button getStateOffButton() {
return findViewById(R.id.state_off_button);
}
}

View File

@@ -0,0 +1,78 @@
/*
* 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);
}