BatterySaverSettings.java revision c7f8e8ce69e80ea495472aade5f8569c6583c5e8
1c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock/* 2c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * Copyright (C) 2014 The Android Open Source Project 3c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * 4c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * you may not use this file except in compliance with the License. 6c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * You may obtain a copy of the License at 7c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * 8c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * 10c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * Unless required by applicable law or agreed to in writing, software 11c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * See the License for the specific language governing permissions and 14c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock * limitations under the License. 15c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock */ 16c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 17c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockpackage com.android.settings.fuelgauge; 18c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 19c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.ContentResolver; 20c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.Context; 21c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.res.Resources; 22c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.database.ContentObserver; 23c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.net.Uri; 24c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.AsyncTask; 25c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.Bundle; 26c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.Handler; 27c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.Message; 28c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.provider.Settings.Global; 29c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.util.Log; 30c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.widget.Switch; 31c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 32c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.R; 33c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsActivity; 34c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsPreferenceFragment; 35c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.notification.SettingPref; 36c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.widget.SwitchBar; 37c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 38c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockpublic class BatterySaverSettings extends SettingsPreferenceFragment 39c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock implements SwitchBar.OnSwitchChangeListener { 40c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String TAG = "BatterySaverSettings"; 41c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically"; 42c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final long WAIT_FOR_SWITCH_ANIM = 500; 43c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 44c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final H mHandler = new H(); 45c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); 46c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 47c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private Context mContext; 48c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private SwitchBar mSwitchBar; 49c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private boolean mSwitchBarListenerAdded; 50c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private SettingPref mTriggerPref; 51c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 52c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 53c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onActivityCreated(Bundle savedInstanceState) { 54c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onActivityCreated(savedInstanceState); 55c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 56c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock addPreferencesFromResource(R.xml.battery_saver_settings); 57c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 58c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mContext = getActivity(); 59c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar = ((SettingsActivity) mContext).getSwitchBar(); 60c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock updateSwitchBar(); 61c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY, 62c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0, 63c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock getResources().getIntArray(R.array.battery_saver_trigger_values)) { 64c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 65c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock protected String getCaption(Resources res, int value) { 66c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (value > 0 && value < 100) { 67c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_pct, value); 68c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 69c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_never); 70c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 71c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock }; 72c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref.init(this); 73c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 74c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 75c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private void updateSwitchBar() { 76c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final boolean mode = Global.getInt(getContentResolver(), Global.LOW_POWER_MODE, 0) != 0; 77c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (mSwitchBarListenerAdded) { 78c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 79c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 80c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.getSwitch().setChecked(mode); 81c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (mSwitchBarListenerAdded) { 82c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 83c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 84c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 85c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 86c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private void updateTriggerLevel() { 87c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref.update(mContext); 88c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 89c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 90c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 91c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onResume() { 92c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onResume(); 93c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock updateSwitchBar(); 94c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(true); 95c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.show(); 96c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 97c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBarListenerAdded = true; 98c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 99c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 100c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 101c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onPause() { 102c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onPause(); 103c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(false); 104c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (mSwitchBarListenerAdded) { 105c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 106c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 107c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSwitchBar.hide(); 108c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 109c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 110c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 111c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onSwitchChanged(Switch switchView, boolean isChecked) { 112c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mHandler.postSetMode(isChecked); 113c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 114c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 115c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private void handleSetMode(final boolean mode) { 116c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock AsyncTask.execute(new Runnable() { 117c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 118c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void run() { 119c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock Log.d(TAG, "LOW_POWER_MODE from settings: " + mode); 120c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock Global.putInt(getContentResolver(), Global.LOW_POWER_MODE, mode ? 1 : 0); 121c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 122c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock }); 123c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 124c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 125c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final class H extends Handler { 126c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final int SET_MODE = 1; 127c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 128c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void postSetMode(boolean mode) { 129c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock removeMessages(SET_MODE); 130c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final Message m = obtainMessage(SET_MODE, mode ? 1 : 0, 0); 131c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock sendMessageDelayed(m, mode ? WAIT_FOR_SWITCH_ANIM : 0); 132c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 133c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 134c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 135c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void handleMessage(Message msg) { 136c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (msg.what == SET_MODE) { 137c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock handleSetMode(msg.arg1 != 0); 138c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 139c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 140c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 141c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 142c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final class SettingsObserver extends ContentObserver { 143c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE); 144c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI 145c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL); 146c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 147c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public SettingsObserver(Handler handler) { 148c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super(handler); 149c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 150c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 151c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 152c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onChange(boolean selfChange, Uri uri) { 153c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_URI.equals(uri)) { 154c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock updateSwitchBar(); 155c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 156c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) { 157c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock updateTriggerLevel(); 158c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 159c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 160c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 161c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void setListening(boolean listening) { 162c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final ContentResolver cr = getContentResolver(); 163c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (listening) { 164c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_URI, false, this); 165c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this); 166c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } else { 167c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.unregisterContentObserver(this); 168c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 169c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 170c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 171c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock} 172