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 1941e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlockimport android.content.BroadcastReceiver; 20c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.ContentResolver; 21c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.Context; 2241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlockimport android.content.Intent; 2341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlockimport android.content.IntentFilter; 24c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.res.Resources; 25c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.database.ContentObserver; 26c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.net.Uri; 27c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.AsyncTask; 28d4a6768880beee8b03642908219377851414121cSalvador Martinezimport android.os.BatteryManager; 29c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.Bundle; 30c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.os.Handler; 3141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlockimport android.os.PowerManager; 32c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.provider.Settings.Global; 33c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.util.Log; 34249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport android.widget.Switch; 35c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 369d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 37c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.R; 38249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport com.android.settings.SettingsActivity; 39c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsPreferenceFragment; 4083f013cfd49a52293d2bb6b00029eb285b9157d6Elliott Hughesimport com.android.settings.Utils; 41af24b6377e63fc3f950b5a3c20737ccce104760eJason Monkimport com.android.settings.dashboard.conditional.BatterySaverCondition; 42af24b6377e63fc3f950b5a3c20737ccce104760eJason Monkimport com.android.settings.dashboard.conditional.ConditionManager; 43c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.notification.SettingPref; 44249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockimport com.android.settings.widget.SwitchBar; 45c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 4639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING; 4739b467482d1bf256a111c757e9b7621c6f523271Jason Monk 48249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlockpublic class BatterySaverSettings extends SettingsPreferenceFragment 49249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock implements SwitchBar.OnSwitchChangeListener { 50c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String TAG = "BatterySaverSettings"; 51249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 52c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final String KEY_TURN_ON_AUTOMATICALLY = "turn_on_automatically"; 53c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private static final long WAIT_FOR_SWITCH_ANIM = 500; 54c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 555845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Handler mHandler = new Handler(); 56c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler); 5741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private final Receiver mReceiver = new Receiver(); 58c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 59c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private Context mContext; 605fe76205b607f193b5925eccfabddc145118b5eaJohn Spurlock private boolean mCreated; 61c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private SettingPref mTriggerPref; 62249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private SwitchBar mSwitchBar; 63249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private Switch mSwitch; 64249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private boolean mValidListener; 6541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private PowerManager mPowerManager; 66c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 67c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 688a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 699d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.FUELGAUGE_BATTERY_SAVER; 708a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 718a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 728a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 73c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onActivityCreated(Bundle savedInstanceState) { 74c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onActivityCreated(savedInstanceState); 7545893e65b65a11abda22ea299f217d22c91228caJohn Spurlock if (mCreated) { 7645893e65b65a11abda22ea299f217d22c91228caJohn Spurlock mSwitchBar.show(); 7745893e65b65a11abda22ea299f217d22c91228caJohn Spurlock return; 7845893e65b65a11abda22ea299f217d22c91228caJohn Spurlock } 795fe76205b607f193b5925eccfabddc145118b5eaJohn Spurlock mCreated = true; 80c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock addPreferencesFromResource(R.xml.battery_saver_settings); 81c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 82c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mContext = getActivity(); 83249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar = ((SettingsActivity) mContext).getSwitchBar(); 84249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitch = mSwitchBar.getSwitch(); 85249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.show(); 86249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 87c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY, 88de159c8d16d94785476000e209daa7b5bd6ab5faDianne Hackborn Global.LOW_POWER_MODE_TRIGGER_LEVEL, 89249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 0, /*default*/ 90c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock getResources().getIntArray(R.array.battery_saver_trigger_values)) { 91c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 92c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock protected String getCaption(Resources res, int value) { 93c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (value > 0 && value < 100) { 9483f013cfd49a52293d2bb6b00029eb285b9157d6Elliott Hughes return res.getString(R.string.battery_saver_turn_on_automatically_pct, 9583f013cfd49a52293d2bb6b00029eb285b9157d6Elliott Hughes Utils.formatPercentage(value)); 96c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 97c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock return res.getString(R.string.battery_saver_turn_on_automatically_never); 98c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 99c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock }; 100c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mTriggerPref.init(this); 10141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock 10241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 103c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 104c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 105c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 106249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock public void onDestroyView() { 107249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock super.onDestroyView(); 108249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.hide(); 109249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 110249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 111249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock @Override 112c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onResume() { 113c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onResume(); 114c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(true); 11541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mReceiver.setListening(true); 116249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (!mValidListener) { 117249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 118249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mValidListener = true; 119249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 120249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock updateSwitch(); 121c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 122c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 123c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 124c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onPause() { 125c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super.onPause(); 126c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock mSettingsObserver.setListening(false); 12741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mReceiver.setListening(false); 128249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 129249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 130249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mValidListener = false; 131249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 132249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 133249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 134249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock @Override 135249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock public void onSwitchChanged(Switch switchView, boolean isChecked) { 13641e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mHandler.removeCallbacks(mStartMode); 137249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (isChecked) { 138249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM); 139249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } else { 14041e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (DEBUG) Log.d(TAG, "Stopping low power mode from settings"); 14141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock trySetPowerSaveMode(false); 14241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 14341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 14441e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock 14541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private void trySetPowerSaveMode(boolean mode) { 14641e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (!mPowerManager.setPowerSaveMode(mode)) { 14741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (DEBUG) Log.d(TAG, "Setting mode failed, fallback to current value"); 14841e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mHandler.post(mUpdateSwitch); 149249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 150af24b6377e63fc3f950b5a3c20737ccce104760eJason Monk // TODO: Remove once broadcast is in place. 151af24b6377e63fc3f950b5a3c20737ccce104760eJason Monk ConditionManager.get(getContext()).getCondition(BatterySaverCondition.class).refreshState(); 152249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 153249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 154249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock private void updateSwitch() { 15541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock final boolean mode = mPowerManager.isPowerSaveMode(); 15641e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (DEBUG) Log.d(TAG, "updateSwitch: isChecked=" + mSwitch.isChecked() + " mode=" + mode); 15741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (mode == mSwitch.isChecked()) return; 158249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock 159249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock // set listener to null so that that code below doesn't trigger onCheckedChanged() 160249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 161249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.removeOnSwitchChangeListener(this); 162249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 16341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mSwitch.setChecked(mode); 164249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock if (mValidListener) { 165249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock mSwitchBar.addOnSwitchChangeListener(this); 166249cf50b19c5b1d9ddce0667fb9d439fcdb6f033John Spurlock } 167c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 168c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 16941e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private final Runnable mUpdateSwitch = new Runnable() { 17041e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock @Override 17141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock public void run() { 17241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock updateSwitch(); 17341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 17441e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock }; 17541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock 1765845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock private final Runnable mStartMode = new Runnable() { 177c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 1785845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 1795845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock AsyncTask.execute(new Runnable() { 1805845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock @Override 1815845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock public void run() { 18241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (DEBUG) Log.d(TAG, "Starting low power mode from settings"); 18341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock trySetPowerSaveMode(true); 1845845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock } 1855845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }); 186c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 1875845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock }; 188c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 18941e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private final class Receiver extends BroadcastReceiver { 190d4a6768880beee8b03642908219377851414121cSalvador Martinez 19141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock private boolean mRegistered; 19241e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock 19341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock @Override 19441e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock public void onReceive(Context context, Intent intent) { 19541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (DEBUG) Log.d(TAG, "Received " + intent.getAction()); 196d4a6768880beee8b03642908219377851414121cSalvador Martinez String action = intent.getAction(); 197d4a6768880beee8b03642908219377851414121cSalvador Martinez if (action.equals(ACTION_POWER_SAVE_MODE_CHANGING)) { 198d4a6768880beee8b03642908219377851414121cSalvador Martinez mHandler.post(mUpdateSwitch); 199d4a6768880beee8b03642908219377851414121cSalvador Martinez } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { 200d4a6768880beee8b03642908219377851414121cSalvador Martinez final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 201d4a6768880beee8b03642908219377851414121cSalvador Martinez // disable BSM switch if phone is plugged in or at 100% while plugged in 202d4a6768880beee8b03642908219377851414121cSalvador Martinez mSwitchBar.setEnabled( 203d4a6768880beee8b03642908219377851414121cSalvador Martinez !(status == BatteryManager.BATTERY_STATUS_CHARGING 204d4a6768880beee8b03642908219377851414121cSalvador Martinez || status == BatteryManager.BATTERY_STATUS_FULL)); 205d4a6768880beee8b03642908219377851414121cSalvador Martinez } 20641e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 20741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock public void setListening(boolean listening) { 20841e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock if (listening && !mRegistered) { 209d4a6768880beee8b03642908219377851414121cSalvador Martinez final IntentFilter ifilter = new IntentFilter(); 210d4a6768880beee8b03642908219377851414121cSalvador Martinez ifilter.addAction(ACTION_POWER_SAVE_MODE_CHANGING); 211d4a6768880beee8b03642908219377851414121cSalvador Martinez ifilter.addAction(Intent.ACTION_BATTERY_CHANGED); 212d4a6768880beee8b03642908219377851414121cSalvador Martinez mContext.registerReceiver(this, ifilter); 21341e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mRegistered = true; 21441e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } else if (!listening && mRegistered) { 21541e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mContext.unregisterReceiver(this); 21641e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock mRegistered = false; 21741e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 21841e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 219d4a6768880beee8b03642908219377851414121cSalvador Martinez 22041e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock } 22141e8351448ccebbc0ffdf1caf811c1074e8ee988John Spurlock 222c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final class SettingsObserver extends ContentObserver { 223c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI 224c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL); 225c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 226c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public SettingsObserver(Handler handler) { 227c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock super(handler); 228c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 229c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 230c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock @Override 231c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void onChange(boolean selfChange, Uri uri) { 232c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) { 2335845d98a8aa0bb75bff6bd30646cdc8867002f99John Spurlock mTriggerPref.update(mContext); 234c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 235c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 236c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock 237c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock public void setListening(boolean listening) { 238c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock final ContentResolver cr = getContentResolver(); 239c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock if (listening) { 240c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this); 241c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } else { 242c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock cr.unregisterContentObserver(this); 243c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 244c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 245c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock } 246c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock} 247