blob: 77c27fa043c270f3defb448dfc5184e6d4f3e311 [file] [log] [blame]
Michael Wright0087a142013-02-05 16:29:39 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.settings;
18
19import android.content.ContentResolver;
20import android.content.Context;
Michael Wright0087a142013-02-05 16:29:39 -080021import android.database.ContentObserver;
22import android.net.Uri;
23import android.os.AsyncTask;
24import android.os.Handler;
25import android.os.IPowerManager;
26import android.os.PowerManager;
27import android.os.RemoteException;
28import android.os.ServiceManager;
29import android.os.UserHandle;
30import android.provider.Settings;
Michael Wright0087a142013-02-05 16:29:39 -080031import android.widget.ImageView;
32
Jason Monk97b87a92015-06-23 15:04:44 -040033import com.android.internal.logging.MetricsLogger;
34
Michael Wright0087a142013-02-05 16:29:39 -080035import java.util.ArrayList;
36
37public class BrightnessController implements ToggleSlider.Listener {
38 private static final String TAG = "StatusBar.BrightnessController";
John Spurlock6d205262014-06-10 19:26:14 -040039 private static final boolean SHOW_AUTOMATIC_ICON = false;
Michael Wright0087a142013-02-05 16:29:39 -080040
Adrian Roosdaf7d412014-05-13 14:55:09 +020041 /**
42 * {@link android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ} uses the range [-1, 1].
43 * Using this factor, it is converted to [0, BRIGHTNESS_ADJ_RESOLUTION] for the SeekBar.
44 */
Adrian Roos27a2ce22015-06-02 13:44:46 -070045 private static final float BRIGHTNESS_ADJ_RESOLUTION = 2048;
Adrian Roosdaf7d412014-05-13 14:55:09 +020046
Michael Wright0087a142013-02-05 16:29:39 -080047 private final int mMinimumBacklight;
48 private final int mMaximumBacklight;
49
50 private final Context mContext;
51 private final ImageView mIcon;
52 private final ToggleSlider mControl;
53 private final boolean mAutomaticAvailable;
54 private final IPowerManager mPower;
55 private final CurrentUserTracker mUserTracker;
56 private final Handler mHandler;
57 private final BrightnessObserver mBrightnessObserver;
58
59 private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
60 new ArrayList<BrightnessStateChangeCallback>();
61
Adrian Roosdaf7d412014-05-13 14:55:09 +020062 private boolean mAutomatic;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020063 private boolean mListening;
Adrian Roosb7ebbde2014-08-15 20:11:38 +020064 private boolean mExternalChange;
Adrian Roosdaf7d412014-05-13 14:55:09 +020065
Michael Wright0087a142013-02-05 16:29:39 -080066 public interface BrightnessStateChangeCallback {
67 public void onBrightnessLevelChanged();
68 }
69
70 /** ContentObserver to watch brightness **/
71 private class BrightnessObserver extends ContentObserver {
72
73 private final Uri BRIGHTNESS_MODE_URI =
74 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
75 private final Uri BRIGHTNESS_URI =
76 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
Adrian Roosdaf7d412014-05-13 14:55:09 +020077 private final Uri BRIGHTNESS_ADJ_URI =
78 Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ);
Michael Wright0087a142013-02-05 16:29:39 -080079
80 public BrightnessObserver(Handler handler) {
81 super(handler);
82 }
83
84 @Override
85 public void onChange(boolean selfChange) {
86 onChange(selfChange, null);
87 }
88
89 @Override
90 public void onChange(boolean selfChange, Uri uri) {
91 if (selfChange) return;
Adrian Roosb7ebbde2014-08-15 20:11:38 +020092 try {
93 mExternalChange = true;
94 if (BRIGHTNESS_MODE_URI.equals(uri)) {
95 updateMode();
96 updateSlider();
97 } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) {
98 updateSlider();
99 } else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) {
100 updateSlider();
101 } else {
102 updateMode();
103 updateSlider();
104 }
105 for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
106 cb.onBrightnessLevelChanged();
107 }
108 } finally {
109 mExternalChange = false;
Michael Wright0087a142013-02-05 16:29:39 -0800110 }
111 }
112
113 public void startObserving() {
114 final ContentResolver cr = mContext.getContentResolver();
115 cr.unregisterContentObserver(this);
116 cr.registerContentObserver(
117 BRIGHTNESS_MODE_URI,
118 false, this, UserHandle.USER_ALL);
119 cr.registerContentObserver(
120 BRIGHTNESS_URI,
121 false, this, UserHandle.USER_ALL);
Adrian Roosdaf7d412014-05-13 14:55:09 +0200122 cr.registerContentObserver(
123 BRIGHTNESS_ADJ_URI,
124 false, this, UserHandle.USER_ALL);
Michael Wright0087a142013-02-05 16:29:39 -0800125 }
126
127 public void stopObserving() {
128 final ContentResolver cr = mContext.getContentResolver();
129 cr.unregisterContentObserver(this);
130 }
131
132 }
133
134 public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
135 mContext = context;
136 mIcon = icon;
137 mControl = control;
138 mHandler = new Handler();
139 mUserTracker = new CurrentUserTracker(mContext) {
140 @Override
141 public void onUserSwitched(int newUserId) {
142 updateMode();
143 updateSlider();
144 }
145 };
146 mBrightnessObserver = new BrightnessObserver(mHandler);
Michael Wright0087a142013-02-05 16:29:39 -0800147
148 PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
149 mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
150 mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
151
152 mAutomaticAvailable = context.getResources().getBoolean(
153 com.android.internal.R.bool.config_automatic_brightness_available);
154 mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
Michael Wright0087a142013-02-05 16:29:39 -0800155 }
156
157 public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
158 mChangeCallbacks.add(cb);
159 }
160
161 public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
162 return mChangeCallbacks.remove(cb);
163 }
164
165 @Override
166 public void onInit(ToggleSlider control) {
167 // Do nothing
168 }
169
Jorim Jaggif056e352014-05-11 23:09:22 +0200170 public void registerCallbacks() {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200171 if (mListening) {
172 return;
173 }
Alan Viverette5a399492014-07-14 16:19:38 -0700174
Jorim Jaggif056e352014-05-11 23:09:22 +0200175 mBrightnessObserver.startObserving();
176 mUserTracker.startTracking();
177
Alan Viverette5a399492014-07-14 16:19:38 -0700178 // Update the slider and mode before attaching the listener so we don't
179 // receive the onChanged notifications for the initial values.
Jorim Jaggif056e352014-05-11 23:09:22 +0200180 updateMode();
181 updateSlider();
182
183 mControl.setOnChangedListener(this);
Alan Viverette5a399492014-07-14 16:19:38 -0700184 mListening = true;
Jorim Jaggif056e352014-05-11 23:09:22 +0200185 }
186
Michael Wright0087a142013-02-05 16:29:39 -0800187 /** Unregister all call backs, both to and from the controller */
188 public void unregisterCallbacks() {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200189 if (!mListening) {
190 return;
191 }
Alan Viverette5a399492014-07-14 16:19:38 -0700192
Michael Wright0087a142013-02-05 16:29:39 -0800193 mBrightnessObserver.stopObserving();
Michael Wright0087a142013-02-05 16:29:39 -0800194 mUserTracker.stopTracking();
Jorim Jaggif056e352014-05-11 23:09:22 +0200195 mControl.setOnChangedListener(null);
Alan Viverette5a399492014-07-14 16:19:38 -0700196 mListening = false;
Michael Wright0087a142013-02-05 16:29:39 -0800197 }
198
Adrian Roos5fd872e2014-08-12 17:28:58 +0200199 @Override
Jason Monk97b87a92015-06-23 15:04:44 -0400200 public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value,
201 boolean stopTracking) {
Adrian Roosdaf7d412014-05-13 14:55:09 +0200202 updateIcon(mAutomatic);
Adrian Roosb7ebbde2014-08-15 20:11:38 +0200203 if (mExternalChange) return;
204
Adrian Roosdaf7d412014-05-13 14:55:09 +0200205 if (!mAutomatic) {
Michael Wright0087a142013-02-05 16:29:39 -0800206 final int val = value + mMinimumBacklight;
Jason Monk97b87a92015-06-23 15:04:44 -0400207 if (stopTracking) {
208 MetricsLogger.action(mContext, MetricsLogger.ACTION_BRIGHTNESS, val);
209 }
Michael Wright0087a142013-02-05 16:29:39 -0800210 setBrightness(val);
211 if (!tracking) {
212 AsyncTask.execute(new Runnable() {
213 public void run() {
214 Settings.System.putIntForUser(mContext.getContentResolver(),
215 Settings.System.SCREEN_BRIGHTNESS, val,
216 UserHandle.USER_CURRENT);
217 }
218 });
219 }
Adrian Roosdaf7d412014-05-13 14:55:09 +0200220 } else {
221 final float adj = value / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1;
Jason Monk97b87a92015-06-23 15:04:44 -0400222 if (stopTracking) {
223 MetricsLogger.action(mContext, MetricsLogger.ACTION_BRIGHTNESS_AUTO, value);
224 }
Adrian Roos6e2d4652014-05-14 20:01:43 +0200225 setBrightnessAdj(adj);
Adrian Roosdaf7d412014-05-13 14:55:09 +0200226 if (!tracking) {
227 AsyncTask.execute(new Runnable() {
228 public void run() {
229 Settings.System.putFloatForUser(mContext.getContentResolver(),
230 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj,
231 UserHandle.USER_CURRENT);
232 }
233 });
234 }
Michael Wright0087a142013-02-05 16:29:39 -0800235 }
236
237 for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
238 cb.onBrightnessLevelChanged();
239 }
240 }
241
242 private void setMode(int mode) {
243 Settings.System.putIntForUser(mContext.getContentResolver(),
244 Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
245 mUserTracker.getCurrentUserId());
246 }
247
248 private void setBrightness(int brightness) {
249 try {
250 mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
251 } catch (RemoteException ex) {
252 }
253 }
254
Adrian Roos6e2d4652014-05-14 20:01:43 +0200255 private void setBrightnessAdj(float adj) {
Adrian Roosdaf7d412014-05-13 14:55:09 +0200256 try {
257 mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj);
258 } catch (RemoteException ex) {
259 }
260 }
261
Michael Wright0087a142013-02-05 16:29:39 -0800262 private void updateIcon(boolean automatic) {
263 if (mIcon != null) {
John Spurlock6d205262014-06-10 19:26:14 -0400264 mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ?
Michael Wright0087a142013-02-05 16:29:39 -0800265 com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
266 com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
267 }
268 }
269
270 /** Fetch the brightness mode from the system settings and update the icon */
271 private void updateMode() {
272 if (mAutomaticAvailable) {
273 int automatic;
Adrian Roosdaf7d412014-05-13 14:55:09 +0200274 automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
275 Settings.System.SCREEN_BRIGHTNESS_MODE,
276 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
277 UserHandle.USER_CURRENT);
Adrian Roos6e2d4652014-05-14 20:01:43 +0200278 mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
Adrian Roosdaf7d412014-05-13 14:55:09 +0200279 updateIcon(mAutomatic);
Michael Wright0087a142013-02-05 16:29:39 -0800280 } else {
281 mControl.setChecked(false);
282 updateIcon(false /*automatic*/);
283 }
284 }
285
286 /** Fetch the brightness from the system settings and update the slider */
287 private void updateSlider() {
Adrian Roosdaf7d412014-05-13 14:55:09 +0200288 if (mAutomatic) {
289 float value = Settings.System.getFloatForUser(mContext.getContentResolver(),
290 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0,
Michael Wright0087a142013-02-05 16:29:39 -0800291 UserHandle.USER_CURRENT);
Adrian Roosdaf7d412014-05-13 14:55:09 +0200292 mControl.setMax((int) BRIGHTNESS_ADJ_RESOLUTION);
293 mControl.setValue((int) ((value + 1) * BRIGHTNESS_ADJ_RESOLUTION / 2f));
294 } else {
295 int value;
296 value = Settings.System.getIntForUser(mContext.getContentResolver(),
297 Settings.System.SCREEN_BRIGHTNESS, mMaximumBacklight,
298 UserHandle.USER_CURRENT);
299 mControl.setMax(mMaximumBacklight - mMinimumBacklight);
300 mControl.setValue(value - mMinimumBacklight);
Michael Wright0087a142013-02-05 16:29:39 -0800301 }
Michael Wright0087a142013-02-05 16:29:39 -0800302 }
303
304}