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