BatterySaverSettings.java revision c7f8e8ce69e80ea495472aade5f8569c6583c5e8
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.os.Message;
28c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.provider.Settings.Global;
29c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.util.Log;
30c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.widget.Switch;
31c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
32c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.R;
33c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsActivity;
34c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.SettingsPreferenceFragment;
35c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.notification.SettingPref;
36c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport com.android.settings.widget.SwitchBar;
37c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
38c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockpublic class BatterySaverSettings extends SettingsPreferenceFragment
39c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        implements SwitchBar.OnSwitchChangeListener {
40c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private static final String TAG = "BatterySaverSettings";
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
44c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private final H mHandler = new H();
45c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private final SettingsObserver mSettingsObserver = new SettingsObserver(mHandler);
46c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
47c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private Context mContext;
48c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private SwitchBar mSwitchBar;
49c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private boolean mSwitchBarListenerAdded;
50c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private SettingPref mTriggerPref;
51c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
52c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    @Override
53c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    public void onActivityCreated(Bundle savedInstanceState) {
54c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        super.onActivityCreated(savedInstanceState);
55c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
56c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        addPreferencesFromResource(R.xml.battery_saver_settings);
57c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
58c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mContext = getActivity();
59c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
60c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        updateSwitchBar();
61c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY,
62c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0,
63c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                getResources().getIntArray(R.array.battery_saver_trigger_values)) {
64c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            @Override
65c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            protected String getCaption(Resources res, int value) {
66c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                if (value > 0 && value < 100) {
67c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                    return res.getString(R.string.battery_saver_turn_on_automatically_pct, value);
68c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                }
69c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                return res.getString(R.string.battery_saver_turn_on_automatically_never);
70c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
71c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        };
72c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mTriggerPref.init(this);
73c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
74c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
75c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private void updateSwitchBar() {
76c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        final boolean mode = Global.getInt(getContentResolver(), Global.LOW_POWER_MODE, 0) != 0;
77c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        if (mSwitchBarListenerAdded) {
78c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            mSwitchBar.removeOnSwitchChangeListener(this);
79c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
80c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBar.getSwitch().setChecked(mode);
81c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        if (mSwitchBarListenerAdded) {
82c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            mSwitchBar.addOnSwitchChangeListener(this);
83c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
84c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
85c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
86c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private void updateTriggerLevel() {
87c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mTriggerPref.update(mContext);
88c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
89c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
90c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    @Override
91c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    public void onResume() {
92c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        super.onResume();
93c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        updateSwitchBar();
94c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSettingsObserver.setListening(true);
95c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBar.show();
96c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBar.addOnSwitchChangeListener(this);
97c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBarListenerAdded = true;
98c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
99c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
100c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    @Override
101c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    public void onPause() {
102c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        super.onPause();
103c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSettingsObserver.setListening(false);
104c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        if (mSwitchBarListenerAdded) {
105c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            mSwitchBar.removeOnSwitchChangeListener(this);
106c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
107c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mSwitchBar.hide();
108c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
109c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
110c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    @Override
111c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    public void onSwitchChanged(Switch switchView, boolean isChecked) {
112c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        mHandler.postSetMode(isChecked);
113c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
114c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
115c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private void handleSetMode(final boolean mode) {
116c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        AsyncTask.execute(new Runnable() {
117c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            @Override
118c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            public void run() {
119c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                Log.d(TAG, "LOW_POWER_MODE from settings: " + mode);
120c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                Global.putInt(getContentResolver(), Global.LOW_POWER_MODE, mode ? 1 : 0);
121c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
122c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        });
123c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
124c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
125c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private final class H extends Handler {
126c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        private static final int SET_MODE = 1;
127c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
128c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        public void postSetMode(boolean mode) {
129c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            removeMessages(SET_MODE);
130c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            final Message m = obtainMessage(SET_MODE, mode ? 1 : 0, 0);
131c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            sendMessageDelayed(m, mode ? WAIT_FOR_SWITCH_ANIM : 0);
132c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
133c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
134c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        @Override
135c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        public void handleMessage(Message msg) {
136c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            if (msg.what == SET_MODE) {
137c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                handleSetMode(msg.arg1 != 0);
138c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
139c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
140c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
141c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
142c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    private final class SettingsObserver extends ContentObserver {
143c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        private final Uri LOW_POWER_MODE_URI = Global.getUriFor(Global.LOW_POWER_MODE);
144c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI
145c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                = Global.getUriFor(Global.LOW_POWER_MODE_TRIGGER_LEVEL);
146c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
147c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        public SettingsObserver(Handler handler) {
148c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            super(handler);
149c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
150c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
151c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        @Override
152c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        public void onChange(boolean selfChange, Uri uri) {
153c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            if (LOW_POWER_MODE_URI.equals(uri)) {
154c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                updateSwitchBar();
155c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
156c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
157c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                updateTriggerLevel();
158c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
159c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
160c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock
161c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        public void setListening(boolean listening) {
162c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            final ContentResolver cr = getContentResolver();
163c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            if (listening) {
164c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                cr.registerContentObserver(LOW_POWER_MODE_URI, false, this);
165c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this);
166c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            } else {
167c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock                cr.unregisterContentObserver(this);
168c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock            }
169c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock        }
170c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock    }
171c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock}
172