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