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