BatterySaverSettings.java revision 249cf50b19c5b1d9ddce0667fb9d439fcdb6f033
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.provider.Settings.Global; 28c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.util.Log; 29249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport android.widget.Switch; 30c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 31c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.R; 32249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport com.android.settings.SettingsActivity; 33c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsPreferenceFragment; 34c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.notification.SettingPref; 35249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport com.android.settings.widget.SwitchBar; 36c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 37249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockpublic class BatterySaverSettings extends SettingsPreferenceFragment 38249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock implements SwitchBar.OnSwitchChangeListener { 39c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String TAG = "BatterySaverSettings"; 40249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 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 445845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Handler mHandler = new Handler(); 45c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); 46c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 47c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private Context mContext; 485fe76205b607f193b5925eccfabddc145118b5eaJohn Spurlock private boolean mCreated; 49c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private SettingPref mTriggerPref; 50249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private SwitchBar mSwitchBar; 51249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private Switch mSwitch; 52249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private boolean mValidListener; 53c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 54c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 55c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onActivityCreated(Bundle savedInstanceState) { 56c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onActivityCreated(savedInstanceState); 575fe76205b607f193b5925eccfabddc145118b5eaJohn Spurlock if (mCreated) return; 585fe76205b607f193b5925eccfabddc145118b5eaJohn Spurlock mCreated = true; 59c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock addPreferencesFromResource(R.xml.battery_saver_settings); 60c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 61c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mContext = getActivity(); 62249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar = ((SettingsActivity) mContext).getSwitchBar(); 63249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitch = mSwitchBar.getSwitch(); 64249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.show(); 65249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 66c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY, 67de159c8d16d94785476000e209daa7b5bd6ab5faDianne Hackborn Global.LOW_POWER_MODE_TRIGGER_LEVEL, 68249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 0, /*default*/ 69c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock getResources().getIntArray(R.array.battery_saver_trigger_values)) { 70c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 71c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock protected String getCaption(Resources res, int value) { 72c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (value > 0 && value < 100) { 73c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_pct, value); 74c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 75c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_never); 76c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 77c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock }; 78c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref.init(this); 79c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 80c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 81c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 82249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock public void onDestroyView() { 83249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock super.onDestroyView(); 84249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.hide(); 85249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 86249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 87249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock @Override 88c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onResume() { 89c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onResume(); 90c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(true); 91249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (!mValidListener) { 92249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 93249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mValidListener = true; 94249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 95249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock updateSwitch(); 96c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 97c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 98c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 99c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onPause() { 100c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onPause(); 101c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(false); 102249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 103249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 104249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mValidListener = false; 105249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 106249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 107249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 108249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock @Override 109249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock public void onSwitchChanged(Switch switchView, boolean isChecked) { 110249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (isChecked) { 111249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM); 112249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } else { 113249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (DEBUG) Log.d(TAG, "Stopping LOW_POWER_MODE from settings"); 114249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock Global.putInt(getContentResolver(), Global.LOW_POWER_MODE, 0); 115249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 116249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 117249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 118249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private void updateSwitch() { 119249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock final boolean checked = Global.getInt(getContentResolver(), Global.LOW_POWER_MODE, 0) != 0; 120249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (checked == mSwitch.isChecked()) return; 121249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 122249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock // set listener to null so that that code below doesn't trigger onCheckedChanged() 123249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 124249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 125249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 126249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitch.setChecked(checked); 127249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 128249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 129249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 130c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 131c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 1325845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Runnable mStartMode = new Runnable() { 133c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 1345845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 1355845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock AsyncTask.execute(new Runnable() { 1365845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock @Override 1375845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 138249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (DEBUG) Log.d(TAG, "Starting LOW_POWER_MODE from settings"); 139249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock Global.putInt(getContentResolver(), Global.LOW_POWER_MODE, 1); 1405845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } 1415845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }); 142c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 1435845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }; 144c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 145c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final class SettingsObserver extends ContentObserver { 146c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE); 147c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI 148c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL); 149c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 150c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public SettingsObserver(Handler handler) { 151c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super(handler); 152c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 153c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 154c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 155c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onChange(boolean selfChange, Uri uri) { 156c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_URI.equals(uri)) { 157249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock updateSwitch(); 158c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 159c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) { 1605845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mTriggerPref.update(mContext); 161c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 162c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 163c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 164c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void setListening(boolean listening) { 165c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final ContentResolver cr = getContentResolver(); 166c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (listening) { 167c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_URI, false, this); 168c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this); 169c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } else { 170c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.unregisterContentObserver(this); 171c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 172c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 173c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 174c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock} 175