BatterySaverSettings.java revision 5845d98a8aa0bb75bff6bd30646cdc8867002f99
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; 29c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 30c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.R; 31c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsPreferenceFragment; 32c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.notification.SettingPref; 33c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 345845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlockpublic class BatterySaverSettings extends SettingsPreferenceFragment { 35c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String TAG = "BatterySaverSettings"; 365845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private static final String KEY_ALWAYS_ON = "always_on"; 37c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically"; 38c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final long WAIT_FOR_SWITCH_ANIM = 500; 39c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 405845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Handler mHandler = new Handler(); 41c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); 42c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 43c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private Context mContext; 445845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private SettingPref mAlwaysOnPref; 45c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private SettingPref mTriggerPref; 46c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 47c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 48c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onActivityCreated(Bundle savedInstanceState) { 49c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onActivityCreated(savedInstanceState); 50c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 51c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock addPreferencesFromResource(R.xml.battery_saver_settings); 52c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 53c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mContext = getActivity(); 545845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mAlwaysOnPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_ALWAYS_ON, 555845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock Global.LOW_POWER_MODE, 0) { 565845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock @Override 575845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock protected boolean setSetting(Context context, int value) { 585845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mHandler.removeCallbacks(mStartMode); 595845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock if (value == 0) { 605845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock return super.setSetting(context, value); 615845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } else { 625845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock // about lose animations, make sure we don't turn the mode on until the switch 635845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock // stops moving 645845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM); 655845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock return true; 665845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } 675845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } 685845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }; 69c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY, 70de159c8d16d94785476000e209daa7b5bd6ab5faDianne Hackborn Global.LOW_POWER_MODE_TRIGGER_LEVEL, 71de159c8d16d94785476000e209daa7b5bd6ab5faDianne Hackborn mContext.getResources().getInteger( 72de159c8d16d94785476000e209daa7b5bd6ab5faDianne Hackborn com.android.internal.R.integer.config_lowBatteryWarningLevel), 73c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock getResources().getIntArray(R.array.battery_saver_trigger_values)) { 74c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 75c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock protected String getCaption(Resources res, int value) { 76c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (value > 0 && value < 100) { 77c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_pct, value); 78c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 79c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_never); 80c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 81c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock }; 825845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mAlwaysOnPref.init(this); 83c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref.init(this); 84c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 85c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 86c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 87c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onResume() { 88c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onResume(); 89c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(true); 90c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 91c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 92c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 93c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onPause() { 94c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onPause(); 95c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(false); 96c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 97c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 985845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Runnable mStartMode = new Runnable() { 99c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 1005845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 1015845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock AsyncTask.execute(new Runnable() { 1025845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock @Override 1035845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 1045845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock Log.d(TAG, "Starting LOW_POWER_MODE from settings"); 1055845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock Global.putInt(mContext.getContentResolver(), Global.LOW_POWER_MODE, 1); 1065845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } 1075845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }); 108c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 1095845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }; 110c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 111c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final class SettingsObserver extends ContentObserver { 112c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE); 113c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI 114c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL); 115c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 116c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public SettingsObserver(Handler handler) { 117c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super(handler); 118c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 119c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 120c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 121c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onChange(boolean selfChange, Uri uri) { 122c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_URI.equals(uri)) { 1235845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mAlwaysOnPref.update(mContext); 124c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 125c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) { 1265845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mTriggerPref.update(mContext); 127c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 128c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 129c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 130c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void setListening(boolean listening) { 131c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final ContentResolver cr = getContentResolver(); 132c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (listening) { 133c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_URI, false, this); 134c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this); 135c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } else { 136c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.unregisterContentObserver(this); 137c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 138c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 139c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 140c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock} 141