blob: 9411c56294576a7db44cf6671acff7daf2ba52a5 [file] [log] [blame]
Jeff Brown96307042012-07-27 15:51:34 -07001/*
2 * Copyright (C) 2012 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
Jeff Brown131206b2014-04-08 17:27:14 -070017package com.android.server.display;
Jeff Brown96307042012-07-27 15:51:34 -070018
Jeff Brown96307042012-07-27 15:51:34 -070019import android.animation.Animator;
20import android.animation.ObjectAnimator;
Michael Wright144aac92017-12-21 18:37:41 +000021import android.annotation.Nullable;
22import android.annotation.UserIdInt;
Dan Gittiked958e92018-11-13 14:58:20 +000023import android.app.ActivityManager;
Jeff Brown96307042012-07-27 15:51:34 -070024import android.content.Context;
Michael Wright144aac92017-12-21 18:37:41 +000025import android.content.pm.ParceledListSlice;
Jeff Brown96307042012-07-27 15:51:34 -070026import android.content.res.Resources;
Michael Wrightd8460232018-01-16 18:04:59 +000027import android.database.ContentObserver;
Jeff Brown96307042012-07-27 15:51:34 -070028import android.hardware.Sensor;
29import android.hardware.SensorEvent;
30import android.hardware.SensorEventListener;
31import android.hardware.SensorManager;
Peeyush Agarwalcc155dd2018-01-10 11:51:33 +000032import android.hardware.display.AmbientBrightnessDayStats;
Michael Wright144aac92017-12-21 18:37:41 +000033import android.hardware.display.BrightnessChangeEvent;
Michael Wrighteef0e132017-11-21 17:57:52 +000034import android.hardware.display.BrightnessConfiguration;
Jeff Brown131206b2014-04-08 17:27:14 -070035import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
36import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
Michael Wright188bbbf2019-02-05 22:12:17 +000037import android.metrics.LogMaker;
Michael Wrightd8460232018-01-16 18:04:59 +000038import android.net.Uri;
Jeff Brown96307042012-07-27 15:51:34 -070039import android.os.Handler;
40import android.os.Looper;
41import android.os.Message;
Jeff Brown330560f2012-08-21 22:10:57 -070042import android.os.PowerManager;
Jeff Brown131206b2014-04-08 17:27:14 -070043import android.os.RemoteException;
Jeff Brown96307042012-07-27 15:51:34 -070044import android.os.SystemClock;
Simon MacMullen5ae7df12020-03-30 17:59:20 +010045import android.os.SystemProperties;
Jeff Brown3edf5272014-08-14 19:25:14 -070046import android.os.Trace;
Michael Wrightd8460232018-01-16 18:04:59 +000047import android.os.UserHandle;
48import android.provider.Settings;
Michael Wrighte02db662019-03-08 21:24:36 +000049import android.text.TextUtils;
Michael Wright41a5cdf2013-11-13 16:18:32 -080050import android.util.MathUtils;
Jeff Brown96307042012-07-27 15:51:34 -070051import android.util.Slog;
52import android.util.TimeUtils;
Jeff Brown037c33e2014-04-09 00:31:55 -070053import android.view.Display;
Jeff Brown96307042012-07-27 15:51:34 -070054
Fiona Campbelld4eb2952019-11-04 17:19:56 +000055import com.android.internal.BrightnessSynchronizer;
Dan Gittiked958e92018-11-13 14:58:20 +000056import com.android.internal.app.IBatteryStats;
Michael Wright188bbbf2019-02-05 22:12:17 +000057import com.android.internal.logging.MetricsLogger;
58import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Dan Gittiked958e92018-11-13 14:58:20 +000059import com.android.server.LocalServices;
60import com.android.server.am.BatteryStatsService;
Dan Gittik8dbd7e92018-12-03 15:35:53 +000061import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
62import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory;
63import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings;
Dan Gittiked958e92018-11-13 14:58:20 +000064import com.android.server.policy.WindowManagerPolicy;
65
Jeff Brown96307042012-07-27 15:51:34 -070066import java.io.PrintWriter;
Michael Wrighte02db662019-03-08 21:24:36 +000067import java.util.List;
Jeff Brown96307042012-07-27 15:51:34 -070068
69/**
70 * Controls the power state of the display.
71 *
72 * Handles the proximity sensor, light sensor, and animations between states
73 * including the screen off animation.
74 *
75 * This component acts independently of the rest of the power manager service.
76 * In particular, it does not share any state and it only communicates
77 * via asynchronous callbacks to inform the power manager that something has
78 * changed.
79 *
80 * Everything this class does internally is serialized on its handler although
81 * it may be accessed by other threads from the outside.
82 *
83 * Note that the power manager service guarantees that it will hold a suspend
84 * blocker as long as the display is not ready. So most of the work done here
85 * does not need to worry about holding a suspend blocker unless it happens
86 * independently of the display ready signal.
Michael Lentine0839adb2014-07-29 18:47:56 -070087 *
Jeff Brown3ee549c2014-09-22 20:14:39 -070088 * For debugging, you can make the color fade and brightness animations run
Jeff Brown96307042012-07-27 15:51:34 -070089 * slower by changing the "animator duration scale" option in Development Settings.
90 */
Dan Gittik8dbd7e92018-12-03 15:35:53 +000091final class DisplayPowerController implements AutomaticBrightnessController.Callbacks,
92 DisplayWhiteBalanceController.Callbacks {
Jeff Brown96307042012-07-27 15:51:34 -070093 private static final String TAG = "DisplayPowerController";
Jeff Browna576b4d2015-04-23 19:58:06 -070094 private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked";
Jorim Jaggi51304d72017-05-17 17:25:32 +020095 private static final String SCREEN_OFF_BLOCKED_TRACE_NAME = "Screen off blocked";
Jeff Brown96307042012-07-27 15:51:34 -070096
Julius D'souza428aed02016-08-07 19:08:30 -070097 private static final boolean DEBUG = false;
Jeff Brown96307042012-07-27 15:51:34 -070098 private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false;
Jeff Brown96307042012-07-27 15:51:34 -070099
Jeff Brown3ee549c2014-09-22 20:14:39 -0700100 // If true, uses the color fade on animation.
Jeff Brown13c589b2012-08-16 16:20:54 -0700101 // We might want to turn this off if we cannot get a guarantee that the screen
102 // actually turns on and starts showing new content after the call to set the
Jeff Brown5356c7dc2012-08-20 20:17:36 -0700103 // screen state returns. Playing the animation can also be somewhat slow.
Michael Lentine0839adb2014-07-29 18:47:56 -0700104 private static final boolean USE_COLOR_FADE_ON_ANIMATION = false;
Jeff Brown13c589b2012-08-16 16:20:54 -0700105
Jeff Brownb76eebff2012-10-05 22:26:44 -0700106 // The minimum reduction in brightness when dimmed.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000107 private static final float SCREEN_DIM_MINIMUM_REDUCTION_FLOAT = 0.04f;
108 private static final float SCREEN_ANIMATION_RATE_MINIMUM = 0.0f;
Jeff Brownb76eebff2012-10-05 22:26:44 -0700109
Michael Lentine0839adb2014-07-29 18:47:56 -0700110 private static final int COLOR_FADE_ON_ANIMATION_DURATION_MILLIS = 250;
Michael Lentine0c9a62d2014-08-20 09:19:07 -0700111 private static final int COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS = 400;
Jeff Brown96307042012-07-27 15:51:34 -0700112
113 private static final int MSG_UPDATE_POWER_STATE = 1;
114 private static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 2;
Jeff Brown3ee549c2014-09-22 20:14:39 -0700115 private static final int MSG_SCREEN_ON_UNBLOCKED = 3;
Jorim Jaggi51304d72017-05-17 17:25:32 +0200116 private static final int MSG_SCREEN_OFF_UNBLOCKED = 4;
Michael Wrighteef0e132017-11-21 17:57:52 +0000117 private static final int MSG_CONFIGURE_BRIGHTNESS = 5;
Michael Wrightd8460232018-01-16 18:04:59 +0000118 private static final int MSG_SET_TEMPORARY_BRIGHTNESS = 6;
119 private static final int MSG_SET_TEMPORARY_AUTO_BRIGHTNESS_ADJUSTMENT = 7;
Jeff Brown96307042012-07-27 15:51:34 -0700120
121 private static final int PROXIMITY_UNKNOWN = -1;
122 private static final int PROXIMITY_NEGATIVE = 0;
123 private static final int PROXIMITY_POSITIVE = 1;
124
Jeff Brown93cbbb22012-10-04 13:18:36 -0700125 // Proximity sensor debounce delay in milliseconds for positive or negative transitions.
126 private static final int PROXIMITY_SENSOR_POSITIVE_DEBOUNCE_DELAY = 0;
Jeff Brownec083212013-09-11 20:45:25 -0700127 private static final int PROXIMITY_SENSOR_NEGATIVE_DEBOUNCE_DELAY = 250;
Jeff Brown96307042012-07-27 15:51:34 -0700128
129 // Trigger proximity if distance is less than 5 cm.
130 private static final float TYPICAL_PROXIMITY_THRESHOLD = 5.0f;
131
Julius D'souzad5105dd2017-06-02 11:03:53 -0700132 // State machine constants for tracking initial brightness ramp skipping when enabled.
133 private static final int RAMP_STATE_SKIP_NONE = 0;
134 private static final int RAMP_STATE_SKIP_INITIAL = 1;
135 private static final int RAMP_STATE_SKIP_AUTOBRIGHT = 2;
136
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700137 private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0;
138 private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1;
139 private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
Jorim Jaggi51304d72017-05-17 17:25:32 +0200140 private static final int REPORTED_TO_POLICY_SCREEN_TURNING_OFF = 3;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700141
Jeff Brown96307042012-07-27 15:51:34 -0700142 private final Object mLock = new Object();
143
Michael Lentine0839adb2014-07-29 18:47:56 -0700144 private final Context mContext;
145
Jeff Brown96307042012-07-27 15:51:34 -0700146 // Our handler.
147 private final DisplayControllerHandler mHandler;
148
149 // Asynchronous callbacks into the power manager service.
150 // Only invoked from the handler thread while no locks are held.
Jeff Brown131206b2014-04-08 17:27:14 -0700151 private final DisplayPowerCallbacks mCallbacks;
152
153 // Battery stats.
154 private final IBatteryStats mBatteryStats;
Jeff Brown96307042012-07-27 15:51:34 -0700155
Jeff Brown96307042012-07-27 15:51:34 -0700156 // The sensor manager.
157 private final SensorManager mSensorManager;
158
Jeff Brown3ee549c2014-09-22 20:14:39 -0700159 // The window manager policy.
160 private final WindowManagerPolicy mWindowManagerPolicy;
161
Jeff Brown037c33e2014-04-09 00:31:55 -0700162 // The display blanker.
163 private final DisplayBlanker mBlanker;
164
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000165 // The display device.
166 private final DisplayDevice mDisplayDevice;
167
Michael Wrightd8460232018-01-16 18:04:59 +0000168 // Tracker for brightness changes.
169 private final BrightnessTracker mBrightnessTracker;
170
171 // Tracker for brightness settings changes.
172 private final SettingsObserver mSettingsObserver;
173
Jeff Brown96307042012-07-27 15:51:34 -0700174 // The proximity sensor, or null if not available or needed.
175 private Sensor mProximitySensor;
176
Jeff Brown26875502014-01-30 21:47:47 -0800177 // The doze screen brightness.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000178 private final float mScreenBrightnessDozeConfig;
Jeff Brown26875502014-01-30 21:47:47 -0800179
Jeff Brown96307042012-07-27 15:51:34 -0700180 // The dim screen brightness.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000181 private final float mScreenBrightnessDimConfig;
Jeff Brown96307042012-07-27 15:51:34 -0700182
Jeff Brownb76eebff2012-10-05 22:26:44 -0700183 // The minimum allowed brightness.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000184 private final float mScreenBrightnessRangeMinimum;
Jeff Brownb76eebff2012-10-05 22:26:44 -0700185
186 // The maximum allowed brightness.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000187 private final float mScreenBrightnessRangeMaximum;
Jeff Brownb76eebff2012-10-05 22:26:44 -0700188
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000189 private final float mScreenBrightnessDefault;
Michael Wrightd8460232018-01-16 18:04:59 +0000190
Santos Cordonb12c7e12018-04-13 17:10:54 -0700191 // The minimum allowed brightness while in VR.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000192 private final float mScreenBrightnessForVrRangeMinimum;
Santos Cordonb12c7e12018-04-13 17:10:54 -0700193
194 // The maximum allowed brightness while in VR.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000195 private final float mScreenBrightnessForVrRangeMaximum;
Santos Cordonb12c7e12018-04-13 17:10:54 -0700196
Michael Wrightd8460232018-01-16 18:04:59 +0000197 // The default screen brightness for VR.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000198 private final float mScreenBrightnessForVrDefault;
Michael Wrightd8460232018-01-16 18:04:59 +0000199
Jeff Brown330560f2012-08-21 22:10:57 -0700200 // True if auto-brightness should be used.
Jeff Brown96307042012-07-27 15:51:34 -0700201 private boolean mUseSoftwareAutoBrightnessConfig;
Jeff Brown330560f2012-08-21 22:10:57 -0700202
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700203 // True if should use light sensor to automatically determine doze screen brightness.
204 private final boolean mAllowAutoBrightnessWhileDozingConfig;
205
Narayan Kamath38819982017-07-06 18:15:30 +0100206 // Whether or not the color fade on screen on / off is enabled.
207 private final boolean mColorFadeEnabled;
208
Jeff Brown252c2062012-10-08 16:21:01 -0700209 // True if we should fade the screen while turning it off, false if we should play
Jeff Brown3ee549c2014-09-22 20:14:39 -0700210 // a stylish color fade animation instead.
Michael Lentine0839adb2014-07-29 18:47:56 -0700211 private boolean mColorFadeFadesConfig;
Jeff Browna52772f2012-10-04 18:38:09 -0700212
Michael Wrightc3e6af82017-07-25 22:31:03 +0100213 // True if we need to fake a transition to off when coming out of a doze state.
214 // Some display hardware will blank itself when coming out of doze in order to hide
215 // artifacts. For these displays we fake a transition into OFF so that policy can appropriately
216 // blank itself and begin an appropriate power on animation.
217 private boolean mDisplayBlanksAfterDozeConfig;
Michael Wright05e76fe2017-07-20 18:18:33 +0100218
Michael Wright63a40062017-07-26 01:10:59 +0100219 // True if there are only buckets of brightness values when the display is in the doze state,
220 // rather than a full range of values. If this is true, then we'll avoid animating the screen
221 // brightness since it'd likely be multiple jarring brightness transitions instead of just one
222 // to reach the final state.
223 private boolean mBrightnessBucketsInDozeConfig;
224
Jeff Brown96307042012-07-27 15:51:34 -0700225 // The pending power request.
226 // Initially null until the first call to requestPowerState.
227 // Guarded by mLock.
228 private DisplayPowerRequest mPendingRequestLocked;
229
230 // True if a request has been made to wait for the proximity sensor to go negative.
231 // Guarded by mLock.
232 private boolean mPendingWaitForNegativeProximityLocked;
233
234 // True if the pending power request or wait for negative proximity flag
235 // has been changed since the last update occurred.
236 // Guarded by mLock.
237 private boolean mPendingRequestChangedLocked;
238
239 // Set to true when the important parts of the pending power request have been applied.
240 // The important parts are mainly the screen state. Brightness changes may occur
241 // concurrently.
242 // Guarded by mLock.
243 private boolean mDisplayReadyLocked;
244
245 // Set to true if a power state update is required.
246 // Guarded by mLock.
247 private boolean mPendingUpdatePowerStateLocked;
248
249 /* The following state must only be accessed by the handler thread. */
250
251 // The currently requested power state.
252 // The power controller will progressively update its internal state to match
253 // the requested power state. Initially null until the first update.
254 private DisplayPowerRequest mPowerRequest;
255
256 // The current power state.
257 // Must only be accessed on the handler thread.
258 private DisplayPowerState mPowerState;
259
260 // True if the device should wait for negative proximity sensor before
261 // waking up the screen. This is set to false as soon as a negative
262 // proximity sensor measurement is observed or when the device is forced to
263 // go to sleep by the user. While true, the screen remains off.
264 private boolean mWaitingForNegativeProximity;
265
266 // The actual proximity sensor threshold value.
267 private float mProximityThreshold;
268
269 // Set to true if the proximity sensor listener has been registered
270 // with the sensor manager.
271 private boolean mProximitySensorEnabled;
272
273 // The debounced proximity sensor state.
274 private int mProximity = PROXIMITY_UNKNOWN;
275
276 // The raw non-debounced proximity sensor state.
277 private int mPendingProximity = PROXIMITY_UNKNOWN;
Jeff Brownec083212013-09-11 20:45:25 -0700278 private long mPendingProximityDebounceTime = -1; // -1 if fully debounced
Jeff Brown96307042012-07-27 15:51:34 -0700279
280 // True if the screen was turned off because of the proximity sensor.
281 // When the screen turns on again, we report user activity to the power manager.
282 private boolean mScreenOffBecauseOfProximity;
283
Jeff Brown3ee549c2014-09-22 20:14:39 -0700284 // The currently active screen on unblocker. This field is non-null whenever
285 // we are waiting for a callback to release it and unblock the screen.
286 private ScreenOnUnblocker mPendingScreenOnUnblocker;
Jorim Jaggi51304d72017-05-17 17:25:32 +0200287 private ScreenOffUnblocker mPendingScreenOffUnblocker;
Jeff Brown3ee549c2014-09-22 20:14:39 -0700288
289 // True if we were in the process of turning off the screen.
290 // This allows us to recover more gracefully from situations where we abort
291 // turning off the screen.
292 private boolean mPendingScreenOff;
Jeff Brown8b9cf1c2012-10-07 14:54:17 -0700293
Jeff Brown0a434772014-09-30 14:42:27 -0700294 // True if we have unfinished business and are holding a suspend blocker.
295 private boolean mUnfinishedBusiness;
296
Jeff Brown8b9cf1c2012-10-07 14:54:17 -0700297 // The elapsed real time when the screen on was blocked.
298 private long mScreenOnBlockStartRealTime;
Jorim Jaggi51304d72017-05-17 17:25:32 +0200299 private long mScreenOffBlockStartRealTime;
Jeff Brown8b9cf1c2012-10-07 14:54:17 -0700300
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700301 // Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields.
302 private int mReportedScreenStateToPolicy;
Jeff Browne1633ad2015-06-22 19:24:24 -0700303
Julius D'souzad5105dd2017-06-02 11:03:53 -0700304 // If the last recorded screen state was dozing or not.
305 private boolean mDozing;
306
Jeff Brown970d4132014-07-19 11:33:47 -0700307 // Remembers whether certain kinds of brightness adjustments
308 // were recently applied so that we can decide how to transition.
309 private boolean mAppliedAutoBrightness;
310 private boolean mAppliedDimming;
311 private boolean mAppliedLowPower;
Michael Wright2155bc22018-05-01 00:38:32 +0100312 private boolean mAppliedScreenBrightnessOverride;
313 private boolean mAppliedTemporaryBrightness;
314 private boolean mAppliedTemporaryAutoBrightnessAdjustment;
315 private boolean mAppliedBrightnessBoost;
Jeff Brown96307042012-07-27 15:51:34 -0700316
Santos Cordon71e482f2019-05-14 16:44:59 +0100317 // Reason for which the brightness was last changed. See {@link BrightnessReason} for more
318 // information.
319 // At the time of this writing, this value is changed within updatePowerState() only, which is
320 // limited to the thread used by DisplayControllerHandler.
321 private BrightnessReason mBrightnessReason = new BrightnessReason();
322 private BrightnessReason mBrightnessReasonTemp = new BrightnessReason();
323
Julius D'souzafeadad12016-08-05 14:34:38 -0700324 // Brightness animation ramp rates in brightness units per second
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000325 private final float mBrightnessRampRateSlow = 0.2352941f;
326 private final float mBrightnessRampRateFast = 0.7058823f;
327
Prashant Malani99e6d432016-03-29 16:32:37 -0700328
Julius D'souzad5105dd2017-06-02 11:03:53 -0700329 // Whether or not to skip the initial brightness ramps into STATE_ON.
330 private final boolean mSkipScreenOnBrightnessRamp;
331
Dan Gittik8dbd7e92018-12-03 15:35:53 +0000332 // Display white balance components.
333 @Nullable
334 private final DisplayWhiteBalanceSettings mDisplayWhiteBalanceSettings;
335 @Nullable
336 private final DisplayWhiteBalanceController mDisplayWhiteBalanceController;
337
Julius D'souzad5105dd2017-06-02 11:03:53 -0700338 // A record of state for skipping brightness ramps.
339 private int mSkipRampState = RAMP_STATE_SKIP_NONE;
340
341 // The first autobrightness value set when entering RAMP_STATE_SKIP_INITIAL.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000342 private float mInitialAutoBrightness;
Julius D'souzad5105dd2017-06-02 11:03:53 -0700343
Michael Wright639c8be2014-01-17 18:29:12 -0800344 // The controller for the automatic brightness level.
345 private AutomaticBrightnessController mAutomaticBrightnessController;
346
Michael Wright144aac92017-12-21 18:37:41 +0000347 // The mapper between ambient lux, display backlight values, and display brightness.
348 @Nullable
349 private BrightnessMappingStrategy mBrightnessMapper;
350
Michael Wrighteef0e132017-11-21 17:57:52 +0000351 // The current brightness configuration.
Michael Wrightd5df3612018-01-02 12:44:52 +0000352 @Nullable
Michael Wrighteef0e132017-11-21 17:57:52 +0000353 private BrightnessConfiguration mBrightnessConfiguration;
354
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000355 // The last brightness that was set by the user and not temporary. Set to
356 // PowerManager.BRIGHTNESS_INVALID_FLOAT when a brightness has yet to be recorded.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000357 private float mLastUserSetScreenBrightness;
Michael Wrightd8460232018-01-16 18:04:59 +0000358
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000359 // The screen brightness setting has changed but not taken effect yet. If this is different
Michael Wrightd8460232018-01-16 18:04:59 +0000360 // from the current screen brightness setting then this is coming from something other than us
361 // and should be considered a user interaction.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000362 private float mPendingScreenBrightnessSetting;
Michael Wrightd8460232018-01-16 18:04:59 +0000363
364 // The last observed screen brightness setting, either set by us or by the settings app on
365 // behalf of the user.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000366 private float mCurrentScreenBrightnessSetting;
Michael Wrightd8460232018-01-16 18:04:59 +0000367
368 // The temporary screen brightness. Typically set when a user is interacting with the
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000369 // brightness slider but hasn't settled on a choice yet. Set to
370 // PowerManager.BRIGHNTESS_INVALID_FLOAT when there's no temporary brightness set.
371 private float mTemporaryScreenBrightness;
Michael Wrightd8460232018-01-16 18:04:59 +0000372
373 // The current screen brightness while in VR mode.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000374 private float mScreenBrightnessForVr;
Michael Wrightd5df3612018-01-02 12:44:52 +0000375
376 // The last auto brightness adjustment that was set by the user and not temporary. Set to
377 // Float.NaN when an auto-brightness adjustment hasn't been recorded yet.
Michael Wrightd8460232018-01-16 18:04:59 +0000378 private float mAutoBrightnessAdjustment;
379
380 // The pending auto brightness adjustment that will take effect on the next power state update.
381 private float mPendingAutoBrightnessAdjustment;
382
383 // The temporary auto brightness adjustment. Typically set when a user is interacting with the
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000384 // adjustment slider but hasn't settled on a choice yet. Set to
385 // PowerManager.BRIGHTNESS_INVALID_FLOAT when there's no temporary adjustment set.
Michael Wrightd8460232018-01-16 18:04:59 +0000386 private float mTemporaryAutoBrightnessAdjustment;
Michael Wrightd5df3612018-01-02 12:44:52 +0000387
Jeff Brown96307042012-07-27 15:51:34 -0700388 // Animators.
Michael Lentine0839adb2014-07-29 18:47:56 -0700389 private ObjectAnimator mColorFadeOnAnimator;
390 private ObjectAnimator mColorFadeOffAnimator;
Jeff Brown96307042012-07-27 15:51:34 -0700391 private RampAnimator<DisplayPowerState> mScreenBrightnessRampAnimator;
392
Fiona Campbell14a366b2020-04-14 11:54:07 +0100393 // The brightness synchronizer to allow changes in the int brightness value to be reflected in
394 // the float brightness value and vice versa.
395 @Nullable
396 private final BrightnessSynchronizer mBrightnessSynchronizer;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000397
Jeff Brown96307042012-07-27 15:51:34 -0700398 /**
399 * Creates the display power controller.
400 */
Jeff Brown131206b2014-04-08 17:27:14 -0700401 public DisplayPowerController(Context context,
Jeff Brown037c33e2014-04-09 00:31:55 -0700402 DisplayPowerCallbacks callbacks, Handler handler,
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000403 SensorManager sensorManager, DisplayBlanker blanker, DisplayDevice displayDevice) {
Jeff Brown131206b2014-04-08 17:27:14 -0700404 mHandler = new DisplayControllerHandler(handler.getLooper());
Michael Wright144aac92017-12-21 18:37:41 +0000405 mBrightnessTracker = new BrightnessTracker(context, null);
Michael Wrightd8460232018-01-16 18:04:59 +0000406 mSettingsObserver = new SettingsObserver(mHandler);
Jeff Brown96307042012-07-27 15:51:34 -0700407 mCallbacks = callbacks;
Jeff Brown131206b2014-04-08 17:27:14 -0700408 mBatteryStats = BatteryStatsService.getService();
Jeff Brown3b971592013-01-09 18:46:37 -0800409 mSensorManager = sensorManager;
Jeff Brown3ee549c2014-09-22 20:14:39 -0700410 mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
Jeff Brown037c33e2014-04-09 00:31:55 -0700411 mBlanker = blanker;
Michael Lentine0839adb2014-07-29 18:47:56 -0700412 mContext = context;
Fiona Campbell14a366b2020-04-14 11:54:07 +0100413 mBrightnessSynchronizer = new BrightnessSynchronizer(context);
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000414 mDisplayDevice = displayDevice;
Jeff Brown96307042012-07-27 15:51:34 -0700415
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000416 PowerManager pm = context.getSystemService(PowerManager.class);
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000417 DisplayDeviceConfig displayDeviceConfig = mDisplayDevice.getDisplayDeviceConfig();
418
Jeff Brown96307042012-07-27 15:51:34 -0700419 final Resources resources = context.getResources();
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000420
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000421 final float screenBrightnessSettingMinimumFloat = clampAbsoluteBrightness(
422 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM));
Jeff Brownb76eebff2012-10-05 22:26:44 -0700423
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000424 // DOZE AND DIM SETTINGS
425 mScreenBrightnessDozeConfig = clampAbsoluteBrightness(
426 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE));
427 mScreenBrightnessDimConfig = clampAbsoluteBrightness(
428 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM));
Jeff Brown26875502014-01-30 21:47:47 -0800429
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000430 // NORMAL SCREEN SETTINGS
Michael Wright144aac92017-12-21 18:37:41 +0000431 mScreenBrightnessRangeMinimum =
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000432 Math.min(screenBrightnessSettingMinimumFloat, mScreenBrightnessDimConfig);
433 mScreenBrightnessRangeMaximum = clampAbsoluteBrightness(
434 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM));
435 mScreenBrightnessDefault = clampAbsoluteBrightness(
436 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT));
Michael Wright639c8be2014-01-17 18:29:12 -0800437
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000438 // VR SETTINGS
439 mScreenBrightnessForVrDefault = clampAbsoluteBrightness(
440 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR));
441 mScreenBrightnessForVrRangeMaximum = clampAbsoluteBrightness(
442 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR));
443 mScreenBrightnessForVrRangeMinimum = clampAbsoluteBrightness(
444 pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR));
Jeff Brownb76eebff2012-10-05 22:26:44 -0700445
Jeff Brown96307042012-07-27 15:51:34 -0700446 mUseSoftwareAutoBrightnessConfig = resources.getBoolean(
447 com.android.internal.R.bool.config_automatic_brightness_available);
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700448
449 mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean(
450 com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing);
451
Julius D'souzad5105dd2017-06-02 11:03:53 -0700452 mSkipScreenOnBrightnessRamp = resources.getBoolean(
453 com.android.internal.R.bool.config_skipScreenOnBrightnessRamp);
Prashant Malani99e6d432016-03-29 16:32:37 -0700454
Jeff Brown96307042012-07-27 15:51:34 -0700455 if (mUseSoftwareAutoBrightnessConfig) {
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700456 final float dozeScaleFactor = resources.getFraction(
457 com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor,
458 1, 1);
Jeff Brown1a30b552012-08-16 01:31:11 -0700459
Dan Gittiked958e92018-11-13 14:58:20 +0000460 int[] ambientBrighteningThresholds = resources.getIntArray(
461 com.android.internal.R.array.config_ambientBrighteningThresholds);
462 int[] ambientDarkeningThresholds = resources.getIntArray(
463 com.android.internal.R.array.config_ambientDarkeningThresholds);
464 int[] ambientThresholdLevels = resources.getIntArray(
465 com.android.internal.R.array.config_ambientThresholdLevels);
466 HysteresisLevels ambientBrightnessThresholds = new HysteresisLevels(
467 ambientBrighteningThresholds, ambientDarkeningThresholds,
468 ambientThresholdLevels);
469
470 int[] screenBrighteningThresholds = resources.getIntArray(
471 com.android.internal.R.array.config_screenBrighteningThresholds);
472 int[] screenDarkeningThresholds = resources.getIntArray(
473 com.android.internal.R.array.config_screenDarkeningThresholds);
474 int[] screenThresholdLevels = resources.getIntArray(
475 com.android.internal.R.array.config_screenThresholdLevels);
476 HysteresisLevels screenBrightnessThresholds = new HysteresisLevels(
477 screenBrighteningThresholds, screenDarkeningThresholds, screenThresholdLevels);
Michael Wrighteef0e132017-11-21 17:57:52 +0000478
479 long brighteningLightDebounce = resources.getInteger(
480 com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce);
481 long darkeningLightDebounce = resources.getInteger(
482 com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce);
483 boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean(
484 com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp);
Michael Wrighteef0e132017-11-21 17:57:52 +0000485
486 int lightSensorWarmUpTimeConfig = resources.getInteger(
487 com.android.internal.R.integer.config_lightSensorWarmupTime);
488 int lightSensorRate = resources.getInteger(
489 com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
490 int initialLightSensorRate = resources.getInteger(
491 com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate);
492 if (initialLightSensorRate == -1) {
493 initialLightSensorRate = lightSensorRate;
494 } else if (initialLightSensorRate > lightSensorRate) {
495 Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate ("
496 + initialLightSensorRate + ") to be less than or equal to "
497 + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ").");
498 }
499
Michael Wrighte02db662019-03-08 21:24:36 +0000500 String lightSensorType = resources.getString(
501 com.android.internal.R.string.config_displayLightSensorType);
502 Sensor lightSensor = findDisplayLightSensor(lightSensorType);
503
Michael Wright144aac92017-12-21 18:37:41 +0000504 mBrightnessMapper = BrightnessMappingStrategy.create(resources);
505 if (mBrightnessMapper != null) {
Jeff Brown131206b2014-04-08 17:27:14 -0700506 mAutomaticBrightnessController = new AutomaticBrightnessController(this,
Michael Wrighte02db662019-03-08 21:24:36 +0000507 handler.getLooper(), sensorManager, lightSensor, mBrightnessMapper,
Michael Wright144aac92017-12-21 18:37:41 +0000508 lightSensorWarmUpTimeConfig, mScreenBrightnessRangeMinimum,
509 mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
510 initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
Dan Gittiked958e92018-11-13 14:58:20 +0000511 autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds,
Fiona Campbell172fd4a2020-03-13 16:34:30 +0000512 screenBrightnessThresholds, context, displayDeviceConfig);
Michael Wrighteef0e132017-11-21 17:57:52 +0000513 } else {
514 mUseSoftwareAutoBrightnessConfig = false;
Jeff Brown96307042012-07-27 15:51:34 -0700515 }
Jeff Brown96307042012-07-27 15:51:34 -0700516 }
517
Narayan Kamath38819982017-07-06 18:15:30 +0100518 mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
Michael Lentine0839adb2014-07-29 18:47:56 -0700519 mColorFadeFadesConfig = resources.getBoolean(
Jeff Browna52772f2012-10-04 18:38:09 -0700520 com.android.internal.R.bool.config_animateScreenLights);
521
Michael Wrightc3e6af82017-07-25 22:31:03 +0100522 mDisplayBlanksAfterDozeConfig = resources.getBoolean(
523 com.android.internal.R.bool.config_displayBlanksAfterDoze);
Michael Wright05e76fe2017-07-20 18:18:33 +0100524
Michael Wright63a40062017-07-26 01:10:59 +0100525 mBrightnessBucketsInDozeConfig = resources.getBoolean(
526 com.android.internal.R.bool.config_displayBrightnessBucketsInDoze);
527
Jeff Brown96307042012-07-27 15:51:34 -0700528 if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
529 mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
530 if (mProximitySensor != null) {
531 mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(),
532 TYPICAL_PROXIMITY_THRESHOLD);
533 }
534 }
Michael Wrightd8460232018-01-16 18:04:59 +0000535 mCurrentScreenBrightnessSetting = getScreenBrightnessSetting();
536 mScreenBrightnessForVr = getScreenBrightnessForVrSetting();
537 mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000538 mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
539 mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
540 mTemporaryAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
541 mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
Dan Gittik8dbd7e92018-12-03 15:35:53 +0000542
543 DisplayWhiteBalanceSettings displayWhiteBalanceSettings = null;
544 DisplayWhiteBalanceController displayWhiteBalanceController = null;
545 try {
546 displayWhiteBalanceSettings = new DisplayWhiteBalanceSettings(mContext, mHandler);
547 displayWhiteBalanceController = DisplayWhiteBalanceFactory.create(mHandler,
548 mSensorManager, resources);
549 displayWhiteBalanceSettings.setCallbacks(this);
550 displayWhiteBalanceController.setCallbacks(this);
551 } catch (Exception e) {
552 Slog.e(TAG, "failed to set up display white-balance: " + e);
553 }
554 mDisplayWhiteBalanceSettings = displayWhiteBalanceSettings;
555 mDisplayWhiteBalanceController = displayWhiteBalanceController;
Michael Wrighteef0e132017-11-21 17:57:52 +0000556 }
557
Michael Wrighte02db662019-03-08 21:24:36 +0000558 private Sensor findDisplayLightSensor(String sensorType) {
559 if (!TextUtils.isEmpty(sensorType)) {
560 List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
561 for (int i = 0; i < sensors.size(); i++) {
562 Sensor sensor = sensors.get(i);
563 if (sensorType.equals(sensor.getStringType())) {
564 return sensor;
565 }
566 }
567 }
568 return mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
569 }
570
Jeff Brown96307042012-07-27 15:51:34 -0700571 /**
572 * Returns true if the proximity sensor screen-off function is available.
573 */
574 public boolean isProximitySensorAvailable() {
575 return mProximitySensor != null;
576 }
577
578 /**
Michael Wright144aac92017-12-21 18:37:41 +0000579 * Get the {@link BrightnessChangeEvent}s for the specified user.
580 * @param userId userId to fetch data for
581 * @param includePackage if false will null out the package name in events
582 */
583 public ParceledListSlice<BrightnessChangeEvent> getBrightnessEvents(
584 @UserIdInt int userId, boolean includePackage) {
585 return mBrightnessTracker.getEvents(userId, includePackage);
586 }
587
Peeyush Agarwalcc155dd2018-01-10 11:51:33 +0000588 public void onSwitchUser(@UserIdInt int newUserId) {
Kenny Guyecc978f2018-03-14 17:30:20 +0000589 handleSettingsChange(true /* userSwitch */);
Peeyush Agarwalcc155dd2018-01-10 11:51:33 +0000590 mBrightnessTracker.onSwitchUser(newUserId);
591 }
592
593 public ParceledListSlice<AmbientBrightnessDayStats> getAmbientBrightnessStats(
594 @UserIdInt int userId) {
595 return mBrightnessTracker.getAmbientBrightnessStats(userId);
596 }
597
Michael Wright144aac92017-12-21 18:37:41 +0000598 /**
Peeyush Agarwalcc155dd2018-01-10 11:51:33 +0000599 * Persist the brightness slider events and ambient brightness stats to disk.
Michael Wright144aac92017-12-21 18:37:41 +0000600 */
Peeyush Agarwalcc155dd2018-01-10 11:51:33 +0000601 public void persistBrightnessTrackerState() {
602 mBrightnessTracker.persistBrightnessTrackerState();
Michael Wright144aac92017-12-21 18:37:41 +0000603 }
604
605 /**
Jeff Brown96307042012-07-27 15:51:34 -0700606 * Requests a new power state.
607 * The controller makes a copy of the provided object and then
608 * begins adjusting the power state to match what was requested.
609 *
610 * @param request The requested power state.
611 * @param waitForNegativeProximity If true, issues a request to wait for
612 * negative proximity before turning the screen back on, assuming the screen
613 * was turned off by the proximity sensor.
614 * @return True if display is ready, false if there are important changes that must
615 * be made asynchronously (such as turning the screen on), in which case the caller
Jeff Brown606e4e82014-09-18 15:22:26 -0700616 * should grab a wake lock, watch for {@link DisplayPowerCallbacks#onStateChanged()}
617 * then try the request again later until the state converges.
Jeff Brown96307042012-07-27 15:51:34 -0700618 */
619 public boolean requestPowerState(DisplayPowerRequest request,
620 boolean waitForNegativeProximity) {
621 if (DEBUG) {
622 Slog.d(TAG, "requestPowerState: "
623 + request + ", waitForNegativeProximity=" + waitForNegativeProximity);
624 }
625
626 synchronized (mLock) {
627 boolean changed = false;
628
629 if (waitForNegativeProximity
630 && !mPendingWaitForNegativeProximityLocked) {
631 mPendingWaitForNegativeProximityLocked = true;
632 changed = true;
633 }
634
635 if (mPendingRequestLocked == null) {
636 mPendingRequestLocked = new DisplayPowerRequest(request);
637 changed = true;
638 } else if (!mPendingRequestLocked.equals(request)) {
639 mPendingRequestLocked.copyFrom(request);
640 changed = true;
641 }
642
643 if (changed) {
644 mDisplayReadyLocked = false;
645 }
646
647 if (changed && !mPendingRequestChangedLocked) {
648 mPendingRequestChangedLocked = true;
649 sendUpdatePowerStateLocked();
650 }
651
652 return mDisplayReadyLocked;
653 }
654 }
655
Kenny Guy6d1009f2018-03-14 14:28:23 +0000656 public BrightnessConfiguration getDefaultBrightnessConfiguration() {
Dan Gittik9a338892019-01-30 18:52:37 +0000657 if (mAutomaticBrightnessController == null) {
658 return null;
659 }
Kenny Guy6d1009f2018-03-14 14:28:23 +0000660 return mAutomaticBrightnessController.getDefaultConfig();
661 }
662
Jeff Brown96307042012-07-27 15:51:34 -0700663 private void sendUpdatePowerState() {
664 synchronized (mLock) {
665 sendUpdatePowerStateLocked();
666 }
667 }
668
669 private void sendUpdatePowerStateLocked() {
670 if (!mPendingUpdatePowerStateLocked) {
671 mPendingUpdatePowerStateLocked = true;
672 Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE);
Jeff Brown96307042012-07-27 15:51:34 -0700673 mHandler.sendMessage(msg);
674 }
675 }
676
677 private void initialize() {
Jeff Brown037c33e2014-04-09 00:31:55 -0700678 // Initialize the power state object for the default display.
679 // In the future, we might manage multiple displays independently.
680 mPowerState = new DisplayPowerState(mBlanker,
Narayan Kamath38819982017-07-06 18:15:30 +0100681 mColorFadeEnabled ? new ColorFade(Display.DEFAULT_DISPLAY) : null);
Jeff Brown96307042012-07-27 15:51:34 -0700682
Narayan Kamath38819982017-07-06 18:15:30 +0100683 if (mColorFadeEnabled) {
684 mColorFadeOnAnimator = ObjectAnimator.ofFloat(
685 mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
686 mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
687 mColorFadeOnAnimator.addListener(mAnimatorListener);
Jeff Brown96307042012-07-27 15:51:34 -0700688
Narayan Kamath38819982017-07-06 18:15:30 +0100689 mColorFadeOffAnimator = ObjectAnimator.ofFloat(
690 mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
691 mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
692 mColorFadeOffAnimator.addListener(mAnimatorListener);
693 }
Jeff Brown96307042012-07-27 15:51:34 -0700694
695 mScreenBrightnessRampAnimator = new RampAnimator<DisplayPowerState>(
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000696 mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS_FLOAT);
Jeff Brown42558692014-05-20 22:02:46 -0700697 mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener);
Dianne Hackborn3d658bf2014-02-05 13:38:56 -0800698
Jeff Brown131206b2014-04-08 17:27:14 -0700699 // Initialize screen state for battery stats.
700 try {
Jeff Browne95c3cd2014-05-02 16:59:26 -0700701 mBatteryStats.noteScreenState(mPowerState.getScreenState());
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000702 mBatteryStats.noteScreenBrightness(BrightnessSynchronizer.brightnessFloatToInt(mContext,
703 mPowerState.getScreenBrightness()));
Jeff Brown131206b2014-04-08 17:27:14 -0700704 } catch (RemoteException ex) {
705 // same process
Dianne Hackborn3d658bf2014-02-05 13:38:56 -0800706 }
Michael Wright144aac92017-12-21 18:37:41 +0000707 // Initialize all of the brightness tracking state
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000708 final float brightness = convertToNits(BrightnessSynchronizer.brightnessFloatToInt(mContext,
709 mPowerState.getScreenBrightness()));
Michael Wright144aac92017-12-21 18:37:41 +0000710 if (brightness >= 0.0f) {
711 mBrightnessTracker.start(brightness);
712 }
Michael Wrightd8460232018-01-16 18:04:59 +0000713 mContext.getContentResolver().registerContentObserver(
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000714 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FLOAT),
Michael Wrightd8460232018-01-16 18:04:59 +0000715 false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL);
716 mContext.getContentResolver().registerContentObserver(
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000717 Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT),
Santos Cordonb12c7e12018-04-13 17:10:54 -0700718 false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL);
719 mContext.getContentResolver().registerContentObserver(
Michael Wrightd8460232018-01-16 18:04:59 +0000720 Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
721 false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL);
Jeff Brown96307042012-07-27 15:51:34 -0700722 }
723
724 private final Animator.AnimatorListener mAnimatorListener = new Animator.AnimatorListener() {
725 @Override
726 public void onAnimationStart(Animator animation) {
727 }
728 @Override
729 public void onAnimationEnd(Animator animation) {
730 sendUpdatePowerState();
731 }
732 @Override
733 public void onAnimationRepeat(Animator animation) {
734 }
735 @Override
736 public void onAnimationCancel(Animator animation) {
737 }
738 };
739
Jeff Brown42558692014-05-20 22:02:46 -0700740 private final RampAnimator.Listener mRampAnimatorListener = new RampAnimator.Listener() {
741 @Override
742 public void onAnimationEnd() {
743 sendUpdatePowerState();
744 }
745 };
746
Jeff Brown96307042012-07-27 15:51:34 -0700747 private void updatePowerState() {
748 // Update the power state request.
749 final boolean mustNotify;
Michael Wright188bbbf2019-02-05 22:12:17 +0000750 final int previousPolicy;
Jeff Brown96307042012-07-27 15:51:34 -0700751 boolean mustInitialize = false;
Santos Cordon71e482f2019-05-14 16:44:59 +0100752 int brightnessAdjustmentFlags = 0;
753 mBrightnessReasonTemp.set(null);
Jeff Brown330560f2012-08-21 22:10:57 -0700754
Jeff Brown96307042012-07-27 15:51:34 -0700755 synchronized (mLock) {
756 mPendingUpdatePowerStateLocked = false;
757 if (mPendingRequestLocked == null) {
758 return; // wait until first actual power request
759 }
760
761 if (mPowerRequest == null) {
762 mPowerRequest = new DisplayPowerRequest(mPendingRequestLocked);
763 mWaitingForNegativeProximity = mPendingWaitForNegativeProximityLocked;
Jeff Brown6307a152012-08-20 13:24:23 -0700764 mPendingWaitForNegativeProximityLocked = false;
Jeff Brown96307042012-07-27 15:51:34 -0700765 mPendingRequestChangedLocked = false;
766 mustInitialize = true;
Michael Wright188bbbf2019-02-05 22:12:17 +0000767 // Assume we're on and bright until told otherwise, since that's the state we turn
768 // on in.
769 previousPolicy = DisplayPowerRequest.POLICY_BRIGHT;
Jeff Brown96307042012-07-27 15:51:34 -0700770 } else if (mPendingRequestChangedLocked) {
Michael Wright188bbbf2019-02-05 22:12:17 +0000771 previousPolicy = mPowerRequest.policy;
Jeff Brown96307042012-07-27 15:51:34 -0700772 mPowerRequest.copyFrom(mPendingRequestLocked);
773 mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked;
Jeff Brown6307a152012-08-20 13:24:23 -0700774 mPendingWaitForNegativeProximityLocked = false;
Jeff Brown96307042012-07-27 15:51:34 -0700775 mPendingRequestChangedLocked = false;
776 mDisplayReadyLocked = false;
Michael Wright188bbbf2019-02-05 22:12:17 +0000777 } else {
778 previousPolicy = mPowerRequest.policy;
Jeff Brown96307042012-07-27 15:51:34 -0700779 }
780
781 mustNotify = !mDisplayReadyLocked;
782 }
783
784 // Initialize things the first time the power state is changed.
785 if (mustInitialize) {
786 initialize();
787 }
788
Jeff Brown970d4132014-07-19 11:33:47 -0700789 // Compute the basic display state using the policy.
790 // We might override this below based on other factors.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000791 // Initialise brightness as invalid.
Jeff Brown970d4132014-07-19 11:33:47 -0700792 int state;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000793 float brightnessState = PowerManager.BRIGHTNESS_INVALID_FLOAT;
Jeff Brown2175e9c2014-09-12 16:11:07 -0700794 boolean performScreenOffTransition = false;
Jeff Brown970d4132014-07-19 11:33:47 -0700795 switch (mPowerRequest.policy) {
796 case DisplayPowerRequest.POLICY_OFF:
797 state = Display.STATE_OFF;
Jeff Brown2175e9c2014-09-12 16:11:07 -0700798 performScreenOffTransition = true;
Jeff Brown970d4132014-07-19 11:33:47 -0700799 break;
800 case DisplayPowerRequest.POLICY_DOZE:
801 if (mPowerRequest.dozeScreenState != Display.STATE_UNKNOWN) {
802 state = mPowerRequest.dozeScreenState;
803 } else {
804 state = Display.STATE_DOZE;
805 }
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700806 if (!mAllowAutoBrightnessWhileDozingConfig) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000807 brightnessState = mPowerRequest.dozeScreenBrightness;
Santos Cordon71e482f2019-05-14 16:44:59 +0100808 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE);
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700809 }
Jeff Brown970d4132014-07-19 11:33:47 -0700810 break;
Santos Cordon3107d292016-09-20 15:50:35 -0700811 case DisplayPowerRequest.POLICY_VR:
812 state = Display.STATE_VR;
813 break;
Jeff Brown970d4132014-07-19 11:33:47 -0700814 case DisplayPowerRequest.POLICY_DIM:
815 case DisplayPowerRequest.POLICY_BRIGHT:
816 default:
817 state = Display.STATE_ON;
818 break;
819 }
Jeff Brown2175e9c2014-09-12 16:11:07 -0700820 assert(state != Display.STATE_UNKNOWN);
Jeff Brown970d4132014-07-19 11:33:47 -0700821
Jeff Brown6307a152012-08-20 13:24:23 -0700822 // Apply the proximity sensor.
Jeff Brown96307042012-07-27 15:51:34 -0700823 if (mProximitySensor != null) {
Jeff Brown970d4132014-07-19 11:33:47 -0700824 if (mPowerRequest.useProximitySensor && state != Display.STATE_OFF) {
Jeff Brown6307a152012-08-20 13:24:23 -0700825 setProximitySensorEnabled(true);
826 if (!mScreenOffBecauseOfProximity
827 && mProximity == PROXIMITY_POSITIVE) {
828 mScreenOffBecauseOfProximity = true;
Jeff Brownec083212013-09-11 20:45:25 -0700829 sendOnProximityPositiveWithWakelock();
Jeff Brown6307a152012-08-20 13:24:23 -0700830 }
831 } else if (mWaitingForNegativeProximity
832 && mScreenOffBecauseOfProximity
833 && mProximity == PROXIMITY_POSITIVE
Jeff Brown970d4132014-07-19 11:33:47 -0700834 && state != Display.STATE_OFF) {
Jeff Brown6307a152012-08-20 13:24:23 -0700835 setProximitySensorEnabled(true);
836 } else {
837 setProximitySensorEnabled(false);
838 mWaitingForNegativeProximity = false;
839 }
840 if (mScreenOffBecauseOfProximity
841 && mProximity != PROXIMITY_POSITIVE) {
Jeff Brown96307042012-07-27 15:51:34 -0700842 mScreenOffBecauseOfProximity = false;
Jeff Brownec083212013-09-11 20:45:25 -0700843 sendOnProximityNegativeWithWakelock();
Jeff Brown96307042012-07-27 15:51:34 -0700844 }
Jeff Brown6307a152012-08-20 13:24:23 -0700845 } else {
846 mWaitingForNegativeProximity = false;
Jeff Brown96307042012-07-27 15:51:34 -0700847 }
Jeff Brown970d4132014-07-19 11:33:47 -0700848 if (mScreenOffBecauseOfProximity) {
849 state = Display.STATE_OFF;
Jeff Brown96307042012-07-27 15:51:34 -0700850 }
851
Jeff Brownbf4e4142014-10-02 13:08:05 -0700852 // Animate the screen state change unless already animating.
853 // The transition may be deferred, so after this point we will use the
854 // actual state instead of the desired one.
Santos Cordon3107d292016-09-20 15:50:35 -0700855 final int oldState = mPowerState.getScreenState();
Jeff Brownbf4e4142014-10-02 13:08:05 -0700856 animateScreenStateChange(state, performScreenOffTransition);
857 state = mPowerState.getScreenState();
858
Jeff Brown970d4132014-07-19 11:33:47 -0700859 if (state == Display.STATE_OFF) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000860 brightnessState = PowerManager.BRIGHTNESS_OFF_FLOAT;
Santos Cordon71e482f2019-05-14 16:44:59 +0100861 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_SCREEN_OFF);
Jeff Brown970d4132014-07-19 11:33:47 -0700862 }
863
Michael Wrightd8460232018-01-16 18:04:59 +0000864 // Always use the VR brightness when in the VR state.
865 if (state == Display.STATE_VR) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000866 brightnessState = mScreenBrightnessForVr;
Santos Cordon71e482f2019-05-14 16:44:59 +0100867 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_VR);
Michael Wrightd8460232018-01-16 18:04:59 +0000868 }
869
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000870 if ((Float.isNaN(brightnessState))
871 && isValidBrightnessValue(mPowerRequest.screenBrightnessOverride)) {
872 brightnessState = mPowerRequest.screenBrightnessOverride;
Santos Cordon71e482f2019-05-14 16:44:59 +0100873 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_OVERRIDE);
Michael Wright2155bc22018-05-01 00:38:32 +0100874 mAppliedScreenBrightnessOverride = true;
875 } else {
876 mAppliedScreenBrightnessOverride = false;
Michael Wrightd8460232018-01-16 18:04:59 +0000877 }
Michael Wright144aac92017-12-21 18:37:41 +0000878
879 final boolean autoBrightnessEnabledInDoze =
880 mAllowAutoBrightnessWhileDozingConfig && Display.isDozeState(state);
881 final boolean autoBrightnessEnabled = mPowerRequest.useAutoBrightness
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700882 && (state == Display.STATE_ON || autoBrightnessEnabledInDoze)
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000883 && Float.isNaN(brightnessState)
Michael Wright144aac92017-12-21 18:37:41 +0000884 && mAutomaticBrightnessController != null;
Michael Wright144aac92017-12-21 18:37:41 +0000885
Michael Wrightd8460232018-01-16 18:04:59 +0000886 final boolean userSetBrightnessChanged = updateUserSetScreenBrightness();
Michael Wright144aac92017-12-21 18:37:41 +0000887
Michael Wrightd8460232018-01-16 18:04:59 +0000888 // Use the temporary screen brightness if there isn't an override, either from
889 // WindowManager or based on the display state.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000890 if (isValidBrightnessValue(mTemporaryScreenBrightness)) {
891 brightnessState = mTemporaryScreenBrightness;
Michael Wright2155bc22018-05-01 00:38:32 +0100892 mAppliedTemporaryBrightness = true;
Santos Cordon71e482f2019-05-14 16:44:59 +0100893 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_TEMPORARY);
Michael Wright2155bc22018-05-01 00:38:32 +0100894 } else {
895 mAppliedTemporaryBrightness = false;
Michael Wrightd8460232018-01-16 18:04:59 +0000896 }
897
898 final boolean autoBrightnessAdjustmentChanged = updateAutoBrightnessAdjustment();
899 if (autoBrightnessAdjustmentChanged) {
900 mTemporaryAutoBrightnessAdjustment = Float.NaN;
901 }
902
903 // Use the autobrightness adjustment override if set.
904 final float autoBrightnessAdjustment;
905 if (!Float.isNaN(mTemporaryAutoBrightnessAdjustment)) {
906 autoBrightnessAdjustment = mTemporaryAutoBrightnessAdjustment;
Santos Cordon71e482f2019-05-14 16:44:59 +0100907 brightnessAdjustmentFlags = BrightnessReason.ADJUSTMENT_AUTO_TEMP;
Michael Wright2155bc22018-05-01 00:38:32 +0100908 mAppliedTemporaryAutoBrightnessAdjustment = true;
Michael Wrightd8460232018-01-16 18:04:59 +0000909 } else {
910 autoBrightnessAdjustment = mAutoBrightnessAdjustment;
Santos Cordon71e482f2019-05-14 16:44:59 +0100911 brightnessAdjustmentFlags = BrightnessReason.ADJUSTMENT_AUTO;
Kenny Guy3931a3e2018-05-22 11:41:17 +0100912 mAppliedTemporaryAutoBrightnessAdjustment = false;
Michael Wrightd8460232018-01-16 18:04:59 +0000913 }
Michael Wrightd8460232018-01-16 18:04:59 +0000914 // Apply brightness boost.
915 // We do this here after deciding whether auto-brightness is enabled so that we don't
916 // disable the light sensor during this temporary state. That way when boost ends we will
917 // be able to resume normal auto-brightness behavior without any delay.
918 if (mPowerRequest.boostScreenBrightness
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000919 && brightnessState != PowerManager.BRIGHTNESS_OFF_FLOAT) {
920 brightnessState = PowerManager.BRIGHTNESS_MAX;
Santos Cordon71e482f2019-05-14 16:44:59 +0100921 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_BOOST);
Michael Wright2155bc22018-05-01 00:38:32 +0100922 mAppliedBrightnessBoost = true;
923 } else {
924 mAppliedBrightnessBoost = false;
Michael Wrightd8460232018-01-16 18:04:59 +0000925 }
926
Kenny Guy53d06612018-01-30 14:19:13 +0000927 // If the brightness is already set then it's been overridden by something other than the
Michael Wrightd8460232018-01-16 18:04:59 +0000928 // user, or is a temporary adjustment.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000929 boolean userInitiatedChange = (Float.isNaN(brightnessState))
Michael Wrightd8460232018-01-16 18:04:59 +0000930 && (autoBrightnessAdjustmentChanged || userSetBrightnessChanged);
Kenny Guy53d06612018-01-30 14:19:13 +0000931 boolean hadUserBrightnessPoint = false;
Michael Wright144aac92017-12-21 18:37:41 +0000932 // Configure auto-brightness.
933 if (mAutomaticBrightnessController != null) {
Kenny Guy53d06612018-01-30 14:19:13 +0000934 hadUserBrightnessPoint = mAutomaticBrightnessController.hasUserDataPoints();
Jeff Brown970d4132014-07-19 11:33:47 -0700935 mAutomaticBrightnessController.configure(autoBrightnessEnabled,
Michael Wrightd8460232018-01-16 18:04:59 +0000936 mBrightnessConfiguration,
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000937 mLastUserSetScreenBrightness,
Michael Wright617564f2018-01-25 22:20:54 +0000938 userSetBrightnessChanged, autoBrightnessAdjustment,
939 autoBrightnessAdjustmentChanged, mPowerRequest.policy);
Jeff Brown7b5be5e2014-11-12 18:45:31 -0800940 }
941
Kenny Guyd6fd7d62019-11-13 15:33:19 +0000942 if (mBrightnessTracker != null) {
943 mBrightnessTracker.setBrightnessConfiguration(mBrightnessConfiguration);
944 }
945
Jeff Brown970d4132014-07-19 11:33:47 -0700946 // Apply auto-brightness.
947 boolean slowChange = false;
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000948 if (Float.isNaN(brightnessState)) {
Michael Wright617564f2018-01-25 22:20:54 +0000949 float newAutoBrightnessAdjustment = autoBrightnessAdjustment;
Jeff Brown970d4132014-07-19 11:33:47 -0700950 if (autoBrightnessEnabled) {
Fiona Campbellf972a082020-03-25 18:05:25 +0000951 brightnessState = mAutomaticBrightnessController.getAutomaticScreenBrightness();
Michael Wright617564f2018-01-25 22:20:54 +0000952 newAutoBrightnessAdjustment =
953 mAutomaticBrightnessController.getAutomaticScreenBrightnessAdjustment();
Jeff Brown970d4132014-07-19 11:33:47 -0700954 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000955 if (isValidBrightnessValue(brightnessState)
956 || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT) {
Jeff Brown970d4132014-07-19 11:33:47 -0700957 // Use current auto-brightness value and slowly adjust to changes.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000958 brightnessState = clampScreenBrightness(brightnessState);
Jeff Brown970d4132014-07-19 11:33:47 -0700959 if (mAppliedAutoBrightness && !autoBrightnessAdjustmentChanged) {
960 slowChange = true; // slowly adapt to auto-brightness
961 }
Michael Wrightd8460232018-01-16 18:04:59 +0000962 // Tell the rest of the system about the new brightness. Note that we do this
963 // before applying the low power or dim transformations so that the slider
964 // accurately represents the full possible range, even if they range changes what
965 // it means in absolute terms.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000966 putScreenBrightnessSetting(brightnessState);
Jeff Brown970d4132014-07-19 11:33:47 -0700967 mAppliedAutoBrightness = true;
Santos Cordon71e482f2019-05-14 16:44:59 +0100968 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_AUTOMATIC);
Jeff Brown96307042012-07-27 15:51:34 -0700969 } else {
Jeff Brown970d4132014-07-19 11:33:47 -0700970 mAppliedAutoBrightness = false;
Jeff Brown96307042012-07-27 15:51:34 -0700971 }
Michael Wright617564f2018-01-25 22:20:54 +0000972 if (autoBrightnessAdjustment != newAutoBrightnessAdjustment) {
973 // If the autobrightness controller has decided to change the adjustment value
974 // used, make sure that's reflected in settings.
975 putAutoBrightnessAdjustmentSetting(newAutoBrightnessAdjustment);
Santos Cordon71e482f2019-05-14 16:44:59 +0100976 } else {
977 // Adjustment values resulted in no change
978 brightnessAdjustmentFlags = 0;
Michael Wright617564f2018-01-25 22:20:54 +0000979 }
Jeff Brown96307042012-07-27 15:51:34 -0700980 } else {
Jeff Brown970d4132014-07-19 11:33:47 -0700981 mAppliedAutoBrightness = false;
Santos Cordon71e482f2019-05-14 16:44:59 +0100982 brightnessAdjustmentFlags = 0;
Jeff Brown970d4132014-07-19 11:33:47 -0700983 }
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700984 // Use default brightness when dozing unless overridden.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000985 if ((Float.isNaN(brightnessState))
986 && Display.isDozeState(state)) {
987 brightnessState = mScreenBrightnessDozeConfig;
Santos Cordon71e482f2019-05-14 16:44:59 +0100988 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT);
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -0700989 }
990
Jeff Brown970d4132014-07-19 11:33:47 -0700991 // Apply manual brightness.
Fiona Campbelld4eb2952019-11-04 17:19:56 +0000992 if (Float.isNaN(brightnessState)) {
993 brightnessState = clampScreenBrightness(mCurrentScreenBrightnessSetting);
Santos Cordon71e482f2019-05-14 16:44:59 +0100994 mBrightnessReasonTemp.setReason(BrightnessReason.REASON_MANUAL);
Jeff Brown970d4132014-07-19 11:33:47 -0700995 }
996
997 // Apply dimming by at least some minimum amount when user activity
998 // timeout is about to expire.
999 if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001000 if (brightnessState > mScreenBrightnessRangeMinimum) {
1001 brightnessState = Math.max(Math.min(brightnessState
1002 - SCREEN_DIM_MINIMUM_REDUCTION_FLOAT,
Jeff Brown5c8ea082014-07-24 19:30:31 -07001003 mScreenBrightnessDimConfig), mScreenBrightnessRangeMinimum);
Santos Cordon71e482f2019-05-14 16:44:59 +01001004 mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_DIMMED);
Jeff Brown5c8ea082014-07-24 19:30:31 -07001005 }
Jeff Brown970d4132014-07-19 11:33:47 -07001006 if (!mAppliedDimming) {
1007 slowChange = false;
1008 }
1009 mAppliedDimming = true;
mochangmingf0cb46c2015-12-29 13:55:24 +08001010 } else if (mAppliedDimming) {
1011 slowChange = false;
1012 mAppliedDimming = false;
Jeff Brown970d4132014-07-19 11:33:47 -07001013 }
jackqdyulei92681e82017-02-28 11:26:28 -08001014 // If low power mode is enabled, scale brightness by screenLowPowerBrightnessFactor
Jeff Brown970d4132014-07-19 11:33:47 -07001015 // as long as it is above the minimum threshold.
1016 if (mPowerRequest.lowPowerMode) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001017 if (brightnessState > mScreenBrightnessRangeMinimum) {
jackqdyulei92681e82017-02-28 11:26:28 -08001018 final float brightnessFactor =
1019 Math.min(mPowerRequest.screenLowPowerBrightnessFactor, 1);
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001020 final float lowPowerBrightnessFloat = (brightnessState * brightnessFactor);
1021 brightnessState = Math.max(lowPowerBrightnessFloat,
1022 mScreenBrightnessRangeMinimum);
Santos Cordon71e482f2019-05-14 16:44:59 +01001023 mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_LOW_POWER);
Jeff Brown970d4132014-07-19 11:33:47 -07001024 }
1025 if (!mAppliedLowPower) {
1026 slowChange = false;
1027 }
1028 mAppliedLowPower = true;
mochangmingf0cb46c2015-12-29 13:55:24 +08001029 } else if (mAppliedLowPower) {
1030 slowChange = false;
1031 mAppliedLowPower = false;
Jeff Brown970d4132014-07-19 11:33:47 -07001032 }
1033
Jeff Brown0a434772014-09-30 14:42:27 -07001034 // Animate the screen brightness when the screen is on or dozing.
Santos Cordon3107d292016-09-20 15:50:35 -07001035 // Skip the animation when the screen is off or suspended or transition to/from VR.
Prashant Malani33538242014-11-13 14:04:00 -08001036 if (!mPendingScreenOff) {
Julius D'souzad5105dd2017-06-02 11:03:53 -07001037 if (mSkipScreenOnBrightnessRamp) {
Julius D'souzad5105dd2017-06-02 11:03:53 -07001038 if (state == Display.STATE_ON) {
1039 if (mSkipRampState == RAMP_STATE_SKIP_NONE && mDozing) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001040 mInitialAutoBrightness = brightnessState;
Julius D'souzad5105dd2017-06-02 11:03:53 -07001041 mSkipRampState = RAMP_STATE_SKIP_INITIAL;
1042 } else if (mSkipRampState == RAMP_STATE_SKIP_INITIAL
1043 && mUseSoftwareAutoBrightnessConfig
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001044 && !BrightnessSynchronizer.floatEquals(brightnessState,
1045 mInitialAutoBrightness)) {
Julius D'souzad5105dd2017-06-02 11:03:53 -07001046 mSkipRampState = RAMP_STATE_SKIP_AUTOBRIGHT;
1047 } else if (mSkipRampState == RAMP_STATE_SKIP_AUTOBRIGHT) {
1048 mSkipRampState = RAMP_STATE_SKIP_NONE;
1049 }
1050 } else {
1051 mSkipRampState = RAMP_STATE_SKIP_NONE;
1052 }
1053 }
1054
Michael Wrightb0a1d3d2017-09-22 15:05:02 +01001055 final boolean wasOrWillBeInVr =
1056 (state == Display.STATE_VR || oldState == Display.STATE_VR);
1057 final boolean initialRampSkip =
1058 state == Display.STATE_ON && mSkipRampState != RAMP_STATE_SKIP_NONE;
1059 // While dozing, sometimes the brightness is split into buckets. Rather than animating
1060 // through the buckets, which is unlikely to be smooth in the first place, just jump
1061 // right to the suggested brightness.
1062 final boolean hasBrightnessBuckets =
1063 Display.isDozeState(state) && mBrightnessBucketsInDozeConfig;
1064 // If the color fade is totally covering the screen then we can change the backlight
1065 // level without it being a noticeable jump since any actual content isn't yet visible.
1066 final boolean isDisplayContentVisible =
1067 mColorFadeEnabled && mPowerState.getColorFadeLevel() == 1.0f;
Michael Wright2155bc22018-05-01 00:38:32 +01001068 final boolean brightnessIsTemporary =
1069 mAppliedTemporaryBrightness || mAppliedTemporaryAutoBrightnessAdjustment;
Fiona Campbellc395a292020-04-24 11:55:30 +01001070 // We only want to animate the brightness if it is between 0.0f and 1.0f.
1071 // brightnessState can contain the values -1.0f and NaN, which we do not want to
1072 // animate to. To avoid this, we check the value first.
1073 // If the brightnessState is off (-1.0f) we still want to animate to the minimum
1074 // brightness (0.0f) to accommodate for LED displays, which can appear bright to the
1075 // user even when the display is all black.
1076 float animateValue = brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT
1077 ? PowerManager.BRIGHTNESS_MIN : brightnessState;
1078 if (isValidBrightnessValue(animateValue)) {
1079 if (initialRampSkip || hasBrightnessBuckets
1080 || wasOrWillBeInVr || !isDisplayContentVisible || brightnessIsTemporary) {
1081 animateScreenBrightness(animateValue, SCREEN_ANIMATION_RATE_MINIMUM);
1082 } else {
1083 animateScreenBrightness(animateValue,
1084 slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast);
1085 }
Prashant Malani33538242014-11-13 14:04:00 -08001086 }
Michael Wright144aac92017-12-21 18:37:41 +00001087
Michael Wrightd8460232018-01-16 18:04:59 +00001088 if (!brightnessIsTemporary) {
Kenny Guyb54d40b2019-02-28 12:49:53 +00001089 if (userInitiatedChange && (mAutomaticBrightnessController == null
1090 || !mAutomaticBrightnessController.hasValidAmbientLux())) {
1091 // If we don't have a valid lux reading we can't report a valid
1092 // slider event so notify as if the system changed the brightness.
1093 userInitiatedChange = false;
1094 }
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001095 notifyBrightnessChanged(
1096 BrightnessSynchronizer.brightnessFloatToInt(mContext, brightnessState),
1097 userInitiatedChange, hadUserBrightnessPoint);
Michael Wright144aac92017-12-21 18:37:41 +00001098 }
Michael Wrightd8460232018-01-16 18:04:59 +00001099
Jeff Brown0a434772014-09-30 14:42:27 -07001100 }
1101
Santos Cordon71e482f2019-05-14 16:44:59 +01001102 // Log any changes to what is currently driving the brightness setting.
1103 if (!mBrightnessReasonTemp.equals(mBrightnessReason) || brightnessAdjustmentFlags != 0) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001104 Slog.v(TAG, "Brightness [" + brightnessState + "] reason changing to: '"
Santos Cordon71e482f2019-05-14 16:44:59 +01001105 + mBrightnessReasonTemp.toString(brightnessAdjustmentFlags)
1106 + "', previous reason: '" + mBrightnessReason + "'.");
1107 mBrightnessReason.set(mBrightnessReasonTemp);
1108 }
1109
Dan Gittik8dbd7e92018-12-03 15:35:53 +00001110 // Update display white-balance.
1111 if (mDisplayWhiteBalanceController != null) {
1112 if (state == Display.STATE_ON && mDisplayWhiteBalanceSettings.isEnabled()) {
1113 mDisplayWhiteBalanceController.setEnabled(true);
Dan Gittik1151ac02019-02-13 14:05:37 +00001114 mDisplayWhiteBalanceController.updateDisplayColorTemperature();
Dan Gittik8dbd7e92018-12-03 15:35:53 +00001115 } else {
1116 mDisplayWhiteBalanceController.setEnabled(false);
1117 }
1118 }
1119
Jeff Brown0a434772014-09-30 14:42:27 -07001120 // Determine whether the display is ready for use in the newly requested state.
1121 // Note that we do not wait for the brightness ramp animation to complete before
1122 // reporting the display is ready because we only need to ensure the screen is in the
1123 // right power state even as it continues to converge on the desired brightness.
Narayan Kamath38819982017-07-06 18:15:30 +01001124 final boolean ready = mPendingScreenOnUnblocker == null &&
1125 (!mColorFadeEnabled ||
1126 (!mColorFadeOnAnimator.isStarted() && !mColorFadeOffAnimator.isStarted()))
Jeff Brown0a434772014-09-30 14:42:27 -07001127 && mPowerState.waitUntilClean(mCleanListener);
1128 final boolean finished = ready
1129 && !mScreenBrightnessRampAnimator.isAnimating();
1130
Jorim Jaggi0d210f62015-07-10 14:24:44 -07001131 // Notify policy about screen turned on.
1132 if (ready && state != Display.STATE_OFF
1133 && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_ON) {
Michael Wrightc3e6af82017-07-25 22:31:03 +01001134 setReportedScreenState(REPORTED_TO_POLICY_SCREEN_ON);
Jorim Jaggi0d210f62015-07-10 14:24:44 -07001135 mWindowManagerPolicy.screenTurnedOn();
1136 }
1137
Jeff Brown0a434772014-09-30 14:42:27 -07001138 // Grab a wake lock if we have unfinished business.
1139 if (!finished && !mUnfinishedBusiness) {
1140 if (DEBUG) {
1141 Slog.d(TAG, "Unfinished business...");
1142 }
1143 mCallbacks.acquireSuspendBlocker();
1144 mUnfinishedBusiness = true;
1145 }
1146
1147 // Notify the power manager when ready.
1148 if (ready && mustNotify) {
1149 // Send state change.
Jeff Brown96307042012-07-27 15:51:34 -07001150 synchronized (mLock) {
1151 if (!mPendingRequestChangedLocked) {
1152 mDisplayReadyLocked = true;
Jeff Brownc38c9be2012-10-04 13:16:19 -07001153
1154 if (DEBUG) {
1155 Slog.d(TAG, "Display ready!");
1156 }
Jeff Brown96307042012-07-27 15:51:34 -07001157 }
1158 }
Jeff Brownec083212013-09-11 20:45:25 -07001159 sendOnStateChangedWithWakelock();
Jeff Brown96307042012-07-27 15:51:34 -07001160 }
Jeff Brown0a434772014-09-30 14:42:27 -07001161
1162 // Release the wake lock when we have no unfinished business.
1163 if (finished && mUnfinishedBusiness) {
1164 if (DEBUG) {
1165 Slog.d(TAG, "Finished business...");
1166 }
1167 mUnfinishedBusiness = false;
1168 mCallbacks.releaseSuspendBlocker();
1169 }
Julius D'souzad5105dd2017-06-02 11:03:53 -07001170
1171 // Record if dozing for future comparison.
1172 mDozing = state != Display.STATE_ON;
Michael Wright188bbbf2019-02-05 22:12:17 +00001173
1174 if (previousPolicy != mPowerRequest.policy) {
1175 logDisplayPolicyChanged(mPowerRequest.policy);
1176 }
Jeff Brown96307042012-07-27 15:51:34 -07001177 }
1178
Michael Wright639c8be2014-01-17 18:29:12 -08001179 @Override
1180 public void updateBrightness() {
1181 sendUpdatePowerState();
1182 }
1183
Michael Wrighteef0e132017-11-21 17:57:52 +00001184 public void setBrightnessConfiguration(BrightnessConfiguration c) {
1185 Message msg = mHandler.obtainMessage(MSG_CONFIGURE_BRIGHTNESS, c);
1186 msg.sendToTarget();
1187 }
1188
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001189 public void setTemporaryBrightness(float brightness) {
Michael Wrightd8460232018-01-16 18:04:59 +00001190 Message msg = mHandler.obtainMessage(MSG_SET_TEMPORARY_BRIGHTNESS,
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001191 Float.floatToIntBits(brightness), 0 /*unused*/);
Michael Wrightd8460232018-01-16 18:04:59 +00001192 msg.sendToTarget();
1193 }
1194
1195 public void setTemporaryAutoBrightnessAdjustment(float adjustment) {
1196 Message msg = mHandler.obtainMessage(MSG_SET_TEMPORARY_AUTO_BRIGHTNESS_ADJUSTMENT,
1197 Float.floatToIntBits(adjustment), 0 /*unused*/);
1198 msg.sendToTarget();
1199 }
1200
Jeff Brown8b9cf1c2012-10-07 14:54:17 -07001201 private void blockScreenOn() {
Jeff Brown3ee549c2014-09-22 20:14:39 -07001202 if (mPendingScreenOnUnblocker == null) {
Jeff Brown3edf5272014-08-14 19:25:14 -07001203 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);
Jeff Brown3ee549c2014-09-22 20:14:39 -07001204 mPendingScreenOnUnblocker = new ScreenOnUnblocker();
Jeff Brown037c33e2014-04-09 00:31:55 -07001205 mScreenOnBlockStartRealTime = SystemClock.elapsedRealtime();
Jeff Brown3edf5272014-08-14 19:25:14 -07001206 Slog.i(TAG, "Blocking screen on until initial contents have been drawn.");
Jeff Brown8b9cf1c2012-10-07 14:54:17 -07001207 }
1208 }
1209
1210 private void unblockScreenOn() {
Jeff Brown3ee549c2014-09-22 20:14:39 -07001211 if (mPendingScreenOnUnblocker != null) {
1212 mPendingScreenOnUnblocker = null;
Jeff Brown2d8a3902014-03-11 23:02:35 -07001213 long delay = SystemClock.elapsedRealtime() - mScreenOnBlockStartRealTime;
Jeff Brown3edf5272014-08-14 19:25:14 -07001214 Slog.i(TAG, "Unblocked screen on after " + delay + " ms");
1215 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);
Jeff Brown8b9cf1c2012-10-07 14:54:17 -07001216 }
1217 }
1218
Jorim Jaggi51304d72017-05-17 17:25:32 +02001219 private void blockScreenOff() {
1220 if (mPendingScreenOffUnblocker == null) {
1221 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_OFF_BLOCKED_TRACE_NAME, 0);
1222 mPendingScreenOffUnblocker = new ScreenOffUnblocker();
1223 mScreenOffBlockStartRealTime = SystemClock.elapsedRealtime();
1224 Slog.i(TAG, "Blocking screen off");
1225 }
1226 }
1227
1228 private void unblockScreenOff() {
1229 if (mPendingScreenOffUnblocker != null) {
1230 mPendingScreenOffUnblocker = null;
1231 long delay = SystemClock.elapsedRealtime() - mScreenOffBlockStartRealTime;
1232 Slog.i(TAG, "Unblocked screen off after " + delay + " ms");
1233 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, SCREEN_OFF_BLOCKED_TRACE_NAME, 0);
1234 }
1235 }
1236
Jeff Brown3ee549c2014-09-22 20:14:39 -07001237 private boolean setScreenState(int state) {
Michael Wrightc3e6af82017-07-25 22:31:03 +01001238 return setScreenState(state, false /*reportOnly*/);
Michael Wright05e76fe2017-07-20 18:18:33 +01001239 }
1240
Michael Wrightc3e6af82017-07-25 22:31:03 +01001241 private boolean setScreenState(int state, boolean reportOnly) {
Jorim Jaggi51304d72017-05-17 17:25:32 +02001242 final boolean isOff = (state == Display.STATE_OFF);
Jeff Brown037c33e2014-04-09 00:31:55 -07001243 if (mPowerState.getScreenState() != state) {
Jorim Jaggi51304d72017-05-17 17:25:32 +02001244
1245 // If we are trying to turn screen off, give policy a chance to do something before we
1246 // actually turn the screen off.
1247 if (isOff && !mScreenOffBecauseOfProximity) {
1248 if (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_ON) {
Michael Wrightc3e6af82017-07-25 22:31:03 +01001249 setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_OFF);
Jorim Jaggi51304d72017-05-17 17:25:32 +02001250 blockScreenOff();
1251 mWindowManagerPolicy.screenTurningOff(mPendingScreenOffUnblocker);
Michael Wrightc3e6af82017-07-25 22:31:03 +01001252 unblockScreenOff();
Jorim Jaggi51304d72017-05-17 17:25:32 +02001253 } else if (mPendingScreenOffUnblocker != null) {
Jorim Jaggi51304d72017-05-17 17:25:32 +02001254 // Abort doing the state change until screen off is unblocked.
1255 return false;
1256 }
1257 }
1258
Michael Wrightc3e6af82017-07-25 22:31:03 +01001259 if (!reportOnly) {
Michael Wrightb0a1d3d2017-09-22 15:05:02 +01001260 Trace.traceCounter(Trace.TRACE_TAG_POWER, "ScreenState", state);
Simon MacMullen5ae7df12020-03-30 17:59:20 +01001261 // TODO(b/153319140) remove when we can get this from the above trace invocation
1262 SystemProperties.set("debug.tracing.screen_state", String.valueOf(state));
Michael Wrightc3e6af82017-07-25 22:31:03 +01001263 mPowerState.setScreenState(state);
1264 // Tell battery stats about the transition.
1265 try {
1266 mBatteryStats.noteScreenState(state);
1267 } catch (RemoteException ex) {
1268 // same process
1269 }
Jeff Brown96307042012-07-27 15:51:34 -07001270 }
1271 }
Jeff Browne1633ad2015-06-22 19:24:24 -07001272
1273 // Tell the window manager policy when the screen is turned off or on unless it's due
1274 // to the proximity sensor. We temporarily block turning the screen on until the
1275 // window manager is ready by leaving a black surface covering the screen.
1276 // This surface is essentially the final state of the color fade animation and
1277 // it is only removed once the window manager tells us that the activity has
1278 // finished drawing underneath.
Jorim Jaggi0d210f62015-07-10 14:24:44 -07001279 if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF
1280 && !mScreenOffBecauseOfProximity) {
Michael Wrightc3e6af82017-07-25 22:31:03 +01001281 setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
Jeff Browne1633ad2015-06-22 19:24:24 -07001282 unblockScreenOn();
1283 mWindowManagerPolicy.screenTurnedOff();
Jorim Jaggi51304d72017-05-17 17:25:32 +02001284 } else if (!isOff
1285 && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_OFF) {
1286
1287 // We told policy already that screen was turning off, but now we changed our minds.
1288 // Complete the full state transition on -> turningOff -> off.
1289 unblockScreenOff();
1290 mWindowManagerPolicy.screenTurnedOff();
Michael Wrightc3e6af82017-07-25 22:31:03 +01001291 setReportedScreenState(REPORTED_TO_POLICY_SCREEN_OFF);
Jorim Jaggi51304d72017-05-17 17:25:32 +02001292 }
1293 if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {
Michael Wrightc3e6af82017-07-25 22:31:03 +01001294 setReportedScreenState(REPORTED_TO_POLICY_SCREEN_TURNING_ON);
Jeff Browne1633ad2015-06-22 19:24:24 -07001295 if (mPowerState.getColorFadeLevel() == 0.0f) {
1296 blockScreenOn();
1297 } else {
1298 unblockScreenOn();
1299 }
1300 mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);
1301 }
1302
1303 // Return true if the screen isn't blocked.
Jeff Brown3ee549c2014-09-22 20:14:39 -07001304 return mPendingScreenOnUnblocker == null;
Jeff Brown96307042012-07-27 15:51:34 -07001305 }
1306
Michael Wrightc3e6af82017-07-25 22:31:03 +01001307 private void setReportedScreenState(int state) {
1308 Trace.traceCounter(Trace.TRACE_TAG_POWER, "ReportedScreenStateToPolicy", state);
1309 mReportedScreenStateToPolicy = state;
1310 }
1311
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001312 private float clampScreenBrightnessForVr(float value) {
Santos Cordonb12c7e12018-04-13 17:10:54 -07001313 return MathUtils.constrain(
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001314 value, mScreenBrightnessForVrRangeMinimum,
1315 mScreenBrightnessForVrRangeMaximum);
Santos Cordonb12c7e12018-04-13 17:10:54 -07001316 }
1317
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001318 private float clampScreenBrightness(float value) {
1319 if (Float.isNaN(value)) {
1320 return mScreenBrightnessRangeMinimum;
1321 }
Michael Wright639c8be2014-01-17 18:29:12 -08001322 return MathUtils.constrain(
1323 value, mScreenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum);
Jeff Brown330560f2012-08-21 22:10:57 -07001324 }
1325
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001326 // Checks whether the brightness is within the valid brightness range, not including the off or
1327 // invalid states.
1328 private boolean isValidBrightnessValue(float brightnessState) {
1329 return brightnessState >= mScreenBrightnessRangeMinimum
1330 && brightnessState <= mScreenBrightnessRangeMaximum;
1331 }
1332
1333 private void animateScreenBrightness(float target, float rate) {
Jeff Brown0a434772014-09-30 14:42:27 -07001334 if (DEBUG) {
1335 Slog.d(TAG, "Animating brightness: target=" + target +", rate=" + rate);
1336 }
Jeff Brown96307042012-07-27 15:51:34 -07001337 if (mScreenBrightnessRampAnimator.animateTo(target, rate)) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001338 Trace.traceCounter(Trace.TRACE_TAG_POWER, "TargetScreenBrightness", (int) target);
Simon MacMullen5ae7df12020-03-30 17:59:20 +01001339 // TODO(b/153319140) remove when we can get this from the above trace invocation
1340 SystemProperties.set("debug.tracing.screen_brightness", String.valueOf(target));
Jeff Brown131206b2014-04-08 17:27:14 -07001341 try {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001342 // TODO(brightnessfloat): change BatteryStats to use float
1343 mBatteryStats.noteScreenBrightness(
1344 BrightnessSynchronizer.brightnessFloatToInt(
1345 mContext, target));
Jeff Brown131206b2014-04-08 17:27:14 -07001346 } catch (RemoteException ex) {
1347 // same process
1348 }
Jeff Brown96307042012-07-27 15:51:34 -07001349 }
1350 }
1351
Jeff Brown606e4e82014-09-18 15:22:26 -07001352 private void animateScreenStateChange(int target, boolean performScreenOffTransition) {
1353 // If there is already an animation in progress, don't interfere with it.
Narayan Kamath38819982017-07-06 18:15:30 +01001354 if (mColorFadeEnabled &&
1355 (mColorFadeOnAnimator.isStarted() || mColorFadeOffAnimator.isStarted())) {
Chong Zhangb131c702016-02-16 16:31:48 -08001356 if (target != Display.STATE_ON) {
1357 return;
1358 }
1359 // If display state changed to on, proceed and stop the color fade and turn screen on.
1360 mPendingScreenOff = false;
Jeff Brown606e4e82014-09-18 15:22:26 -07001361 }
1362
Michael Wrightc3e6af82017-07-25 22:31:03 +01001363 if (mDisplayBlanksAfterDozeConfig
1364 && Display.isDozeState(mPowerState.getScreenState())
Michael Wright05e76fe2017-07-20 18:18:33 +01001365 && !Display.isDozeState(target)) {
Michael Wright05e76fe2017-07-20 18:18:33 +01001366 // Skip the screen off animation and add a black surface to hide the
Michael Wrightc3e6af82017-07-25 22:31:03 +01001367 // contents of the screen.
1368 mPowerState.prepareColorFade(mContext,
1369 mColorFadeFadesConfig ? ColorFade.MODE_FADE : ColorFade.MODE_WARM_UP);
Lucas Dupina84952b2017-08-15 15:56:50 -07001370 if (mColorFadeOffAnimator != null) {
1371 mColorFadeOffAnimator.end();
1372 }
Michael Wrightc3e6af82017-07-25 22:31:03 +01001373 // Some display hardware will blank itself on the transition between doze and non-doze
1374 // but still on display states. In this case we want to report to policy that the
1375 // display has turned off so it can prepare the appropriate power on animation, but we
1376 // don't want to actually transition to the fully off state since that takes
1377 // significantly longer to transition from.
1378 setScreenState(Display.STATE_OFF, target != Display.STATE_OFF /*reportOnly*/);
Michael Wright05e76fe2017-07-20 18:18:33 +01001379 }
1380
Jeff Brown3ee549c2014-09-22 20:14:39 -07001381 // If we were in the process of turning off the screen but didn't quite
1382 // finish. Then finish up now to prevent a jarring transition back
1383 // to screen on if we skipped blocking screen on as usual.
1384 if (mPendingScreenOff && target != Display.STATE_OFF) {
1385 setScreenState(Display.STATE_OFF);
1386 mPendingScreenOff = false;
Michael Lentined73854d2015-09-25 10:55:26 -07001387 mPowerState.dismissColorFadeResources();
Jeff Brown606e4e82014-09-18 15:22:26 -07001388 }
1389
1390 if (target == Display.STATE_ON) {
1391 // Want screen on. The contents of the screen may not yet
Jeff Brown3ee549c2014-09-22 20:14:39 -07001392 // be visible if the color fade has not been dismissed because
Jeff Brown606e4e82014-09-18 15:22:26 -07001393 // its last frame of animation is solid black.
Jeff Brown3ee549c2014-09-22 20:14:39 -07001394 if (!setScreenState(Display.STATE_ON)) {
1395 return; // screen on blocked
1396 }
Narayan Kamath38819982017-07-06 18:15:30 +01001397 if (USE_COLOR_FADE_ON_ANIMATION && mColorFadeEnabled && mPowerRequest.isBrightOrDim()) {
Jeff Brown606e4e82014-09-18 15:22:26 -07001398 // Perform screen on animation.
1399 if (mPowerState.getColorFadeLevel() == 1.0f) {
1400 mPowerState.dismissColorFade();
1401 } else if (mPowerState.prepareColorFade(mContext,
1402 mColorFadeFadesConfig ?
1403 ColorFade.MODE_FADE :
1404 ColorFade.MODE_WARM_UP)) {
1405 mColorFadeOnAnimator.start();
1406 } else {
1407 mColorFadeOnAnimator.end();
1408 }
1409 } else {
1410 // Skip screen on animation.
1411 mPowerState.setColorFadeLevel(1.0f);
1412 mPowerState.dismissColorFade();
1413 }
Santos Cordon3107d292016-09-20 15:50:35 -07001414 } else if (target == Display.STATE_VR) {
1415 // Wait for brightness animation to complete beforehand when entering VR
1416 // from screen on to prevent a perceptible jump because brightness may operate
1417 // differently when the display is configured for dozing.
1418 if (mScreenBrightnessRampAnimator.isAnimating()
1419 && mPowerState.getScreenState() == Display.STATE_ON) {
1420 return;
1421 }
1422
1423 // Set screen state.
1424 if (!setScreenState(Display.STATE_VR)) {
1425 return; // screen on blocked
1426 }
1427
1428 // Dismiss the black surface without fanfare.
1429 mPowerState.setColorFadeLevel(1.0f);
1430 mPowerState.dismissColorFade();
Jeff Brown606e4e82014-09-18 15:22:26 -07001431 } else if (target == Display.STATE_DOZE) {
1432 // Want screen dozing.
1433 // Wait for brightness animation to complete beforehand when entering doze
1434 // from screen on to prevent a perceptible jump because brightness may operate
1435 // differently when the display is configured for dozing.
1436 if (mScreenBrightnessRampAnimator.isAnimating()
1437 && mPowerState.getScreenState() == Display.STATE_ON) {
1438 return;
1439 }
1440
Jeff Brown3ee549c2014-09-22 20:14:39 -07001441 // Set screen state.
1442 if (!setScreenState(Display.STATE_DOZE)) {
1443 return; // screen on blocked
1444 }
1445
1446 // Dismiss the black surface without fanfare.
Jeff Brown606e4e82014-09-18 15:22:26 -07001447 mPowerState.setColorFadeLevel(1.0f);
1448 mPowerState.dismissColorFade();
1449 } else if (target == Display.STATE_DOZE_SUSPEND) {
1450 // Want screen dozing and suspended.
1451 // Wait for brightness animation to complete beforehand unless already
1452 // suspended because we may not be able to change it after suspension.
1453 if (mScreenBrightnessRampAnimator.isAnimating()
1454 && mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {
1455 return;
1456 }
1457
Jeff Brown3ee549c2014-09-22 20:14:39 -07001458 // If not already suspending, temporarily set the state to doze until the
1459 // screen on is unblocked, then suspend.
1460 if (mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {
1461 if (!setScreenState(Display.STATE_DOZE)) {
1462 return; // screen on blocked
1463 }
1464 setScreenState(Display.STATE_DOZE_SUSPEND); // already on so can't block
1465 }
1466
1467 // Dismiss the black surface without fanfare.
Jeff Brown606e4e82014-09-18 15:22:26 -07001468 mPowerState.setColorFadeLevel(1.0f);
1469 mPowerState.dismissColorFade();
Chris Phoenix10a4a642017-09-25 13:21:00 -07001470 } else if (target == Display.STATE_ON_SUSPEND) {
1471 // Want screen full-power and suspended.
1472 // Wait for brightness animation to complete beforehand unless already
1473 // suspended because we may not be able to change it after suspension.
1474 if (mScreenBrightnessRampAnimator.isAnimating()
1475 && mPowerState.getScreenState() != Display.STATE_ON_SUSPEND) {
1476 return;
1477 }
1478
1479 // If not already suspending, temporarily set the state to on until the
1480 // screen on is unblocked, then suspend.
1481 if (mPowerState.getScreenState() != Display.STATE_ON_SUSPEND) {
1482 if (!setScreenState(Display.STATE_ON)) {
1483 return;
1484 }
1485 setScreenState(Display.STATE_ON_SUSPEND);
1486 }
1487
1488 // Dismiss the black surface without fanfare.
1489 mPowerState.setColorFadeLevel(1.0f);
1490 mPowerState.dismissColorFade();
Jeff Brown606e4e82014-09-18 15:22:26 -07001491 } else {
1492 // Want screen off.
Jeff Brown3ee549c2014-09-22 20:14:39 -07001493 mPendingScreenOff = true;
Narayan Kamath38819982017-07-06 18:15:30 +01001494 if (!mColorFadeEnabled) {
1495 mPowerState.setColorFadeLevel(0.0f);
1496 }
1497
Jeff Brown606e4e82014-09-18 15:22:26 -07001498 if (mPowerState.getColorFadeLevel() == 0.0f) {
1499 // Turn the screen off.
1500 // A black surface is already hiding the contents of the screen.
1501 setScreenState(Display.STATE_OFF);
Jeff Brown3ee549c2014-09-22 20:14:39 -07001502 mPendingScreenOff = false;
Michael Lentined73854d2015-09-25 10:55:26 -07001503 mPowerState.dismissColorFadeResources();
Jeff Brown606e4e82014-09-18 15:22:26 -07001504 } else if (performScreenOffTransition
1505 && mPowerState.prepareColorFade(mContext,
1506 mColorFadeFadesConfig ?
1507 ColorFade.MODE_FADE : ColorFade.MODE_COOL_DOWN)
1508 && mPowerState.getScreenState() != Display.STATE_OFF) {
1509 // Perform the screen off animation.
1510 mColorFadeOffAnimator.start();
1511 } else {
1512 // Skip the screen off animation and add a black surface to hide the
1513 // contents of the screen.
1514 mColorFadeOffAnimator.end();
1515 }
1516 }
1517 }
1518
Jeff Brown96307042012-07-27 15:51:34 -07001519 private final Runnable mCleanListener = new Runnable() {
1520 @Override
1521 public void run() {
1522 sendUpdatePowerState();
1523 }
1524 };
1525
1526 private void setProximitySensorEnabled(boolean enable) {
1527 if (enable) {
1528 if (!mProximitySensorEnabled) {
Jeff Brownec083212013-09-11 20:45:25 -07001529 // Register the listener.
1530 // Proximity sensor state already cleared initially.
Jeff Brown96307042012-07-27 15:51:34 -07001531 mProximitySensorEnabled = true;
Jeff Brown96307042012-07-27 15:51:34 -07001532 mSensorManager.registerListener(mProximitySensorListener, mProximitySensor,
1533 SensorManager.SENSOR_DELAY_NORMAL, mHandler);
1534 }
1535 } else {
1536 if (mProximitySensorEnabled) {
Jeff Brownec083212013-09-11 20:45:25 -07001537 // Unregister the listener.
1538 // Clear the proximity sensor state for next time.
Jeff Brown96307042012-07-27 15:51:34 -07001539 mProximitySensorEnabled = false;
1540 mProximity = PROXIMITY_UNKNOWN;
Jeff Brownec083212013-09-11 20:45:25 -07001541 mPendingProximity = PROXIMITY_UNKNOWN;
Jeff Brown96307042012-07-27 15:51:34 -07001542 mHandler.removeMessages(MSG_PROXIMITY_SENSOR_DEBOUNCED);
1543 mSensorManager.unregisterListener(mProximitySensorListener);
Jeff Brownec083212013-09-11 20:45:25 -07001544 clearPendingProximityDebounceTime(); // release wake lock (must be last)
Jeff Brown96307042012-07-27 15:51:34 -07001545 }
1546 }
1547 }
1548
1549 private void handleProximitySensorEvent(long time, boolean positive) {
Jeff Brownec083212013-09-11 20:45:25 -07001550 if (mProximitySensorEnabled) {
1551 if (mPendingProximity == PROXIMITY_NEGATIVE && !positive) {
1552 return; // no change
1553 }
1554 if (mPendingProximity == PROXIMITY_POSITIVE && positive) {
1555 return; // no change
1556 }
Jeff Brown96307042012-07-27 15:51:34 -07001557
Jeff Brownec083212013-09-11 20:45:25 -07001558 // Only accept a proximity sensor reading if it remains
1559 // stable for the entire debounce delay. We hold a wake lock while
1560 // debouncing the sensor.
1561 mHandler.removeMessages(MSG_PROXIMITY_SENSOR_DEBOUNCED);
1562 if (positive) {
1563 mPendingProximity = PROXIMITY_POSITIVE;
1564 setPendingProximityDebounceTime(
1565 time + PROXIMITY_SENSOR_POSITIVE_DEBOUNCE_DELAY); // acquire wake lock
1566 } else {
1567 mPendingProximity = PROXIMITY_NEGATIVE;
1568 setPendingProximityDebounceTime(
1569 time + PROXIMITY_SENSOR_NEGATIVE_DEBOUNCE_DELAY); // acquire wake lock
1570 }
1571
1572 // Debounce the new sensor reading.
1573 debounceProximitySensor();
Jeff Brown93cbbb22012-10-04 13:18:36 -07001574 }
Jeff Brown96307042012-07-27 15:51:34 -07001575 }
1576
1577 private void debounceProximitySensor() {
Jeff Brownec083212013-09-11 20:45:25 -07001578 if (mProximitySensorEnabled
1579 && mPendingProximity != PROXIMITY_UNKNOWN
1580 && mPendingProximityDebounceTime >= 0) {
Jeff Brown96307042012-07-27 15:51:34 -07001581 final long now = SystemClock.uptimeMillis();
1582 if (mPendingProximityDebounceTime <= now) {
Jeff Brownec083212013-09-11 20:45:25 -07001583 // Sensor reading accepted. Apply the change then release the wake lock.
Jeff Brown96307042012-07-27 15:51:34 -07001584 mProximity = mPendingProximity;
Jeff Brownec083212013-09-11 20:45:25 -07001585 updatePowerState();
1586 clearPendingProximityDebounceTime(); // release wake lock (must be last)
Jeff Brown96307042012-07-27 15:51:34 -07001587 } else {
Jeff Brownec083212013-09-11 20:45:25 -07001588 // Need to wait a little longer.
1589 // Debounce again later. We continue holding a wake lock while waiting.
Jeff Brown96307042012-07-27 15:51:34 -07001590 Message msg = mHandler.obtainMessage(MSG_PROXIMITY_SENSOR_DEBOUNCED);
Jeff Brown96307042012-07-27 15:51:34 -07001591 mHandler.sendMessageAtTime(msg, mPendingProximityDebounceTime);
1592 }
1593 }
1594 }
1595
Jeff Brownec083212013-09-11 20:45:25 -07001596 private void clearPendingProximityDebounceTime() {
1597 if (mPendingProximityDebounceTime >= 0) {
1598 mPendingProximityDebounceTime = -1;
Jeff Brown131206b2014-04-08 17:27:14 -07001599 mCallbacks.releaseSuspendBlocker(); // release wake lock
Jeff Brownec083212013-09-11 20:45:25 -07001600 }
1601 }
1602
1603 private void setPendingProximityDebounceTime(long debounceTime) {
1604 if (mPendingProximityDebounceTime < 0) {
Jeff Brown131206b2014-04-08 17:27:14 -07001605 mCallbacks.acquireSuspendBlocker(); // acquire wake lock
Jeff Brownec083212013-09-11 20:45:25 -07001606 }
1607 mPendingProximityDebounceTime = debounceTime;
1608 }
1609
Jeff Brownec083212013-09-11 20:45:25 -07001610 private void sendOnStateChangedWithWakelock() {
Jeff Brown131206b2014-04-08 17:27:14 -07001611 mCallbacks.acquireSuspendBlocker();
1612 mHandler.post(mOnStateChangedRunnable);
Jeff Brown96307042012-07-27 15:51:34 -07001613 }
1614
Michael Wright188bbbf2019-02-05 22:12:17 +00001615 private void logDisplayPolicyChanged(int newPolicy) {
1616 LogMaker log = new LogMaker(MetricsEvent.DISPLAY_POLICY);
1617 log.setType(MetricsEvent.TYPE_UPDATE);
1618 log.setSubtype(newPolicy);
1619 MetricsLogger.action(log);
1620 }
1621
Kenny Guyecc978f2018-03-14 17:30:20 +00001622 private void handleSettingsChange(boolean userSwitch) {
Michael Wrightd8460232018-01-16 18:04:59 +00001623 mPendingScreenBrightnessSetting = getScreenBrightnessSetting();
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001624
Kenny Guyecc978f2018-03-14 17:30:20 +00001625 if (userSwitch) {
1626 // Don't treat user switches as user initiated change.
1627 mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
Dan Gittikc1352252018-04-27 17:48:31 +01001628 if (mAutomaticBrightnessController != null) {
1629 mAutomaticBrightnessController.resetShortTermModel();
1630 }
Kenny Guyecc978f2018-03-14 17:30:20 +00001631 }
Michael Wrightd8460232018-01-16 18:04:59 +00001632 mPendingAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
1633 // We don't bother with a pending variable for VR screen brightness since we just
1634 // immediately adapt to it.
1635 mScreenBrightnessForVr = getScreenBrightnessForVrSetting();
1636 sendUpdatePowerState();
1637 }
1638
1639 private float getAutoBrightnessAdjustmentSetting() {
1640 final float adj = Settings.System.getFloatForUser(mContext.getContentResolver(),
1641 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT);
1642 return Float.isNaN(adj) ? 0.0f : clampAutoBrightnessAdjustment(adj);
1643 }
1644
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001645 private float getScreenBrightnessSetting() {
1646 final float brightness = Settings.System.getFloatForUser(mContext.getContentResolver(),
1647 Settings.System.SCREEN_BRIGHTNESS_FLOAT, mScreenBrightnessDefault,
Michael Wrightd8460232018-01-16 18:04:59 +00001648 UserHandle.USER_CURRENT);
1649 return clampAbsoluteBrightness(brightness);
1650 }
1651
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001652 private float getScreenBrightnessForVrSetting() {
1653 final float brightnessFloat = Settings.System.getFloatForUser(mContext.getContentResolver(),
1654 Settings.System.SCREEN_BRIGHTNESS_FOR_VR_FLOAT, mScreenBrightnessForVrDefault,
Michael Wrightd8460232018-01-16 18:04:59 +00001655 UserHandle.USER_CURRENT);
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001656 return clampScreenBrightnessForVr(brightnessFloat);
Michael Wrightd8460232018-01-16 18:04:59 +00001657 }
1658
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001659 private void putScreenBrightnessSetting(float brightnessValue) {
1660 mCurrentScreenBrightnessSetting = brightnessValue;
1661 Settings.System.putFloatForUser(mContext.getContentResolver(),
1662 Settings.System.SCREEN_BRIGHTNESS_FLOAT, brightnessValue, UserHandle.USER_CURRENT);
Michael Wright617564f2018-01-25 22:20:54 +00001663 }
1664
1665 private void putAutoBrightnessAdjustmentSetting(float adjustment) {
1666 mAutoBrightnessAdjustment = adjustment;
1667 Settings.System.putFloatForUser(mContext.getContentResolver(),
1668 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adjustment, UserHandle.USER_CURRENT);
Michael Wrightd8460232018-01-16 18:04:59 +00001669 }
1670
1671 private boolean updateAutoBrightnessAdjustment() {
1672 if (Float.isNaN(mPendingAutoBrightnessAdjustment)) {
1673 return false;
1674 }
1675 if (mAutoBrightnessAdjustment == mPendingAutoBrightnessAdjustment) {
Michael Wright9fdf66b2018-05-22 15:35:05 +01001676 mPendingAutoBrightnessAdjustment = Float.NaN;
Michael Wrightd8460232018-01-16 18:04:59 +00001677 return false;
1678 }
1679 mAutoBrightnessAdjustment = mPendingAutoBrightnessAdjustment;
1680 mPendingAutoBrightnessAdjustment = Float.NaN;
1681 return true;
1682 }
1683
1684 private boolean updateUserSetScreenBrightness() {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001685 if ((Float.isNaN(mPendingScreenBrightnessSetting)
1686 || mPendingScreenBrightnessSetting < 0.0f)) {
Michael Wrightd8460232018-01-16 18:04:59 +00001687 return false;
1688 }
1689 if (mCurrentScreenBrightnessSetting == mPendingScreenBrightnessSetting) {
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001690 mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
1691 mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
Michael Wrightd8460232018-01-16 18:04:59 +00001692 return false;
1693 }
Kenny Guyad9a6ea2018-01-31 15:57:15 +00001694 mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
Michael Wrightd8460232018-01-16 18:04:59 +00001695 mLastUserSetScreenBrightness = mPendingScreenBrightnessSetting;
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001696 mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
1697 mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
Michael Wrightd8460232018-01-16 18:04:59 +00001698 return true;
1699 }
1700
Kenny Guy53d06612018-01-30 14:19:13 +00001701 private void notifyBrightnessChanged(int brightness, boolean userInitiated,
1702 boolean hadUserDataPoint) {
Michael Wrightd8460232018-01-16 18:04:59 +00001703 final float brightnessInNits = convertToNits(brightness);
Kenny Guyad9a6ea2018-01-31 15:57:15 +00001704 if (mPowerRequest.useAutoBrightness && brightnessInNits >= 0.0f
1705 && mAutomaticBrightnessController != null) {
Michael Wrightd8460232018-01-16 18:04:59 +00001706 // We only want to track changes on devices that can actually map the display backlight
1707 // values into a physical brightness unit since the value provided by the API is in
1708 // nits and not using the arbitrary backlight units.
Kenny Guy53d06612018-01-30 14:19:13 +00001709 final float powerFactor = mPowerRequest.lowPowerMode
1710 ? mPowerRequest.screenLowPowerBrightnessFactor
1711 : 1.0f;
1712 mBrightnessTracker.notifyBrightnessChanged(brightnessInNits, userInitiated,
1713 powerFactor, hadUserDataPoint,
1714 mAutomaticBrightnessController.isDefaultConfig());
Michael Wrightd8460232018-01-16 18:04:59 +00001715 }
1716 }
1717
1718 private float convertToNits(int backlight) {
Michael Wright144aac92017-12-21 18:37:41 +00001719 if (mBrightnessMapper != null) {
Michael Wrightd8460232018-01-16 18:04:59 +00001720 return mBrightnessMapper.convertToNits(backlight);
Michael Wright144aac92017-12-21 18:37:41 +00001721 } else {
1722 return -1.0f;
1723 }
1724 }
1725
Jeff Brown96307042012-07-27 15:51:34 -07001726 private final Runnable mOnStateChangedRunnable = new Runnable() {
1727 @Override
1728 public void run() {
1729 mCallbacks.onStateChanged();
Jeff Brown131206b2014-04-08 17:27:14 -07001730 mCallbacks.releaseSuspendBlocker();
Jeff Brown96307042012-07-27 15:51:34 -07001731 }
1732 };
1733
Jeff Brownec083212013-09-11 20:45:25 -07001734 private void sendOnProximityPositiveWithWakelock() {
Jeff Brown131206b2014-04-08 17:27:14 -07001735 mCallbacks.acquireSuspendBlocker();
1736 mHandler.post(mOnProximityPositiveRunnable);
Jeff Brown93cbbb22012-10-04 13:18:36 -07001737 }
1738
1739 private final Runnable mOnProximityPositiveRunnable = new Runnable() {
1740 @Override
1741 public void run() {
1742 mCallbacks.onProximityPositive();
Jeff Brown131206b2014-04-08 17:27:14 -07001743 mCallbacks.releaseSuspendBlocker();
Jeff Brown93cbbb22012-10-04 13:18:36 -07001744 }
1745 };
1746
Jeff Brownec083212013-09-11 20:45:25 -07001747 private void sendOnProximityNegativeWithWakelock() {
Jeff Brown131206b2014-04-08 17:27:14 -07001748 mCallbacks.acquireSuspendBlocker();
1749 mHandler.post(mOnProximityNegativeRunnable);
Jeff Brown96307042012-07-27 15:51:34 -07001750 }
1751
1752 private final Runnable mOnProximityNegativeRunnable = new Runnable() {
1753 @Override
1754 public void run() {
1755 mCallbacks.onProximityNegative();
Jeff Brown131206b2014-04-08 17:27:14 -07001756 mCallbacks.releaseSuspendBlocker();
Jeff Brown96307042012-07-27 15:51:34 -07001757 }
1758 };
1759
Jeff Brownbd6e1502012-08-28 03:27:37 -07001760 public void dump(final PrintWriter pw) {
Jeff Brown96307042012-07-27 15:51:34 -07001761 synchronized (mLock) {
1762 pw.println();
Jeff Brown131206b2014-04-08 17:27:14 -07001763 pw.println("Display Power Controller Locked State:");
Jeff Brown96307042012-07-27 15:51:34 -07001764 pw.println(" mDisplayReadyLocked=" + mDisplayReadyLocked);
1765 pw.println(" mPendingRequestLocked=" + mPendingRequestLocked);
1766 pw.println(" mPendingRequestChangedLocked=" + mPendingRequestChangedLocked);
1767 pw.println(" mPendingWaitForNegativeProximityLocked="
1768 + mPendingWaitForNegativeProximityLocked);
1769 pw.println(" mPendingUpdatePowerStateLocked=" + mPendingUpdatePowerStateLocked);
1770 }
1771
1772 pw.println();
Jeff Brown131206b2014-04-08 17:27:14 -07001773 pw.println("Display Power Controller Configuration:");
Jeff Brown26875502014-01-30 21:47:47 -08001774 pw.println(" mScreenBrightnessDozeConfig=" + mScreenBrightnessDozeConfig);
Jeff Brown96307042012-07-27 15:51:34 -07001775 pw.println(" mScreenBrightnessDimConfig=" + mScreenBrightnessDimConfig);
Michael Wright2155bc22018-05-01 00:38:32 +01001776 pw.println(" mScreenBrightnessDefault=" + mScreenBrightnessDefault);
1777 pw.println(" mScreenBrightnessForVrRangeMinimum=" + mScreenBrightnessForVrRangeMinimum);
1778 pw.println(" mScreenBrightnessForVrRangeMaximum=" + mScreenBrightnessForVrRangeMaximum);
1779 pw.println(" mScreenBrightnessForVrDefault=" + mScreenBrightnessForVrDefault);
Jeff Brown2175e9c2014-09-12 16:11:07 -07001780 pw.println(" mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig);
Filip Gruszczynskia15aa7d2014-10-28 14:12:40 -07001781 pw.println(" mAllowAutoBrightnessWhileDozingConfig=" +
1782 mAllowAutoBrightnessWhileDozingConfig);
Michael Wright2155bc22018-05-01 00:38:32 +01001783 pw.println(" mSkipScreenOnBrightnessRamp=" + mSkipScreenOnBrightnessRamp);
Jeff Brown2175e9c2014-09-12 16:11:07 -07001784 pw.println(" mColorFadeFadesConfig=" + mColorFadeFadesConfig);
Michael Wright2155bc22018-05-01 00:38:32 +01001785 pw.println(" mColorFadeEnabled=" + mColorFadeEnabled);
1786 pw.println(" mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig);
1787 pw.println(" mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig);
Jeff Brown96307042012-07-27 15:51:34 -07001788
Jeff Brownbd6e1502012-08-28 03:27:37 -07001789 mHandler.runWithScissors(new Runnable() {
1790 @Override
1791 public void run() {
1792 dumpLocal(pw);
Jeff Brown96307042012-07-27 15:51:34 -07001793 }
Jeff Brown4ed8fe72012-08-30 18:18:29 -07001794 }, 1000);
Jeff Brown96307042012-07-27 15:51:34 -07001795 }
1796
1797 private void dumpLocal(PrintWriter pw) {
1798 pw.println();
Jeff Brown131206b2014-04-08 17:27:14 -07001799 pw.println("Display Power Controller Thread State:");
Jeff Brown96307042012-07-27 15:51:34 -07001800 pw.println(" mPowerRequest=" + mPowerRequest);
Michael Wright2155bc22018-05-01 00:38:32 +01001801 pw.println(" mUnfinishedBusiness=" + mUnfinishedBusiness);
Jeff Brown96307042012-07-27 15:51:34 -07001802 pw.println(" mWaitingForNegativeProximity=" + mWaitingForNegativeProximity);
Jeff Brown96307042012-07-27 15:51:34 -07001803 pw.println(" mProximitySensor=" + mProximitySensor);
1804 pw.println(" mProximitySensorEnabled=" + mProximitySensorEnabled);
1805 pw.println(" mProximityThreshold=" + mProximityThreshold);
1806 pw.println(" mProximity=" + proximityToString(mProximity));
1807 pw.println(" mPendingProximity=" + proximityToString(mPendingProximity));
1808 pw.println(" mPendingProximityDebounceTime="
1809 + TimeUtils.formatUptime(mPendingProximityDebounceTime));
1810 pw.println(" mScreenOffBecauseOfProximity=" + mScreenOffBecauseOfProximity);
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001811 pw.println(" mLastUserSetScreenBrightnessFloat=" + mLastUserSetScreenBrightness);
1812 pw.println(" mPendingScreenBrightnessSettingFloat="
1813 + mPendingScreenBrightnessSetting);
1814 pw.println(" mTemporaryScreenBrightnessFloat=" + mTemporaryScreenBrightness);
Michael Wrightd8460232018-01-16 18:04:59 +00001815 pw.println(" mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment);
Santos Cordon71e482f2019-05-14 16:44:59 +01001816 pw.println(" mBrightnessReason=" + mBrightnessReason);
Michael Wright2155bc22018-05-01 00:38:32 +01001817 pw.println(" mTemporaryAutoBrightnessAdjustment=" + mTemporaryAutoBrightnessAdjustment);
Michael Wrightd8460232018-01-16 18:04:59 +00001818 pw.println(" mPendingAutoBrightnessAdjustment=" + mPendingAutoBrightnessAdjustment);
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001819 pw.println(" mScreenBrightnessForVrFloat=" + mScreenBrightnessForVr);
Jeff Brown970d4132014-07-19 11:33:47 -07001820 pw.println(" mAppliedAutoBrightness=" + mAppliedAutoBrightness);
1821 pw.println(" mAppliedDimming=" + mAppliedDimming);
1822 pw.println(" mAppliedLowPower=" + mAppliedLowPower);
Michael Wright2155bc22018-05-01 00:38:32 +01001823 pw.println(" mAppliedScreenBrightnessOverride=" + mAppliedScreenBrightnessOverride);
1824 pw.println(" mAppliedTemporaryBrightness=" + mAppliedTemporaryBrightness);
1825 pw.println(" mDozing=" + mDozing);
1826 pw.println(" mSkipRampState=" + skipRampStateToString(mSkipRampState));
Michael Wright2155bc22018-05-01 00:38:32 +01001827 pw.println(" mScreenOnBlockStartRealTime=" + mScreenOnBlockStartRealTime);
1828 pw.println(" mScreenOffBlockStartRealTime=" + mScreenOffBlockStartRealTime);
Jeff Brown3ee549c2014-09-22 20:14:39 -07001829 pw.println(" mPendingScreenOnUnblocker=" + mPendingScreenOnUnblocker);
Michael Wright2155bc22018-05-01 00:38:32 +01001830 pw.println(" mPendingScreenOffUnblocker=" + mPendingScreenOffUnblocker);
Jeff Brown3ee549c2014-09-22 20:14:39 -07001831 pw.println(" mPendingScreenOff=" + mPendingScreenOff);
Michael Wrightc3e6af82017-07-25 22:31:03 +01001832 pw.println(" mReportedToPolicy=" +
1833 reportedToPolicyToString(mReportedScreenStateToPolicy));
Jeff Brown96307042012-07-27 15:51:34 -07001834
Luis Hector Chavezb48942e2018-07-27 09:12:23 -07001835 if (mScreenBrightnessRampAnimator != null) {
1836 pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" +
1837 mScreenBrightnessRampAnimator.isAnimating());
1838 }
Jeff Brown42558692014-05-20 22:02:46 -07001839
Michael Lentine0839adb2014-07-29 18:47:56 -07001840 if (mColorFadeOnAnimator != null) {
1841 pw.println(" mColorFadeOnAnimator.isStarted()=" +
1842 mColorFadeOnAnimator.isStarted());
Jeff Brown96307042012-07-27 15:51:34 -07001843 }
Michael Lentine0839adb2014-07-29 18:47:56 -07001844 if (mColorFadeOffAnimator != null) {
1845 pw.println(" mColorFadeOffAnimator.isStarted()=" +
1846 mColorFadeOffAnimator.isStarted());
Jeff Brown96307042012-07-27 15:51:34 -07001847 }
1848
1849 if (mPowerState != null) {
1850 mPowerState.dump(pw);
1851 }
Michael Wright639c8be2014-01-17 18:29:12 -08001852
1853 if (mAutomaticBrightnessController != null) {
1854 mAutomaticBrightnessController.dump(pw);
1855 }
1856
Michael Wright144aac92017-12-21 18:37:41 +00001857 if (mBrightnessTracker != null) {
1858 pw.println();
1859 mBrightnessTracker.dump(pw);
1860 }
Dan Gittik8dbd7e92018-12-03 15:35:53 +00001861
1862 pw.println();
1863 if (mDisplayWhiteBalanceController != null) {
1864 mDisplayWhiteBalanceController.dump(pw);
1865 mDisplayWhiteBalanceSettings.dump(pw);
1866 }
Jeff Brown96307042012-07-27 15:51:34 -07001867 }
1868
1869 private static String proximityToString(int state) {
1870 switch (state) {
1871 case PROXIMITY_UNKNOWN:
1872 return "Unknown";
1873 case PROXIMITY_NEGATIVE:
1874 return "Negative";
1875 case PROXIMITY_POSITIVE:
1876 return "Positive";
1877 default:
1878 return Integer.toString(state);
1879 }
1880 }
1881
Jorim Jaggi0d210f62015-07-10 14:24:44 -07001882 private static String reportedToPolicyToString(int state) {
1883 switch (state) {
1884 case REPORTED_TO_POLICY_SCREEN_OFF:
1885 return "REPORTED_TO_POLICY_SCREEN_OFF";
1886 case REPORTED_TO_POLICY_SCREEN_TURNING_ON:
1887 return "REPORTED_TO_POLICY_SCREEN_TURNING_ON";
1888 case REPORTED_TO_POLICY_SCREEN_ON:
1889 return "REPORTED_TO_POLICY_SCREEN_ON";
1890 default:
1891 return Integer.toString(state);
1892 }
1893 }
1894
Michael Wright2155bc22018-05-01 00:38:32 +01001895 private static String skipRampStateToString(int state) {
1896 switch (state) {
1897 case RAMP_STATE_SKIP_NONE:
1898 return "RAMP_STATE_SKIP_NONE";
1899 case RAMP_STATE_SKIP_INITIAL:
1900 return "RAMP_STATE_SKIP_INITIAL";
1901 case RAMP_STATE_SKIP_AUTOBRIGHT:
1902 return "RAMP_STATE_SKIP_AUTOBRIGHT";
1903 default:
1904 return Integer.toString(state);
1905 }
1906 }
1907
Michael Wright639c8be2014-01-17 18:29:12 -08001908 private static int clampAbsoluteBrightness(int value) {
1909 return MathUtils.constrain(value, PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON);
Jeff Brown96307042012-07-27 15:51:34 -07001910 }
1911
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001912 private static float clampAbsoluteBrightness(float value) {
1913 return MathUtils.constrain(value, PowerManager.BRIGHTNESS_MIN,
1914 PowerManager.BRIGHTNESS_MAX);
1915 }
1916
Michael Wrightd8460232018-01-16 18:04:59 +00001917 private static float clampAutoBrightnessAdjustment(float value) {
1918 return MathUtils.constrain(value, -1.0f, 1.0f);
1919 }
1920
Jeff Brown96307042012-07-27 15:51:34 -07001921 private final class DisplayControllerHandler extends Handler {
1922 public DisplayControllerHandler(Looper looper) {
Jeff Browna2910d02012-08-25 12:29:46 -07001923 super(looper, null, true /*async*/);
Jeff Brown96307042012-07-27 15:51:34 -07001924 }
1925
1926 @Override
1927 public void handleMessage(Message msg) {
1928 switch (msg.what) {
1929 case MSG_UPDATE_POWER_STATE:
1930 updatePowerState();
1931 break;
1932
1933 case MSG_PROXIMITY_SENSOR_DEBOUNCED:
1934 debounceProximitySensor();
1935 break;
Jeff Brown3ee549c2014-09-22 20:14:39 -07001936
1937 case MSG_SCREEN_ON_UNBLOCKED:
1938 if (mPendingScreenOnUnblocker == msg.obj) {
1939 unblockScreenOn();
1940 updatePowerState();
1941 }
1942 break;
Jorim Jaggi51304d72017-05-17 17:25:32 +02001943 case MSG_SCREEN_OFF_UNBLOCKED:
1944 if (mPendingScreenOffUnblocker == msg.obj) {
1945 unblockScreenOff();
1946 updatePowerState();
1947 }
1948 break;
Michael Wrighteef0e132017-11-21 17:57:52 +00001949 case MSG_CONFIGURE_BRIGHTNESS:
Michael Wrightd5df3612018-01-02 12:44:52 +00001950 mBrightnessConfiguration = (BrightnessConfiguration)msg.obj;
Michael Wrighteef0e132017-11-21 17:57:52 +00001951 updatePowerState();
1952 break;
Michael Wrightd8460232018-01-16 18:04:59 +00001953
1954 case MSG_SET_TEMPORARY_BRIGHTNESS:
1955 // TODO: Should we have a a timeout for the temporary brightness?
Fiona Campbelld4eb2952019-11-04 17:19:56 +00001956 mTemporaryScreenBrightness = Float.intBitsToFloat(msg.arg1);
Michael Wrightd8460232018-01-16 18:04:59 +00001957 updatePowerState();
1958 break;
1959
1960 case MSG_SET_TEMPORARY_AUTO_BRIGHTNESS_ADJUSTMENT:
1961 mTemporaryAutoBrightnessAdjustment = Float.intBitsToFloat(msg.arg1);
1962 updatePowerState();
1963 break;
Jeff Brown96307042012-07-27 15:51:34 -07001964 }
1965 }
1966 }
1967
1968 private final SensorEventListener mProximitySensorListener = new SensorEventListener() {
1969 @Override
1970 public void onSensorChanged(SensorEvent event) {
1971 if (mProximitySensorEnabled) {
1972 final long time = SystemClock.uptimeMillis();
1973 final float distance = event.values[0];
1974 boolean positive = distance >= 0.0f && distance < mProximityThreshold;
1975 handleProximitySensorEvent(time, positive);
1976 }
1977 }
1978
1979 @Override
1980 public void onAccuracyChanged(Sensor sensor, int accuracy) {
1981 // Not used.
1982 }
1983 };
Jeff Brown3ee549c2014-09-22 20:14:39 -07001984
Michael Wrightd8460232018-01-16 18:04:59 +00001985
1986 private final class SettingsObserver extends ContentObserver {
1987 public SettingsObserver(Handler handler) {
1988 super(handler);
1989 }
1990
1991 @Override
1992 public void onChange(boolean selfChange, Uri uri) {
Kenny Guyecc978f2018-03-14 17:30:20 +00001993 handleSettingsChange(false /* userSwitch */);
Michael Wrightd8460232018-01-16 18:04:59 +00001994 }
1995 }
1996
Jeff Brown3ee549c2014-09-22 20:14:39 -07001997 private final class ScreenOnUnblocker implements WindowManagerPolicy.ScreenOnListener {
1998 @Override
1999 public void onScreenOn() {
2000 Message msg = mHandler.obtainMessage(MSG_SCREEN_ON_UNBLOCKED, this);
Jeff Brown3ee549c2014-09-22 20:14:39 -07002001 mHandler.sendMessage(msg);
2002 }
2003 }
Jorim Jaggi51304d72017-05-17 17:25:32 +02002004
2005 private final class ScreenOffUnblocker implements WindowManagerPolicy.ScreenOffListener {
Jorim Jaggi51304d72017-05-17 17:25:32 +02002006 @Override
2007 public void onScreenOff() {
2008 Message msg = mHandler.obtainMessage(MSG_SCREEN_OFF_UNBLOCKED, this);
Jorim Jaggi51304d72017-05-17 17:25:32 +02002009 mHandler.sendMessage(msg);
2010 }
2011 }
Dan Gittika5a2d632019-01-09 14:25:29 +00002012
2013 void setAutoBrightnessLoggingEnabled(boolean enabled) {
2014 if (mAutomaticBrightnessController != null) {
2015 mAutomaticBrightnessController.setLoggingEnabled(enabled);
2016 }
2017 }
Dan Gittik8dbd7e92018-12-03 15:35:53 +00002018
2019 @Override // DisplayWhiteBalanceController.Callbacks
2020 public void updateWhiteBalance() {
2021 sendUpdatePowerState();
2022 }
2023
2024 void setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
2025 if (mDisplayWhiteBalanceController != null) {
2026 mDisplayWhiteBalanceController.setLoggingEnabled(enabled);
2027 mDisplayWhiteBalanceSettings.setLoggingEnabled(enabled);
2028 }
2029 }
2030
2031 void setAmbientColorTemperatureOverride(float cct) {
2032 if (mDisplayWhiteBalanceController != null) {
2033 mDisplayWhiteBalanceController.setAmbientColorTemperatureOverride(cct);
2034 // The ambient color temperature override is only applied when the ambient color
2035 // temperature changes or is updated, so it doesn't necessarily change the screen color
2036 // temperature immediately. So, let's make it!
2037 sendUpdatePowerState();
2038 }
2039 }
Santos Cordon71e482f2019-05-14 16:44:59 +01002040
2041 /**
2042 * Stores data about why the brightness was changed. Made up of one main
2043 * {@code BrightnessReason.REASON_*} reason and various {@code BrightnessReason.MODIFIER_*}
2044 * modifiers.
2045 */
2046 private final class BrightnessReason {
2047 static final int REASON_UNKNOWN = 0;
2048 static final int REASON_MANUAL = 1;
2049 static final int REASON_DOZE = 2;
2050 static final int REASON_DOZE_DEFAULT = 3;
2051 static final int REASON_AUTOMATIC = 4;
2052 static final int REASON_SCREEN_OFF = 5;
2053 static final int REASON_VR = 6;
2054 static final int REASON_OVERRIDE = 7;
2055 static final int REASON_TEMPORARY = 8;
2056 static final int REASON_BOOST = 9;
2057 static final int REASON_MAX = REASON_BOOST;
2058
2059 static final int MODIFIER_DIMMED = 0x1;
2060 static final int MODIFIER_LOW_POWER = 0x2;
2061 static final int MODIFIER_MASK = 0x3;
2062
2063 // ADJUSTMENT_*
2064 // These things can happen at any point, even if the main brightness reason doesn't
2065 // fundamentally change, so they're not stored.
2066
2067 // Auto-brightness adjustment factor changed
2068 static final int ADJUSTMENT_AUTO_TEMP = 0x1;
2069 // Temporary adjustment to the auto-brightness adjustment factor.
2070 static final int ADJUSTMENT_AUTO = 0x2;
2071
2072 // One of REASON_*
2073 public int reason;
2074 // Any number of MODIFIER_*
2075 public int modifier;
2076
2077 public void set(BrightnessReason other) {
2078 setReason(other == null ? REASON_UNKNOWN : other.reason);
2079 setModifier(other == null ? 0 : other.modifier);
2080 }
2081
2082 public void setReason(int reason) {
2083 if (reason < REASON_UNKNOWN || reason > REASON_MAX) {
2084 Slog.w(TAG, "brightness reason out of bounds: " + reason);
2085 } else {
2086 this.reason = reason;
2087 }
2088 }
2089
2090 public void setModifier(int modifier) {
2091 if ((modifier & ~MODIFIER_MASK) != 0) {
2092 Slog.w(TAG, "brightness modifier out of bounds: 0x"
2093 + Integer.toHexString(modifier));
2094 } else {
2095 this.modifier = modifier;
2096 }
2097 }
2098
2099 public void addModifier(int modifier) {
2100 setModifier(modifier | this.modifier);
2101 }
2102
2103 @Override
2104 public boolean equals(Object obj) {
2105 if (obj == null || !(obj instanceof BrightnessReason)) {
2106 return false;
2107 }
2108 BrightnessReason other = (BrightnessReason) obj;
2109 return other.reason == reason && other.modifier == modifier;
2110 }
2111
2112 @Override
2113 public String toString() {
2114 return toString(0);
2115 }
2116
2117 public String toString(int adjustments) {
2118 final StringBuilder sb = new StringBuilder();
2119 sb.append(reasonToString(reason));
2120 sb.append(" [");
2121 if ((adjustments & ADJUSTMENT_AUTO_TEMP) != 0) {
2122 sb.append(" temp_adj");
2123 }
2124 if ((adjustments & ADJUSTMENT_AUTO) != 0) {
2125 sb.append(" auto_adj");
2126 }
2127 if ((modifier & MODIFIER_LOW_POWER) != 0) {
2128 sb.append(" low_pwr");
2129 }
2130 if ((modifier & MODIFIER_DIMMED) != 0) {
2131 sb.append(" dim");
2132 }
2133 int strlen = sb.length();
2134 if (sb.charAt(strlen - 1) == '[') {
2135 sb.setLength(strlen - 2);
2136 } else {
2137 sb.append(" ]");
2138 }
2139 return sb.toString();
2140 }
2141
2142 private String reasonToString(int reason) {
2143 switch (reason) {
2144 case REASON_MANUAL: return "manual";
2145 case REASON_DOZE: return "doze";
2146 case REASON_DOZE_DEFAULT: return "doze_default";
2147 case REASON_AUTOMATIC: return "automatic";
2148 case REASON_SCREEN_OFF: return "screen_off";
2149 case REASON_VR: return "vr";
2150 case REASON_OVERRIDE: return "override";
2151 case REASON_TEMPORARY: return "temporary";
2152 case REASON_BOOST: return "boost";
2153 default: return Integer.toString(reason);
2154 }
2155 }
2156 }
Jeff Brown96307042012-07-27 15:51:34 -07002157}