blob: 71e788375d5e6a5167d51975fcd5a2122b1113e9 [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
Fan Zhang106b1c02018-04-24 11:14:06 -070019import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
Fiona Campbelld4eb2952019-11-04 17:19:56 +000020import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinearFloat;
21import static com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat;
Fan Zhang106b1c02018-04-24 11:14:06 -070022
Michael Wrightd8460232018-01-16 18:04:59 +000023import android.animation.ValueAnimator;
Michael Wright0087a142013-02-05 16:29:39 -080024import android.content.ContentResolver;
25import android.content.Context;
Michael Wright0087a142013-02-05 16:29:39 -080026import android.database.ContentObserver;
Michael Wrightd8460232018-01-16 18:04:59 +000027import android.hardware.display.DisplayManager;
Michael Wright0087a142013-02-05 16:29:39 -080028import android.net.Uri;
29import android.os.AsyncTask;
30import android.os.Handler;
Jorim Jaggic6da82f2016-08-02 16:11:25 +020031import android.os.Looper;
32import android.os.Message;
Michael Wright0087a142013-02-05 16:29:39 -080033import android.os.PowerManager;
34import android.os.RemoteException;
35import android.os.ServiceManager;
36import android.os.UserHandle;
yuemingweb2bf7d182018-01-23 16:05:08 +000037import android.os.UserManager;
Michael Wright0087a142013-02-05 16:29:39 -080038import android.provider.Settings;
Santos Cordon3107d292016-09-20 15:50:35 -070039import android.service.vr.IVrManager;
40import android.service.vr.IVrStateCallbacks;
41import android.util.Log;
Fiona Campbelld4eb2952019-11-04 17:19:56 +000042import android.util.MathUtils;
Michael Wright0087a142013-02-05 16:29:39 -080043
Fiona Campbelld4eb2952019-11-04 17:19:56 +000044import com.android.internal.BrightnessSynchronizer;
Jason Monk97b87a92015-06-23 15:04:44 -040045import com.android.internal.logging.MetricsLogger;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010046import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Philip P. Moltmann4e615e62018-08-28 14:57:49 -070047import com.android.settingslib.RestrictedLockUtilsInternal;
Jason Monk9c7844c2017-01-18 15:21:53 -050048import com.android.systemui.Dependency;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000049import com.android.systemui.broadcast.BroadcastDispatcher;
Jason Monk97b87a92015-06-23 15:04:44 -040050
Michael Wright0087a142013-02-05 16:29:39 -080051import java.util.ArrayList;
52
53public class BrightnessController implements ToggleSlider.Listener {
54 private static final String TAG = "StatusBar.BrightnessController";
Michael Wrightd8460232018-01-16 18:04:59 +000055 private static final int SLIDER_ANIMATION_DURATION = 3000;
Adrian Roosdaf7d412014-05-13 14:55:09 +020056
Jorim Jaggic6da82f2016-08-02 16:11:25 +020057 private static final int MSG_UPDATE_SLIDER = 1;
58 private static final int MSG_SET_CHECKED = 2;
59 private static final int MSG_ATTACH_LISTENER = 3;
60 private static final int MSG_DETACH_LISTENER = 4;
Santos Cordon3107d292016-09-20 15:50:35 -070061 private static final int MSG_VR_MODE_CHANGED = 5;
Jorim Jaggic6da82f2016-08-02 16:11:25 +020062
Fiona Campbelld4eb2952019-11-04 17:19:56 +000063 private static final Uri BRIGHTNESS_MODE_URI =
64 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
65 private static final Uri BRIGHTNESS_URI =
66 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
67 private static final Uri BRIGHTNESS_FLOAT_URI =
68 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
69 private static final Uri BRIGHTNESS_FOR_VR_FLOAT_URI =
70 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT);
71
72 private final float mMinimumBacklight;
73 private final float mMaximumBacklight;
74 private final float mDefaultBacklight;
75 private final float mMinimumBacklightForVr;
76 private final float mMaximumBacklightForVr;
77 private final float mDefaultBacklightForVr;
Michael Wright0087a142013-02-05 16:29:39 -080078
79 private final Context mContext;
Michael Wright0087a142013-02-05 16:29:39 -080080 private final ToggleSlider mControl;
81 private final boolean mAutomaticAvailable;
Michael Wrightd8460232018-01-16 18:04:59 +000082 private final DisplayManager mDisplayManager;
Michael Wright0087a142013-02-05 16:29:39 -080083 private final CurrentUserTracker mUserTracker;
Santos Cordon3107d292016-09-20 15:50:35 -070084 private final IVrManager mVrManager;
Jorim Jaggic6da82f2016-08-02 16:11:25 +020085
Jason Monk9c7844c2017-01-18 15:21:53 -050086 private final Handler mBackgroundHandler;
Michael Wright0087a142013-02-05 16:29:39 -080087 private final BrightnessObserver mBrightnessObserver;
88
89 private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
90 new ArrayList<BrightnessStateChangeCallback>();
91
Santos Cordon3107d292016-09-20 15:50:35 -070092 private volatile boolean mAutomatic; // Brightness adjusted automatically using ambient light.
93 private volatile boolean mIsVrModeEnabled;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020094 private boolean mListening;
Adrian Roosb7ebbde2014-08-15 20:11:38 +020095 private boolean mExternalChange;
Michael Wrighta72faf92018-01-29 15:17:20 +000096 private boolean mControlValueInitialized;
Michael Wrightd8460232018-01-16 18:04:59 +000097
98 private ValueAnimator mSliderAnimator;
Adrian Roosdaf7d412014-05-13 14:55:09 +020099
Michael Wright0087a142013-02-05 16:29:39 -0800100 public interface BrightnessStateChangeCallback {
101 public void onBrightnessLevelChanged();
102 }
103
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000104 /** ContentObserver to watch brightness */
Michael Wright0087a142013-02-05 16:29:39 -0800105 private class BrightnessObserver extends ContentObserver {
106
Michael Wright0087a142013-02-05 16:29:39 -0800107 public BrightnessObserver(Handler handler) {
108 super(handler);
109 }
110
111 @Override
112 public void onChange(boolean selfChange) {
113 onChange(selfChange, null);
114 }
115
116 @Override
117 public void onChange(boolean selfChange, Uri uri) {
118 if (selfChange) return;
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200119
120 if (BRIGHTNESS_MODE_URI.equals(uri)) {
121 mBackgroundHandler.post(mUpdateModeRunnable);
122 mBackgroundHandler.post(mUpdateSliderRunnable);
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000123 } else if (BRIGHTNESS_FLOAT_URI.equals(uri)) {
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200124 mBackgroundHandler.post(mUpdateSliderRunnable);
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000125 } else if (BRIGHTNESS_FOR_VR_FLOAT_URI.equals(uri)) {
Santos Cordon3107d292016-09-20 15:50:35 -0700126 mBackgroundHandler.post(mUpdateSliderRunnable);
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200127 } else {
128 mBackgroundHandler.post(mUpdateModeRunnable);
129 mBackgroundHandler.post(mUpdateSliderRunnable);
130 }
131 for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
132 cb.onBrightnessLevelChanged();
Michael Wright0087a142013-02-05 16:29:39 -0800133 }
134 }
135
136 public void startObserving() {
137 final ContentResolver cr = mContext.getContentResolver();
138 cr.unregisterContentObserver(this);
139 cr.registerContentObserver(
140 BRIGHTNESS_MODE_URI,
141 false, this, UserHandle.USER_ALL);
142 cr.registerContentObserver(
143 BRIGHTNESS_URI,
144 false, this, UserHandle.USER_ALL);
Adrian Roosdaf7d412014-05-13 14:55:09 +0200145 cr.registerContentObserver(
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000146 BRIGHTNESS_FLOAT_URI,
147 false, this, UserHandle.USER_ALL);
148 cr.registerContentObserver(
149 BRIGHTNESS_FOR_VR_FLOAT_URI,
Santos Cordon3107d292016-09-20 15:50:35 -0700150 false, this, UserHandle.USER_ALL);
Michael Wright0087a142013-02-05 16:29:39 -0800151 }
152
153 public void stopObserving() {
154 final ContentResolver cr = mContext.getContentResolver();
155 cr.unregisterContentObserver(this);
156 }
157
158 }
159
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200160 private final Runnable mStartListeningRunnable = new Runnable() {
161 @Override
162 public void run() {
Lucas Dupinb803a552019-10-03 15:00:03 -0700163 if (mListening) {
164 return;
165 }
166 mListening = true;
167
168 if (mVrManager != null) {
169 try {
170 mVrManager.registerListener(mVrStateCallbacks);
171 mIsVrModeEnabled = mVrManager.getVrModeState();
172 } catch (RemoteException e) {
173 Log.e(TAG, "Failed to register VR mode state listener: ", e);
174 }
175 }
176
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200177 mBrightnessObserver.startObserving();
178 mUserTracker.startTracking();
179
180 // Update the slider and mode before attaching the listener so we don't
181 // receive the onChanged notifications for the initial values.
182 mUpdateModeRunnable.run();
183 mUpdateSliderRunnable.run();
184
185 mHandler.sendEmptyMessage(MSG_ATTACH_LISTENER);
186 }
187 };
188
189 private final Runnable mStopListeningRunnable = new Runnable() {
190 @Override
191 public void run() {
Lucas Dupinb803a552019-10-03 15:00:03 -0700192 if (!mListening) {
193 return;
194 }
195 mListening = false;
196
197 if (mVrManager != null) {
198 try {
199 mVrManager.unregisterListener(mVrStateCallbacks);
200 } catch (RemoteException e) {
201 Log.e(TAG, "Failed to unregister VR mode state listener: ", e);
202 }
203 }
204
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200205 mBrightnessObserver.stopObserving();
206 mUserTracker.stopTracking();
207
208 mHandler.sendEmptyMessage(MSG_DETACH_LISTENER);
209 }
210 };
211
212 /**
213 * Fetch the brightness mode from the system settings and update the icon. Should be called from
214 * background thread.
215 */
216 private final Runnable mUpdateModeRunnable = new Runnable() {
217 @Override
218 public void run() {
219 if (mAutomaticAvailable) {
220 int automatic;
221 automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
222 Settings.System.SCREEN_BRIGHTNESS_MODE,
223 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
224 UserHandle.USER_CURRENT);
225 mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200226 } else {
227 mHandler.obtainMessage(MSG_SET_CHECKED, 0).sendToTarget();
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200228 }
229 }
230 };
231
232 /**
233 * Fetch the brightness from the system settings and update the slider. Should be called from
234 * background thread.
235 */
236 private final Runnable mUpdateSliderRunnable = new Runnable() {
237 @Override
238 public void run() {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000239 final float valFloat;
Michael Wright585ff982018-04-13 18:15:27 +0100240 final boolean inVrMode = mIsVrModeEnabled;
241 if (inVrMode) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000242 valFloat = Settings.System.getFloatForUser(mContext.getContentResolver(),
243 Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT, mDefaultBacklightForVr,
Santos Cordon3107d292016-09-20 15:50:35 -0700244 UserHandle.USER_CURRENT);
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200245 } else {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000246 valFloat = Settings.System.getFloatForUser(mContext.getContentResolver(),
247 Settings.System.SCREEN_BRIGHTNESS_FLOAT, mDefaultBacklight,
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200248 UserHandle.USER_CURRENT);
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200249 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000250 // Value is passed as intbits, since this is what the message takes.
251 final int valueAsIntBits = Float.floatToIntBits(valFloat);
252 mHandler.obtainMessage(MSG_UPDATE_SLIDER, valueAsIntBits,
253 inVrMode ? 1 : 0).sendToTarget();
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200254 }
255 };
256
Santos Cordon3107d292016-09-20 15:50:35 -0700257 private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
258 @Override
259 public void onVrStateChanged(boolean enabled) {
260 mHandler.obtainMessage(MSG_VR_MODE_CHANGED, enabled ? 1 : 0, 0)
261 .sendToTarget();
262 }
263 };
264
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200265 private final Handler mHandler = new Handler() {
266 @Override
267 public void handleMessage(Message msg) {
268 mExternalChange = true;
269 try {
270 switch (msg.what) {
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200271 case MSG_UPDATE_SLIDER:
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000272 updateSlider(Float.intBitsToFloat(msg.arg1), msg.arg2 != 0);
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200273 break;
274 case MSG_SET_CHECKED:
275 mControl.setChecked(msg.arg1 != 0);
276 break;
277 case MSG_ATTACH_LISTENER:
278 mControl.setOnChangedListener(BrightnessController.this);
279 break;
280 case MSG_DETACH_LISTENER:
281 mControl.setOnChangedListener(null);
Jorim Jaggi4adee262016-09-21 14:49:46 -0700282 break;
Santos Cordon3107d292016-09-20 15:50:35 -0700283 case MSG_VR_MODE_CHANGED:
284 updateVrMode(msg.arg1 != 0);
285 break;
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200286 default:
287 super.handleMessage(msg);
288 }
289 } finally {
290 mExternalChange = false;
291 }
292 }
293 };
294
Fabian Kozynski5ca7a512019-10-16 19:56:11 +0000295 public BrightnessController(Context context, ToggleSlider control,
296 BroadcastDispatcher broadcastDispatcher) {
Michael Wright0087a142013-02-05 16:29:39 -0800297 mContext = context;
Michael Wright0087a142013-02-05 16:29:39 -0800298 mControl = control;
Fan Zhang106b1c02018-04-24 11:14:06 -0700299 mControl.setMax(GAMMA_SPACE_MAX);
Jason Monk9c7844c2017-01-18 15:21:53 -0500300 mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
Fabian Kozynski5ca7a512019-10-16 19:56:11 +0000301 mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
Michael Wright0087a142013-02-05 16:29:39 -0800302 @Override
303 public void onUserSwitched(int newUserId) {
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200304 mBackgroundHandler.post(mUpdateModeRunnable);
305 mBackgroundHandler.post(mUpdateSliderRunnable);
Michael Wright0087a142013-02-05 16:29:39 -0800306 }
307 };
308 mBrightnessObserver = new BrightnessObserver(mHandler);
Michael Wright0087a142013-02-05 16:29:39 -0800309
Michael Wright585ff982018-04-13 18:15:27 +0100310 PowerManager pm = context.getSystemService(PowerManager.class);
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000311 mMinimumBacklight = pm.getBrightnessConstraint(
312 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
313 mMaximumBacklight = pm.getBrightnessConstraint(
314 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);
315 mDefaultBacklight = pm.getBrightnessConstraint(
316 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT);
317 mMinimumBacklightForVr = pm.getBrightnessConstraint(
318 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR);
319 mMaximumBacklightForVr = pm.getBrightnessConstraint(
320 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR);
321 mDefaultBacklightForVr = pm.getBrightnessConstraint(
322 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR);
323
Michael Wright0087a142013-02-05 16:29:39 -0800324
325 mAutomaticAvailable = context.getResources().getBoolean(
326 com.android.internal.R.bool.config_automatic_brightness_available);
Michael Wrightd8460232018-01-16 18:04:59 +0000327 mDisplayManager = context.getSystemService(DisplayManager.class);
Craig Donner8deb67c2017-02-07 18:10:32 -0800328 mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
329 Context.VR_SERVICE));
Michael Wright0087a142013-02-05 16:29:39 -0800330 }
331
332 public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
333 mChangeCallbacks.add(cb);
334 }
335
336 public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
337 return mChangeCallbacks.remove(cb);
338 }
339
340 @Override
341 public void onInit(ToggleSlider control) {
342 // Do nothing
343 }
344
Jorim Jaggif056e352014-05-11 23:09:22 +0200345 public void registerCallbacks() {
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200346 mBackgroundHandler.post(mStartListeningRunnable);
Jorim Jaggif056e352014-05-11 23:09:22 +0200347 }
348
Michael Wright0087a142013-02-05 16:29:39 -0800349 /** Unregister all call backs, both to and from the controller */
350 public void unregisterCallbacks() {
Jorim Jaggic6da82f2016-08-02 16:11:25 +0200351 mBackgroundHandler.post(mStopListeningRunnable);
Michael Wrighta72faf92018-01-29 15:17:20 +0000352 mControlValueInitialized = false;
Michael Wright0087a142013-02-05 16:29:39 -0800353 }
354
Adrian Roos5fd872e2014-08-12 17:28:58 +0200355 @Override
Muyuan Li3b0f8922016-04-18 19:27:29 -0700356 public void onChanged(ToggleSlider toggleSlider, boolean tracking, boolean automatic,
357 int value, boolean stopTracking) {
Adrian Roosb7ebbde2014-08-15 20:11:38 +0200358 if (mExternalChange) return;
359
Michael Wrightd8460232018-01-16 18:04:59 +0000360 if (mSliderAnimator != null) {
361 mSliderAnimator.cancel();
362 }
363
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000364 final float minBacklight;
365 final float maxBacklight;
Michael Wright585ff982018-04-13 18:15:27 +0100366 final int metric;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000367 final String settingToChange;
Michael Wright585ff982018-04-13 18:15:27 +0100368
Santos Cordon3107d292016-09-20 15:50:35 -0700369 if (mIsVrModeEnabled) {
Michael Wright585ff982018-04-13 18:15:27 +0100370 metric = MetricsEvent.ACTION_BRIGHTNESS_FOR_VR;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000371 minBacklight = mMinimumBacklightForVr;
372 maxBacklight = mMaximumBacklightForVr;
373 settingToChange = Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT;
Michael Wrightd8460232018-01-16 18:04:59 +0000374 } else {
Michael Wright585ff982018-04-13 18:15:27 +0100375 metric = mAutomatic
376 ? MetricsEvent.ACTION_BRIGHTNESS_AUTO
377 : MetricsEvent.ACTION_BRIGHTNESS;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000378 minBacklight = mMinimumBacklight;
379 maxBacklight = mMaximumBacklight;
380 settingToChange = Settings.System.SCREEN_BRIGHTNESS_FLOAT;
Michael Wright585ff982018-04-13 18:15:27 +0100381 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000382 final float valFloat = MathUtils.min(convertGammaToLinearFloat(value,
383 minBacklight, maxBacklight),
384 1.0f);
Michael Wright585ff982018-04-13 18:15:27 +0100385 if (stopTracking) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000386 // TODO(brightnessfloat): change to use float value instead.
387 MetricsLogger.action(mContext, metric,
388 BrightnessSynchronizer.brightnessFloatToInt(mContext, valFloat));
Michael Wright585ff982018-04-13 18:15:27 +0100389
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000390 }
391 setBrightness(valFloat);
Michael Wright585ff982018-04-13 18:15:27 +0100392 if (!tracking) {
393 AsyncTask.execute(new Runnable() {
394 public void run() {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000395 Settings.System.putFloatForUser(mContext.getContentResolver(),
396 settingToChange, valFloat, UserHandle.USER_CURRENT);
Michael Wright585ff982018-04-13 18:15:27 +0100397 }
398 });
Michael Wright0087a142013-02-05 16:29:39 -0800399 }
400
401 for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
402 cb.onBrightnessLevelChanged();
403 }
404 }
405
yuemingweb2bf7d182018-01-23 16:05:08 +0000406 public void checkRestrictionAndSetEnabled() {
407 mBackgroundHandler.post(new Runnable() {
408 @Override
409 public void run() {
410 ((ToggleSliderView)mControl).setEnforcedAdmin(
Philip P. Moltmann4e615e62018-08-28 14:57:49 -0700411 RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
yuemingweb2bf7d182018-01-23 16:05:08 +0000412 UserManager.DISALLOW_CONFIG_BRIGHTNESS,
413 mUserTracker.getCurrentUserId()));
414 }
415 });
416 }
417
Michael Wright0087a142013-02-05 16:29:39 -0800418 private void setMode(int mode) {
419 Settings.System.putIntForUser(mContext.getContentResolver(),
420 Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
421 mUserTracker.getCurrentUserId());
422 }
423
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000424 private void setBrightness(float brightness) {
Michael Wrightd8460232018-01-16 18:04:59 +0000425 mDisplayManager.setTemporaryBrightness(brightness);
Michael Wright0087a142013-02-05 16:29:39 -0800426 }
427
Santos Cordon3107d292016-09-20 15:50:35 -0700428 private void updateVrMode(boolean isEnabled) {
429 if (mIsVrModeEnabled != isEnabled) {
430 mIsVrModeEnabled = isEnabled;
431 mBackgroundHandler.post(mUpdateSliderRunnable);
432 }
433 }
Michael Wrightd8460232018-01-16 18:04:59 +0000434
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000435 private void updateSlider(float brightnessValue, boolean inVrMode) {
436 final float min;
437 final float max;
Michael Wright585ff982018-04-13 18:15:27 +0100438 if (inVrMode) {
439 min = mMinimumBacklightForVr;
440 max = mMaximumBacklightForVr;
441 } else {
442 min = mMinimumBacklight;
443 max = mMaximumBacklight;
444 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000445 // convertGammaToLinearFloat returns 0-1
Fiona Campbell3dfe3442020-05-26 13:08:53 +0100446 if (BrightnessSynchronizer.floatEquals(brightnessValue,
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000447 convertGammaToLinearFloat(mControl.getValue(), min, max))) {
Fiona Campbell3dfe3442020-05-26 13:08:53 +0100448 // If the value in the slider is equal to the value on the current brightness
449 // then the slider does not need to animate, since the brightness will not change.
Michael Wright585ff982018-04-13 18:15:27 +0100450 return;
451 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000452 // Returns GAMMA_SPACE_MIN - GAMMA_SPACE_MAX
453 final int sliderVal = convertLinearToGammaFloat(brightnessValue, min, max);
Michael Wright585ff982018-04-13 18:15:27 +0100454 animateSliderTo(sliderVal);
455 }
456
Michael Wrightd8460232018-01-16 18:04:59 +0000457 private void animateSliderTo(int target) {
Michael Wrighta72faf92018-01-29 15:17:20 +0000458 if (!mControlValueInitialized) {
Fabian Kozynskib9dc0c72018-09-20 13:00:17 -0400459 // Don't animate the first value since its default state isn't meaningful to users.
Michael Wrightd8460232018-01-16 18:04:59 +0000460 mControl.setValue(target);
Michael Wrighta72faf92018-01-29 15:17:20 +0000461 mControlValueInitialized = true;
Michael Wrightd8460232018-01-16 18:04:59 +0000462 }
463 if (mSliderAnimator != null && mSliderAnimator.isStarted()) {
464 mSliderAnimator.cancel();
465 }
466 mSliderAnimator = ValueAnimator.ofInt(mControl.getValue(), target);
467 mSliderAnimator.addUpdateListener((ValueAnimator animation) -> {
468 mExternalChange = true;
Fabian Kozynskib9dc0c72018-09-20 13:00:17 -0400469 mControl.setValue((int) animation.getAnimatedValue());
Michael Wrightd8460232018-01-16 18:04:59 +0000470 mExternalChange = false;
471 });
Fabian Kozynskib9dc0c72018-09-20 13:00:17 -0400472 final long animationDuration = SLIDER_ANIMATION_DURATION * Math.abs(
473 mControl.getValue() - target) / GAMMA_SPACE_MAX;
474 mSliderAnimator.setDuration(animationDuration);
Michael Wrightd8460232018-01-16 18:04:59 +0000475 mSliderAnimator.start();
476 }
Michael Wright585ff982018-04-13 18:15:27 +0100477
Michael Wright0087a142013-02-05 16:29:39 -0800478}