• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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 
17 package com.android.server.power;
18 
19 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
20 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT;
21 import static android.os.PowerManagerInternal.MODE_DEVICE_IDLE;
22 import static android.os.PowerManagerInternal.MODE_DISPLAY_INACTIVE;
23 import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
24 import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
25 import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING;
26 import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING;
27 
28 import android.annotation.IntDef;
29 import android.annotation.NonNull;
30 import android.annotation.Nullable;
31 import android.annotation.UserIdInt;
32 import android.app.ActivityManager;
33 import android.app.SynchronousUserSwitchObserver;
34 import android.content.BroadcastReceiver;
35 import android.content.ContentResolver;
36 import android.content.Context;
37 import android.content.Intent;
38 import android.content.IntentFilter;
39 import android.content.pm.PackageManager;
40 import android.content.res.Resources;
41 import android.database.ContentObserver;
42 import android.hardware.SensorManager;
43 import android.hardware.SystemSensorManager;
44 import android.hardware.display.AmbientDisplayConfiguration;
45 import android.hardware.display.DisplayManagerInternal;
46 import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
47 import android.hardware.power.V1_0.PowerHint;
48 import android.net.Uri;
49 import android.os.BatteryManager;
50 import android.os.BatteryManagerInternal;
51 import android.os.BatterySaverPolicyConfig;
52 import android.os.Binder;
53 import android.os.Handler;
54 import android.os.IBinder;
55 import android.os.IPowerManager;
56 import android.os.Looper;
57 import android.os.Message;
58 import android.os.PowerManager;
59 import android.os.PowerManager.ServiceType;
60 import android.os.PowerManager.WakeData;
61 import android.os.PowerManager.WakeReason;
62 import android.os.PowerManagerInternal;
63 import android.os.PowerSaveState;
64 import android.os.Process;
65 import android.os.RemoteException;
66 import android.os.ResultReceiver;
67 import android.os.ShellCallback;
68 import android.os.SystemClock;
69 import android.os.SystemProperties;
70 import android.os.Trace;
71 import android.os.UserHandle;
72 import android.os.UserManager;
73 import android.os.WorkSource;
74 import android.os.WorkSource.WorkChain;
75 import android.provider.Settings;
76 import android.provider.Settings.SettingNotFoundException;
77 import android.service.dreams.DreamManagerInternal;
78 import android.service.vr.IVrManager;
79 import android.service.vr.IVrStateCallbacks;
80 import android.sysprop.InitProperties;
81 import android.util.KeyValueListParser;
82 import android.util.PrintWriterPrinter;
83 import android.util.Slog;
84 import android.util.SparseArray;
85 import android.util.TimeUtils;
86 import android.util.proto.ProtoOutputStream;
87 import android.view.Display;
88 import android.view.KeyEvent;
89 
90 import com.android.internal.BrightnessSynchronizer;
91 import com.android.internal.annotations.VisibleForTesting;
92 import com.android.internal.app.IAppOpsService;
93 import com.android.internal.app.IBatteryStats;
94 import com.android.internal.os.BackgroundThread;
95 import com.android.internal.util.DumpUtils;
96 import com.android.server.EventLogTags;
97 import com.android.server.LockGuard;
98 import com.android.server.RescueParty;
99 import com.android.server.ServiceThread;
100 import com.android.server.SystemService;
101 import com.android.server.UiThread;
102 import com.android.server.UserspaceRebootLogger;
103 import com.android.server.Watchdog;
104 import com.android.server.am.BatteryStatsService;
105 import com.android.server.lights.LightsManager;
106 import com.android.server.lights.LogicalLight;
107 import com.android.server.policy.WindowManagerPolicy;
108 import com.android.server.power.batterysaver.BatterySaverController;
109 import com.android.server.power.batterysaver.BatterySaverPolicy;
110 import com.android.server.power.batterysaver.BatterySaverStateMachine;
111 import com.android.server.power.batterysaver.BatterySavingStats;
112 
113 import java.io.FileDescriptor;
114 import java.io.PrintWriter;
115 import java.lang.annotation.Retention;
116 import java.lang.annotation.RetentionPolicy;
117 import java.util.ArrayList;
118 import java.util.Arrays;
119 import java.util.List;
120 import java.util.Objects;
121 
122 /**
123  * The power manager service is responsible for coordinating power management
124  * functions on the device.
125  */
126 public final class PowerManagerService extends SystemService
127         implements Watchdog.Monitor {
128     private static final String TAG = "PowerManagerService";
129 
130     private static final boolean DEBUG = false;
131     private static final boolean DEBUG_SPEW = DEBUG && true;
132 
133     // Message: Sent when a user activity timeout occurs to update the power state.
134     private static final int MSG_USER_ACTIVITY_TIMEOUT = 1;
135     // Message: Sent when the device enters or exits a dreaming or dozing state.
136     private static final int MSG_SANDMAN = 2;
137     // Message: Sent when the screen brightness boost expires.
138     private static final int MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 3;
139     // Message: Polling to look for long held wake locks.
140     private static final int MSG_CHECK_FOR_LONG_WAKELOCKS = 4;
141     // Message: Sent when an attentive timeout occurs to update the power state.
142     private static final int MSG_ATTENTIVE_TIMEOUT = 5;
143 
144     // Dirty bit: mWakeLocks changed
145     private static final int DIRTY_WAKE_LOCKS = 1 << 0;
146     // Dirty bit: mWakefulness changed
147     private static final int DIRTY_WAKEFULNESS = 1 << 1;
148     // Dirty bit: user activity was poked or may have timed out
149     private static final int DIRTY_USER_ACTIVITY = 1 << 2;
150     // Dirty bit: actual display power state was updated asynchronously
151     private static final int DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED = 1 << 3;
152     // Dirty bit: mBootCompleted changed
153     private static final int DIRTY_BOOT_COMPLETED = 1 << 4;
154     // Dirty bit: settings changed
155     private static final int DIRTY_SETTINGS = 1 << 5;
156     // Dirty bit: mIsPowered changed
157     private static final int DIRTY_IS_POWERED = 1 << 6;
158     // Dirty bit: mStayOn changed
159     private static final int DIRTY_STAY_ON = 1 << 7;
160     // Dirty bit: battery state changed
161     private static final int DIRTY_BATTERY_STATE = 1 << 8;
162     // Dirty bit: proximity state changed
163     private static final int DIRTY_PROXIMITY_POSITIVE = 1 << 9;
164     // Dirty bit: dock state changed
165     private static final int DIRTY_DOCK_STATE = 1 << 10;
166     // Dirty bit: brightness boost changed
167     private static final int DIRTY_SCREEN_BRIGHTNESS_BOOST = 1 << 11;
168     // Dirty bit: sQuiescent changed
169     private static final int DIRTY_QUIESCENT = 1 << 12;
170     // Dirty bit: VR Mode enabled changed
171     private static final int DIRTY_VR_MODE_CHANGED = 1 << 13;
172     // Dirty bit: attentive timer may have timed out
173     private static final int DIRTY_ATTENTIVE = 1 << 14;
174 
175     // Summarizes the state of all active wakelocks.
176     private static final int WAKE_LOCK_CPU = 1 << 0;
177     private static final int WAKE_LOCK_SCREEN_BRIGHT = 1 << 1;
178     private static final int WAKE_LOCK_SCREEN_DIM = 1 << 2;
179     private static final int WAKE_LOCK_BUTTON_BRIGHT = 1 << 3;
180     private static final int WAKE_LOCK_PROXIMITY_SCREEN_OFF = 1 << 4;
181     private static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
182     private static final int WAKE_LOCK_DOZE = 1 << 6;
183     private static final int WAKE_LOCK_DRAW = 1 << 7;
184 
185     // Summarizes the user activity state.
186     private static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
187     private static final int USER_ACTIVITY_SCREEN_DIM = 1 << 1;
188     private static final int USER_ACTIVITY_SCREEN_DREAM = 1 << 2;
189 
190     // Default timeout in milliseconds.  This is only used until the settings
191     // provider populates the actual default value (R.integer.def_screen_off_timeout).
192     private static final int DEFAULT_SCREEN_OFF_TIMEOUT = 15 * 1000;
193     private static final int DEFAULT_SLEEP_TIMEOUT = -1;
194 
195     // Screen brightness boost timeout.
196     // Hardcoded for now until we decide what the right policy should be.
197     // This should perhaps be a setting.
198     private static final int SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 5 * 1000;
199 
200     // Float.NaN cannot be stored in config.xml so -2 is used instead
201     private static final float INVALID_BRIGHTNESS_IN_CONFIG = -2f;
202 
203     // How long a partial wake lock must be held until we consider it a long wake lock.
204     static final long MIN_LONG_WAKE_CHECK_INTERVAL = 60*1000;
205 
206     // Power features defined in hardware/libhardware/include/hardware/power.h.
207     private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1;
208 
209     // Default setting for double tap to wake.
210     private static final int DEFAULT_DOUBLE_TAP_TO_WAKE = 0;
211 
212     // System property indicating that the screen should remain off until an explicit user action
213     private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
214 
215     // System Property indicating that retail demo mode is currently enabled.
216     private static final String SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED = "sys.retaildemo.enabled";
217 
218     // System property for last reboot reason
219     private static final String SYSTEM_PROPERTY_REBOOT_REASON = "sys.boot.reason";
220 
221     // Possible reasons for shutting down or reboot for use in
222     // SYSTEM_PROPERTY_REBOOT_REASON(sys.boot.reason) which is set by bootstat
223     private static final String REASON_SHUTDOWN = "shutdown";
224     private static final String REASON_REBOOT = "reboot";
225     private static final String REASON_USERREQUESTED = "shutdown,userrequested";
226     private static final String REASON_THERMAL_SHUTDOWN = "shutdown,thermal";
227     private static final String REASON_LOW_BATTERY = "shutdown,battery";
228     private static final String REASON_BATTERY_THERMAL_STATE = "shutdown,thermal,battery";
229 
230     private static final String TRACE_SCREEN_ON = "Screen turning on";
231 
232     /** If turning screen on takes more than this long, we show a warning on logcat. */
233     private static final int SCREEN_ON_LATENCY_WARNING_MS = 200;
234 
235     /** Constants for {@link #shutdownOrRebootInternal} */
236     @Retention(RetentionPolicy.SOURCE)
237     @IntDef({HALT_MODE_SHUTDOWN, HALT_MODE_REBOOT, HALT_MODE_REBOOT_SAFE_MODE})
238     public @interface HaltMode {}
239     private static final int HALT_MODE_SHUTDOWN = 0;
240     private static final int HALT_MODE_REBOOT = 1;
241     private static final int HALT_MODE_REBOOT_SAFE_MODE = 2;
242 
243     private final Context mContext;
244     private final ServiceThread mHandlerThread;
245     private final Handler mHandler;
246     private final AmbientDisplayConfiguration mAmbientDisplayConfiguration;
247     private final BatterySaverController mBatterySaverController;
248     private final BatterySaverPolicy mBatterySaverPolicy;
249     private final BatterySaverStateMachine mBatterySaverStateMachine;
250     private final BatterySavingStats mBatterySavingStats;
251     private final AttentionDetector mAttentionDetector;
252     private final BinderService mBinderService;
253     private final LocalService mLocalService;
254     private final NativeWrapper mNativeWrapper;
255     private final SystemPropertiesWrapper mSystemProperties;
256     private final Clock mClock;
257     private final Injector mInjector;
258 
259     private LightsManager mLightsManager;
260     private BatteryManagerInternal mBatteryManagerInternal;
261     private DisplayManagerInternal mDisplayManagerInternal;
262     private IBatteryStats mBatteryStats;
263     private IAppOpsService mAppOps;
264     private WindowManagerPolicy mPolicy;
265     private Notifier mNotifier;
266     private WirelessChargerDetector mWirelessChargerDetector;
267     private SettingsObserver mSettingsObserver;
268     private DreamManagerInternal mDreamManager;
269     private LogicalLight mAttentionLight;
270 
271     private InattentiveSleepWarningController mInattentiveSleepWarningOverlayController;
272     private final AmbientDisplaySuppressionController mAmbientDisplaySuppressionController;
273 
274     private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_POWER);
275 
276     // A bitfield that indicates what parts of the power state have
277     // changed and need to be recalculated.
278     private int mDirty;
279 
280     // Indicates whether the device is awake or asleep or somewhere in between.
281     // This is distinct from the screen power state, which is managed separately.
282     // Do not access directly; always use {@link #setWakefulness} and {@link getWakefulness}.
283     private int mWakefulnessRaw;
284     private boolean mWakefulnessChanging;
285 
286     // True if the sandman has just been summoned for the first time since entering the
287     // dreaming or dozing state.  Indicates whether a new dream should begin.
288     private boolean mSandmanSummoned;
289 
290     // True if MSG_SANDMAN has been scheduled.
291     private boolean mSandmanScheduled;
292 
293     // Table of all suspend blockers.
294     // There should only be a few of these.
295     private final ArrayList<SuspendBlocker> mSuspendBlockers = new ArrayList<SuspendBlocker>();
296 
297     // Table of all wake locks acquired by applications.
298     private final ArrayList<WakeLock> mWakeLocks = new ArrayList<WakeLock>();
299 
300     // A bitfield that summarizes the state of all active wakelocks.
301     private int mWakeLockSummary;
302 
303     // Have we scheduled a message to check for long wake locks?  This is when we will check.
304     private long mNotifyLongScheduled;
305 
306     // Last time we checked for long wake locks.
307     private long mNotifyLongDispatched;
308 
309     // The time we decided to do next long check.
310     private long mNotifyLongNextCheck;
311 
312     // If true, instructs the display controller to wait for the proximity sensor to
313     // go negative before turning the screen on.
314     private boolean mRequestWaitForNegativeProximity;
315 
316     // Timestamp of the last time the device was awoken or put to sleep.
317     private long mLastWakeTime;
318     private long mLastSleepTime;
319 
320     // Last reason the device went to sleep.
321     private @WakeReason int mLastWakeReason;
322     private int mLastSleepReason;
323 
324     // Timestamp of the last call to user activity.
325     private long mLastUserActivityTime;
326     private long mLastUserActivityTimeNoChangeLights;
327 
328     // Timestamp of last interactive power hint.
329     private long mLastInteractivePowerHintTime;
330 
331     // Timestamp of the last screen brightness boost.
332     private long mLastScreenBrightnessBoostTime;
333     private boolean mScreenBrightnessBoostInProgress;
334 
335     // A bitfield that summarizes the effect of the user activity timer.
336     private int mUserActivitySummary;
337 
338     // The desired display power state.  The actual state may lag behind the
339     // requested because it is updated asynchronously by the display power controller.
340     private final DisplayPowerRequest mDisplayPowerRequest = new DisplayPowerRequest();
341 
342     // True if the display power state has been fully applied, which means the display
343     // is actually on or actually off or whatever was requested.
344     private boolean mDisplayReady;
345 
346     // The suspend blocker used to keep the CPU alive when an application has acquired
347     // a wake lock.
348     private final SuspendBlocker mWakeLockSuspendBlocker;
349 
350     // True if the wake lock suspend blocker has been acquired.
351     private boolean mHoldingWakeLockSuspendBlocker;
352 
353     // The suspend blocker used to keep the CPU alive when the display is on, the
354     // display is getting ready or there is user activity (in which case the display
355     // must be on).
356     private final SuspendBlocker mDisplaySuspendBlocker;
357 
358     // True if the display suspend blocker has been acquired.
359     private boolean mHoldingDisplaySuspendBlocker;
360 
361     // True if systemReady() has been called.
362     private boolean mSystemReady;
363 
364     // True if boot completed occurred. We keep the screen on until this happens.
365     // The screen will be off if we are in quiescent mode.
366     private boolean mBootCompleted;
367 
368     // True if auto-suspend mode is enabled.
369     // Refer to autosuspend.h.
370     private boolean mHalAutoSuspendModeEnabled;
371 
372     // True if interactive mode is enabled.
373     // Refer to power.h.
374     private boolean mHalInteractiveModeEnabled;
375 
376     // True if the device is plugged into a power source.
377     private boolean mIsPowered;
378 
379     // The current plug type, such as BatteryManager.BATTERY_PLUGGED_WIRELESS.
380     private int mPlugType;
381 
382     // The current battery level percentage.
383     private int mBatteryLevel;
384 
385     // The battery level percentage at the time the dream started.
386     // This is used to terminate a dream and go to sleep if the battery is
387     // draining faster than it is charging and the user activity timeout has expired.
388     private int mBatteryLevelWhenDreamStarted;
389 
390     // The current dock state.
391     private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
392 
393     // True to decouple auto-suspend mode from the display state.
394     private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig;
395 
396     // True to decouple interactive mode from the display state.
397     private boolean mDecoupleHalInteractiveModeFromDisplayConfig;
398 
399     // True if the device should wake up when plugged or unplugged.
400     private boolean mWakeUpWhenPluggedOrUnpluggedConfig;
401 
402     // True if the device should wake up when plugged or unplugged in theater mode.
403     private boolean mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig;
404 
405     // True if the device should suspend when the screen is off due to proximity.
406     private boolean mSuspendWhenScreenOffDueToProximityConfig;
407 
408     // Default value for attentive timeout.
409     private int mAttentiveTimeoutConfig;
410 
411     // True if dreams are supported on this device.
412     private boolean mDreamsSupportedConfig;
413 
414     // Default value for dreams enabled
415     private boolean mDreamsEnabledByDefaultConfig;
416 
417     // Default value for dreams activate-on-sleep
418     private boolean mDreamsActivatedOnSleepByDefaultConfig;
419 
420     // Default value for dreams activate-on-dock
421     private boolean mDreamsActivatedOnDockByDefaultConfig;
422 
423     // True if dreams can run while not plugged in.
424     private boolean mDreamsEnabledOnBatteryConfig;
425 
426     // Minimum battery level to allow dreaming when powered.
427     // Use -1 to disable this safety feature.
428     private int mDreamsBatteryLevelMinimumWhenPoweredConfig;
429 
430     // Minimum battery level to allow dreaming when not powered.
431     // Use -1 to disable this safety feature.
432     private int mDreamsBatteryLevelMinimumWhenNotPoweredConfig;
433 
434     // If the battery level drops by this percentage and the user activity timeout
435     // has expired, then assume the device is receiving insufficient current to charge
436     // effectively and terminate the dream.  Use -1 to disable this safety feature.
437     private int mDreamsBatteryLevelDrainCutoffConfig;
438 
439     // True if dreams are enabled by the user.
440     private boolean mDreamsEnabledSetting;
441 
442     // True if dreams should be activated on sleep.
443     private boolean mDreamsActivateOnSleepSetting;
444 
445     // True if dreams should be activated on dock.
446     private boolean mDreamsActivateOnDockSetting;
447 
448     // True if doze should not be started until after the screen off transition.
449     private boolean mDozeAfterScreenOff;
450 
451     // The minimum screen off timeout, in milliseconds.
452     private long mMinimumScreenOffTimeoutConfig;
453 
454     // The screen dim duration, in milliseconds.
455     // This is subtracted from the end of the screen off timeout so the
456     // minimum screen off timeout should be longer than this.
457     private long mMaximumScreenDimDurationConfig;
458 
459     // The maximum screen dim time expressed as a ratio relative to the screen
460     // off timeout.  If the screen off timeout is very short then we want the
461     // dim timeout to also be quite short so that most of the time is spent on.
462     // Otherwise the user won't get much screen on time before dimming occurs.
463     private float mMaximumScreenDimRatioConfig;
464 
465     // Whether device supports double tap to wake.
466     private boolean mSupportsDoubleTapWakeConfig;
467 
468     // The screen off timeout setting value in milliseconds.
469     private long mScreenOffTimeoutSetting;
470 
471     // Default for attentive warning duration.
472     private long mAttentiveWarningDurationConfig;
473 
474     // The sleep timeout setting value in milliseconds.
475     private long mSleepTimeoutSetting;
476 
477     // How long to show a warning message to user before the device goes to sleep
478     // after long user inactivity, even if wakelocks are held.
479     private long mAttentiveTimeoutSetting;
480 
481     // The maximum allowable screen off timeout according to the device
482     // administration policy.  Overrides other settings.
483     private long mMaximumScreenOffTimeoutFromDeviceAdmin = Long.MAX_VALUE;
484 
485     // The stay on while plugged in setting.
486     // A bitfield of battery conditions under which to make the screen stay on.
487     private int mStayOnWhilePluggedInSetting;
488 
489     // True if the device should stay on.
490     private boolean mStayOn;
491 
492     // True if the lights should stay off until an explicit user action.
493     private static boolean sQuiescent;
494 
495     // True if the proximity sensor reads a positive result.
496     private boolean mProximityPositive;
497 
498     // Screen brightness setting limits.
499     private float mScreenBrightnessSettingMinimum;
500     private float mScreenBrightnessSettingMaximum;
501     private float mScreenBrightnessSettingDefault;
502     public final float mScreenBrightnessMinimum;
503     public final float mScreenBrightnessMaximum;
504     public final float mScreenBrightnessDefault;
505     public final float mScreenBrightnessDoze;
506     public final float mScreenBrightnessDim;
507     public final float mScreenBrightnessMinimumVr;
508     public final float mScreenBrightnessMaximumVr;
509     public final float mScreenBrightnessDefaultVr;
510 
511     // The screen brightness mode.
512     // One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
513     private int mScreenBrightnessModeSetting;
514 
515     // The screen brightness setting override from the window manager
516     // to allow the current foreground activity to override the brightness.
517     private float mScreenBrightnessOverrideFromWindowManager =
518             PowerManager.BRIGHTNESS_INVALID_FLOAT;
519 
520     // The window manager has determined the user to be inactive via other means.
521     // Set this to false to disable.
522     private boolean mUserInactiveOverrideFromWindowManager;
523 
524     // The next possible user activity timeout after being explicitly told the user is inactive.
525     // Set to -1 when not told the user is inactive since the last period spent dozing or asleep.
526     private long mOverriddenTimeout = -1;
527 
528     // The user activity timeout override from the window manager
529     // to allow the current foreground activity to override the user activity timeout.
530     // Use -1 to disable.
531     private long mUserActivityTimeoutOverrideFromWindowManager = -1;
532 
533     // The screen state to use while dozing.
534     private int mDozeScreenStateOverrideFromDreamManager = Display.STATE_UNKNOWN;
535 
536     // The screen brightness to use while dozing.
537     private int mDozeScreenBrightnessOverrideFromDreamManager = PowerManager.BRIGHTNESS_DEFAULT;
538 
539     private float mDozeScreenBrightnessOverrideFromDreamManagerFloat =
540             PowerManager.BRIGHTNESS_INVALID_FLOAT;
541     // Keep display state when dozing.
542     private boolean mDrawWakeLockOverrideFromSidekick;
543 
544     // Time when we last logged a warning about calling userActivity() without permission.
545     private long mLastWarningAboutUserActivityPermission = Long.MIN_VALUE;
546 
547     // True if the battery level is currently considered low.
548     private boolean mBatteryLevelLow;
549 
550     // True if we are currently in device idle mode.
551     private boolean mDeviceIdleMode;
552 
553     // True if we are currently in light device idle mode.
554     private boolean mLightDeviceIdleMode;
555 
556     // Set of app ids that we will always respect the wake locks for.
557     int[] mDeviceIdleWhitelist = new int[0];
558 
559     // Set of app ids that are temporarily allowed to acquire wakelocks due to high-pri message
560     int[] mDeviceIdleTempWhitelist = new int[0];
561 
562     private final SparseArray<UidState> mUidState = new SparseArray<>();
563 
564     // We are currently in the middle of a batch change of uids.
565     private boolean mUidsChanging;
566 
567     // Some uids have actually changed while mUidsChanging was true.
568     private boolean mUidsChanged;
569 
570     // True if theater mode is enabled
571     private boolean mTheaterModeEnabled;
572 
573     // True if always on display is enabled
574     private boolean mAlwaysOnEnabled;
575 
576     // True if double tap to wake is enabled
577     private boolean mDoubleTapWakeEnabled;
578 
579     // True if we are currently in VR Mode.
580     private boolean mIsVrModeEnabled;
581 
582     // True if we in the process of performing a forceSuspend
583     private boolean mForceSuspendActive;
584 
585     // Transition to Doze is in progress.  We have transitioned to WAKEFULNESS_DOZING,
586     // but the DreamService has not yet been told to start (it's an async process).
587     private boolean mDozeStartInProgress;
588 
589     private final class ForegroundProfileObserver extends SynchronousUserSwitchObserver {
590         @Override
onUserSwitching(@serIdInt int newUserId)591         public void onUserSwitching(@UserIdInt int newUserId) throws RemoteException {
592             synchronized (mLock) {
593                 mUserId = newUserId;
594             }
595         }
596 
597         @Override
onForegroundProfileSwitch(@serIdInt int newProfileId)598         public void onForegroundProfileSwitch(@UserIdInt int newProfileId) throws RemoteException {
599             final long now = mClock.uptimeMillis();
600             synchronized (mLock) {
601                 mForegroundProfile = newProfileId;
602                 maybeUpdateForegroundProfileLastActivityLocked(now);
603             }
604         }
605     }
606 
607     // User id corresponding to activity the user is currently interacting with.
608     private @UserIdInt int mForegroundProfile;
609     // User id of main profile for the current user (doesn't include managed profiles)
610     private @UserIdInt int mUserId;
611 
612     // Per-profile state to track when a profile should be locked.
613     private final SparseArray<ProfilePowerState> mProfilePowerState = new SparseArray<>();
614 
615     private static final class ProfilePowerState {
616         // Profile user id.
617         final @UserIdInt int mUserId;
618         // Maximum time to lock set by admin.
619         long mScreenOffTimeout;
620         // Like top-level mWakeLockSummary, but only for wake locks that affect current profile.
621         int mWakeLockSummary;
622         // Last user activity that happened in an app running in the profile.
623         long mLastUserActivityTime;
624         // Whether profile has been locked last time it timed out.
625         boolean mLockingNotified;
626 
ProfilePowerState(@serIdInt int userId, long screenOffTimeout, long now)627         public ProfilePowerState(@UserIdInt int userId, long screenOffTimeout, long now) {
628             mUserId = userId;
629             mScreenOffTimeout = screenOffTimeout;
630             // Not accurate but at least won't cause immediate locking of the profile.
631             mLastUserActivityTime = now;
632         }
633     }
634 
635     /**
636      * All times are in milliseconds. These constants are kept synchronized with the system
637      * global Settings. Any access to this class or its fields should be done while
638      * holding the PowerManagerService.mLock lock.
639      */
640     private final class Constants extends ContentObserver {
641         // Key names stored in the settings value.
642         private static final String KEY_NO_CACHED_WAKE_LOCKS = "no_cached_wake_locks";
643 
644         private static final boolean DEFAULT_NO_CACHED_WAKE_LOCKS = true;
645 
646         // Prevent processes that are cached from holding wake locks?
647         public boolean NO_CACHED_WAKE_LOCKS = DEFAULT_NO_CACHED_WAKE_LOCKS;
648 
649         private ContentResolver mResolver;
650         private final KeyValueListParser mParser = new KeyValueListParser(',');
651 
Constants(Handler handler)652         public Constants(Handler handler) {
653             super(handler);
654         }
655 
start(ContentResolver resolver)656         public void start(ContentResolver resolver) {
657             mResolver = resolver;
658             mResolver.registerContentObserver(Settings.Global.getUriFor(
659                     Settings.Global.POWER_MANAGER_CONSTANTS), false, this);
660             updateConstants();
661         }
662 
663         @Override
onChange(boolean selfChange, Uri uri)664         public void onChange(boolean selfChange, Uri uri) {
665             updateConstants();
666         }
667 
updateConstants()668         private void updateConstants() {
669             synchronized (mLock) {
670                 try {
671                     mParser.setString(Settings.Global.getString(mResolver,
672                             Settings.Global.POWER_MANAGER_CONSTANTS));
673                 } catch (IllegalArgumentException e) {
674                     // Failed to parse the settings string, log this and move on
675                     // with defaults.
676                     Slog.e(TAG, "Bad alarm manager settings", e);
677                 }
678 
679                 NO_CACHED_WAKE_LOCKS = mParser.getBoolean(KEY_NO_CACHED_WAKE_LOCKS,
680                         DEFAULT_NO_CACHED_WAKE_LOCKS);
681             }
682         }
683 
dump(PrintWriter pw)684         void dump(PrintWriter pw) {
685             pw.println("  Settings " + Settings.Global.POWER_MANAGER_CONSTANTS + ":");
686 
687             pw.print("    "); pw.print(KEY_NO_CACHED_WAKE_LOCKS); pw.print("=");
688             pw.println(NO_CACHED_WAKE_LOCKS);
689         }
690 
dumpProto(ProtoOutputStream proto)691         void dumpProto(ProtoOutputStream proto) {
692             final long constantsToken = proto.start(PowerManagerServiceDumpProto.CONSTANTS);
693             proto.write(PowerManagerServiceDumpProto.ConstantsProto.IS_NO_CACHED_WAKE_LOCKS,
694                     NO_CACHED_WAKE_LOCKS);
695             proto.end(constantsToken);
696         }
697     }
698 
699     /**
700      * Wrapper around the static-native methods of PowerManagerService.
701      *
702      * This class exists to allow us to mock static native methods in our tests. If mocking static
703      * methods becomes easier than this in the future, we can delete this class.
704      */
705     @VisibleForTesting
706     public static class NativeWrapper {
707         /** Wrapper for PowerManager.nativeInit */
nativeInit(PowerManagerService service)708         public void nativeInit(PowerManagerService service) {
709             service.nativeInit();
710         }
711 
712         /** Wrapper for PowerManager.nativeAcquireSuspectBlocker */
nativeAcquireSuspendBlocker(String name)713         public void nativeAcquireSuspendBlocker(String name) {
714             PowerManagerService.nativeAcquireSuspendBlocker(name);
715         }
716 
717         /** Wrapper for PowerManager.nativeReleaseSuspendBlocker */
nativeReleaseSuspendBlocker(String name)718         public void nativeReleaseSuspendBlocker(String name) {
719             PowerManagerService.nativeReleaseSuspendBlocker(name);
720         }
721 
722         /** Wrapper for PowerManager.nativeSetInteractive */
nativeSetInteractive(boolean enable)723         public void nativeSetInteractive(boolean enable) {
724             PowerManagerService.nativeSetInteractive(enable);
725         }
726 
727         /** Wrapper for PowerManager.nativeSetAutoSuspend */
nativeSetAutoSuspend(boolean enable)728         public void nativeSetAutoSuspend(boolean enable) {
729             PowerManagerService.nativeSetAutoSuspend(enable);
730         }
731 
732         /** Wrapper for PowerManager.nativeSendPowerHint */
nativeSendPowerHint(int hintId, int data)733         public void nativeSendPowerHint(int hintId, int data) {
734             PowerManagerService.nativeSendPowerHint(hintId, data);
735         }
736 
737         /** Wrapper for PowerManager.nativeSetPowerBoost */
nativeSetPowerBoost(int boost, int durationMs)738         public void nativeSetPowerBoost(int boost, int durationMs) {
739             PowerManagerService.nativeSetPowerBoost(boost, durationMs);
740         }
741 
742         /** Wrapper for PowerManager.nativeSetPowerMode */
nativeSetPowerMode(int mode, boolean enabled)743         public boolean nativeSetPowerMode(int mode, boolean enabled) {
744             return PowerManagerService.nativeSetPowerMode(mode, enabled);
745         }
746 
747         /** Wrapper for PowerManager.nativeSetFeature */
nativeSetFeature(int featureId, int data)748         public void nativeSetFeature(int featureId, int data) {
749             PowerManagerService.nativeSetFeature(featureId, data);
750         }
751 
752         /** Wrapper for PowerManager.nativeForceSuspend */
nativeForceSuspend()753         public boolean nativeForceSuspend() {
754             return PowerManagerService.nativeForceSuspend();
755         }
756     }
757 
758     /** Functional interface for providing time. */
759     @VisibleForTesting
760     interface Clock {
761         /**
762          * Returns current time in milliseconds since boot, not counting time spent in deep sleep.
763          */
uptimeMillis()764         long uptimeMillis();
765     }
766 
767     @VisibleForTesting
768     static class Injector {
createNotifier(Looper looper, Context context, IBatteryStats batteryStats, SuspendBlocker suspendBlocker, WindowManagerPolicy policy)769         Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
770                 SuspendBlocker suspendBlocker, WindowManagerPolicy policy) {
771             return new Notifier(looper, context, batteryStats, suspendBlocker, policy);
772         }
773 
createSuspendBlocker(PowerManagerService service, String name)774         SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
775             SuspendBlocker suspendBlocker = service.new SuspendBlockerImpl(name);
776             service.mSuspendBlockers.add(suspendBlocker);
777             return suspendBlocker;
778         }
779 
createBatterySaverPolicy( Object lock, Context context, BatterySavingStats batterySavingStats)780         BatterySaverPolicy createBatterySaverPolicy(
781                 Object lock, Context context, BatterySavingStats batterySavingStats) {
782             return new BatterySaverPolicy(lock, context, batterySavingStats);
783         }
784 
createBatterySaverController( Object lock, Context context, BatterySaverPolicy batterySaverPolicy, BatterySavingStats batterySavingStats)785         BatterySaverController createBatterySaverController(
786                 Object lock, Context context, BatterySaverPolicy batterySaverPolicy,
787                 BatterySavingStats batterySavingStats) {
788             return new BatterySaverController(lock, context, BackgroundThread.get().getLooper(),
789                     batterySaverPolicy, batterySavingStats);
790         }
791 
createBatterySaverStateMachine(Object lock, Context context, BatterySaverController batterySaverController)792         BatterySaverStateMachine createBatterySaverStateMachine(Object lock, Context context,
793                 BatterySaverController batterySaverController) {
794             return new BatterySaverStateMachine(lock, context, batterySaverController);
795         }
796 
createNativeWrapper()797         NativeWrapper createNativeWrapper() {
798             return new NativeWrapper();
799         }
800 
createWirelessChargerDetector( SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler)801         WirelessChargerDetector createWirelessChargerDetector(
802                 SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) {
803             return new WirelessChargerDetector(sensorManager, suspendBlocker, handler);
804         }
805 
createAmbientDisplayConfiguration(Context context)806         AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) {
807             return new AmbientDisplayConfiguration(context);
808         }
809 
createAmbientDisplaySuppressionController( Context context)810         AmbientDisplaySuppressionController createAmbientDisplaySuppressionController(
811                 Context context) {
812             return new AmbientDisplaySuppressionController(context);
813         }
814 
createInattentiveSleepWarningController()815         InattentiveSleepWarningController createInattentiveSleepWarningController() {
816             return new InattentiveSleepWarningController();
817         }
818 
createSystemPropertiesWrapper()819         public SystemPropertiesWrapper createSystemPropertiesWrapper() {
820             return new SystemPropertiesWrapper() {
821                 @Override
822                 public String get(String key, String def) {
823                     return SystemProperties.get(key, def);
824                 }
825 
826                 @Override
827                 public void set(String key, String val) {
828                     SystemProperties.set(key, val);
829                 }
830             };
831         }
832 
createClock()833         Clock createClock() {
834             return SystemClock::uptimeMillis;
835         }
836 
837         /**
838          * Handler for asynchronous operations performed by the power manager.
839          */
createHandler(Looper looper, Handler.Callback callback)840         Handler createHandler(Looper looper, Handler.Callback callback) {
841             return new Handler(looper, callback, true /*async*/);
842         }
843 
invalidateIsInteractiveCaches()844         void invalidateIsInteractiveCaches() {
845             PowerManager.invalidateIsInteractiveCaches();
846         }
847     }
848 
849     final Constants mConstants;
850 
851     private native void nativeInit();
852     private static native void nativeAcquireSuspendBlocker(String name);
853     private static native void nativeReleaseSuspendBlocker(String name);
854     private static native void nativeSetInteractive(boolean enable);
855     private static native void nativeSetAutoSuspend(boolean enable);
856     private static native void nativeSendPowerHint(int hintId, int data);
857     private static native void nativeSetPowerBoost(int boost, int durationMs);
858     private static native boolean nativeSetPowerMode(int mode, boolean enabled);
859     private static native void nativeSetFeature(int featureId, int data);
860     private static native boolean nativeForceSuspend();
861 
862     public PowerManagerService(Context context) {
863         this(context, new Injector());
864     }
865 
866     @VisibleForTesting
867     PowerManagerService(Context context, Injector injector) {
868         super(context);
869 
870         mContext = context;
871         mBinderService = new BinderService();
872         mLocalService = new LocalService();
873         mNativeWrapper = injector.createNativeWrapper();
874         mSystemProperties = injector.createSystemPropertiesWrapper();
875         mClock = injector.createClock();
876         mInjector = injector;
877 
878         mHandlerThread = new ServiceThread(TAG,
879                 Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
880         mHandlerThread.start();
881         mHandler = injector.createHandler(mHandlerThread.getLooper(),
882                 new PowerManagerHandlerCallback());
883         mConstants = new Constants(mHandler);
884         mAmbientDisplayConfiguration = mInjector.createAmbientDisplayConfiguration(context);
885         mAmbientDisplaySuppressionController =
886                 mInjector.createAmbientDisplaySuppressionController(context);
887         mAttentionDetector = new AttentionDetector(this::onUserAttention, mLock);
888 
889         mBatterySavingStats = new BatterySavingStats(mLock);
890         mBatterySaverPolicy =
891                 mInjector.createBatterySaverPolicy(mLock, mContext, mBatterySavingStats);
892         mBatterySaverController = mInjector.createBatterySaverController(mLock, mContext,
893                 mBatterySaverPolicy, mBatterySavingStats);
894         mBatterySaverStateMachine = mInjector.createBatterySaverStateMachine(mLock, mContext,
895                 mBatterySaverController);
896 
897         mInattentiveSleepWarningOverlayController =
898                 mInjector.createInattentiveSleepWarningController();
899 
900         // Save brightness values:
901         // Get float values from config.
902         // Store float if valid
903         // Otherwise, get int values and convert to float and then store.
904         final float min = mContext.getResources().getFloat(com.android.internal.R.dimen
905                 .config_screenBrightnessSettingMinimumFloat);
906         final float max = mContext.getResources().getFloat(com.android.internal.R.dimen
907                 .config_screenBrightnessSettingMaximumFloat);
908         final float def = mContext.getResources().getFloat(com.android.internal.R.dimen
909                 .config_screenBrightnessSettingDefaultFloat);
910         final float doze = mContext.getResources().getFloat(com.android.internal.R.dimen
911                 .config_screenBrightnessDozeFloat);
912         final float dim = mContext.getResources().getFloat(com.android.internal.R.dimen
913                 .config_screenBrightnessDimFloat);
914 
915         if (min == INVALID_BRIGHTNESS_IN_CONFIG || max == INVALID_BRIGHTNESS_IN_CONFIG
916                 || def == INVALID_BRIGHTNESS_IN_CONFIG) {
917             mScreenBrightnessMinimum = BrightnessSynchronizer.brightnessIntToFloat(
918                     mContext.getResources().getInteger(com.android.internal.R.integer
919                             .config_screenBrightnessSettingMinimum),
920                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
921                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
922             mScreenBrightnessMaximum = BrightnessSynchronizer.brightnessIntToFloat(
923                     mContext.getResources().getInteger(com.android.internal.R.integer
924                             .config_screenBrightnessSettingMaximum),
925                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
926                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
927             mScreenBrightnessDefault = BrightnessSynchronizer.brightnessIntToFloat(
928                     mContext.getResources().getInteger(com.android.internal.R.integer
929                             .config_screenBrightnessSettingDefault),
930                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
931                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
932         } else {
933             mScreenBrightnessMinimum = min;
934             mScreenBrightnessMaximum = max;
935             mScreenBrightnessDefault = def;
936         }
937         if (doze == INVALID_BRIGHTNESS_IN_CONFIG) {
938             mScreenBrightnessDoze = BrightnessSynchronizer.brightnessIntToFloat(
939                     mContext.getResources().getInteger(com.android.internal.R.integer
940                             .config_screenBrightnessDoze), PowerManager.BRIGHTNESS_OFF + 1,
941                     PowerManager.BRIGHTNESS_ON, PowerManager.BRIGHTNESS_MIN,
942                     PowerManager.BRIGHTNESS_MAX);
943         } else {
944             mScreenBrightnessDoze = doze;
945         }
946         if (dim == INVALID_BRIGHTNESS_IN_CONFIG) {
947             mScreenBrightnessDim = BrightnessSynchronizer.brightnessIntToFloat(
948                     mContext.getResources().getInteger(com.android.internal.R.integer
949                             .config_screenBrightnessDim), PowerManager.BRIGHTNESS_OFF + 1,
950                     PowerManager.BRIGHTNESS_ON, PowerManager.BRIGHTNESS_MIN,
951                     PowerManager.BRIGHTNESS_MAX);
952         } else {
953             mScreenBrightnessDim = dim;
954         }
955 
956         final float vrMin = mContext.getResources().getFloat(com.android.internal.R.dimen
957                 .config_screenBrightnessSettingForVrMinimumFloat);
958         final float vrMax = mContext.getResources().getFloat(com.android.internal.R.dimen
959                 .config_screenBrightnessSettingForVrMaximumFloat);
960         final float vrDef = mContext.getResources().getFloat(com.android.internal.R.dimen
961                 .config_screenBrightnessSettingForVrDefaultFloat);
962         if (vrMin == INVALID_BRIGHTNESS_IN_CONFIG || vrMax == INVALID_BRIGHTNESS_IN_CONFIG
963                 || vrDef == INVALID_BRIGHTNESS_IN_CONFIG) {
964             mScreenBrightnessMinimumVr = BrightnessSynchronizer.brightnessIntToFloat(
965                     mContext.getResources().getInteger(com.android.internal.R.integer
966                             .config_screenBrightnessForVrSettingMinimum),
967                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
968                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
969             mScreenBrightnessMaximumVr = BrightnessSynchronizer.brightnessIntToFloat(
970                     mContext.getResources().getInteger(com.android.internal.R.integer
971                             .config_screenBrightnessForVrSettingMaximum),
972                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
973                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
974             mScreenBrightnessDefaultVr = BrightnessSynchronizer.brightnessIntToFloat(
975                     mContext.getResources().getInteger(com.android.internal.R.integer
976                             .config_screenBrightnessForVrSettingDefault),
977                     PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
978                     PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
979         } else {
980             mScreenBrightnessMinimumVr = vrMin;
981             mScreenBrightnessMaximumVr = vrMax;
982             mScreenBrightnessDefaultVr = vrDef;
983         }
984 
985         synchronized (mLock) {
986             mWakeLockSuspendBlocker =
987                     mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks");
988             mDisplaySuspendBlocker =
989                     mInjector.createSuspendBlocker(this, "PowerManagerService.Display");
990             if (mDisplaySuspendBlocker != null) {
991                 mDisplaySuspendBlocker.acquire();
992                 mHoldingDisplaySuspendBlocker = true;
993             }
994             mHalAutoSuspendModeEnabled = false;
995             mHalInteractiveModeEnabled = true;
996 
997             mWakefulnessRaw = WAKEFULNESS_AWAKE;
998             sQuiescent = mSystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1")
999                     || InitProperties.userspace_reboot_in_progress().orElse(false);
1000 
1001             mNativeWrapper.nativeInit(this);
1002             mNativeWrapper.nativeSetAutoSuspend(false);
1003             mNativeWrapper.nativeSetInteractive(true);
1004             mNativeWrapper.nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
1005             mInjector.invalidateIsInteractiveCaches();
1006         }
1007     }
1008 
1009     @Override
1010     public void onStart() {
1011         publishBinderService(Context.POWER_SERVICE, mBinderService, /* allowIsolated= */ false,
1012                 DUMP_FLAG_PRIORITY_DEFAULT | DUMP_FLAG_PRIORITY_CRITICAL);
1013         publishLocalService(PowerManagerInternal.class, mLocalService);
1014 
1015         Watchdog.getInstance().addMonitor(this);
1016         Watchdog.getInstance().addThread(mHandler);
1017     }
1018 
1019     @Override
1020     public void onBootPhase(int phase) {
1021         synchronized (mLock) {
1022             if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
1023                 incrementBootCount();
1024 
1025             } else if (phase == PHASE_BOOT_COMPLETED) {
1026                 final long now = mClock.uptimeMillis();
1027                 mBootCompleted = true;
1028                 mDirty |= DIRTY_BOOT_COMPLETED;
1029 
1030                 mBatterySaverStateMachine.onBootCompleted();
1031                 userActivityNoUpdateLocked(
1032                         now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
1033 
1034                 if (sQuiescent) {
1035                     goToSleepNoUpdateLocked(mClock.uptimeMillis(),
1036                             PowerManager.GO_TO_SLEEP_REASON_QUIESCENT,
1037                             PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID);
1038                 }
1039                 updatePowerStateLocked();
1040             }
1041         }
1042     }
1043 
1044     public void systemReady(IAppOpsService appOps) {
1045         synchronized (mLock) {
1046             mSystemReady = true;
1047             mAppOps = appOps;
1048             mDreamManager = getLocalService(DreamManagerInternal.class);
1049             mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);
1050             mPolicy = getLocalService(WindowManagerPolicy.class);
1051             mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);
1052             mAttentionDetector.systemReady(mContext);
1053 
1054             PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
1055             mScreenBrightnessSettingMinimum = pm.getBrightnessConstraint(
1056                     PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
1057             mScreenBrightnessSettingMaximum = pm.getBrightnessConstraint(
1058                     PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM);
1059             mScreenBrightnessSettingDefault = pm.getBrightnessConstraint(
1060                     PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT);
1061 
1062             SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
1063 
1064             // The notifier runs on the system server's main looper so as not to interfere
1065             // with the animations and other critical functions of the power manager.
1066             mBatteryStats = BatteryStatsService.getService();
1067             mNotifier = mInjector.createNotifier(Looper.getMainLooper(), mContext, mBatteryStats,
1068                     mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"),
1069                     mPolicy);
1070 
1071             mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager,
1072                     mInjector.createSuspendBlocker(
1073                             this, "PowerManagerService.WirelessChargerDetector"),
1074                     mHandler);
1075             mSettingsObserver = new SettingsObserver(mHandler);
1076 
1077             mLightsManager = getLocalService(LightsManager.class);
1078             mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
1079 
1080             // Initialize display power management.
1081             mDisplayManagerInternal.initPowerManagement(
1082                     mDisplayPowerCallbacks, mHandler, sensorManager);
1083 
1084             try {
1085                 final ForegroundProfileObserver observer = new ForegroundProfileObserver();
1086                 ActivityManager.getService().registerUserSwitchObserver(observer, TAG);
1087             } catch (RemoteException e) {
1088                 // Shouldn't happen since in-process.
1089             }
1090 
1091             // Go.
1092             readConfigurationLocked();
1093             updateSettingsLocked();
1094             mDirty |= DIRTY_BATTERY_STATE;
1095             updatePowerStateLocked();
1096         }
1097 
1098         final ContentResolver resolver = mContext.getContentResolver();
1099         mConstants.start(resolver);
1100 
1101         mBatterySaverController.systemReady();
1102         mBatterySaverPolicy.systemReady();
1103 
1104         // Register for settings changes.
1105         resolver.registerContentObserver(Settings.Secure.getUriFor(
1106                 Settings.Secure.SCREENSAVER_ENABLED),
1107                 false, mSettingsObserver, UserHandle.USER_ALL);
1108         resolver.registerContentObserver(Settings.Secure.getUriFor(
1109                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
1110                 false, mSettingsObserver, UserHandle.USER_ALL);
1111         resolver.registerContentObserver(Settings.Secure.getUriFor(
1112                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
1113                 false, mSettingsObserver, UserHandle.USER_ALL);
1114         resolver.registerContentObserver(Settings.System.getUriFor(
1115                 Settings.System.SCREEN_OFF_TIMEOUT),
1116                 false, mSettingsObserver, UserHandle.USER_ALL);
1117         resolver.registerContentObserver(Settings.Secure.getUriFor(
1118                 Settings.Secure.SLEEP_TIMEOUT),
1119                 false, mSettingsObserver, UserHandle.USER_ALL);
1120         resolver.registerContentObserver(Settings.Secure.getUriFor(
1121                 Settings.Secure.ATTENTIVE_TIMEOUT),
1122                 false, mSettingsObserver, UserHandle.USER_ALL);
1123         resolver.registerContentObserver(Settings.Global.getUriFor(
1124                 Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
1125                 false, mSettingsObserver, UserHandle.USER_ALL);
1126         resolver.registerContentObserver(Settings.System.getUriFor(
1127                 Settings.System.SCREEN_BRIGHTNESS_MODE),
1128                 false, mSettingsObserver, UserHandle.USER_ALL);
1129         resolver.registerContentObserver(Settings.System.getUriFor(
1130                 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
1131                 false, mSettingsObserver, UserHandle.USER_ALL);
1132         resolver.registerContentObserver(Settings.Global.getUriFor(
1133                 Settings.Global.THEATER_MODE_ON),
1134                 false, mSettingsObserver, UserHandle.USER_ALL);
1135         resolver.registerContentObserver(Settings.Secure.getUriFor(
1136                 Settings.Secure.DOZE_ALWAYS_ON),
1137                 false, mSettingsObserver, UserHandle.USER_ALL);
1138         resolver.registerContentObserver(Settings.Secure.getUriFor(
1139                 Settings.Secure.DOUBLE_TAP_TO_WAKE),
1140                 false, mSettingsObserver, UserHandle.USER_ALL);
1141         resolver.registerContentObserver(Settings.Global.getUriFor(
1142                 Settings.Global.DEVICE_DEMO_MODE),
1143                 false, mSettingsObserver, UserHandle.USER_SYSTEM);
1144         IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE));
1145         if (vrManager != null) {
1146             try {
1147                 vrManager.registerListener(mVrStateCallbacks);
1148             } catch (RemoteException e) {
1149                 Slog.e(TAG, "Failed to register VR mode state listener: " + e);
1150             }
1151         }
1152 
1153         // Register for broadcasts from other components of the system.
1154         IntentFilter filter = new IntentFilter();
1155         filter.addAction(Intent.ACTION_BATTERY_CHANGED);
1156         filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
1157         mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);
1158 
1159         filter = new IntentFilter();
1160         filter.addAction(Intent.ACTION_DREAMING_STARTED);
1161         filter.addAction(Intent.ACTION_DREAMING_STOPPED);
1162         mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);
1163 
1164         filter = new IntentFilter();
1165         filter.addAction(Intent.ACTION_USER_SWITCHED);
1166         mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
1167 
1168         filter = new IntentFilter();
1169         filter.addAction(Intent.ACTION_DOCK_EVENT);
1170         mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
1171     }
1172 
1173     @VisibleForTesting
1174     void readConfigurationLocked() {
1175         final Resources resources = mContext.getResources();
1176 
1177         mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean(
1178                 com.android.internal.R.bool.config_powerDecoupleAutoSuspendModeFromDisplay);
1179         mDecoupleHalInteractiveModeFromDisplayConfig = resources.getBoolean(
1180                 com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay);
1181         mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean(
1182                 com.android.internal.R.bool.config_unplugTurnsOnScreen);
1183         mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean(
1184                 com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug);
1185         mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean(
1186                 com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity);
1187         mAttentiveTimeoutConfig = resources.getInteger(
1188                 com.android.internal.R.integer.config_attentiveTimeout);
1189         mAttentiveWarningDurationConfig = resources.getInteger(
1190                 com.android.internal.R.integer.config_attentiveWarningDuration);
1191         mDreamsSupportedConfig = resources.getBoolean(
1192                 com.android.internal.R.bool.config_dreamsSupported);
1193         mDreamsEnabledByDefaultConfig = resources.getBoolean(
1194                 com.android.internal.R.bool.config_dreamsEnabledByDefault);
1195         mDreamsActivatedOnSleepByDefaultConfig = resources.getBoolean(
1196                 com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
1197         mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean(
1198                 com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
1199         mDreamsEnabledOnBatteryConfig = resources.getBoolean(
1200                 com.android.internal.R.bool.config_dreamsEnabledOnBattery);
1201         mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger(
1202                 com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenPowered);
1203         mDreamsBatteryLevelMinimumWhenNotPoweredConfig = resources.getInteger(
1204                 com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered);
1205         mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger(
1206                 com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff);
1207         mDozeAfterScreenOff = resources.getBoolean(
1208                 com.android.internal.R.bool.config_dozeAfterScreenOffByDefault);
1209         mMinimumScreenOffTimeoutConfig = resources.getInteger(
1210                 com.android.internal.R.integer.config_minimumScreenOffTimeout);
1211         mMaximumScreenDimDurationConfig = resources.getInteger(
1212                 com.android.internal.R.integer.config_maximumScreenDimDuration);
1213         mMaximumScreenDimRatioConfig = resources.getFraction(
1214                 com.android.internal.R.fraction.config_maximumScreenDimRatio, 1, 1);
1215         mSupportsDoubleTapWakeConfig = resources.getBoolean(
1216                 com.android.internal.R.bool.config_supportDoubleTapWake);
1217     }
1218 
1219     private void updateSettingsLocked() {
1220         final ContentResolver resolver = mContext.getContentResolver();
1221 
1222         mDreamsEnabledSetting = (Settings.Secure.getIntForUser(resolver,
1223                 Settings.Secure.SCREENSAVER_ENABLED,
1224                 mDreamsEnabledByDefaultConfig ? 1 : 0,
1225                 UserHandle.USER_CURRENT) != 0);
1226         mDreamsActivateOnSleepSetting = (Settings.Secure.getIntForUser(resolver,
1227                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
1228                 mDreamsActivatedOnSleepByDefaultConfig ? 1 : 0,
1229                 UserHandle.USER_CURRENT) != 0);
1230         mDreamsActivateOnDockSetting = (Settings.Secure.getIntForUser(resolver,
1231                 Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
1232                 mDreamsActivatedOnDockByDefaultConfig ? 1 : 0,
1233                 UserHandle.USER_CURRENT) != 0);
1234         mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,
1235                 Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,
1236                 UserHandle.USER_CURRENT);
1237         mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver,
1238                 Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT,
1239                 UserHandle.USER_CURRENT);
1240         mAttentiveTimeoutSetting = Settings.Secure.getIntForUser(resolver,
1241                 Settings.Secure.ATTENTIVE_TIMEOUT, mAttentiveTimeoutConfig,
1242                 UserHandle.USER_CURRENT);
1243         mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver,
1244                 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
1245         mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(),
1246                 Settings.Global.THEATER_MODE_ON, 0) == 1;
1247         mAlwaysOnEnabled = mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT);
1248 
1249         if (mSupportsDoubleTapWakeConfig) {
1250             boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver,
1251                     Settings.Secure.DOUBLE_TAP_TO_WAKE, DEFAULT_DOUBLE_TAP_TO_WAKE,
1252                             UserHandle.USER_CURRENT) != 0;
1253             if (doubleTapWakeEnabled != mDoubleTapWakeEnabled) {
1254                 mDoubleTapWakeEnabled = doubleTapWakeEnabled;
1255                 mNativeWrapper.nativeSetFeature(
1256                         POWER_FEATURE_DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled ? 1 : 0);
1257             }
1258         }
1259 
1260         final String retailDemoValue = UserManager.isDeviceInDemoMode(mContext) ? "1" : "0";
1261         if (!retailDemoValue.equals(
1262                 mSystemProperties.get(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, null))) {
1263             mSystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, retailDemoValue);
1264         }
1265 
1266         mScreenBrightnessModeSetting = Settings.System.getIntForUser(resolver,
1267                 Settings.System.SCREEN_BRIGHTNESS_MODE,
1268                 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT);
1269 
1270         mDirty |= DIRTY_SETTINGS;
1271     }
1272 
1273     private void handleSettingsChangedLocked() {
1274         updateSettingsLocked();
1275         updatePowerStateLocked();
1276     }
1277 
1278     private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName,
1279             WorkSource ws, String historyTag, int uid, int pid) {
1280         synchronized (mLock) {
1281             if (DEBUG_SPEW) {
1282                 Slog.d(TAG, "acquireWakeLockInternal: lock=" + Objects.hashCode(lock)
1283                         + ", flags=0x" + Integer.toHexString(flags)
1284                         + ", tag=\"" + tag + "\", ws=" + ws + ", uid=" + uid + ", pid=" + pid);
1285             }
1286 
1287             WakeLock wakeLock;
1288             int index = findWakeLockIndexLocked(lock);
1289             boolean notifyAcquire;
1290             if (index >= 0) {
1291                 wakeLock = mWakeLocks.get(index);
1292                 if (!wakeLock.hasSameProperties(flags, tag, ws, uid, pid)) {
1293                     // Update existing wake lock.  This shouldn't happen but is harmless.
1294                     notifyWakeLockChangingLocked(wakeLock, flags, tag, packageName,
1295                             uid, pid, ws, historyTag);
1296                     wakeLock.updateProperties(flags, tag, packageName, ws, historyTag, uid, pid);
1297                 }
1298                 notifyAcquire = false;
1299             } else {
1300                 UidState state = mUidState.get(uid);
1301                 if (state == null) {
1302                     state = new UidState(uid);
1303                     state.mProcState = ActivityManager.PROCESS_STATE_NONEXISTENT;
1304                     mUidState.put(uid, state);
1305                 }
1306                 state.mNumWakeLocks++;
1307                 wakeLock = new WakeLock(lock, flags, tag, packageName, ws, historyTag, uid, pid,
1308                         state);
1309                 try {
1310                     lock.linkToDeath(wakeLock, 0);
1311                 } catch (RemoteException ex) {
1312                     throw new IllegalArgumentException("Wake lock is already dead.");
1313                 }
1314                 mWakeLocks.add(wakeLock);
1315                 setWakeLockDisabledStateLocked(wakeLock);
1316                 notifyAcquire = true;
1317             }
1318 
1319             applyWakeLockFlagsOnAcquireLocked(wakeLock, uid);
1320             mDirty |= DIRTY_WAKE_LOCKS;
1321             updatePowerStateLocked();
1322             if (notifyAcquire) {
1323                 // This needs to be done last so we are sure we have acquired the
1324                 // kernel wake lock.  Otherwise we have a race where the system may
1325                 // go to sleep between the time we start the accounting in battery
1326                 // stats and when we actually get around to telling the kernel to
1327                 // stay awake.
1328                 notifyWakeLockAcquiredLocked(wakeLock);
1329             }
1330         }
1331     }
1332 
1333     @SuppressWarnings("deprecation")
1334     private static boolean isScreenLock(final WakeLock wakeLock) {
1335         switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
1336             case PowerManager.FULL_WAKE_LOCK:
1337             case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
1338             case PowerManager.SCREEN_DIM_WAKE_LOCK:
1339                 return true;
1340         }
1341         return false;
1342     }
1343 
1344     private static WorkChain getFirstNonEmptyWorkChain(WorkSource workSource) {
1345         if (workSource.getWorkChains() == null) {
1346             return null;
1347         }
1348 
1349         for (WorkChain workChain: workSource.getWorkChains()) {
1350             if (workChain.getSize() > 0) {
1351                 return workChain;
1352             }
1353         }
1354 
1355         return null;
1356     }
1357 
1358     private void applyWakeLockFlagsOnAcquireLocked(WakeLock wakeLock, int uid) {
1359         if ((wakeLock.mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0
1360                 && isScreenLock(wakeLock)) {
1361             String opPackageName;
1362             int opUid;
1363             if (wakeLock.mWorkSource != null && !wakeLock.mWorkSource.isEmpty()) {
1364                 WorkSource workSource = wakeLock.mWorkSource;
1365                 WorkChain workChain = getFirstNonEmptyWorkChain(workSource);
1366                 if (workChain != null) {
1367                     opPackageName = workChain.getAttributionTag();
1368                     opUid = workChain.getAttributionUid();
1369                 } else {
1370                     opPackageName = workSource.getPackageName(0) != null
1371                             ? workSource.getPackageName(0) : wakeLock.mPackageName;
1372                     opUid = workSource.getUid(0);
1373                 }
1374             } else {
1375                 opPackageName = wakeLock.mPackageName;
1376                 opUid = wakeLock.mOwnerUid;
1377             }
1378             wakeUpNoUpdateLocked(mClock.uptimeMillis(),
1379                     PowerManager.WAKE_REASON_APPLICATION, wakeLock.mTag,
1380                     opUid, opPackageName, opUid);
1381         }
1382     }
1383 
1384     private void releaseWakeLockInternal(IBinder lock, int flags) {
1385         synchronized (mLock) {
1386             int index = findWakeLockIndexLocked(lock);
1387             if (index < 0) {
1388                 if (DEBUG_SPEW) {
1389                     Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock)
1390                             + " [not found], flags=0x" + Integer.toHexString(flags));
1391                 }
1392                 return;
1393             }
1394 
1395             WakeLock wakeLock = mWakeLocks.get(index);
1396             if (DEBUG_SPEW) {
1397                 Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock)
1398                         + " [" + wakeLock.mTag + "], flags=0x" + Integer.toHexString(flags));
1399             }
1400 
1401             if ((flags & PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY) != 0) {
1402                 mRequestWaitForNegativeProximity = true;
1403             }
1404 
1405             wakeLock.mLock.unlinkToDeath(wakeLock, 0);
1406             removeWakeLockLocked(wakeLock, index);
1407         }
1408     }
1409 
1410     private void handleWakeLockDeath(WakeLock wakeLock) {
1411         synchronized (mLock) {
1412             if (DEBUG_SPEW) {
1413                 Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock)
1414                         + " [" + wakeLock.mTag + "]");
1415             }
1416 
1417             int index = mWakeLocks.indexOf(wakeLock);
1418             if (index < 0) {
1419                 return;
1420             }
1421 
1422             removeWakeLockLocked(wakeLock, index);
1423         }
1424     }
1425 
1426     private void removeWakeLockLocked(WakeLock wakeLock, int index) {
1427         mWakeLocks.remove(index);
1428         UidState state = wakeLock.mUidState;
1429         state.mNumWakeLocks--;
1430         if (state.mNumWakeLocks <= 0 &&
1431                 state.mProcState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
1432             mUidState.remove(state.mUid);
1433         }
1434         notifyWakeLockReleasedLocked(wakeLock);
1435 
1436         applyWakeLockFlagsOnReleaseLocked(wakeLock);
1437         mDirty |= DIRTY_WAKE_LOCKS;
1438         updatePowerStateLocked();
1439     }
1440 
1441     private void applyWakeLockFlagsOnReleaseLocked(WakeLock wakeLock) {
1442         if ((wakeLock.mFlags & PowerManager.ON_AFTER_RELEASE) != 0
1443                 && isScreenLock(wakeLock)) {
1444             userActivityNoUpdateLocked(mClock.uptimeMillis(),
1445                     PowerManager.USER_ACTIVITY_EVENT_OTHER,
1446                     PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS,
1447                     wakeLock.mOwnerUid);
1448         }
1449     }
1450 
1451     private void updateWakeLockWorkSourceInternal(IBinder lock, WorkSource ws, String historyTag,
1452             int callingUid) {
1453         synchronized (mLock) {
1454             int index = findWakeLockIndexLocked(lock);
1455             if (index < 0) {
1456                 if (DEBUG_SPEW) {
1457                     Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock)
1458                             + " [not found], ws=" + ws);
1459                 }
1460                 throw new IllegalArgumentException("Wake lock not active: " + lock
1461                         + " from uid " + callingUid);
1462             }
1463 
1464             WakeLock wakeLock = mWakeLocks.get(index);
1465             if (DEBUG_SPEW) {
1466                 Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock)
1467                         + " [" + wakeLock.mTag + "], ws=" + ws);
1468             }
1469 
1470             if (!wakeLock.hasSameWorkSource(ws)) {
1471                 notifyWakeLockChangingLocked(wakeLock, wakeLock.mFlags, wakeLock.mTag,
1472                         wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid,
1473                         ws, historyTag);
1474                 wakeLock.mHistoryTag = historyTag;
1475                 wakeLock.updateWorkSource(ws);
1476             }
1477         }
1478     }
1479 
1480     private int findWakeLockIndexLocked(IBinder lock) {
1481         final int count = mWakeLocks.size();
1482         for (int i = 0; i < count; i++) {
1483             if (mWakeLocks.get(i).mLock == lock) {
1484                 return i;
1485             }
1486         }
1487         return -1;
1488     }
1489 
1490     private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) {
1491         if (mSystemReady && !wakeLock.mDisabled) {
1492             wakeLock.mNotifiedAcquired = true;
1493             mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
1494                     wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource,
1495                     wakeLock.mHistoryTag);
1496             restartNofifyLongTimerLocked(wakeLock);
1497         }
1498     }
1499 
1500     private void enqueueNotifyLongMsgLocked(long time) {
1501         mNotifyLongScheduled = time;
1502         Message msg = mHandler.obtainMessage(MSG_CHECK_FOR_LONG_WAKELOCKS);
1503         msg.setAsynchronous(true);
1504         mHandler.sendMessageAtTime(msg, time);
1505     }
1506 
1507     private void restartNofifyLongTimerLocked(WakeLock wakeLock) {
1508         wakeLock.mAcquireTime = mClock.uptimeMillis();
1509         if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
1510                 == PowerManager.PARTIAL_WAKE_LOCK && mNotifyLongScheduled == 0) {
1511             enqueueNotifyLongMsgLocked(wakeLock.mAcquireTime + MIN_LONG_WAKE_CHECK_INTERVAL);
1512         }
1513     }
1514 
1515     private void notifyWakeLockLongStartedLocked(WakeLock wakeLock) {
1516         if (mSystemReady && !wakeLock.mDisabled) {
1517             wakeLock.mNotifiedLong = true;
1518             mNotifier.onLongPartialWakeLockStart(wakeLock.mTag, wakeLock.mOwnerUid,
1519                     wakeLock.mWorkSource, wakeLock.mHistoryTag);
1520         }
1521     }
1522 
1523     private void notifyWakeLockLongFinishedLocked(WakeLock wakeLock) {
1524         if (wakeLock.mNotifiedLong) {
1525             wakeLock.mNotifiedLong = false;
1526             mNotifier.onLongPartialWakeLockFinish(wakeLock.mTag, wakeLock.mOwnerUid,
1527                     wakeLock.mWorkSource, wakeLock.mHistoryTag);
1528         }
1529     }
1530 
1531     private void notifyWakeLockChangingLocked(WakeLock wakeLock, int flags, String tag,
1532             String packageName, int uid, int pid, WorkSource ws, String historyTag) {
1533         if (mSystemReady && wakeLock.mNotifiedAcquired) {
1534             mNotifier.onWakeLockChanging(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
1535                     wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource,
1536                     wakeLock.mHistoryTag, flags, tag, packageName, uid, pid, ws, historyTag);
1537             notifyWakeLockLongFinishedLocked(wakeLock);
1538             // Changing the wake lock will count as releasing the old wake lock(s) and
1539             // acquiring the new ones...  we do this because otherwise once a wakelock
1540             // becomes long, if we just continued to treat it as long we can get in to
1541             // situations where we spam battery stats with every following change to it.
1542             restartNofifyLongTimerLocked(wakeLock);
1543         }
1544     }
1545 
1546     private void notifyWakeLockReleasedLocked(WakeLock wakeLock) {
1547         if (mSystemReady && wakeLock.mNotifiedAcquired) {
1548             wakeLock.mNotifiedAcquired = false;
1549             wakeLock.mAcquireTime = 0;
1550             mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag,
1551                     wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid,
1552                     wakeLock.mWorkSource, wakeLock.mHistoryTag);
1553             notifyWakeLockLongFinishedLocked(wakeLock);
1554         }
1555     }
1556 
1557     @SuppressWarnings("deprecation")
1558     private boolean isWakeLockLevelSupportedInternal(int level) {
1559         synchronized (mLock) {
1560             switch (level) {
1561                 case PowerManager.PARTIAL_WAKE_LOCK:
1562                 case PowerManager.SCREEN_DIM_WAKE_LOCK:
1563                 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
1564                 case PowerManager.FULL_WAKE_LOCK:
1565                 case PowerManager.DOZE_WAKE_LOCK:
1566                 case PowerManager.DRAW_WAKE_LOCK:
1567                     return true;
1568 
1569                 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
1570                     return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
1571 
1572                 default:
1573                     return false;
1574             }
1575         }
1576     }
1577 
1578     // Called from native code.
1579     private void userActivityFromNative(long eventTime, int event, int flags) {
1580         userActivityInternal(eventTime, event, flags, Process.SYSTEM_UID);
1581     }
1582 
1583     private void userActivityInternal(long eventTime, int event, int flags, int uid) {
1584         synchronized (mLock) {
1585             if (userActivityNoUpdateLocked(eventTime, event, flags, uid)) {
1586                 updatePowerStateLocked();
1587             }
1588         }
1589     }
1590 
1591     private void onUserAttention() {
1592         synchronized (mLock) {
1593             if (userActivityNoUpdateLocked(mClock.uptimeMillis(),
1594                     PowerManager.USER_ACTIVITY_EVENT_ATTENTION, 0 /* flags */,
1595                     Process.SYSTEM_UID)) {
1596                 updatePowerStateLocked();
1597             }
1598         }
1599     }
1600 
1601     private boolean userActivityNoUpdateLocked(long eventTime, int event, int flags, int uid) {
1602         if (DEBUG_SPEW) {
1603             Slog.d(TAG, "userActivityNoUpdateLocked: eventTime=" + eventTime
1604                     + ", event=" + event + ", flags=0x" + Integer.toHexString(flags)
1605                     + ", uid=" + uid);
1606         }
1607 
1608         if (eventTime < mLastSleepTime || eventTime < mLastWakeTime || !mSystemReady) {
1609             return false;
1610         }
1611 
1612         Trace.traceBegin(Trace.TRACE_TAG_POWER, "userActivity");
1613         try {
1614             if (eventTime > mLastInteractivePowerHintTime) {
1615                 powerHintInternal(PowerHint.INTERACTION, 0);
1616                 mLastInteractivePowerHintTime = eventTime;
1617             }
1618 
1619             mNotifier.onUserActivity(event, uid);
1620             mAttentionDetector.onUserActivity(eventTime, event);
1621 
1622             if (mUserInactiveOverrideFromWindowManager) {
1623                 mUserInactiveOverrideFromWindowManager = false;
1624                 mOverriddenTimeout = -1;
1625             }
1626 
1627             if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP
1628                     || getWakefulnessLocked() == WAKEFULNESS_DOZING
1629                     || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) {
1630                 return false;
1631             }
1632 
1633             maybeUpdateForegroundProfileLastActivityLocked(eventTime);
1634 
1635             if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) {
1636                 if (eventTime > mLastUserActivityTimeNoChangeLights
1637                         && eventTime > mLastUserActivityTime) {
1638                     mLastUserActivityTimeNoChangeLights = eventTime;
1639                     mDirty |= DIRTY_USER_ACTIVITY;
1640                     if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) {
1641                         mDirty |= DIRTY_QUIESCENT;
1642                     }
1643 
1644                     return true;
1645                 }
1646             } else {
1647                 if (eventTime > mLastUserActivityTime) {
1648                     mLastUserActivityTime = eventTime;
1649                     mDirty |= DIRTY_USER_ACTIVITY;
1650                     if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) {
1651                         mDirty |= DIRTY_QUIESCENT;
1652                     }
1653                     return true;
1654                 }
1655             }
1656         } finally {
1657             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1658         }
1659         return false;
1660     }
1661 
1662     private void maybeUpdateForegroundProfileLastActivityLocked(long eventTime) {
1663         final ProfilePowerState profile = mProfilePowerState.get(mForegroundProfile);
1664         if (profile != null && eventTime > profile.mLastUserActivityTime) {
1665             profile.mLastUserActivityTime = eventTime;
1666         }
1667     }
1668 
1669     private void wakeUpInternal(long eventTime, @WakeReason int reason, String details, int uid,
1670             String opPackageName, int opUid) {
1671         synchronized (mLock) {
1672             if (wakeUpNoUpdateLocked(eventTime, reason, details, uid, opPackageName, opUid)) {
1673                 updatePowerStateLocked();
1674             }
1675         }
1676     }
1677 
1678     private boolean wakeUpNoUpdateLocked(long eventTime, @WakeReason int reason, String details,
1679             int reasonUid, String opPackageName, int opUid) {
1680         if (DEBUG_SPEW) {
1681             Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime + ", uid=" + reasonUid);
1682         }
1683 
1684         if (eventTime < mLastSleepTime || getWakefulnessLocked() == WAKEFULNESS_AWAKE
1685                 || mForceSuspendActive || !mSystemReady) {
1686             return false;
1687         }
1688 
1689         Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, 0);
1690 
1691         Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakeUp");
1692         try {
1693             Slog.i(TAG, "Waking up from "
1694                     + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())
1695                     + " (uid=" + reasonUid
1696                     + ", reason=" + PowerManager.wakeReasonToString(reason)
1697                     + ", details=" + details
1698                     + ")...");
1699 
1700             mLastWakeTime = eventTime;
1701             mLastWakeReason = reason;
1702             setWakefulnessLocked(WAKEFULNESS_AWAKE, reason, eventTime);
1703 
1704             mNotifier.onWakeUp(reason, details, reasonUid, opPackageName, opUid);
1705             userActivityNoUpdateLocked(
1706                     eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid);
1707 
1708             if (sQuiescent) {
1709                 mDirty |= DIRTY_QUIESCENT;
1710             }
1711         } finally {
1712             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1713         }
1714         return true;
1715     }
1716 
1717     private void goToSleepInternal(long eventTime, int reason, int flags, int uid) {
1718         synchronized (mLock) {
1719             if (goToSleepNoUpdateLocked(eventTime, reason, flags, uid)) {
1720                 updatePowerStateLocked();
1721             }
1722         }
1723     }
1724 
1725     /**
1726      * Puts the system in doze.
1727      *
1728      * This method is called goToSleep for historical reasons but actually attempts to DOZE,
1729      * and only tucks itself in to SLEEP if requested with the flag
1730      * {@link PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE}.
1731      */
1732     @SuppressWarnings("deprecation")
1733     private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags, int uid) {
1734         if (DEBUG_SPEW) {
1735             Slog.d(TAG, "goToSleepNoUpdateLocked: eventTime=" + eventTime
1736                     + ", reason=" + reason + ", flags=" + flags + ", uid=" + uid);
1737         }
1738 
1739         if (eventTime < mLastWakeTime
1740                 || getWakefulnessLocked() == WAKEFULNESS_ASLEEP
1741                 || getWakefulnessLocked() == WAKEFULNESS_DOZING
1742                 || !mSystemReady
1743                 || !mBootCompleted) {
1744             return false;
1745         }
1746 
1747         Trace.traceBegin(Trace.TRACE_TAG_POWER, "goToSleep");
1748         try {
1749             reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX,
1750                     Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN));
1751             Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason)
1752                     + " (uid " + uid + ")...");
1753 
1754             mLastSleepTime = eventTime;
1755             mLastSleepReason = reason;
1756             mSandmanSummoned = true;
1757             mDozeStartInProgress = true;
1758             setWakefulnessLocked(WAKEFULNESS_DOZING, reason, eventTime);
1759 
1760             // Report the number of wake locks that will be cleared by going to sleep.
1761             int numWakeLocksCleared = 0;
1762             final int numWakeLocks = mWakeLocks.size();
1763             for (int i = 0; i < numWakeLocks; i++) {
1764                 final WakeLock wakeLock = mWakeLocks.get(i);
1765                 switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
1766                     case PowerManager.FULL_WAKE_LOCK:
1767                     case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
1768                     case PowerManager.SCREEN_DIM_WAKE_LOCK:
1769                         numWakeLocksCleared += 1;
1770                         break;
1771                 }
1772             }
1773             EventLogTags.writePowerSleepRequested(numWakeLocksCleared);
1774 
1775             // Skip dozing if requested.
1776             if ((flags & PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) != 0) {
1777                 reallyGoToSleepNoUpdateLocked(eventTime, uid);
1778             }
1779         } finally {
1780             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1781         }
1782         return true;
1783     }
1784 
1785     private void napInternal(long eventTime, int uid) {
1786         synchronized (mLock) {
1787             if (napNoUpdateLocked(eventTime, uid)) {
1788                 updatePowerStateLocked();
1789             }
1790         }
1791     }
1792 
1793     private boolean napNoUpdateLocked(long eventTime, int uid) {
1794         if (DEBUG_SPEW) {
1795             Slog.d(TAG, "napNoUpdateLocked: eventTime=" + eventTime + ", uid=" + uid);
1796         }
1797 
1798         if (eventTime < mLastWakeTime || getWakefulnessLocked() != WAKEFULNESS_AWAKE
1799                 || !mBootCompleted || !mSystemReady) {
1800             return false;
1801         }
1802 
1803         Trace.traceBegin(Trace.TRACE_TAG_POWER, "nap");
1804         try {
1805             Slog.i(TAG, "Nap time (uid " + uid +")...");
1806 
1807             mSandmanSummoned = true;
1808             setWakefulnessLocked(WAKEFULNESS_DREAMING, 0, eventTime);
1809         } finally {
1810             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1811         }
1812         return true;
1813     }
1814 
1815     // Done dozing, drop everything and go to sleep.
1816     private boolean reallyGoToSleepNoUpdateLocked(long eventTime, int uid) {
1817         if (DEBUG_SPEW) {
1818             Slog.d(TAG, "reallyGoToSleepNoUpdateLocked: eventTime=" + eventTime
1819                     + ", uid=" + uid);
1820         }
1821 
1822         if (eventTime < mLastWakeTime || getWakefulnessLocked() == WAKEFULNESS_ASLEEP
1823                 || !mBootCompleted || !mSystemReady) {
1824             return false;
1825         }
1826 
1827         Trace.traceBegin(Trace.TRACE_TAG_POWER, "reallyGoToSleep");
1828         try {
1829             Slog.i(TAG, "Sleeping (uid " + uid +")...");
1830 
1831             setWakefulnessLocked(WAKEFULNESS_ASLEEP, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT,
1832                     eventTime);
1833         } finally {
1834             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1835         }
1836         return true;
1837     }
1838 
1839     @VisibleForTesting
1840     void setWakefulnessLocked(int wakefulness, int reason, long eventTime) {
1841         if (getWakefulnessLocked() != wakefulness) {
1842             // Under lock, invalidate before set ensures caches won't return stale values.
1843             mInjector.invalidateIsInteractiveCaches();
1844             mWakefulnessRaw = wakefulness;
1845             mWakefulnessChanging = true;
1846             mDirty |= DIRTY_WAKEFULNESS;
1847 
1848             // This is only valid while we are in wakefulness dozing. Set to false otherwise.
1849             mDozeStartInProgress &= (getWakefulnessLocked() == WAKEFULNESS_DOZING);
1850 
1851             if (mNotifier != null) {
1852                 mNotifier.onWakefulnessChangeStarted(wakefulness, reason, eventTime);
1853             }
1854             mAttentionDetector.onWakefulnessChangeStarted(wakefulness);
1855         }
1856     }
1857 
1858     @VisibleForTesting
1859     int getWakefulnessLocked() {
1860         return mWakefulnessRaw;
1861     }
1862 
1863     /**
1864      * Logs the time the device would have spent awake before user activity timeout,
1865      * had the system not been told the user was inactive.
1866      */
1867     private void logSleepTimeoutRecapturedLocked() {
1868         final long now = mClock.uptimeMillis();
1869         final long savedWakeTimeMs = mOverriddenTimeout - now;
1870         if (savedWakeTimeMs >= 0) {
1871             EventLogTags.writePowerSoftSleepRequested(savedWakeTimeMs);
1872             mOverriddenTimeout = -1;
1873         }
1874     }
1875 
1876     private void finishWakefulnessChangeIfNeededLocked() {
1877         if (mWakefulnessChanging && mDisplayReady) {
1878             if (getWakefulnessLocked() == WAKEFULNESS_DOZING
1879                     && (mWakeLockSummary & WAKE_LOCK_DOZE) == 0) {
1880                 return; // wait until dream has enabled dozing
1881             } else {
1882                 // Doze wakelock acquired (doze started) or device is no longer dozing.
1883                 mDozeStartInProgress = false;
1884             }
1885             if (getWakefulnessLocked() == WAKEFULNESS_DOZING
1886                     || getWakefulnessLocked() == WAKEFULNESS_ASLEEP) {
1887                 logSleepTimeoutRecapturedLocked();
1888             }
1889             if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) {
1890                 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, 0);
1891                 final int latencyMs = (int) (mClock.uptimeMillis() - mLastWakeTime);
1892                 if (latencyMs >= SCREEN_ON_LATENCY_WARNING_MS) {
1893                     Slog.w(TAG, "Screen on took " + latencyMs + " ms");
1894                 }
1895             }
1896             mWakefulnessChanging = false;
1897             mNotifier.onWakefulnessChangeFinished();
1898         }
1899     }
1900 
1901     /**
1902      * Updates the global power state based on dirty bits recorded in mDirty.
1903      *
1904      * This is the main function that performs power state transitions.
1905      * We centralize them here so that we can recompute the power state completely
1906      * each time something important changes, and ensure that we do it the same
1907      * way each time.  The point is to gather all of the transition logic here.
1908      */
1909     private void updatePowerStateLocked() {
1910         if (!mSystemReady || mDirty == 0) {
1911             return;
1912         }
1913         if (!Thread.holdsLock(mLock)) {
1914             Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
1915         }
1916 
1917         Trace.traceBegin(Trace.TRACE_TAG_POWER, "updatePowerState");
1918         try {
1919             // Phase 0: Basic state updates.
1920             updateIsPoweredLocked(mDirty);
1921             updateStayOnLocked(mDirty);
1922             updateScreenBrightnessBoostLocked(mDirty);
1923 
1924             // Phase 1: Update wakefulness.
1925             // Loop because the wake lock and user activity computations are influenced
1926             // by changes in wakefulness.
1927             final long now = mClock.uptimeMillis();
1928             int dirtyPhase2 = 0;
1929             for (;;) {
1930                 int dirtyPhase1 = mDirty;
1931                 dirtyPhase2 |= dirtyPhase1;
1932                 mDirty = 0;
1933 
1934                 updateWakeLockSummaryLocked(dirtyPhase1);
1935                 updateUserActivitySummaryLocked(now, dirtyPhase1);
1936                 updateAttentiveStateLocked(now, dirtyPhase1);
1937                 if (!updateWakefulnessLocked(dirtyPhase1)) {
1938                     break;
1939                 }
1940             }
1941 
1942             // Phase 2: Lock profiles that became inactive/not kept awake.
1943             updateProfilesLocked(now);
1944 
1945             // Phase 3: Update display power state.
1946             final boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2);
1947 
1948             // Phase 4: Update dream state (depends on display ready signal).
1949             updateDreamLocked(dirtyPhase2, displayBecameReady);
1950 
1951             // Phase 5: Send notifications, if needed.
1952             finishWakefulnessChangeIfNeededLocked();
1953 
1954             // Phase 6: Update suspend blocker.
1955             // Because we might release the last suspend blocker here, we need to make sure
1956             // we finished everything else first!
1957             updateSuspendBlockerLocked();
1958         } finally {
1959             Trace.traceEnd(Trace.TRACE_TAG_POWER);
1960         }
1961     }
1962 
1963     /**
1964      * Check profile timeouts and notify profiles that should be locked.
1965      */
1966     private void updateProfilesLocked(long now) {
1967         final int numProfiles = mProfilePowerState.size();
1968         for (int i = 0; i < numProfiles; i++) {
1969             final ProfilePowerState profile = mProfilePowerState.valueAt(i);
1970             if (isProfileBeingKeptAwakeLocked(profile, now)) {
1971                 profile.mLockingNotified = false;
1972             } else if (!profile.mLockingNotified) {
1973                 profile.mLockingNotified = true;
1974                 mNotifier.onProfileTimeout(profile.mUserId);
1975             }
1976         }
1977     }
1978 
1979     private boolean isProfileBeingKeptAwakeLocked(ProfilePowerState profile, long now) {
1980         return (profile.mLastUserActivityTime + profile.mScreenOffTimeout > now)
1981                 || (profile.mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0
1982                 || (mProximityPositive &&
1983                     (profile.mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0);
1984     }
1985 
1986     /**
1987      * Updates the value of mIsPowered.
1988      * Sets DIRTY_IS_POWERED if a change occurred.
1989      */
1990     private void updateIsPoweredLocked(int dirty) {
1991         if ((dirty & DIRTY_BATTERY_STATE) != 0) {
1992             final boolean wasPowered = mIsPowered;
1993             final int oldPlugType = mPlugType;
1994             final boolean oldLevelLow = mBatteryLevelLow;
1995             mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
1996             mPlugType = mBatteryManagerInternal.getPlugType();
1997             mBatteryLevel = mBatteryManagerInternal.getBatteryLevel();
1998             mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow();
1999 
2000             if (DEBUG_SPEW) {
2001                 Slog.d(TAG, "updateIsPoweredLocked: wasPowered=" + wasPowered
2002                         + ", mIsPowered=" + mIsPowered
2003                         + ", oldPlugType=" + oldPlugType
2004                         + ", mPlugType=" + mPlugType
2005                         + ", mBatteryLevel=" + mBatteryLevel);
2006             }
2007 
2008             if (wasPowered != mIsPowered || oldPlugType != mPlugType) {
2009                 mDirty |= DIRTY_IS_POWERED;
2010 
2011                 // Update wireless dock detection state.
2012                 final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(
2013                         mIsPowered, mPlugType);
2014 
2015                 // Treat plugging and unplugging the devices as a user activity.
2016                 // Users find it disconcerting when they plug or unplug the device
2017                 // and it shuts off right away.
2018                 // Some devices also wake the device when plugged or unplugged because
2019                 // they don't have a charging LED.
2020                 final long now = mClock.uptimeMillis();
2021                 if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType,
2022                         dockedOnWirelessCharger)) {
2023                     wakeUpNoUpdateLocked(now, PowerManager.WAKE_REASON_PLUGGED_IN,
2024                             "android.server.power:PLUGGED:" + mIsPowered, Process.SYSTEM_UID,
2025                             mContext.getOpPackageName(), Process.SYSTEM_UID);
2026                 }
2027                 userActivityNoUpdateLocked(
2028                         now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
2029 
2030                 // only play charging sounds if boot is completed so charging sounds don't play
2031                 // with potential notification sounds
2032                 if (mBootCompleted) {
2033                     if (mIsPowered && !BatteryManager.isPlugWired(oldPlugType)
2034                             && BatteryManager.isPlugWired(mPlugType)) {
2035                         mNotifier.onWiredChargingStarted(mUserId);
2036                     } else if (dockedOnWirelessCharger) {
2037                         mNotifier.onWirelessChargingStarted(mBatteryLevel, mUserId);
2038                     }
2039                 }
2040             }
2041 
2042             mBatterySaverStateMachine.setBatteryStatus(mIsPowered, mBatteryLevel, mBatteryLevelLow);
2043         }
2044     }
2045 
2046     private boolean shouldWakeUpWhenPluggedOrUnpluggedLocked(
2047             boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) {
2048         // Don't wake when powered unless configured to do so.
2049         if (!mWakeUpWhenPluggedOrUnpluggedConfig) {
2050             return false;
2051         }
2052 
2053         // Don't wake when undocked from wireless charger.
2054         // See WirelessChargerDetector for justification.
2055         if (wasPowered && !mIsPowered
2056                 && oldPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS) {
2057             return false;
2058         }
2059 
2060         // Don't wake when docked on wireless charger unless we are certain of it.
2061         // See WirelessChargerDetector for justification.
2062         if (!wasPowered && mIsPowered
2063                 && mPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS
2064                 && !dockedOnWirelessCharger) {
2065             return false;
2066         }
2067 
2068         // If already dreaming and becoming powered, then don't wake.
2069         if (mIsPowered && getWakefulnessLocked() == WAKEFULNESS_DREAMING) {
2070             return false;
2071         }
2072 
2073         // Don't wake while theater mode is enabled.
2074         if (mTheaterModeEnabled && !mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) {
2075             return false;
2076         }
2077 
2078         // On Always On Display, SystemUI shows the charging indicator
2079         if (mAlwaysOnEnabled && getWakefulnessLocked() == WAKEFULNESS_DOZING) {
2080             return false;
2081         }
2082 
2083         // Otherwise wake up!
2084         return true;
2085     }
2086 
2087     /**
2088      * Updates the value of mStayOn.
2089      * Sets DIRTY_STAY_ON if a change occurred.
2090      */
2091     private void updateStayOnLocked(int dirty) {
2092         if ((dirty & (DIRTY_BATTERY_STATE | DIRTY_SETTINGS)) != 0) {
2093             final boolean wasStayOn = mStayOn;
2094             if (mStayOnWhilePluggedInSetting != 0
2095                     && !isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
2096                 mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting);
2097             } else {
2098                 mStayOn = false;
2099             }
2100 
2101             if (mStayOn != wasStayOn) {
2102                 mDirty |= DIRTY_STAY_ON;
2103             }
2104         }
2105     }
2106 
2107     /**
2108      * Updates the value of mWakeLockSummary to summarize the state of all active wake locks.
2109      * Note that most wake-locks are ignored when the system is asleep.
2110      *
2111      * This function must have no other side-effects.
2112      */
2113     @SuppressWarnings("deprecation")
2114     private void updateWakeLockSummaryLocked(int dirty) {
2115         if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS)) != 0) {
2116             mWakeLockSummary = 0;
2117 
2118             final int numProfiles = mProfilePowerState.size();
2119             for (int i = 0; i < numProfiles; i++) {
2120                 mProfilePowerState.valueAt(i).mWakeLockSummary = 0;
2121             }
2122 
2123             final int numWakeLocks = mWakeLocks.size();
2124             for (int i = 0; i < numWakeLocks; i++) {
2125                 final WakeLock wakeLock = mWakeLocks.get(i);
2126                 final int wakeLockFlags = getWakeLockSummaryFlags(wakeLock);
2127                 mWakeLockSummary |= wakeLockFlags;
2128                 for (int j = 0; j < numProfiles; j++) {
2129                     final ProfilePowerState profile = mProfilePowerState.valueAt(j);
2130                     if (wakeLockAffectsUser(wakeLock, profile.mUserId)) {
2131                         profile.mWakeLockSummary |= wakeLockFlags;
2132                     }
2133                 }
2134             }
2135 
2136             mWakeLockSummary = adjustWakeLockSummaryLocked(mWakeLockSummary);
2137             for (int i = 0; i < numProfiles; i++) {
2138                 final ProfilePowerState profile = mProfilePowerState.valueAt(i);
2139                 profile.mWakeLockSummary = adjustWakeLockSummaryLocked(profile.mWakeLockSummary);
2140             }
2141 
2142             if (DEBUG_SPEW) {
2143                 Slog.d(TAG, "updateWakeLockSummaryLocked: mWakefulness="
2144                         + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())
2145                         + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));
2146             }
2147         }
2148     }
2149 
2150     private int adjustWakeLockSummaryLocked(int wakeLockSummary) {
2151         // Cancel wake locks that make no sense based on the current state.
2152         if (getWakefulnessLocked() != WAKEFULNESS_DOZING) {
2153             wakeLockSummary &= ~(WAKE_LOCK_DOZE | WAKE_LOCK_DRAW);
2154         }
2155         if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP
2156                 || (wakeLockSummary & WAKE_LOCK_DOZE) != 0) {
2157             wakeLockSummary &= ~(WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM
2158                     | WAKE_LOCK_BUTTON_BRIGHT);
2159             if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP) {
2160                 wakeLockSummary &= ~WAKE_LOCK_PROXIMITY_SCREEN_OFF;
2161             }
2162         }
2163 
2164         // Infer implied wake locks where necessary based on the current state.
2165         if ((wakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM)) != 0) {
2166             if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) {
2167                 wakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE;
2168             } else if (getWakefulnessLocked() == WAKEFULNESS_DREAMING) {
2169                 wakeLockSummary |= WAKE_LOCK_CPU;
2170             }
2171         }
2172         if ((wakeLockSummary & WAKE_LOCK_DRAW) != 0) {
2173             wakeLockSummary |= WAKE_LOCK_CPU;
2174         }
2175 
2176         return wakeLockSummary;
2177     }
2178 
2179     /** Get wake lock summary flags that correspond to the given wake lock. */
2180     private int getWakeLockSummaryFlags(WakeLock wakeLock) {
2181         switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
2182             case PowerManager.PARTIAL_WAKE_LOCK:
2183                 if (!wakeLock.mDisabled) {
2184                     // We only respect this if the wake lock is not disabled.
2185                     return WAKE_LOCK_CPU;
2186                 }
2187                 break;
2188             case PowerManager.FULL_WAKE_LOCK:
2189                 return WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT;
2190             case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
2191                 return WAKE_LOCK_SCREEN_BRIGHT;
2192             case PowerManager.SCREEN_DIM_WAKE_LOCK:
2193                 return WAKE_LOCK_SCREEN_DIM;
2194             case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
2195                 return WAKE_LOCK_PROXIMITY_SCREEN_OFF;
2196             case PowerManager.DOZE_WAKE_LOCK:
2197                 return WAKE_LOCK_DOZE;
2198             case PowerManager.DRAW_WAKE_LOCK:
2199                 return WAKE_LOCK_DRAW;
2200         }
2201         return 0;
2202     }
2203 
2204     private boolean wakeLockAffectsUser(WakeLock wakeLock, @UserIdInt int userId) {
2205         if (wakeLock.mWorkSource != null) {
2206             for (int k = 0; k < wakeLock.mWorkSource.size(); k++) {
2207                 final int uid = wakeLock.mWorkSource.getUid(k);
2208                 if (userId == UserHandle.getUserId(uid)) {
2209                     return true;
2210                 }
2211             }
2212 
2213             final List<WorkChain> workChains = wakeLock.mWorkSource.getWorkChains();
2214             if (workChains != null) {
2215                 for (int k = 0; k < workChains.size(); k++) {
2216                     final int uid = workChains.get(k).getAttributionUid();
2217                     if (userId == UserHandle.getUserId(uid)) {
2218                         return true;
2219                     }
2220                 }
2221             }
2222         }
2223         return userId == UserHandle.getUserId(wakeLock.mOwnerUid);
2224     }
2225 
2226     void checkForLongWakeLocks() {
2227         synchronized (mLock) {
2228             final long now = mClock.uptimeMillis();
2229             mNotifyLongDispatched = now;
2230             final long when = now - MIN_LONG_WAKE_CHECK_INTERVAL;
2231             long nextCheckTime = Long.MAX_VALUE;
2232             final int numWakeLocks = mWakeLocks.size();
2233             for (int i = 0; i < numWakeLocks; i++) {
2234                 final WakeLock wakeLock = mWakeLocks.get(i);
2235                 if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
2236                         == PowerManager.PARTIAL_WAKE_LOCK) {
2237                     if (wakeLock.mNotifiedAcquired && !wakeLock.mNotifiedLong) {
2238                         if (wakeLock.mAcquireTime < when) {
2239                             // This wake lock has exceeded the long acquire time, report!
2240                             notifyWakeLockLongStartedLocked(wakeLock);
2241                         } else {
2242                             // This wake lock could still become a long one, at this time.
2243                             long checkTime = wakeLock.mAcquireTime + MIN_LONG_WAKE_CHECK_INTERVAL;
2244                             if (checkTime < nextCheckTime) {
2245                                 nextCheckTime = checkTime;
2246                             }
2247                         }
2248                     }
2249                 }
2250             }
2251             mNotifyLongScheduled = 0;
2252             mHandler.removeMessages(MSG_CHECK_FOR_LONG_WAKELOCKS);
2253             if (nextCheckTime != Long.MAX_VALUE) {
2254                 mNotifyLongNextCheck = nextCheckTime;
2255                 enqueueNotifyLongMsgLocked(nextCheckTime);
2256             } else {
2257                 mNotifyLongNextCheck = 0;
2258             }
2259         }
2260     }
2261 
2262     /**
2263      * Updates the value of mUserActivitySummary to summarize the user requested
2264      * state of the system such as whether the screen should be bright or dim.
2265      * Note that user activity is ignored when the system is asleep.
2266      *
2267      * This function must have no other side-effects.
2268      */
2269     private void updateUserActivitySummaryLocked(long now, int dirty) {
2270         // Update the status of the user activity timeout timer.
2271         if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY
2272                 | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
2273             mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
2274 
2275             long nextTimeout = 0;
2276             if (getWakefulnessLocked() == WAKEFULNESS_AWAKE
2277                     || getWakefulnessLocked() == WAKEFULNESS_DREAMING
2278                     || getWakefulnessLocked() == WAKEFULNESS_DOZING) {
2279                 final long attentiveTimeout = getAttentiveTimeoutLocked();
2280                 final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
2281                 final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
2282                         attentiveTimeout);
2283                 final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
2284                 final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
2285                 final long nextProfileTimeout = getNextProfileTimeoutLocked(now);
2286 
2287                 mUserActivitySummary = 0;
2288                 if (mLastUserActivityTime >= mLastWakeTime) {
2289                     nextTimeout = mLastUserActivityTime
2290                             + screenOffTimeout - screenDimDuration;
2291                     if (now < nextTimeout) {
2292                         mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
2293                     } else {
2294                         nextTimeout = mLastUserActivityTime + screenOffTimeout;
2295                         if (now < nextTimeout) {
2296                             mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
2297                         }
2298                     }
2299                 }
2300                 if (mUserActivitySummary == 0
2301                         && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
2302                     nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
2303                     if (now < nextTimeout) {
2304                         if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT
2305                                 || mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) {
2306                             mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
2307                         } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
2308                             mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
2309                         }
2310                     }
2311                 }
2312 
2313                 if (mUserActivitySummary == 0) {
2314                     if (sleepTimeout >= 0) {
2315                         final long anyUserActivity = Math.max(mLastUserActivityTime,
2316                                 mLastUserActivityTimeNoChangeLights);
2317                         if (anyUserActivity >= mLastWakeTime) {
2318                             nextTimeout = anyUserActivity + sleepTimeout;
2319                             if (now < nextTimeout) {
2320                                 mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
2321                             }
2322                         }
2323                     } else {
2324                         mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
2325                         nextTimeout = -1;
2326                     }
2327                 }
2328 
2329                 if (mUserActivitySummary != USER_ACTIVITY_SCREEN_DREAM && userInactiveOverride) {
2330                     if ((mUserActivitySummary &
2331                             (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0) {
2332                         // Device is being kept awake by recent user activity
2333                         if (nextTimeout >= now && mOverriddenTimeout == -1) {
2334                             // Save when the next timeout would have occurred
2335                             mOverriddenTimeout = nextTimeout;
2336                         }
2337                     }
2338                     mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
2339                     nextTimeout = -1;
2340                 }
2341 
2342                 if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
2343                         && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) {
2344                     nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout,
2345                             screenDimDuration);
2346                 }
2347 
2348                 if (nextProfileTimeout > 0) {
2349                     nextTimeout = Math.min(nextTimeout, nextProfileTimeout);
2350                 }
2351 
2352                 if (mUserActivitySummary != 0 && nextTimeout >= 0) {
2353                     scheduleUserInactivityTimeout(nextTimeout);
2354                 }
2355             } else {
2356                 mUserActivitySummary = 0;
2357             }
2358 
2359             if (DEBUG_SPEW) {
2360                 Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness="
2361                         + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())
2362                         + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
2363                         + ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout));
2364             }
2365         }
2366     }
2367 
2368     private void scheduleUserInactivityTimeout(long timeMs) {
2369         final Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
2370         msg.setAsynchronous(true);
2371         mHandler.sendMessageAtTime(msg, timeMs);
2372     }
2373 
2374     private void scheduleAttentiveTimeout(long timeMs) {
2375         final Message msg = mHandler.obtainMessage(MSG_ATTENTIVE_TIMEOUT);
2376         msg.setAsynchronous(true);
2377         mHandler.sendMessageAtTime(msg, timeMs);
2378     }
2379 
2380     /**
2381      * Finds the next profile timeout time or returns -1 if there are no profiles to be locked.
2382      */
2383     private long getNextProfileTimeoutLocked(long now) {
2384         long nextTimeout = -1;
2385         final int numProfiles = mProfilePowerState.size();
2386         for (int i = 0; i < numProfiles; i++) {
2387             final ProfilePowerState profile = mProfilePowerState.valueAt(i);
2388             final long timeout = profile.mLastUserActivityTime + profile.mScreenOffTimeout;
2389             if (timeout > now && (nextTimeout == -1 || timeout < nextTimeout)) {
2390                 nextTimeout = timeout;
2391             }
2392         }
2393         return nextTimeout;
2394     }
2395 
2396     private void updateAttentiveStateLocked(long now, int dirty) {
2397         long attentiveTimeout = getAttentiveTimeoutLocked();
2398         long goToSleepTime = mLastUserActivityTime + attentiveTimeout;
2399         long showWarningTime = goToSleepTime - mAttentiveWarningDurationConfig;
2400 
2401         boolean warningDismissed = maybeHideInattentiveSleepWarningLocked(now, showWarningTime);
2402 
2403         if (attentiveTimeout >= 0 && (warningDismissed
2404                 || (dirty & (DIRTY_ATTENTIVE | DIRTY_STAY_ON | DIRTY_SCREEN_BRIGHTNESS_BOOST
2405                 | DIRTY_PROXIMITY_POSITIVE | DIRTY_WAKEFULNESS | DIRTY_BOOT_COMPLETED
2406                 | DIRTY_SETTINGS)) != 0)) {
2407             if (DEBUG_SPEW) {
2408                 Slog.d(TAG, "Updating attentive state");
2409             }
2410 
2411             mHandler.removeMessages(MSG_ATTENTIVE_TIMEOUT);
2412 
2413             if (isBeingKeptFromShowingInattentiveSleepWarningLocked()) {
2414                 return;
2415             }
2416 
2417             long nextTimeout = -1;
2418 
2419             if (now < showWarningTime) {
2420                 nextTimeout = showWarningTime;
2421             } else if (now < goToSleepTime) {
2422                 if (DEBUG) {
2423                     long timeToSleep = goToSleepTime - now;
2424                     Slog.d(TAG, "Going to sleep in " + timeToSleep
2425                             + "ms if there is no user activity");
2426                 }
2427                 mInattentiveSleepWarningOverlayController.show();
2428                 nextTimeout = goToSleepTime;
2429             } else {
2430                 if (DEBUG && getWakefulnessLocked() != WAKEFULNESS_ASLEEP) {
2431                     Slog.i(TAG, "Going to sleep now due to long user inactivity");
2432                 }
2433             }
2434 
2435             if (nextTimeout >= 0) {
2436                 scheduleAttentiveTimeout(nextTimeout);
2437             }
2438         }
2439     }
2440 
2441     private boolean maybeHideInattentiveSleepWarningLocked(long now, long showWarningTime) {
2442         long attentiveTimeout = getAttentiveTimeoutLocked();
2443 
2444         if (!mInattentiveSleepWarningOverlayController.isShown()) {
2445             return false;
2446         }
2447 
2448         if (getWakefulnessLocked() != WAKEFULNESS_AWAKE) {
2449             mInattentiveSleepWarningOverlayController.dismiss(false);
2450             return true;
2451         } else if (attentiveTimeout < 0 || isBeingKeptFromShowingInattentiveSleepWarningLocked()
2452                 || now < showWarningTime) {
2453             mInattentiveSleepWarningOverlayController.dismiss(true);
2454             return true;
2455         }
2456 
2457         return false;
2458     }
2459 
2460     private boolean isAttentiveTimeoutExpired(long now) {
2461         long attentiveTimeout = getAttentiveTimeoutLocked();
2462         return attentiveTimeout >= 0 && now >= mLastUserActivityTime + attentiveTimeout;
2463     }
2464 
2465     /**
2466      * Called when a user activity timeout has occurred.
2467      * Simply indicates that something about user activity has changed so that the new
2468      * state can be recomputed when the power state is updated.
2469      *
2470      * This function must have no other side-effects besides setting the dirty
2471      * bit and calling update power state.  Wakefulness transitions are handled elsewhere.
2472      */
2473     private void handleUserActivityTimeout() { // runs on handler thread
2474         synchronized (mLock) {
2475             if (DEBUG_SPEW) {
2476                 Slog.d(TAG, "handleUserActivityTimeout");
2477             }
2478 
2479             mDirty |= DIRTY_USER_ACTIVITY;
2480             updatePowerStateLocked();
2481         }
2482     }
2483 
2484     private void handleAttentiveTimeout() { // runs on handler thread
2485         synchronized (mLock) {
2486             if (DEBUG_SPEW) {
2487                 Slog.d(TAG, "handleAttentiveTimeout");
2488             }
2489 
2490             mDirty |= DIRTY_ATTENTIVE;
2491             updatePowerStateLocked();
2492         }
2493     }
2494 
2495     private long getAttentiveTimeoutLocked() {
2496         long timeout = mAttentiveTimeoutSetting;
2497         if (timeout <= 0) {
2498             return -1;
2499         }
2500 
2501         return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
2502     }
2503 
2504     private long getSleepTimeoutLocked(long attentiveTimeout) {
2505         long timeout = mSleepTimeoutSetting;
2506         if (timeout <= 0) {
2507             return -1;
2508         }
2509         if (attentiveTimeout >= 0) {
2510             timeout = Math.min(timeout, attentiveTimeout);
2511         }
2512         return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
2513     }
2514 
2515     private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) {
2516         long timeout = mScreenOffTimeoutSetting;
2517         if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
2518             timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
2519         }
2520         if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
2521             timeout = Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
2522         }
2523         if (sleepTimeout >= 0) {
2524             timeout = Math.min(timeout, sleepTimeout);
2525         }
2526         if (attentiveTimeout >= 0) {
2527             timeout = Math.min(timeout, attentiveTimeout);
2528         }
2529         return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
2530     }
2531 
2532     private long getScreenDimDurationLocked(long screenOffTimeout) {
2533         return Math.min(mMaximumScreenDimDurationConfig,
2534                 (long)(screenOffTimeout * mMaximumScreenDimRatioConfig));
2535     }
2536 
2537     /**
2538      * Updates the wakefulness of the device.
2539      *
2540      * This is the function that decides whether the device should start dreaming
2541      * based on the current wake locks and user activity state.  It may modify mDirty
2542      * if the wakefulness changes.
2543      *
2544      * Returns true if the wakefulness changed and we need to restart power state calculation.
2545      */
2546     private boolean updateWakefulnessLocked(int dirty) {
2547         boolean changed = false;
2548         if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED
2549                 | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE
2550                 | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS
2551                 | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) {
2552             if (getWakefulnessLocked() == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) {
2553                 if (DEBUG_SPEW) {
2554                     Slog.d(TAG, "updateWakefulnessLocked: Bed time...");
2555                 }
2556                 final long time = mClock.uptimeMillis();
2557                 if (isAttentiveTimeoutExpired(time)) {
2558                     changed = goToSleepNoUpdateLocked(time, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT,
2559                             PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID);
2560                 } else if (shouldNapAtBedTimeLocked()) {
2561                     changed = napNoUpdateLocked(time, Process.SYSTEM_UID);
2562                 } else {
2563                     changed = goToSleepNoUpdateLocked(time,
2564                             PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID);
2565                 }
2566             }
2567         }
2568         return changed;
2569     }
2570 
2571     /**
2572      * Returns true if the device should automatically nap and start dreaming when the user
2573      * activity timeout has expired and it's bedtime.
2574      */
2575     private boolean shouldNapAtBedTimeLocked() {
2576         return mDreamsActivateOnSleepSetting
2577                 || (mDreamsActivateOnDockSetting
2578                         && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED);
2579     }
2580 
2581     /**
2582      * Returns true if the device should go to sleep now.
2583      * Also used when exiting a dream to determine whether we should go back
2584      * to being fully awake or else go to sleep for good.
2585      */
2586     private boolean isItBedTimeYetLocked() {
2587         if (!mBootCompleted) {
2588             return false;
2589         }
2590 
2591         long now = mClock.uptimeMillis();
2592         if (isAttentiveTimeoutExpired(now)) {
2593             return !isBeingKeptFromInattentiveSleepLocked();
2594         } else {
2595             return !isBeingKeptAwakeLocked();
2596         }
2597     }
2598 
2599     /**
2600      * Returns true if the device is being kept awake by a wake lock, user activity
2601      * or the stay on while powered setting.  We also keep the phone awake when
2602      * the proximity sensor returns a positive result so that the device does not
2603      * lock while in a phone call.  This function only controls whether the device
2604      * will go to sleep or dream which is independent of whether it will be allowed
2605      * to suspend.
2606      */
2607     private boolean isBeingKeptAwakeLocked() {
2608         return mStayOn
2609                 || mProximityPositive
2610                 || (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0
2611                 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
2612                         | USER_ACTIVITY_SCREEN_DIM)) != 0
2613                 || mScreenBrightnessBoostInProgress;
2614     }
2615 
2616     /**
2617      * Returns true if the device is prevented from going into inattentive sleep by the stay on
2618      * while powered setting. We also keep the device awake when the proximity sensor returns a
2619      * positive result so that the device does not lock while in a phone call. This function only
2620      * controls whether the device will go to sleep which is independent of whether it will be
2621      * allowed to suspend.
2622      */
2623     private boolean isBeingKeptFromInattentiveSleepLocked() {
2624         return mStayOn || mScreenBrightnessBoostInProgress || mProximityPositive
2625                 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
2626                 | USER_ACTIVITY_SCREEN_DIM)) != 0;
2627     }
2628 
2629     private boolean isBeingKeptFromShowingInattentiveSleepWarningLocked() {
2630         return mStayOn || mScreenBrightnessBoostInProgress || mProximityPositive || !mBootCompleted;
2631     }
2632 
2633     /**
2634      * Determines whether to post a message to the sandman to update the dream state.
2635      */
2636     private void updateDreamLocked(int dirty, boolean displayBecameReady) {
2637         if ((dirty & (DIRTY_WAKEFULNESS
2638                 | DIRTY_USER_ACTIVITY
2639                 | DIRTY_ATTENTIVE
2640                 | DIRTY_WAKE_LOCKS
2641                 | DIRTY_BOOT_COMPLETED
2642                 | DIRTY_SETTINGS
2643                 | DIRTY_IS_POWERED
2644                 | DIRTY_STAY_ON
2645                 | DIRTY_PROXIMITY_POSITIVE
2646                 | DIRTY_BATTERY_STATE)) != 0 || displayBecameReady) {
2647             if (mDisplayReady) {
2648                 scheduleSandmanLocked();
2649             }
2650         }
2651     }
2652 
2653     private void scheduleSandmanLocked() {
2654         if (!mSandmanScheduled) {
2655             mSandmanScheduled = true;
2656             Message msg = mHandler.obtainMessage(MSG_SANDMAN);
2657             msg.setAsynchronous(true);
2658             mHandler.sendMessage(msg);
2659         }
2660     }
2661 
2662     /**
2663      * Called when the device enters or exits a dreaming or dozing state.
2664      *
2665      * We do this asynchronously because we must call out of the power manager to start
2666      * the dream and we don't want to hold our lock while doing so.  There is a risk that
2667      * the device will wake or go to sleep in the meantime so we have to handle that case.
2668      */
2669     private void handleSandman() { // runs on handler thread
2670         // Handle preconditions.
2671         final boolean startDreaming;
2672         final int wakefulness;
2673         synchronized (mLock) {
2674             mSandmanScheduled = false;
2675             wakefulness = getWakefulnessLocked();
2676             if (mSandmanSummoned && mDisplayReady) {
2677                 startDreaming = canDreamLocked() || canDozeLocked();
2678                 mSandmanSummoned = false;
2679             } else {
2680                 startDreaming = false;
2681             }
2682         }
2683 
2684         // Start dreaming if needed.
2685         // We only control the dream on the handler thread, so we don't need to worry about
2686         // concurrent attempts to start or stop the dream.
2687         final boolean isDreaming;
2688         if (mDreamManager != null) {
2689             // Restart the dream whenever the sandman is summoned.
2690             if (startDreaming) {
2691                 mDreamManager.stopDream(false /*immediate*/);
2692                 mDreamManager.startDream(wakefulness == WAKEFULNESS_DOZING);
2693             }
2694             isDreaming = mDreamManager.isDreaming();
2695         } else {
2696             isDreaming = false;
2697         }
2698 
2699         // At this point, we either attempted to start the dream or no attempt will be made,
2700         // so stop holding the display suspend blocker for Doze.
2701         mDozeStartInProgress = false;
2702 
2703         // Update dream state.
2704         synchronized (mLock) {
2705             // Remember the initial battery level when the dream started.
2706             if (startDreaming && isDreaming) {
2707                 mBatteryLevelWhenDreamStarted = mBatteryLevel;
2708                 if (wakefulness == WAKEFULNESS_DOZING) {
2709                     Slog.i(TAG, "Dozing...");
2710                 } else {
2711                     Slog.i(TAG, "Dreaming...");
2712                 }
2713             }
2714 
2715             // If preconditions changed, wait for the next iteration to determine
2716             // whether the dream should continue (or be restarted).
2717             if (mSandmanSummoned || getWakefulnessLocked() != wakefulness) {
2718                 return; // wait for next cycle
2719             }
2720 
2721             // Determine whether the dream should continue.
2722             long now = mClock.uptimeMillis();
2723             if (wakefulness == WAKEFULNESS_DREAMING) {
2724                 if (isDreaming && canDreamLocked()) {
2725                     if (mDreamsBatteryLevelDrainCutoffConfig >= 0
2726                             && mBatteryLevel < mBatteryLevelWhenDreamStarted
2727                                     - mDreamsBatteryLevelDrainCutoffConfig
2728                             && !isBeingKeptAwakeLocked()) {
2729                         // If the user activity timeout expired and the battery appears
2730                         // to be draining faster than it is charging then stop dreaming
2731                         // and go to sleep.
2732                         Slog.i(TAG, "Stopping dream because the battery appears to "
2733                                 + "be draining faster than it is charging.  "
2734                                 + "Battery level when dream started: "
2735                                 + mBatteryLevelWhenDreamStarted + "%.  "
2736                                 + "Battery level now: " + mBatteryLevel + "%.");
2737                     } else {
2738                         return; // continue dreaming
2739                     }
2740                 }
2741 
2742                 // Dream has ended or will be stopped.  Update the power state.
2743                 if (isItBedTimeYetLocked()) {
2744                     int flags = 0;
2745                     if (isAttentiveTimeoutExpired(now)) {
2746                         flags |= PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE;
2747                     }
2748                     goToSleepNoUpdateLocked(now, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, flags,
2749                             Process.SYSTEM_UID);
2750                     updatePowerStateLocked();
2751                 } else {
2752                     wakeUpNoUpdateLocked(now,
2753                             PowerManager.WAKE_REASON_UNKNOWN,
2754                             "android.server.power:DREAM_FINISHED", Process.SYSTEM_UID,
2755                             mContext.getOpPackageName(), Process.SYSTEM_UID);
2756                     updatePowerStateLocked();
2757                 }
2758             } else if (wakefulness == WAKEFULNESS_DOZING) {
2759                 if (isDreaming) {
2760                     return; // continue dozing
2761                 }
2762 
2763                 // Doze has ended or will be stopped.  Update the power state.
2764                 reallyGoToSleepNoUpdateLocked(now, Process.SYSTEM_UID);
2765                 updatePowerStateLocked();
2766             }
2767         }
2768 
2769         // Stop dream.
2770         if (isDreaming) {
2771             mDreamManager.stopDream(false /*immediate*/);
2772         }
2773     }
2774 
2775     /**
2776      * Returns true if the device is allowed to dream in its current state.
2777      */
2778     private boolean canDreamLocked() {
2779         if (getWakefulnessLocked() != WAKEFULNESS_DREAMING
2780                 || !mDreamsSupportedConfig
2781                 || !mDreamsEnabledSetting
2782                 || !mDisplayPowerRequest.isBrightOrDim()
2783                 || mDisplayPowerRequest.isVr()
2784                 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
2785                         | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0
2786                 || !mBootCompleted) {
2787             return false;
2788         }
2789         if (!isBeingKeptAwakeLocked()) {
2790             if (!mIsPowered && !mDreamsEnabledOnBatteryConfig) {
2791                 return false;
2792             }
2793             if (!mIsPowered
2794                     && mDreamsBatteryLevelMinimumWhenNotPoweredConfig >= 0
2795                     && mBatteryLevel < mDreamsBatteryLevelMinimumWhenNotPoweredConfig) {
2796                 return false;
2797             }
2798             if (mIsPowered
2799                     && mDreamsBatteryLevelMinimumWhenPoweredConfig >= 0
2800                     && mBatteryLevel < mDreamsBatteryLevelMinimumWhenPoweredConfig) {
2801                 return false;
2802             }
2803         }
2804         return true;
2805     }
2806 
2807     /**
2808      * Returns true if the device is allowed to doze in its current state.
2809      */
2810     private boolean canDozeLocked() {
2811         return getWakefulnessLocked() == WAKEFULNESS_DOZING;
2812     }
2813 
2814     /**
2815      * Updates the display power state asynchronously.
2816      * When the update is finished, mDisplayReady will be set to true.  The display
2817      * controller posts a message to tell us when the actual display power state
2818      * has been updated so we come back here to double-check and finish up.
2819      *
2820      * This function recalculates the display power state each time.
2821      *
2822      * @return True if the display became ready.
2823      */
2824     private boolean updateDisplayPowerStateLocked(int dirty) {
2825         final boolean oldDisplayReady = mDisplayReady;
2826         if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
2827                 | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
2828                 | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_VR_MODE_CHANGED |
2829                 DIRTY_QUIESCENT)) != 0) {
2830             if ((dirty & DIRTY_QUIESCENT) != 0) {
2831                 sQuiescent = false;
2832             }
2833 
2834             mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();
2835 
2836             // Determine appropriate screen brightness and auto-brightness adjustments.
2837             final boolean autoBrightness;
2838             final float screenBrightnessOverride;
2839             if (!mBootCompleted) {
2840                 // Keep the brightness steady during boot. This requires the
2841                 // bootloader brightness and the default brightness to be identical.
2842                 autoBrightness = false;
2843                 screenBrightnessOverride = mScreenBrightnessSettingDefault;
2844             } else if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {
2845                 autoBrightness = false;
2846                 screenBrightnessOverride = mScreenBrightnessOverrideFromWindowManager;
2847             } else {
2848                 autoBrightness = (mScreenBrightnessModeSetting ==
2849                         Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
2850                 screenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT;
2851             }
2852 
2853             // Update display power request.
2854             mDisplayPowerRequest.screenBrightnessOverride = screenBrightnessOverride;
2855             mDisplayPowerRequest.useAutoBrightness = autoBrightness;
2856             mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
2857             mDisplayPowerRequest.boostScreenBrightness = shouldBoostScreenBrightness();
2858 
2859             updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest);
2860 
2861             if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
2862                 mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager;
2863                 if ((mWakeLockSummary & WAKE_LOCK_DRAW) != 0
2864                         && !mDrawWakeLockOverrideFromSidekick) {
2865                     if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) {
2866                         mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE;
2867                     }
2868                     if (mDisplayPowerRequest.dozeScreenState == Display.STATE_ON_SUSPEND) {
2869                         mDisplayPowerRequest.dozeScreenState = Display.STATE_ON;
2870                     }
2871                 }
2872                 mDisplayPowerRequest.dozeScreenBrightness =
2873                         mDozeScreenBrightnessOverrideFromDreamManagerFloat;
2874             } else {
2875                 mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
2876                 mDisplayPowerRequest.dozeScreenBrightness =
2877                         PowerManager.BRIGHTNESS_INVALID_FLOAT;
2878             }
2879 
2880             mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
2881                     mRequestWaitForNegativeProximity);
2882             mRequestWaitForNegativeProximity = false;
2883 
2884             if (DEBUG_SPEW) {
2885                 Slog.d(TAG, "updateDisplayPowerStateLocked: mDisplayReady=" + mDisplayReady
2886                         + ", policy=" + mDisplayPowerRequest.policy
2887                         + ", mWakefulness=" + getWakefulnessLocked()
2888                         + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary)
2889                         + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
2890                         + ", mBootCompleted=" + mBootCompleted
2891                         + ", screenBrightnessOverride=" + screenBrightnessOverride
2892                         + ", useAutoBrightness=" + autoBrightness
2893                         + ", mScreenBrightnessBoostInProgress=" + mScreenBrightnessBoostInProgress
2894                         + ", mIsVrModeEnabled= " + mIsVrModeEnabled
2895                         + ", sQuiescent=" + sQuiescent);
2896             }
2897         }
2898         return mDisplayReady && !oldDisplayReady;
2899     }
2900 
2901     private void updateScreenBrightnessBoostLocked(int dirty) {
2902         if ((dirty & DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) {
2903             if (mScreenBrightnessBoostInProgress) {
2904                 final long now = mClock.uptimeMillis();
2905                 mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT);
2906                 if (mLastScreenBrightnessBoostTime > mLastSleepTime) {
2907                     final long boostTimeout = mLastScreenBrightnessBoostTime +
2908                             SCREEN_BRIGHTNESS_BOOST_TIMEOUT;
2909                     if (boostTimeout > now) {
2910                         Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT);
2911                         msg.setAsynchronous(true);
2912                         mHandler.sendMessageAtTime(msg, boostTimeout);
2913                         return;
2914                     }
2915                 }
2916                 mScreenBrightnessBoostInProgress = false;
2917                 userActivityNoUpdateLocked(now,
2918                         PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
2919             }
2920         }
2921     }
2922 
2923     private boolean shouldBoostScreenBrightness() {
2924         return !mIsVrModeEnabled && mScreenBrightnessBoostInProgress;
2925     }
2926 
2927     private static boolean isValidBrightness(float value) {
2928         return value >= PowerManager.BRIGHTNESS_MIN && value <= PowerManager.BRIGHTNESS_MAX;
2929     }
2930 
2931     @VisibleForTesting
2932     int getDesiredScreenPolicyLocked() {
2933         if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP || sQuiescent) {
2934             return DisplayPowerRequest.POLICY_OFF;
2935         }
2936 
2937         if (getWakefulnessLocked() == WAKEFULNESS_DOZING) {
2938             if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
2939                 return DisplayPowerRequest.POLICY_DOZE;
2940             }
2941             if (mDozeAfterScreenOff) {
2942                 return DisplayPowerRequest.POLICY_OFF;
2943             }
2944             // Fall through and preserve the current screen policy if not configured to
2945             // doze after screen off.  This causes the screen off transition to be skipped.
2946         }
2947 
2948         // It is important that POLICY_VR check happens after the wakefulness checks above so
2949         // that VR-mode does not prevent displays from transitioning to the correct state when
2950         // dozing or sleeping.
2951         if (mIsVrModeEnabled) {
2952             return DisplayPowerRequest.POLICY_VR;
2953         }
2954 
2955         if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
2956                 || (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
2957                 || !mBootCompleted
2958                 || mScreenBrightnessBoostInProgress) {
2959             return DisplayPowerRequest.POLICY_BRIGHT;
2960         }
2961 
2962         return DisplayPowerRequest.POLICY_DIM;
2963     }
2964 
2965     private final DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks =
2966             new DisplayManagerInternal.DisplayPowerCallbacks() {
2967         private int mDisplayState = Display.STATE_UNKNOWN;
2968 
2969         @Override
2970         public void onStateChanged() {
2971             synchronized (mLock) {
2972                 mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED;
2973                 updatePowerStateLocked();
2974             }
2975         }
2976 
2977         @Override
2978         public void onProximityPositive() {
2979             synchronized (mLock) {
2980                 mProximityPositive = true;
2981                 mDirty |= DIRTY_PROXIMITY_POSITIVE;
2982                 updatePowerStateLocked();
2983             }
2984         }
2985 
2986         @Override
2987         public void onProximityNegative() {
2988             synchronized (mLock) {
2989                 mProximityPositive = false;
2990                 mDirty |= DIRTY_PROXIMITY_POSITIVE;
2991                 userActivityNoUpdateLocked(mClock.uptimeMillis(),
2992                         PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
2993                 updatePowerStateLocked();
2994             }
2995         }
2996 
2997         @Override
2998         public void onDisplayStateChange(int state) {
2999             // This method is only needed to support legacy display blanking behavior
3000             // where the display's power state is coupled to suspend or to the power HAL.
3001             // The order of operations matters here.
3002             synchronized (mLock) {
3003                 if (mDisplayState != state) {
3004                     mDisplayState = state;
3005                     setPowerModeInternal(MODE_DISPLAY_INACTIVE,
3006                             !Display.isActiveState(state));
3007                     if (state == Display.STATE_OFF) {
3008                         if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
3009                             setHalInteractiveModeLocked(false);
3010                         }
3011                         if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
3012                             setHalAutoSuspendModeLocked(true);
3013                         }
3014                     } else {
3015                         if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
3016                             setHalAutoSuspendModeLocked(false);
3017                         }
3018                         if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
3019                             setHalInteractiveModeLocked(true);
3020                         }
3021                     }
3022                 }
3023             }
3024         }
3025 
3026         @Override
3027         public void acquireSuspendBlocker() {
3028             mDisplaySuspendBlocker.acquire();
3029         }
3030 
3031         @Override
3032         public void releaseSuspendBlocker() {
3033             mDisplaySuspendBlocker.release();
3034         }
3035 
3036         @Override
3037         public String toString() {
3038             synchronized (this) {
3039                 return "state=" + Display.stateToString(mDisplayState);
3040             }
3041         }
3042     };
3043 
3044     private boolean shouldUseProximitySensorLocked() {
3045         return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0;
3046     }
3047 
3048     /**
3049      * Updates the suspend blocker that keeps the CPU alive.
3050      *
3051      * This function must have no other side-effects.
3052      */
3053     private void updateSuspendBlockerLocked() {
3054         final boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0);
3055         final boolean needDisplaySuspendBlocker = needDisplaySuspendBlockerLocked();
3056         final boolean autoSuspend = !needDisplaySuspendBlocker;
3057         final boolean interactive = mDisplayPowerRequest.isBrightOrDim();
3058 
3059         // Disable auto-suspend if needed.
3060         // FIXME We should consider just leaving auto-suspend enabled forever since
3061         // we already hold the necessary wakelocks.
3062         if (!autoSuspend && mDecoupleHalAutoSuspendModeFromDisplayConfig) {
3063             setHalAutoSuspendModeLocked(false);
3064         }
3065 
3066         // First acquire suspend blockers if needed.
3067         if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) {
3068             mWakeLockSuspendBlocker.acquire();
3069             mHoldingWakeLockSuspendBlocker = true;
3070         }
3071         if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) {
3072             mDisplaySuspendBlocker.acquire();
3073             mHoldingDisplaySuspendBlocker = true;
3074         }
3075 
3076         // Inform the power HAL about interactive mode.
3077         // Although we could set interactive strictly based on the wakefulness
3078         // as reported by isInteractive(), it is actually more desirable to track
3079         // the display policy state instead so that the interactive state observed
3080         // by the HAL more accurately tracks transitions between AWAKE and DOZING.
3081         // Refer to getDesiredScreenPolicyLocked() for details.
3082         if (mDecoupleHalInteractiveModeFromDisplayConfig) {
3083             // When becoming non-interactive, we want to defer sending this signal
3084             // until the display is actually ready so that all transitions have
3085             // completed.  This is probably a good sign that things have gotten
3086             // too tangled over here...
3087             if (interactive || mDisplayReady) {
3088                 setHalInteractiveModeLocked(interactive);
3089             }
3090         }
3091 
3092         // Then release suspend blockers if needed.
3093         if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) {
3094             mWakeLockSuspendBlocker.release();
3095             mHoldingWakeLockSuspendBlocker = false;
3096         }
3097         if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) {
3098             mDisplaySuspendBlocker.release();
3099             mHoldingDisplaySuspendBlocker = false;
3100         }
3101 
3102         // Enable auto-suspend if needed.
3103         if (autoSuspend && mDecoupleHalAutoSuspendModeFromDisplayConfig) {
3104             setHalAutoSuspendModeLocked(true);
3105         }
3106     }
3107 
3108     /**
3109      * Return true if we must keep a suspend blocker active on behalf of the display.
3110      * We do so if the screen is on or is in transition between states.
3111      */
3112     private boolean needDisplaySuspendBlockerLocked() {
3113         if (!mDisplayReady) {
3114             return true;
3115         }
3116         if (mDisplayPowerRequest.isBrightOrDim()) {
3117             // If we asked for the screen to be on but it is off due to the proximity
3118             // sensor then we may suspend but only if the configuration allows it.
3119             // On some hardware it may not be safe to suspend because the proximity
3120             // sensor may not be correctly configured as a wake-up source.
3121             if (!mDisplayPowerRequest.useProximitySensor || !mProximityPositive
3122                     || !mSuspendWhenScreenOffDueToProximityConfig) {
3123                 return true;
3124             }
3125         }
3126 
3127         if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE
3128                 && mDisplayPowerRequest.dozeScreenState == Display.STATE_ON) {
3129             // Although we are in DOZE and would normally allow the device to suspend,
3130             // the doze service has explicitly requested the display to remain in the ON
3131             // state which means we should hold the display suspend blocker.
3132             return true;
3133         }
3134         if (mScreenBrightnessBoostInProgress) {
3135             return true;
3136         }
3137 
3138         // When we transition to DOZING, we have to keep the display suspend blocker
3139         // up until the Doze service has a change to acquire the DOZE wakelock.
3140         // Here we wait for mWakefulnessChanging to become false since the wakefulness
3141         // transition to DOZING isn't considered "changed" until the doze wake lock is
3142         // acquired.
3143         if (getWakefulnessLocked() == WAKEFULNESS_DOZING && mDozeStartInProgress) {
3144             return true;
3145         }
3146 
3147         // Let the system suspend if the screen is off or dozing.
3148         return false;
3149     }
3150 
3151     private void setHalAutoSuspendModeLocked(boolean enable) {
3152         if (enable != mHalAutoSuspendModeEnabled) {
3153             if (DEBUG) {
3154                 Slog.d(TAG, "Setting HAL auto-suspend mode to " + enable);
3155             }
3156             mHalAutoSuspendModeEnabled = enable;
3157             Trace.traceBegin(Trace.TRACE_TAG_POWER, "setHalAutoSuspend(" + enable + ")");
3158             try {
3159                 mNativeWrapper.nativeSetAutoSuspend(enable);
3160             } finally {
3161                 Trace.traceEnd(Trace.TRACE_TAG_POWER);
3162             }
3163         }
3164     }
3165 
3166     private void setHalInteractiveModeLocked(boolean enable) {
3167         if (enable != mHalInteractiveModeEnabled) {
3168             if (DEBUG) {
3169                 Slog.d(TAG, "Setting HAL interactive mode to " + enable);
3170             }
3171             mHalInteractiveModeEnabled = enable;
3172             Trace.traceBegin(Trace.TRACE_TAG_POWER, "setHalInteractive(" + enable + ")");
3173             try {
3174                 mNativeWrapper.nativeSetInteractive(enable);
3175             } finally {
3176                 Trace.traceEnd(Trace.TRACE_TAG_POWER);
3177             }
3178         }
3179     }
3180 
3181     private boolean isInteractiveInternal() {
3182         synchronized (mLock) {
3183             return PowerManagerInternal.isInteractive(getWakefulnessLocked());
3184         }
3185     }
3186 
3187     private boolean setLowPowerModeInternal(boolean enabled) {
3188         synchronized (mLock) {
3189             if (DEBUG) {
3190                 Slog.d(TAG, "setLowPowerModeInternal " + enabled + " mIsPowered=" + mIsPowered);
3191             }
3192             if (mIsPowered) {
3193                 return false;
3194             }
3195 
3196             mBatterySaverStateMachine.setBatterySaverEnabledManually(enabled);
3197 
3198             return true;
3199         }
3200     }
3201 
3202     boolean isDeviceIdleModeInternal() {
3203         synchronized (mLock) {
3204             return mDeviceIdleMode;
3205         }
3206     }
3207 
3208     boolean isLightDeviceIdleModeInternal() {
3209         synchronized (mLock) {
3210             return mLightDeviceIdleMode;
3211         }
3212     }
3213 
3214     private void handleBatteryStateChangedLocked() {
3215         mDirty |= DIRTY_BATTERY_STATE;
3216         updatePowerStateLocked();
3217     }
3218 
3219     private void shutdownOrRebootInternal(final @HaltMode int haltMode, final boolean confirm,
3220             @Nullable final String reason, boolean wait) {
3221         if (PowerManager.REBOOT_USERSPACE.equals(reason)) {
3222             if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
3223                 throw new UnsupportedOperationException(
3224                         "Attempted userspace reboot on a device that doesn't support it");
3225             }
3226             UserspaceRebootLogger.noteUserspaceRebootWasRequested();
3227         }
3228         if (mHandler == null || !mSystemReady) {
3229             if (RescueParty.isAttemptingFactoryReset()) {
3230                 // If we're stuck in a really low-level reboot loop, and a
3231                 // rescue party is trying to prompt the user for a factory data
3232                 // reset, we must GET TO DA CHOPPA!
3233                 PowerManagerService.lowLevelReboot(reason);
3234             } else {
3235                 throw new IllegalStateException("Too early to call shutdown() or reboot()");
3236             }
3237         }
3238 
3239         Runnable runnable = new Runnable() {
3240             @Override
3241             public void run() {
3242                 synchronized (this) {
3243                     if (haltMode == HALT_MODE_REBOOT_SAFE_MODE) {
3244                         ShutdownThread.rebootSafeMode(getUiContext(), confirm);
3245                     } else if (haltMode == HALT_MODE_REBOOT) {
3246                         ShutdownThread.reboot(getUiContext(), reason, confirm);
3247                     } else {
3248                         ShutdownThread.shutdown(getUiContext(), reason, confirm);
3249                     }
3250                 }
3251             }
3252         };
3253 
3254         // ShutdownThread must run on a looper capable of displaying the UI.
3255         Message msg = Message.obtain(UiThread.getHandler(), runnable);
3256         msg.setAsynchronous(true);
3257         UiThread.getHandler().sendMessage(msg);
3258 
3259         // PowerManager.reboot() is documented not to return so just wait for the inevitable.
3260         if (wait) {
3261             synchronized (runnable) {
3262                 while (true) {
3263                     try {
3264                         runnable.wait();
3265                     } catch (InterruptedException e) {
3266                     }
3267                 }
3268             }
3269         }
3270     }
3271 
3272     private void crashInternal(final String message) {
3273         Thread t = new Thread("PowerManagerService.crash()") {
3274             @Override
3275             public void run() {
3276                 throw new RuntimeException(message);
3277             }
3278         };
3279         try {
3280             t.start();
3281             t.join();
3282         } catch (InterruptedException e) {
3283             Slog.wtf(TAG, e);
3284         }
3285     }
3286 
3287     @VisibleForTesting
3288     void updatePowerRequestFromBatterySaverPolicy(DisplayPowerRequest displayPowerRequest) {
3289         PowerSaveState state = mBatterySaverPolicy.
3290                 getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS);
3291         displayPowerRequest.lowPowerMode = state.batterySaverEnabled;
3292         displayPowerRequest.screenLowPowerBrightnessFactor = state.brightnessFactor;
3293     }
3294 
3295     void setStayOnSettingInternal(int val) {
3296         Settings.Global.putInt(mContext.getContentResolver(),
3297                 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, val);
3298     }
3299 
3300     void setMaximumScreenOffTimeoutFromDeviceAdminInternal(@UserIdInt int userId, long timeMs) {
3301         if (userId < 0) {
3302             Slog.wtf(TAG, "Attempt to set screen off timeout for invalid user: " + userId);
3303             return;
3304         }
3305         synchronized (mLock) {
3306             // System-wide timeout
3307             if (userId == UserHandle.USER_SYSTEM) {
3308                 mMaximumScreenOffTimeoutFromDeviceAdmin = timeMs;
3309             } else if (timeMs == Long.MAX_VALUE || timeMs == 0) {
3310                 mProfilePowerState.delete(userId);
3311             } else {
3312                 final ProfilePowerState profile = mProfilePowerState.get(userId);
3313                 if (profile != null) {
3314                     profile.mScreenOffTimeout = timeMs;
3315                 } else {
3316                     mProfilePowerState.put(userId, new ProfilePowerState(userId, timeMs,
3317                             mClock.uptimeMillis()));
3318                     // We need to recalculate wake locks for the new profile state.
3319                     mDirty |= DIRTY_WAKE_LOCKS;
3320                 }
3321             }
3322             mDirty |= DIRTY_SETTINGS;
3323             updatePowerStateLocked();
3324         }
3325     }
3326 
3327     boolean setDeviceIdleModeInternal(boolean enabled) {
3328         synchronized (mLock) {
3329             if (mDeviceIdleMode == enabled) {
3330                 return false;
3331             }
3332             mDeviceIdleMode = enabled;
3333             updateWakeLockDisabledStatesLocked();
3334             setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode);
3335         }
3336         if (enabled) {
3337             EventLogTags.writeDeviceIdleOnPhase("power");
3338         } else {
3339             EventLogTags.writeDeviceIdleOffPhase("power");
3340         }
3341         return true;
3342     }
3343 
3344     boolean setLightDeviceIdleModeInternal(boolean enabled) {
3345         synchronized (mLock) {
3346             if (mLightDeviceIdleMode != enabled) {
3347                 mLightDeviceIdleMode = enabled;
3348                 setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode);
3349                 return true;
3350             }
3351             return false;
3352         }
3353     }
3354 
3355     void setDeviceIdleWhitelistInternal(int[] appids) {
3356         synchronized (mLock) {
3357             mDeviceIdleWhitelist = appids;
3358             if (mDeviceIdleMode) {
3359                 updateWakeLockDisabledStatesLocked();
3360             }
3361         }
3362     }
3363 
3364     void setDeviceIdleTempWhitelistInternal(int[] appids) {
3365         synchronized (mLock) {
3366             mDeviceIdleTempWhitelist = appids;
3367             if (mDeviceIdleMode) {
3368                 updateWakeLockDisabledStatesLocked();
3369             }
3370         }
3371     }
3372 
3373     void startUidChangesInternal() {
3374         synchronized (mLock) {
3375             mUidsChanging = true;
3376         }
3377     }
3378 
3379     void finishUidChangesInternal() {
3380         synchronized (mLock) {
3381             mUidsChanging = false;
3382             if (mUidsChanged) {
3383                 updateWakeLockDisabledStatesLocked();
3384                 mUidsChanged = false;
3385             }
3386         }
3387     }
3388 
3389     private void handleUidStateChangeLocked() {
3390         if (mUidsChanging) {
3391             mUidsChanged = true;
3392         } else {
3393             updateWakeLockDisabledStatesLocked();
3394         }
3395     }
3396 
3397     void updateUidProcStateInternal(int uid, int procState) {
3398         synchronized (mLock) {
3399             UidState state = mUidState.get(uid);
3400             if (state == null) {
3401                 state = new UidState(uid);
3402                 mUidState.put(uid, state);
3403             }
3404             final boolean oldShouldAllow = state.mProcState
3405                     <= ActivityManager.PROCESS_STATE_RECEIVER;
3406             state.mProcState = procState;
3407             if (state.mNumWakeLocks > 0) {
3408                 if (mDeviceIdleMode) {
3409                     handleUidStateChangeLocked();
3410                 } else if (!state.mActive && oldShouldAllow !=
3411                         (procState <= ActivityManager.PROCESS_STATE_RECEIVER)) {
3412                     // If this uid is not active, but the process state has changed such
3413                     // that we may still want to allow it to hold a wake lock, then take care of it.
3414                     handleUidStateChangeLocked();
3415                 }
3416             }
3417         }
3418     }
3419 
3420     void uidGoneInternal(int uid) {
3421         synchronized (mLock) {
3422             final int index = mUidState.indexOfKey(uid);
3423             if (index >= 0) {
3424                 UidState state = mUidState.valueAt(index);
3425                 state.mProcState = ActivityManager.PROCESS_STATE_NONEXISTENT;
3426                 state.mActive = false;
3427                 mUidState.removeAt(index);
3428                 if (mDeviceIdleMode && state.mNumWakeLocks > 0) {
3429                     handleUidStateChangeLocked();
3430                 }
3431             }
3432         }
3433     }
3434 
3435     void uidActiveInternal(int uid) {
3436         synchronized (mLock) {
3437             UidState state = mUidState.get(uid);
3438             if (state == null) {
3439                 state = new UidState(uid);
3440                 state.mProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
3441                 mUidState.put(uid, state);
3442             }
3443             state.mActive = true;
3444             if (state.mNumWakeLocks > 0) {
3445                 handleUidStateChangeLocked();
3446             }
3447         }
3448     }
3449 
3450     void uidIdleInternal(int uid) {
3451         synchronized (mLock) {
3452             UidState state = mUidState.get(uid);
3453             if (state != null) {
3454                 state.mActive = false;
3455                 if (state.mNumWakeLocks > 0) {
3456                     handleUidStateChangeLocked();
3457                 }
3458             }
3459         }
3460     }
3461 
3462     private void updateWakeLockDisabledStatesLocked() {
3463         boolean changed = false;
3464         final int numWakeLocks = mWakeLocks.size();
3465         for (int i = 0; i < numWakeLocks; i++) {
3466             final WakeLock wakeLock = mWakeLocks.get(i);
3467             if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
3468                     == PowerManager.PARTIAL_WAKE_LOCK) {
3469                 if (setWakeLockDisabledStateLocked(wakeLock)) {
3470                     changed = true;
3471                     if (wakeLock.mDisabled) {
3472                         // This wake lock is no longer being respected.
3473                         notifyWakeLockReleasedLocked(wakeLock);
3474                     } else {
3475                         notifyWakeLockAcquiredLocked(wakeLock);
3476                     }
3477                 }
3478             }
3479         }
3480         if (changed) {
3481             mDirty |= DIRTY_WAKE_LOCKS;
3482             updatePowerStateLocked();
3483         }
3484     }
3485 
3486     private boolean setWakeLockDisabledStateLocked(WakeLock wakeLock) {
3487         if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
3488                 == PowerManager.PARTIAL_WAKE_LOCK) {
3489             boolean disabled = false;
3490             final int appid = UserHandle.getAppId(wakeLock.mOwnerUid);
3491             if (appid >= Process.FIRST_APPLICATION_UID) {
3492                 // Cached inactive processes are never allowed to hold wake locks.
3493                 if (mConstants.NO_CACHED_WAKE_LOCKS) {
3494                     disabled = mForceSuspendActive
3495                             || (!wakeLock.mUidState.mActive && wakeLock.mUidState.mProcState
3496                                     != ActivityManager.PROCESS_STATE_NONEXISTENT &&
3497                             wakeLock.mUidState.mProcState > ActivityManager.PROCESS_STATE_RECEIVER);
3498                 }
3499                 if (mDeviceIdleMode) {
3500                     // If we are in idle mode, we will also ignore all partial wake locks that are
3501                     // for application uids that are not whitelisted.
3502                     final UidState state = wakeLock.mUidState;
3503                     if (Arrays.binarySearch(mDeviceIdleWhitelist, appid) < 0 &&
3504                             Arrays.binarySearch(mDeviceIdleTempWhitelist, appid) < 0 &&
3505                             state.mProcState != ActivityManager.PROCESS_STATE_NONEXISTENT &&
3506                             state.mProcState >
3507                                     ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
3508                         disabled = true;
3509                     }
3510                 }
3511             }
3512             if (wakeLock.mDisabled != disabled) {
3513                 wakeLock.mDisabled = disabled;
3514                 return true;
3515             }
3516         }
3517         return false;
3518     }
3519 
3520     private boolean isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() {
3521         return mMaximumScreenOffTimeoutFromDeviceAdmin >= 0
3522                 && mMaximumScreenOffTimeoutFromDeviceAdmin < Long.MAX_VALUE;
3523     }
3524 
3525     private void setAttentionLightInternal(boolean on, int color) {
3526         LogicalLight light;
3527         synchronized (mLock) {
3528             if (!mSystemReady) {
3529                 return;
3530             }
3531             light = mAttentionLight;
3532         }
3533 
3534         // Control light outside of lock.
3535         if (light != null) {
3536             light.setFlashing(color, LogicalLight.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0);
3537         }
3538     }
3539 
3540     private void setDozeAfterScreenOffInternal(boolean on) {
3541         synchronized (mLock) {
3542             mDozeAfterScreenOff = on;
3543         }
3544     }
3545 
3546     private void boostScreenBrightnessInternal(long eventTime, int uid) {
3547         synchronized (mLock) {
3548             if (!mSystemReady || getWakefulnessLocked() == WAKEFULNESS_ASLEEP
3549                     || eventTime < mLastScreenBrightnessBoostTime) {
3550                 return;
3551             }
3552 
3553             Slog.i(TAG, "Brightness boost activated (uid " + uid +")...");
3554             mLastScreenBrightnessBoostTime = eventTime;
3555             mScreenBrightnessBoostInProgress = true;
3556             mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST;
3557 
3558             userActivityNoUpdateLocked(eventTime,
3559                     PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid);
3560             updatePowerStateLocked();
3561         }
3562     }
3563 
3564     private boolean isScreenBrightnessBoostedInternal() {
3565         synchronized (mLock) {
3566             return mScreenBrightnessBoostInProgress;
3567         }
3568     }
3569 
3570     /**
3571      * Called when a screen brightness boost timeout has occurred.
3572      *
3573      * This function must have no other side-effects besides setting the dirty
3574      * bit and calling update power state.
3575      */
3576     private void handleScreenBrightnessBoostTimeout() { // runs on handler thread
3577         synchronized (mLock) {
3578             if (DEBUG_SPEW) {
3579                 Slog.d(TAG, "handleScreenBrightnessBoostTimeout");
3580             }
3581 
3582             mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST;
3583             updatePowerStateLocked();
3584         }
3585     }
3586 
3587     private void setScreenBrightnessOverrideFromWindowManagerInternal(float brightness) {
3588         synchronized (mLock) {
3589             if (!BrightnessSynchronizer.floatEquals(mScreenBrightnessOverrideFromWindowManager,
3590                     brightness)) {
3591                 mScreenBrightnessOverrideFromWindowManager = brightness;
3592                 mDirty |= DIRTY_SETTINGS;
3593                 updatePowerStateLocked();
3594             }
3595         }
3596     }
3597 
3598     private void setUserInactiveOverrideFromWindowManagerInternal() {
3599         synchronized (mLock) {
3600             mUserInactiveOverrideFromWindowManager = true;
3601             mDirty |= DIRTY_USER_ACTIVITY;
3602             updatePowerStateLocked();
3603         }
3604     }
3605 
3606     private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) {
3607         synchronized (mLock) {
3608             if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) {
3609                 mUserActivityTimeoutOverrideFromWindowManager = timeoutMillis;
3610                 EventLogTags.writeUserActivityTimeoutOverride(timeoutMillis);
3611                 mDirty |= DIRTY_SETTINGS;
3612                 updatePowerStateLocked();
3613             }
3614         }
3615     }
3616 
3617     private void setDozeOverrideFromDreamManagerInternal(
3618             int screenState, int screenBrightness) {
3619         synchronized (mLock) {
3620             if (mDozeScreenStateOverrideFromDreamManager != screenState
3621                     || mDozeScreenBrightnessOverrideFromDreamManager != screenBrightness) {
3622                 mDozeScreenStateOverrideFromDreamManager = screenState;
3623                 mDozeScreenBrightnessOverrideFromDreamManager = screenBrightness;
3624                 mDozeScreenBrightnessOverrideFromDreamManagerFloat =
3625                         BrightnessSynchronizer.brightnessIntToFloat(mContext,
3626                                 mDozeScreenBrightnessOverrideFromDreamManager);
3627                 mDirty |= DIRTY_SETTINGS;
3628                 updatePowerStateLocked();
3629             }
3630         }
3631     }
3632 
3633     private void setDrawWakeLockOverrideFromSidekickInternal(boolean keepState) {
3634         synchronized (mLock) {
3635             if (mDrawWakeLockOverrideFromSidekick != keepState) {
3636                 mDrawWakeLockOverrideFromSidekick = keepState;
3637                 mDirty |= DIRTY_SETTINGS;
3638                 updatePowerStateLocked();
3639             }
3640         }
3641     }
3642 
3643     @VisibleForTesting
3644     void setVrModeEnabled(boolean enabled) {
3645         mIsVrModeEnabled = enabled;
3646     }
3647 
3648     private void powerHintInternal(int hintId, int data) {
3649         // Maybe filter the event.
3650         switch (hintId) {
3651             case PowerHint.LAUNCH: // 1: activate launch boost 0: deactivate.
3652                 if (data == 1 && mBatterySaverController.isLaunchBoostDisabled()) {
3653                     return;
3654                 }
3655                 break;
3656         }
3657 
3658         mNativeWrapper.nativeSendPowerHint(hintId, data);
3659     }
3660 
3661     private void setPowerBoostInternal(int boost, int durationMs) {
3662         // Maybe filter the event.
3663         mNativeWrapper.nativeSetPowerBoost(boost, durationMs);
3664     }
3665 
3666     private boolean setPowerModeInternal(int mode, boolean enabled) {
3667         // Maybe filter the event.
3668         return mNativeWrapper.nativeSetPowerMode(mode, enabled);
3669     }
3670 
3671     @VisibleForTesting
3672     boolean wasDeviceIdleForInternal(long ms) {
3673         synchronized (mLock) {
3674             return mLastUserActivityTime + ms < mClock.uptimeMillis();
3675         }
3676     }
3677 
3678     @VisibleForTesting
3679     void onUserActivity() {
3680         synchronized (mLock) {
3681             mLastUserActivityTime = mClock.uptimeMillis();
3682         }
3683     }
3684 
3685     private boolean forceSuspendInternal(int uid) {
3686         try {
3687             synchronized (mLock) {
3688                 mForceSuspendActive = true;
3689                 // Place the system in an non-interactive state
3690                 goToSleepInternal(mClock.uptimeMillis(),
3691                         PowerManager.GO_TO_SLEEP_REASON_FORCE_SUSPEND,
3692                         PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, uid);
3693 
3694                 // Disable all the partial wake locks as well
3695                 updateWakeLockDisabledStatesLocked();
3696             }
3697 
3698             Slog.i(TAG, "Force-Suspending (uid " + uid + ")...");
3699             boolean success = mNativeWrapper.nativeForceSuspend();
3700             if (!success) {
3701                 Slog.i(TAG, "Force-Suspending failed in native.");
3702             }
3703             return success;
3704         } finally {
3705             synchronized (mLock) {
3706                 mForceSuspendActive = false;
3707                 // Re-enable wake locks once again.
3708                 updateWakeLockDisabledStatesLocked();
3709             }
3710         }
3711     }
3712 
3713     /**
3714      * Low-level function turn the device off immediately, without trying
3715      * to be clean.  Most people should use {@link ShutdownThread} for a clean shutdown.
3716      *
3717      * @param reason code to pass to android_reboot() (e.g. "userrequested"), or null.
3718      */
3719     public static void lowLevelShutdown(String reason) {
3720         if (reason == null) {
3721             reason = "";
3722         }
3723         SystemProperties.set("sys.powerctl", "shutdown," + reason);
3724     }
3725 
3726     /**
3727      * Low-level function to reboot the device. On success, this
3728      * function doesn't return. If more than 20 seconds passes from
3729      * the time a reboot is requested, this method returns.
3730      *
3731      * @param reason code to pass to the kernel (e.g. "recovery"), or null.
3732      */
3733     public static void lowLevelReboot(String reason) {
3734         if (reason == null) {
3735             reason = "";
3736         }
3737 
3738         // If the reason is "quiescent", it means that the boot process should proceed
3739         // without turning on the screen/lights.
3740         // The "quiescent" property is sticky, meaning that any number
3741         // of subsequent reboots should honor the property until it is reset.
3742         if (reason.equals(PowerManager.REBOOT_QUIESCENT)) {
3743             sQuiescent = true;
3744             reason = "";
3745         } else if (reason.endsWith("," + PowerManager.REBOOT_QUIESCENT)) {
3746             sQuiescent = true;
3747             reason = reason.substring(0,
3748                     reason.length() - PowerManager.REBOOT_QUIESCENT.length() - 1);
3749         }
3750 
3751         if (reason.equals(PowerManager.REBOOT_RECOVERY)
3752                 || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
3753             reason = "recovery";
3754         }
3755 
3756         if (sQuiescent) {
3757             // Pass the optional "quiescent" argument to the bootloader to let it know
3758             // that it should not turn the screen/lights on.
3759             reason = reason + ",quiescent";
3760         }
3761 
3762         SystemProperties.set("sys.powerctl", "reboot," + reason);
3763         try {
3764             Thread.sleep(20 * 1000L);
3765         } catch (InterruptedException e) {
3766             Thread.currentThread().interrupt();
3767         }
3768         Slog.wtf(TAG, "Unexpected return from lowLevelReboot!");
3769     }
3770 
3771     @Override // Watchdog.Monitor implementation
3772     public void monitor() {
3773         // Grab and release lock for watchdog monitor to detect deadlocks.
3774         synchronized (mLock) {
3775         }
3776     }
3777 
3778     private void dumpInternal(PrintWriter pw) {
3779         pw.println("POWER MANAGER (dumpsys power)\n");
3780 
3781         final WirelessChargerDetector wcd;
3782         synchronized (mLock) {
3783             pw.println("Power Manager State:");
3784             mConstants.dump(pw);
3785             pw.println("  mDirty=0x" + Integer.toHexString(mDirty));
3786             pw.println("  mWakefulness="
3787                     + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked()));
3788             pw.println("  mWakefulnessChanging=" + mWakefulnessChanging);
3789             pw.println("  mIsPowered=" + mIsPowered);
3790             pw.println("  mPlugType=" + mPlugType);
3791             pw.println("  mBatteryLevel=" + mBatteryLevel);
3792             pw.println("  mBatteryLevelWhenDreamStarted=" + mBatteryLevelWhenDreamStarted);
3793             pw.println("  mDockState=" + mDockState);
3794             pw.println("  mStayOn=" + mStayOn);
3795             pw.println("  mProximityPositive=" + mProximityPositive);
3796             pw.println("  mBootCompleted=" + mBootCompleted);
3797             pw.println("  mSystemReady=" + mSystemReady);
3798             pw.println("  mHalAutoSuspendModeEnabled=" + mHalAutoSuspendModeEnabled);
3799             pw.println("  mHalInteractiveModeEnabled=" + mHalInteractiveModeEnabled);
3800             pw.println("  mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));
3801             pw.print("  mNotifyLongScheduled=");
3802             if (mNotifyLongScheduled == 0) {
3803                 pw.print("(none)");
3804             } else {
3805                 TimeUtils.formatDuration(mNotifyLongScheduled, mClock.uptimeMillis(), pw);
3806             }
3807             pw.println();
3808             pw.print("  mNotifyLongDispatched=");
3809             if (mNotifyLongDispatched == 0) {
3810                 pw.print("(none)");
3811             } else {
3812                 TimeUtils.formatDuration(mNotifyLongDispatched, mClock.uptimeMillis(), pw);
3813             }
3814             pw.println();
3815             pw.print("  mNotifyLongNextCheck=");
3816             if (mNotifyLongNextCheck == 0) {
3817                 pw.print("(none)");
3818             } else {
3819                 TimeUtils.formatDuration(mNotifyLongNextCheck, mClock.uptimeMillis(), pw);
3820             }
3821             pw.println();
3822             pw.println("  mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary));
3823             pw.println("  mRequestWaitForNegativeProximity=" + mRequestWaitForNegativeProximity);
3824             pw.println("  mSandmanScheduled=" + mSandmanScheduled);
3825             pw.println("  mSandmanSummoned=" + mSandmanSummoned);
3826             pw.println("  mBatteryLevelLow=" + mBatteryLevelLow);
3827             pw.println("  mLightDeviceIdleMode=" + mLightDeviceIdleMode);
3828             pw.println("  mDeviceIdleMode=" + mDeviceIdleMode);
3829             pw.println("  mDeviceIdleWhitelist=" + Arrays.toString(mDeviceIdleWhitelist));
3830             pw.println("  mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist));
3831             pw.println("  mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime));
3832             pw.println("  mLastSleepTime=" + TimeUtils.formatUptime(mLastSleepTime));
3833             pw.println("  mLastSleepReason=" + PowerManager.sleepReasonToString(mLastSleepReason));
3834             pw.println("  mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime));
3835             pw.println("  mLastUserActivityTimeNoChangeLights="
3836                     + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights));
3837             pw.println("  mLastInteractivePowerHintTime="
3838                     + TimeUtils.formatUptime(mLastInteractivePowerHintTime));
3839             pw.println("  mLastScreenBrightnessBoostTime="
3840                     + TimeUtils.formatUptime(mLastScreenBrightnessBoostTime));
3841             pw.println("  mScreenBrightnessBoostInProgress="
3842                     + mScreenBrightnessBoostInProgress);
3843             pw.println("  mDisplayReady=" + mDisplayReady);
3844             pw.println("  mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker);
3845             pw.println("  mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker);
3846 
3847             pw.println();
3848             pw.println("Settings and Configuration:");
3849             pw.println("  mDecoupleHalAutoSuspendModeFromDisplayConfig="
3850                     + mDecoupleHalAutoSuspendModeFromDisplayConfig);
3851             pw.println("  mDecoupleHalInteractiveModeFromDisplayConfig="
3852                     + mDecoupleHalInteractiveModeFromDisplayConfig);
3853             pw.println("  mWakeUpWhenPluggedOrUnpluggedConfig="
3854                     + mWakeUpWhenPluggedOrUnpluggedConfig);
3855             pw.println("  mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig="
3856                     + mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig);
3857             pw.println("  mTheaterModeEnabled="
3858                     + mTheaterModeEnabled);
3859             pw.println("  mSuspendWhenScreenOffDueToProximityConfig="
3860                     + mSuspendWhenScreenOffDueToProximityConfig);
3861             pw.println("  mDreamsSupportedConfig=" + mDreamsSupportedConfig);
3862             pw.println("  mDreamsEnabledByDefaultConfig=" + mDreamsEnabledByDefaultConfig);
3863             pw.println("  mDreamsActivatedOnSleepByDefaultConfig="
3864                     + mDreamsActivatedOnSleepByDefaultConfig);
3865             pw.println("  mDreamsActivatedOnDockByDefaultConfig="
3866                     + mDreamsActivatedOnDockByDefaultConfig);
3867             pw.println("  mDreamsEnabledOnBatteryConfig="
3868                     + mDreamsEnabledOnBatteryConfig);
3869             pw.println("  mDreamsBatteryLevelMinimumWhenPoweredConfig="
3870                     + mDreamsBatteryLevelMinimumWhenPoweredConfig);
3871             pw.println("  mDreamsBatteryLevelMinimumWhenNotPoweredConfig="
3872                     + mDreamsBatteryLevelMinimumWhenNotPoweredConfig);
3873             pw.println("  mDreamsBatteryLevelDrainCutoffConfig="
3874                     + mDreamsBatteryLevelDrainCutoffConfig);
3875             pw.println("  mDreamsEnabledSetting=" + mDreamsEnabledSetting);
3876             pw.println("  mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting);
3877             pw.println("  mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);
3878             pw.println("  mDozeAfterScreenOff=" + mDozeAfterScreenOff);
3879             pw.println("  mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig);
3880             pw.println("  mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig);
3881             pw.println("  mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig);
3882             pw.println("  mAttentiveTimeoutConfig=" + mAttentiveTimeoutConfig);
3883             pw.println("  mAttentiveTimeoutSetting=" + mAttentiveTimeoutSetting);
3884             pw.println("  mAttentiveWarningDurationConfig=" + mAttentiveWarningDurationConfig);
3885             pw.println("  mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting);
3886             pw.println("  mSleepTimeoutSetting=" + mSleepTimeoutSetting);
3887             pw.println("  mMaximumScreenOffTimeoutFromDeviceAdmin="
3888                     + mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="
3889                     + isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
3890             pw.println("  mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);
3891             pw.println("  mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);
3892             pw.println("  mScreenBrightnessOverrideFromWindowManager="
3893                     + mScreenBrightnessOverrideFromWindowManager);
3894             pw.println("  mUserActivityTimeoutOverrideFromWindowManager="
3895                     + mUserActivityTimeoutOverrideFromWindowManager);
3896             pw.println("  mUserInactiveOverrideFromWindowManager="
3897                     + mUserInactiveOverrideFromWindowManager);
3898             pw.println("  mDozeScreenStateOverrideFromDreamManager="
3899                     + mDozeScreenStateOverrideFromDreamManager);
3900             pw.println("  mDrawWakeLockOverrideFromSidekick=" + mDrawWakeLockOverrideFromSidekick);
3901             pw.println("  mDozeScreenBrightnessOverrideFromDreamManager="
3902                     + mDozeScreenBrightnessOverrideFromDreamManager);
3903             pw.println("  mScreenBrightnessSettingMinimumFloat=" + mScreenBrightnessSettingMinimum);
3904             pw.println("  mScreenBrightnessSettingMaximumFloat=" + mScreenBrightnessSettingMaximum);
3905             pw.println("  mScreenBrightnessSettingDefaultFloat=" + mScreenBrightnessSettingDefault);
3906             pw.println("  mDoubleTapWakeEnabled=" + mDoubleTapWakeEnabled);
3907             pw.println("  mIsVrModeEnabled=" + mIsVrModeEnabled);
3908             pw.println("  mForegroundProfile=" + mForegroundProfile);
3909             pw.println("  mUserId=" + mUserId);
3910 
3911             final long attentiveTimeout = getAttentiveTimeoutLocked();
3912             final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
3913             final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, attentiveTimeout);
3914             final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
3915             pw.println();
3916             pw.println("Attentive timeout: " + attentiveTimeout + " ms");
3917             pw.println("Sleep timeout: " + sleepTimeout + " ms");
3918             pw.println("Screen off timeout: " + screenOffTimeout + " ms");
3919             pw.println("Screen dim duration: " + screenDimDuration + " ms");
3920 
3921             pw.println();
3922             pw.print("UID states (changing=");
3923             pw.print(mUidsChanging);
3924             pw.print(" changed=");
3925             pw.print(mUidsChanged);
3926             pw.println("):");
3927             for (int i=0; i<mUidState.size(); i++) {
3928                 final UidState state = mUidState.valueAt(i);
3929                 pw.print("  UID "); UserHandle.formatUid(pw, mUidState.keyAt(i));
3930                 pw.print(": ");
3931                 if (state.mActive) pw.print("  ACTIVE ");
3932                 else pw.print("INACTIVE ");
3933                 pw.print(" count=");
3934                 pw.print(state.mNumWakeLocks);
3935                 pw.print(" state=");
3936                 pw.println(state.mProcState);
3937             }
3938 
3939             pw.println();
3940             pw.println("Looper state:");
3941             mHandler.getLooper().dump(new PrintWriterPrinter(pw), "  ");
3942 
3943             pw.println();
3944             pw.println("Wake Locks: size=" + mWakeLocks.size());
3945             for (WakeLock wl : mWakeLocks) {
3946                 pw.println("  " + wl);
3947             }
3948 
3949             pw.println();
3950             pw.println("Suspend Blockers: size=" + mSuspendBlockers.size());
3951             for (SuspendBlocker sb : mSuspendBlockers) {
3952                 pw.println("  " + sb);
3953             }
3954 
3955             pw.println();
3956             pw.println("Display Power: " + mDisplayPowerCallbacks);
3957 
3958             mBatterySaverPolicy.dump(pw);
3959             mBatterySaverStateMachine.dump(pw);
3960             mAttentionDetector.dump(pw);
3961 
3962             pw.println();
3963             final int numProfiles = mProfilePowerState.size();
3964             pw.println("Profile power states: size=" + numProfiles);
3965             for (int i = 0; i < numProfiles; i++) {
3966                 final ProfilePowerState profile = mProfilePowerState.valueAt(i);
3967                 pw.print("  mUserId=");
3968                 pw.print(profile.mUserId);
3969                 pw.print(" mScreenOffTimeout=");
3970                 pw.print(profile.mScreenOffTimeout);
3971                 pw.print(" mWakeLockSummary=");
3972                 pw.print(profile.mWakeLockSummary);
3973                 pw.print(" mLastUserActivityTime=");
3974                 pw.print(profile.mLastUserActivityTime);
3975                 pw.print(" mLockingNotified=");
3976                 pw.println(profile.mLockingNotified);
3977             }
3978 
3979             wcd = mWirelessChargerDetector;
3980         }
3981 
3982         if (wcd != null) {
3983             wcd.dump(pw);
3984         }
3985 
3986         if (mNotifier != null) {
3987             mNotifier.dump(pw);
3988         }
3989 
3990         mAmbientDisplaySuppressionController.dump(pw);
3991     }
3992 
3993     private void dumpProto(FileDescriptor fd) {
3994         final WirelessChargerDetector wcd;
3995         final ProtoOutputStream proto = new ProtoOutputStream(fd);
3996 
3997         synchronized (mLock) {
3998             mConstants.dumpProto(proto);
3999             proto.write(PowerManagerServiceDumpProto.DIRTY, mDirty);
4000             proto.write(PowerManagerServiceDumpProto.WAKEFULNESS, getWakefulnessLocked());
4001             proto.write(PowerManagerServiceDumpProto.IS_WAKEFULNESS_CHANGING, mWakefulnessChanging);
4002             proto.write(PowerManagerServiceDumpProto.IS_POWERED, mIsPowered);
4003             proto.write(PowerManagerServiceDumpProto.PLUG_TYPE, mPlugType);
4004             proto.write(PowerManagerServiceDumpProto.BATTERY_LEVEL, mBatteryLevel);
4005             proto.write(
4006                     PowerManagerServiceDumpProto.BATTERY_LEVEL_WHEN_DREAM_STARTED,
4007                     mBatteryLevelWhenDreamStarted);
4008             proto.write(PowerManagerServiceDumpProto.DOCK_STATE, mDockState);
4009             proto.write(PowerManagerServiceDumpProto.IS_STAY_ON, mStayOn);
4010             proto.write(PowerManagerServiceDumpProto.IS_PROXIMITY_POSITIVE, mProximityPositive);
4011             proto.write(PowerManagerServiceDumpProto.IS_BOOT_COMPLETED, mBootCompleted);
4012             proto.write(PowerManagerServiceDumpProto.IS_SYSTEM_READY, mSystemReady);
4013             proto.write(
4014                     PowerManagerServiceDumpProto.IS_HAL_AUTO_SUSPEND_MODE_ENABLED,
4015                     mHalAutoSuspendModeEnabled);
4016             proto.write(
4017                     PowerManagerServiceDumpProto.IS_HAL_AUTO_INTERACTIVE_MODE_ENABLED,
4018                     mHalInteractiveModeEnabled);
4019 
4020             final long activeWakeLocksToken = proto.start(PowerManagerServiceDumpProto.ACTIVE_WAKE_LOCKS);
4021             proto.write(
4022                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_CPU,
4023                     (mWakeLockSummary & WAKE_LOCK_CPU) != 0);
4024             proto.write(
4025                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_BRIGHT,
4026                     (mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0);
4027             proto.write(
4028                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_DIM,
4029                     (mWakeLockSummary & WAKE_LOCK_SCREEN_DIM) != 0);
4030             proto.write(
4031                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_BUTTON_BRIGHT,
4032                     (mWakeLockSummary & WAKE_LOCK_BUTTON_BRIGHT) != 0);
4033             proto.write(
4034                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_PROXIMITY_SCREEN_OFF,
4035                     (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0);
4036             proto.write(
4037                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_STAY_AWAKE,
4038                     (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0);
4039             proto.write(
4040                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_DOZE,
4041                     (mWakeLockSummary & WAKE_LOCK_DOZE) != 0);
4042             proto.write(
4043                     PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_DRAW,
4044                     (mWakeLockSummary & WAKE_LOCK_DRAW) != 0);
4045             proto.end(activeWakeLocksToken);
4046 
4047             proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_SCHEDULED_MS, mNotifyLongScheduled);
4048             proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_DISPATCHED_MS, mNotifyLongDispatched);
4049             proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_NEXT_CHECK_MS, mNotifyLongNextCheck);
4050 
4051             final long userActivityToken = proto.start(PowerManagerServiceDumpProto.USER_ACTIVITY);
4052             proto.write(
4053                     PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_BRIGHT,
4054                     (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0);
4055             proto.write(
4056                     PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_DIM,
4057                     (mUserActivitySummary & USER_ACTIVITY_SCREEN_DIM) != 0);
4058             proto.write(
4059                     PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_DREAM,
4060                     (mUserActivitySummary & USER_ACTIVITY_SCREEN_DREAM) != 0);
4061             proto.end(userActivityToken);
4062 
4063             proto.write(
4064                     PowerManagerServiceDumpProto.IS_REQUEST_WAIT_FOR_NEGATIVE_PROXIMITY,
4065                     mRequestWaitForNegativeProximity);
4066             proto.write(PowerManagerServiceDumpProto.IS_SANDMAN_SCHEDULED, mSandmanScheduled);
4067             proto.write(PowerManagerServiceDumpProto.IS_SANDMAN_SUMMONED, mSandmanSummoned);
4068             proto.write(PowerManagerServiceDumpProto.IS_BATTERY_LEVEL_LOW, mBatteryLevelLow);
4069             proto.write(PowerManagerServiceDumpProto.IS_LIGHT_DEVICE_IDLE_MODE, mLightDeviceIdleMode);
4070             proto.write(PowerManagerServiceDumpProto.IS_DEVICE_IDLE_MODE, mDeviceIdleMode);
4071 
4072             for (int id : mDeviceIdleWhitelist) {
4073                 proto.write(PowerManagerServiceDumpProto.DEVICE_IDLE_WHITELIST, id);
4074             }
4075             for (int id : mDeviceIdleTempWhitelist) {
4076                 proto.write(PowerManagerServiceDumpProto.DEVICE_IDLE_TEMP_WHITELIST, id);
4077             }
4078 
4079             proto.write(PowerManagerServiceDumpProto.LAST_WAKE_TIME_MS, mLastWakeTime);
4080             proto.write(PowerManagerServiceDumpProto.LAST_SLEEP_TIME_MS, mLastSleepTime);
4081             proto.write(PowerManagerServiceDumpProto.LAST_USER_ACTIVITY_TIME_MS, mLastUserActivityTime);
4082             proto.write(
4083                     PowerManagerServiceDumpProto.LAST_USER_ACTIVITY_TIME_NO_CHANGE_LIGHTS_MS,
4084                     mLastUserActivityTimeNoChangeLights);
4085             proto.write(
4086                     PowerManagerServiceDumpProto.LAST_INTERACTIVE_POWER_HINT_TIME_MS,
4087                     mLastInteractivePowerHintTime);
4088             proto.write(
4089                     PowerManagerServiceDumpProto.LAST_SCREEN_BRIGHTNESS_BOOST_TIME_MS,
4090                     mLastScreenBrightnessBoostTime);
4091             proto.write(
4092                     PowerManagerServiceDumpProto.IS_SCREEN_BRIGHTNESS_BOOST_IN_PROGRESS,
4093                     mScreenBrightnessBoostInProgress);
4094             proto.write(PowerManagerServiceDumpProto.IS_DISPLAY_READY, mDisplayReady);
4095             proto.write(
4096                     PowerManagerServiceDumpProto.IS_HOLDING_WAKE_LOCK_SUSPEND_BLOCKER,
4097                     mHoldingWakeLockSuspendBlocker);
4098             proto.write(
4099                     PowerManagerServiceDumpProto.IS_HOLDING_DISPLAY_SUSPEND_BLOCKER,
4100                     mHoldingDisplaySuspendBlocker);
4101 
4102             final long settingsAndConfigurationToken =
4103                     proto.start(PowerManagerServiceDumpProto.SETTINGS_AND_CONFIGURATION);
4104             proto.write(
4105                     PowerServiceSettingsAndConfigurationDumpProto
4106                             .IS_DECOUPLE_HAL_AUTO_SUSPEND_MODE_FROM_DISPLAY_CONFIG,
4107                     mDecoupleHalAutoSuspendModeFromDisplayConfig);
4108             proto.write(
4109                     PowerServiceSettingsAndConfigurationDumpProto
4110                             .IS_DECOUPLE_HAL_INTERACTIVE_MODE_FROM_DISPLAY_CONFIG,
4111                     mDecoupleHalInteractiveModeFromDisplayConfig);
4112             proto.write(
4113                     PowerServiceSettingsAndConfigurationDumpProto
4114                             .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_CONFIG,
4115                     mWakeUpWhenPluggedOrUnpluggedConfig);
4116             proto.write(
4117                     PowerServiceSettingsAndConfigurationDumpProto
4118                             .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_IN_THEATER_MODE_CONFIG,
4119                     mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig);
4120             proto.write(
4121                     PowerServiceSettingsAndConfigurationDumpProto.IS_THEATER_MODE_ENABLED,
4122                     mTheaterModeEnabled);
4123             proto.write(
4124                     PowerServiceSettingsAndConfigurationDumpProto
4125                             .IS_SUSPEND_WHEN_SCREEN_OFF_DUE_TO_PROXIMITY_CONFIG,
4126                     mSuspendWhenScreenOffDueToProximityConfig);
4127             proto.write(
4128                     PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_SUPPORTED_CONFIG,
4129                     mDreamsSupportedConfig);
4130             proto.write(
4131                     PowerServiceSettingsAndConfigurationDumpProto
4132                             .ARE_DREAMS_ENABLED_BY_DEFAULT_CONFIG,
4133                     mDreamsEnabledByDefaultConfig);
4134             proto.write(
4135                     PowerServiceSettingsAndConfigurationDumpProto
4136                             .ARE_DREAMS_ACTIVATED_ON_SLEEP_BY_DEFAULT_CONFIG,
4137                     mDreamsActivatedOnSleepByDefaultConfig);
4138             proto.write(
4139                     PowerServiceSettingsAndConfigurationDumpProto
4140                             .ARE_DREAMS_ACTIVATED_ON_DOCK_BY_DEFAULT_CONFIG,
4141                     mDreamsActivatedOnDockByDefaultConfig);
4142             proto.write(
4143                     PowerServiceSettingsAndConfigurationDumpProto
4144                             .ARE_DREAMS_ENABLED_ON_BATTERY_CONFIG,
4145                     mDreamsEnabledOnBatteryConfig);
4146             proto.write(
4147                     PowerServiceSettingsAndConfigurationDumpProto
4148                             .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_POWERED_CONFIG,
4149                     mDreamsBatteryLevelMinimumWhenPoweredConfig);
4150             proto.write(
4151                     PowerServiceSettingsAndConfigurationDumpProto
4152                             .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_NOT_POWERED_CONFIG,
4153                     mDreamsBatteryLevelMinimumWhenNotPoweredConfig);
4154             proto.write(
4155                     PowerServiceSettingsAndConfigurationDumpProto
4156                             .DREAMS_BATTERY_LEVEL_DRAIN_CUTOFF_CONFIG,
4157                     mDreamsBatteryLevelDrainCutoffConfig);
4158             proto.write(
4159                     PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_ENABLED_SETTING,
4160                     mDreamsEnabledSetting);
4161             proto.write(
4162                     PowerServiceSettingsAndConfigurationDumpProto
4163                             .ARE_DREAMS_ACTIVATE_ON_SLEEP_SETTING,
4164                     mDreamsActivateOnSleepSetting);
4165             proto.write(
4166                     PowerServiceSettingsAndConfigurationDumpProto
4167                             .ARE_DREAMS_ACTIVATE_ON_DOCK_SETTING,
4168                     mDreamsActivateOnDockSetting);
4169             proto.write(
4170                     PowerServiceSettingsAndConfigurationDumpProto.IS_DOZE_AFTER_SCREEN_OFF_CONFIG,
4171                     mDozeAfterScreenOff);
4172             proto.write(
4173                     PowerServiceSettingsAndConfigurationDumpProto
4174                             .MINIMUM_SCREEN_OFF_TIMEOUT_CONFIG_MS,
4175                     mMinimumScreenOffTimeoutConfig);
4176             proto.write(
4177                     PowerServiceSettingsAndConfigurationDumpProto
4178                             .MAXIMUM_SCREEN_DIM_DURATION_CONFIG_MS,
4179                     mMaximumScreenDimDurationConfig);
4180             proto.write(
4181                     PowerServiceSettingsAndConfigurationDumpProto.MAXIMUM_SCREEN_DIM_RATIO_CONFIG,
4182                     mMaximumScreenDimRatioConfig);
4183             proto.write(
4184                     PowerServiceSettingsAndConfigurationDumpProto.SCREEN_OFF_TIMEOUT_SETTING_MS,
4185                     mScreenOffTimeoutSetting);
4186             proto.write(
4187                     PowerServiceSettingsAndConfigurationDumpProto.SLEEP_TIMEOUT_SETTING_MS,
4188                     mSleepTimeoutSetting);
4189             proto.write(
4190                     PowerServiceSettingsAndConfigurationDumpProto.ATTENTIVE_TIMEOUT_SETTING_MS,
4191                     mAttentiveTimeoutSetting);
4192             proto.write(
4193                     PowerServiceSettingsAndConfigurationDumpProto.ATTENTIVE_TIMEOUT_CONFIG_MS,
4194                     mAttentiveTimeoutConfig);
4195             proto.write(
4196                     PowerServiceSettingsAndConfigurationDumpProto
4197                             .ATTENTIVE_WARNING_DURATION_CONFIG_MS,
4198                     mAttentiveWarningDurationConfig);
4199             proto.write(
4200                     PowerServiceSettingsAndConfigurationDumpProto
4201                             .MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_MS,
4202                     // Clamp to int32
4203                     Math.min(mMaximumScreenOffTimeoutFromDeviceAdmin, Integer.MAX_VALUE));
4204             proto.write(
4205                     PowerServiceSettingsAndConfigurationDumpProto
4206                             .IS_MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_ENFORCED_LOCKED,
4207                     isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked());
4208 
4209             final long stayOnWhilePluggedInToken =
4210                     proto.start(
4211                             PowerServiceSettingsAndConfigurationDumpProto.STAY_ON_WHILE_PLUGGED_IN);
4212             proto.write(
4213                     PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
4214                             .IS_STAY_ON_WHILE_PLUGGED_IN_AC,
4215                     ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_AC) != 0));
4216             proto.write(
4217                     PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
4218                             .IS_STAY_ON_WHILE_PLUGGED_IN_USB,
4219                     ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_USB) != 0));
4220             proto.write(
4221                     PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto
4222                             .IS_STAY_ON_WHILE_PLUGGED_IN_WIRELESS,
4223                     ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_WIRELESS)
4224                             != 0));
4225             proto.end(stayOnWhilePluggedInToken);
4226 
4227             proto.write(
4228                     PowerServiceSettingsAndConfigurationDumpProto.SCREEN_BRIGHTNESS_MODE_SETTING,
4229                     mScreenBrightnessModeSetting);
4230             proto.write(
4231                     PowerServiceSettingsAndConfigurationDumpProto
4232                             .SCREEN_BRIGHTNESS_OVERRIDE_FROM_WINDOW_MANAGER,
4233                     mScreenBrightnessOverrideFromWindowManager);
4234             proto.write(
4235                     PowerServiceSettingsAndConfigurationDumpProto
4236                             .USER_ACTIVITY_TIMEOUT_OVERRIDE_FROM_WINDOW_MANAGER_MS,
4237                     mUserActivityTimeoutOverrideFromWindowManager);
4238             proto.write(
4239                     PowerServiceSettingsAndConfigurationDumpProto
4240                             .IS_USER_INACTIVE_OVERRIDE_FROM_WINDOW_MANAGER,
4241                     mUserInactiveOverrideFromWindowManager);
4242             proto.write(
4243                     PowerServiceSettingsAndConfigurationDumpProto
4244                             .DOZE_SCREEN_STATE_OVERRIDE_FROM_DREAM_MANAGER,
4245                     mDozeScreenStateOverrideFromDreamManager);
4246             proto.write(
4247                     PowerServiceSettingsAndConfigurationDumpProto
4248                             .DRAW_WAKE_LOCK_OVERRIDE_FROM_SIDEKICK,
4249                     mDrawWakeLockOverrideFromSidekick);
4250             proto.write(
4251                     PowerServiceSettingsAndConfigurationDumpProto
4252                             .DOZED_SCREEN_BRIGHTNESS_OVERRIDE_FROM_DREAM_MANAGER,
4253                     mDozeScreenBrightnessOverrideFromDreamManager);
4254 
4255             final long screenBrightnessSettingLimitsToken =
4256                     proto.start(
4257                             PowerServiceSettingsAndConfigurationDumpProto
4258                                     .SCREEN_BRIGHTNESS_SETTING_LIMITS);
4259             proto.write(
4260                     PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
4261                             .SETTING_MINIMUM_FLOAT,
4262                     mScreenBrightnessSettingMinimum);
4263             proto.write(
4264                     PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
4265                             .SETTING_MAXIMUM_FLOAT,
4266                     mScreenBrightnessSettingMaximum);
4267             proto.write(
4268                     PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto
4269                             .SETTING_DEFAULT_FLOAT,
4270                     mScreenBrightnessSettingDefault);
4271             proto.end(screenBrightnessSettingLimitsToken);
4272 
4273             proto.write(
4274                     PowerServiceSettingsAndConfigurationDumpProto.IS_DOUBLE_TAP_WAKE_ENABLED,
4275                     mDoubleTapWakeEnabled);
4276             proto.write(
4277                     PowerServiceSettingsAndConfigurationDumpProto.IS_VR_MODE_ENABLED,
4278                     mIsVrModeEnabled);
4279             proto.end(settingsAndConfigurationToken);
4280 
4281             final long attentiveTimeout = getAttentiveTimeoutLocked();
4282             final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
4283             final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, attentiveTimeout);
4284             final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
4285             proto.write(PowerManagerServiceDumpProto.ATTENTIVE_TIMEOUT_MS, attentiveTimeout);
4286             proto.write(PowerManagerServiceDumpProto.SLEEP_TIMEOUT_MS, sleepTimeout);
4287             proto.write(PowerManagerServiceDumpProto.SCREEN_OFF_TIMEOUT_MS, screenOffTimeout);
4288             proto.write(PowerManagerServiceDumpProto.SCREEN_DIM_DURATION_MS, screenDimDuration);
4289             proto.write(PowerManagerServiceDumpProto.ARE_UIDS_CHANGING, mUidsChanging);
4290             proto.write(PowerManagerServiceDumpProto.ARE_UIDS_CHANGED, mUidsChanged);
4291 
4292             for (int i = 0; i < mUidState.size(); i++) {
4293                 final UidState state = mUidState.valueAt(i);
4294                 final long uIDToken = proto.start(PowerManagerServiceDumpProto.UID_STATES);
4295                 final int uid = mUidState.keyAt(i);
4296                 proto.write(PowerManagerServiceDumpProto.UidStateProto.UID, uid);
4297                 proto.write(PowerManagerServiceDumpProto.UidStateProto.UID_STRING, UserHandle.formatUid(uid));
4298                 proto.write(PowerManagerServiceDumpProto.UidStateProto.IS_ACTIVE, state.mActive);
4299                 proto.write(PowerManagerServiceDumpProto.UidStateProto.NUM_WAKE_LOCKS, state.mNumWakeLocks);
4300                 proto.write(PowerManagerServiceDumpProto.UidStateProto.PROCESS_STATE,
4301                         ActivityManager.processStateAmToProto(state.mProcState));
4302                 proto.end(uIDToken);
4303             }
4304 
4305             mBatterySaverStateMachine.dumpProto(proto,
4306                     PowerManagerServiceDumpProto.BATTERY_SAVER_STATE_MACHINE);
4307 
4308             mHandler.getLooper().dumpDebug(proto, PowerManagerServiceDumpProto.LOOPER);
4309 
4310             for (WakeLock wl : mWakeLocks) {
4311                 wl.dumpDebug(proto, PowerManagerServiceDumpProto.WAKE_LOCKS);
4312             }
4313 
4314             for (SuspendBlocker sb : mSuspendBlockers) {
4315                 sb.dumpDebug(proto, PowerManagerServiceDumpProto.SUSPEND_BLOCKERS);
4316             }
4317             wcd = mWirelessChargerDetector;
4318         }
4319 
4320         if (wcd != null) {
4321             wcd.dumpDebug(proto, PowerManagerServiceDumpProto.WIRELESS_CHARGER_DETECTOR);
4322         }
4323         proto.flush();
4324     }
4325 
4326     private void incrementBootCount() {
4327         synchronized (mLock) {
4328             int count;
4329             try {
4330                 count = Settings.Global.getInt(
4331                         getContext().getContentResolver(), Settings.Global.BOOT_COUNT);
4332             } catch (SettingNotFoundException e) {
4333                 count = 0;
4334             }
4335             Settings.Global.putInt(
4336                     getContext().getContentResolver(), Settings.Global.BOOT_COUNT, count + 1);
4337         }
4338     }
4339 
4340     private static WorkSource copyWorkSource(WorkSource workSource) {
4341         return workSource != null ? new WorkSource(workSource) : null;
4342     }
4343 
4344     @VisibleForTesting
4345     final class BatteryReceiver extends BroadcastReceiver {
4346         @Override
4347         public void onReceive(Context context, Intent intent) {
4348             synchronized (mLock) {
4349                 handleBatteryStateChangedLocked();
4350             }
4351         }
4352     }
4353 
4354     private final class DreamReceiver extends BroadcastReceiver {
4355         @Override
4356         public void onReceive(Context context, Intent intent) {
4357             synchronized (mLock) {
4358                 scheduleSandmanLocked();
4359             }
4360         }
4361     }
4362 
4363     @VisibleForTesting
4364     final class UserSwitchedReceiver extends BroadcastReceiver {
4365         @Override
4366         public void onReceive(Context context, Intent intent) {
4367             synchronized (mLock) {
4368                 handleSettingsChangedLocked();
4369             }
4370         }
4371     }
4372 
4373     private final class DockReceiver extends BroadcastReceiver {
4374         @Override
4375         public void onReceive(Context context, Intent intent) {
4376             synchronized (mLock) {
4377                 int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE,
4378                         Intent.EXTRA_DOCK_STATE_UNDOCKED);
4379                 if (mDockState != dockState) {
4380                     mDockState = dockState;
4381                     mDirty |= DIRTY_DOCK_STATE;
4382                     updatePowerStateLocked();
4383                 }
4384             }
4385         }
4386     }
4387 
4388     private final class SettingsObserver extends ContentObserver {
4389         public SettingsObserver(Handler handler) {
4390             super(handler);
4391         }
4392 
4393         @Override
4394         public void onChange(boolean selfChange, Uri uri) {
4395             synchronized (mLock) {
4396                 handleSettingsChangedLocked();
4397             }
4398         }
4399     }
4400 
4401     private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
4402         @Override
4403         public void onVrStateChanged(boolean enabled) {
4404             powerHintInternal(PowerHint.VR_MODE, enabled ? 1 : 0);
4405 
4406             synchronized (mLock) {
4407                 if (mIsVrModeEnabled != enabled) {
4408                     setVrModeEnabled(enabled);
4409                     mDirty |= DIRTY_VR_MODE_CHANGED;
4410                     updatePowerStateLocked();
4411                 }
4412             }
4413         }
4414     };
4415 
4416     /**
4417      * Callback for asynchronous operations performed by the power manager.
4418      */
4419     private final class PowerManagerHandlerCallback implements Handler.Callback {
4420         @Override
4421         public boolean handleMessage(Message msg) {
4422             switch (msg.what) {
4423                 case MSG_USER_ACTIVITY_TIMEOUT:
4424                     handleUserActivityTimeout();
4425                     break;
4426                 case MSG_SANDMAN:
4427                     handleSandman();
4428                     break;
4429                 case MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT:
4430                     handleScreenBrightnessBoostTimeout();
4431                     break;
4432                 case MSG_CHECK_FOR_LONG_WAKELOCKS:
4433                     checkForLongWakeLocks();
4434                     break;
4435                 case MSG_ATTENTIVE_TIMEOUT:
4436                     handleAttentiveTimeout();
4437                     break;
4438             }
4439 
4440             return true;
4441         }
4442     }
4443 
4444     /**
4445      * Represents a wake lock that has been acquired by an application.
4446      */
4447     /* package */ final class WakeLock implements IBinder.DeathRecipient {
4448         public final IBinder mLock;
4449         public int mFlags;
4450         public String mTag;
4451         public final String mPackageName;
4452         public WorkSource mWorkSource;
4453         public String mHistoryTag;
4454         public final int mOwnerUid;
4455         public final int mOwnerPid;
4456         public final UidState mUidState;
4457         public long mAcquireTime;
4458         public boolean mNotifiedAcquired;
4459         public boolean mNotifiedLong;
4460         public boolean mDisabled;
4461 
4462         public WakeLock(IBinder lock, int flags, String tag, String packageName,
4463                 WorkSource workSource, String historyTag, int ownerUid, int ownerPid,
4464                 UidState uidState) {
4465             mLock = lock;
4466             mFlags = flags;
4467             mTag = tag;
4468             mPackageName = packageName;
4469             mWorkSource = copyWorkSource(workSource);
4470             mHistoryTag = historyTag;
4471             mOwnerUid = ownerUid;
4472             mOwnerPid = ownerPid;
4473             mUidState = uidState;
4474         }
4475 
4476         @Override
4477         public void binderDied() {
4478             PowerManagerService.this.handleWakeLockDeath(this);
4479         }
4480 
4481         public boolean hasSameProperties(int flags, String tag, WorkSource workSource,
4482                 int ownerUid, int ownerPid) {
4483             return mFlags == flags
4484                     && mTag.equals(tag)
4485                     && hasSameWorkSource(workSource)
4486                     && mOwnerUid == ownerUid
4487                     && mOwnerPid == ownerPid;
4488         }
4489 
4490         public void updateProperties(int flags, String tag, String packageName,
4491                 WorkSource workSource, String historyTag, int ownerUid, int ownerPid) {
4492             if (!mPackageName.equals(packageName)) {
4493                 throw new IllegalStateException("Existing wake lock package name changed: "
4494                         + mPackageName + " to " + packageName);
4495             }
4496             if (mOwnerUid != ownerUid) {
4497                 throw new IllegalStateException("Existing wake lock uid changed: "
4498                         + mOwnerUid + " to " + ownerUid);
4499             }
4500             if (mOwnerPid != ownerPid) {
4501                 throw new IllegalStateException("Existing wake lock pid changed: "
4502                         + mOwnerPid + " to " + ownerPid);
4503             }
4504             mFlags = flags;
4505             mTag = tag;
4506             updateWorkSource(workSource);
4507             mHistoryTag = historyTag;
4508         }
4509 
4510         public boolean hasSameWorkSource(WorkSource workSource) {
4511             return Objects.equals(mWorkSource, workSource);
4512         }
4513 
4514         public void updateWorkSource(WorkSource workSource) {
4515             mWorkSource = copyWorkSource(workSource);
4516         }
4517 
4518         @Override
4519         public String toString() {
4520             StringBuilder sb = new StringBuilder();
4521             sb.append(getLockLevelString());
4522             sb.append(" '");
4523             sb.append(mTag);
4524             sb.append("'");
4525             sb.append(getLockFlagsString());
4526             if (mDisabled) {
4527                 sb.append(" DISABLED");
4528             }
4529             if (mNotifiedAcquired) {
4530                 sb.append(" ACQ=");
4531                 TimeUtils.formatDuration(mAcquireTime-mClock.uptimeMillis(), sb);
4532             }
4533             if (mNotifiedLong) {
4534                 sb.append(" LONG");
4535             }
4536             sb.append(" (uid=");
4537             sb.append(mOwnerUid);
4538             if (mOwnerPid != 0) {
4539                 sb.append(" pid=");
4540                 sb.append(mOwnerPid);
4541             }
4542             if (mWorkSource != null) {
4543                 sb.append(" ws=");
4544                 sb.append(mWorkSource);
4545             }
4546             sb.append(")");
4547             return sb.toString();
4548         }
4549 
4550         public void dumpDebug(ProtoOutputStream proto, long fieldId) {
4551             final long wakeLockToken = proto.start(fieldId);
4552             proto.write(WakeLockProto.LOCK_LEVEL, (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK));
4553             proto.write(WakeLockProto.TAG, mTag);
4554 
4555             final long wakeLockFlagsToken = proto.start(WakeLockProto.FLAGS);
4556             proto.write(WakeLockProto.WakeLockFlagsProto.IS_ACQUIRE_CAUSES_WAKEUP,
4557                     (mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP)!=0);
4558             proto.write(WakeLockProto.WakeLockFlagsProto.IS_ON_AFTER_RELEASE,
4559                     (mFlags & PowerManager.ON_AFTER_RELEASE)!=0);
4560             proto.end(wakeLockFlagsToken);
4561 
4562             proto.write(WakeLockProto.IS_DISABLED, mDisabled);
4563             if (mNotifiedAcquired) {
4564                 proto.write(WakeLockProto.ACQ_MS, mAcquireTime);
4565             }
4566             proto.write(WakeLockProto.IS_NOTIFIED_LONG, mNotifiedLong);
4567             proto.write(WakeLockProto.UID, mOwnerUid);
4568             proto.write(WakeLockProto.PID, mOwnerPid);
4569 
4570             if (mWorkSource != null) {
4571                 mWorkSource.dumpDebug(proto, WakeLockProto.WORK_SOURCE);
4572             }
4573             proto.end(wakeLockToken);
4574         }
4575 
4576         @SuppressWarnings("deprecation")
4577         private String getLockLevelString() {
4578             switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
4579                 case PowerManager.FULL_WAKE_LOCK:
4580                     return "FULL_WAKE_LOCK                ";
4581                 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
4582                     return "SCREEN_BRIGHT_WAKE_LOCK       ";
4583                 case PowerManager.SCREEN_DIM_WAKE_LOCK:
4584                     return "SCREEN_DIM_WAKE_LOCK          ";
4585                 case PowerManager.PARTIAL_WAKE_LOCK:
4586                     return "PARTIAL_WAKE_LOCK             ";
4587                 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
4588                     return "PROXIMITY_SCREEN_OFF_WAKE_LOCK";
4589                 case PowerManager.DOZE_WAKE_LOCK:
4590                     return "DOZE_WAKE_LOCK                ";
4591                 case PowerManager.DRAW_WAKE_LOCK:
4592                     return "DRAW_WAKE_LOCK                ";
4593                 default:
4594                     return "???                           ";
4595             }
4596         }
4597 
4598         private String getLockFlagsString() {
4599             String result = "";
4600             if ((mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) {
4601                 result += " ACQUIRE_CAUSES_WAKEUP";
4602             }
4603             if ((mFlags & PowerManager.ON_AFTER_RELEASE) != 0) {
4604                 result += " ON_AFTER_RELEASE";
4605             }
4606             return result;
4607         }
4608     }
4609 
4610     private final class SuspendBlockerImpl implements SuspendBlocker {
4611         private final String mName;
4612         private final String mTraceName;
4613         private int mReferenceCount;
4614 
4615         public SuspendBlockerImpl(String name) {
4616             mName = name;
4617             mTraceName = "SuspendBlocker (" + name + ")";
4618         }
4619 
4620         @Override
4621         protected void finalize() throws Throwable {
4622             try {
4623                 if (mReferenceCount != 0) {
4624                     Slog.wtf(TAG, "Suspend blocker \"" + mName
4625                             + "\" was finalized without being released!");
4626                     mReferenceCount = 0;
4627                     mNativeWrapper.nativeReleaseSuspendBlocker(mName);
4628                     Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
4629                 }
4630             } finally {
4631                 super.finalize();
4632             }
4633         }
4634 
4635         @Override
4636         public void acquire() {
4637             synchronized (this) {
4638                 mReferenceCount += 1;
4639                 if (mReferenceCount == 1) {
4640                     if (DEBUG_SPEW) {
4641                         Slog.d(TAG, "Acquiring suspend blocker \"" + mName + "\".");
4642                     }
4643                     Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0);
4644                     mNativeWrapper.nativeAcquireSuspendBlocker(mName);
4645                 }
4646             }
4647         }
4648 
4649         @Override
4650         public void release() {
4651             synchronized (this) {
4652                 mReferenceCount -= 1;
4653                 if (mReferenceCount == 0) {
4654                     if (DEBUG_SPEW) {
4655                         Slog.d(TAG, "Releasing suspend blocker \"" + mName + "\".");
4656                     }
4657                     mNativeWrapper.nativeReleaseSuspendBlocker(mName);
4658                     Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
4659                 } else if (mReferenceCount < 0) {
4660                     Slog.wtf(TAG, "Suspend blocker \"" + mName
4661                             + "\" was released without being acquired!", new Throwable());
4662                     mReferenceCount = 0;
4663                 }
4664             }
4665         }
4666 
4667         @Override
4668         public String toString() {
4669             synchronized (this) {
4670                 return mName + ": ref count=" + mReferenceCount;
4671             }
4672         }
4673 
4674         public void dumpDebug(ProtoOutputStream proto, long fieldId) {
4675             final long sbToken = proto.start(fieldId);
4676             synchronized (this) {
4677                 proto.write(SuspendBlockerProto.NAME, mName);
4678                 proto.write(SuspendBlockerProto.REFERENCE_COUNT, mReferenceCount);
4679             }
4680             proto.end(sbToken);
4681         }
4682     }
4683 
4684     static final class UidState {
4685         final int mUid;
4686         int mNumWakeLocks;
4687         int mProcState;
4688         boolean mActive;
4689 
4690         UidState(int uid) {
4691             mUid = uid;
4692         }
4693     }
4694 
4695     @VisibleForTesting
4696     final class BinderService extends IPowerManager.Stub {
4697         @Override
4698         public void onShellCommand(FileDescriptor in, FileDescriptor out,
4699                 FileDescriptor err, String[] args, ShellCallback callback,
4700                 ResultReceiver resultReceiver) {
4701             (new PowerManagerShellCommand(this)).exec(
4702                     this, in, out, err, args, callback, resultReceiver);
4703         }
4704 
4705         @Override // Binder call
4706         public void acquireWakeLockWithUid(IBinder lock, int flags, String tag,
4707                 String packageName, int uid) {
4708             if (uid < 0) {
4709                 uid = Binder.getCallingUid();
4710             }
4711             acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null);
4712         }
4713 
4714         @Override // Binder call
4715         public void powerHint(int hintId, int data) {
4716             if (!mSystemReady) {
4717                 // Service not ready yet, so who the heck cares about power hints, bah.
4718                 return;
4719             }
4720             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
4721             powerHintInternal(hintId, data);
4722         }
4723 
4724         @Override // Binder call
4725         public void setPowerBoost(int boost, int durationMs) {
4726             if (!mSystemReady) {
4727                 // Service not ready yet, so who the heck cares about power hints, bah.
4728                 return;
4729             }
4730             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
4731             setPowerBoostInternal(boost, durationMs);
4732         }
4733 
4734         @Override // Binder call
4735         public void setPowerMode(int mode, boolean enabled) {
4736             if (!mSystemReady) {
4737                 // Service not ready yet, so who the heck cares about power hints, bah.
4738                 return;
4739             }
4740             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
4741             setPowerModeInternal(mode, enabled); // Intentionally ignore return value
4742         }
4743 
4744         @Override // Binder call
4745         public boolean setPowerModeChecked(int mode, boolean enabled) {
4746             if (!mSystemReady) {
4747                 // Service not ready yet, so who the heck cares about power hints, bah.
4748                 return false;
4749             }
4750             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
4751             return setPowerModeInternal(mode, enabled);
4752         }
4753 
4754         @Override // Binder call
4755         public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName,
4756                 WorkSource ws, String historyTag) {
4757             if (lock == null) {
4758                 throw new IllegalArgumentException("lock must not be null");
4759             }
4760             if (packageName == null) {
4761                 throw new IllegalArgumentException("packageName must not be null");
4762             }
4763             PowerManager.validateWakeLockParameters(flags, tag);
4764 
4765             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
4766             if ((flags & PowerManager.DOZE_WAKE_LOCK) != 0) {
4767                 mContext.enforceCallingOrSelfPermission(
4768                         android.Manifest.permission.DEVICE_POWER, null);
4769             }
4770             if (ws != null && !ws.isEmpty()) {
4771                 mContext.enforceCallingOrSelfPermission(
4772                         android.Manifest.permission.UPDATE_DEVICE_STATS, null);
4773             } else {
4774                 ws = null;
4775             }
4776 
4777             final int uid = Binder.getCallingUid();
4778             final int pid = Binder.getCallingPid();
4779             final long ident = Binder.clearCallingIdentity();
4780             try {
4781                 acquireWakeLockInternal(lock, flags, tag, packageName, ws, historyTag, uid, pid);
4782             } finally {
4783                 Binder.restoreCallingIdentity(ident);
4784             }
4785         }
4786 
4787         @Override // Binder call
4788         public void releaseWakeLock(IBinder lock, int flags) {
4789             if (lock == null) {
4790                 throw new IllegalArgumentException("lock must not be null");
4791             }
4792 
4793             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
4794 
4795             final long ident = Binder.clearCallingIdentity();
4796             try {
4797                 releaseWakeLockInternal(lock, flags);
4798             } finally {
4799                 Binder.restoreCallingIdentity(ident);
4800             }
4801         }
4802 
4803         @Override // Binder call
4804         public void updateWakeLockUids(IBinder lock, int[] uids) {
4805             WorkSource ws = null;
4806 
4807             if (uids != null) {
4808                 ws = new WorkSource();
4809                 // XXX should WorkSource have a way to set uids as an int[] instead of adding them
4810                 // one at a time?
4811                 for (int i = 0; i < uids.length; i++) {
4812                     ws.add(uids[i]);
4813                 }
4814             }
4815             updateWakeLockWorkSource(lock, ws, null);
4816         }
4817 
4818         @Override // Binder call
4819         public void updateWakeLockWorkSource(IBinder lock, WorkSource ws, String historyTag) {
4820             if (lock == null) {
4821                 throw new IllegalArgumentException("lock must not be null");
4822             }
4823 
4824             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
4825             if (ws != null && !ws.isEmpty()) {
4826                 mContext.enforceCallingOrSelfPermission(
4827                         android.Manifest.permission.UPDATE_DEVICE_STATS, null);
4828             } else {
4829                 ws = null;
4830             }
4831 
4832             final int callingUid = Binder.getCallingUid();
4833             final long ident = Binder.clearCallingIdentity();
4834             try {
4835                 updateWakeLockWorkSourceInternal(lock, ws, historyTag, callingUid);
4836             } finally {
4837                 Binder.restoreCallingIdentity(ident);
4838             }
4839         }
4840 
4841         @Override // Binder call
4842         public boolean isWakeLockLevelSupported(int level) {
4843             final long ident = Binder.clearCallingIdentity();
4844             try {
4845                 return isWakeLockLevelSupportedInternal(level);
4846             } finally {
4847                 Binder.restoreCallingIdentity(ident);
4848             }
4849         }
4850 
4851         @Override // Binder call
4852         public void userActivity(long eventTime, int event, int flags) {
4853             final long now = mClock.uptimeMillis();
4854             if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER)
4855                     != PackageManager.PERMISSION_GRANTED
4856                     && mContext.checkCallingOrSelfPermission(
4857                             android.Manifest.permission.USER_ACTIVITY)
4858                             != PackageManager.PERMISSION_GRANTED) {
4859                 // Once upon a time applications could call userActivity().
4860                 // Now we require the DEVICE_POWER permission.  Log a warning and ignore the
4861                 // request instead of throwing a SecurityException so we don't break old apps.
4862                 synchronized (mLock) {
4863                     if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) {
4864                         mLastWarningAboutUserActivityPermission = now;
4865                         Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the "
4866                                 + "caller does not have DEVICE_POWER or USER_ACTIVITY "
4867                                 + "permission.  Please fix your app!  "
4868                                 + " pid=" + Binder.getCallingPid()
4869                                 + " uid=" + Binder.getCallingUid());
4870                     }
4871                 }
4872                 return;
4873             }
4874 
4875             if (eventTime > now) {
4876                 throw new IllegalArgumentException("event time must not be in the future");
4877             }
4878 
4879             final int uid = Binder.getCallingUid();
4880             final long ident = Binder.clearCallingIdentity();
4881             try {
4882                 userActivityInternal(eventTime, event, flags, uid);
4883             } finally {
4884                 Binder.restoreCallingIdentity(ident);
4885             }
4886         }
4887 
4888         @Override // Binder call
4889         public void wakeUp(long eventTime, @WakeReason int reason, String details,
4890                 String opPackageName) {
4891             if (eventTime > mClock.uptimeMillis()) {
4892                 throw new IllegalArgumentException("event time must not be in the future");
4893             }
4894 
4895             mContext.enforceCallingOrSelfPermission(
4896                     android.Manifest.permission.DEVICE_POWER, null);
4897 
4898             final int uid = Binder.getCallingUid();
4899             final long ident = Binder.clearCallingIdentity();
4900             try {
4901                 wakeUpInternal(eventTime, reason, details, uid, opPackageName, uid);
4902             } finally {
4903                 Binder.restoreCallingIdentity(ident);
4904             }
4905         }
4906 
4907         @Override // Binder call
4908         public void goToSleep(long eventTime, int reason, int flags) {
4909             if (eventTime > mClock.uptimeMillis()) {
4910                 throw new IllegalArgumentException("event time must not be in the future");
4911             }
4912 
4913             mContext.enforceCallingOrSelfPermission(
4914                     android.Manifest.permission.DEVICE_POWER, null);
4915 
4916             final int uid = Binder.getCallingUid();
4917             final long ident = Binder.clearCallingIdentity();
4918             try {
4919                 goToSleepInternal(eventTime, reason, flags, uid);
4920             } finally {
4921                 Binder.restoreCallingIdentity(ident);
4922             }
4923         }
4924 
4925         @Override // Binder call
4926         public void nap(long eventTime) {
4927             if (eventTime > mClock.uptimeMillis()) {
4928                 throw new IllegalArgumentException("event time must not be in the future");
4929             }
4930 
4931             mContext.enforceCallingOrSelfPermission(
4932                     android.Manifest.permission.DEVICE_POWER, null);
4933 
4934             final int uid = Binder.getCallingUid();
4935             final long ident = Binder.clearCallingIdentity();
4936             try {
4937                 napInternal(eventTime, uid);
4938             } finally {
4939                 Binder.restoreCallingIdentity(ident);
4940             }
4941         }
4942 
4943         public float getBrightnessConstraint(int constraint) {
4944             switch (constraint) {
4945                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM:
4946                     return mScreenBrightnessMinimum;
4947                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM:
4948                     return mScreenBrightnessMaximum;
4949                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT:
4950                     return mScreenBrightnessDefault;
4951                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM:
4952                     return mScreenBrightnessDim;
4953                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE:
4954                     return mScreenBrightnessDoze;
4955                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR:
4956                     return mScreenBrightnessMinimumVr;
4957                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR:
4958                     return mScreenBrightnessMaximumVr;
4959                 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR:
4960                     return mScreenBrightnessDefaultVr;
4961                 default:
4962                     return PowerManager.BRIGHTNESS_INVALID_FLOAT;
4963             }
4964         }
4965 
4966         @Override // Binder call
4967         public boolean isInteractive() {
4968             final long ident = Binder.clearCallingIdentity();
4969             try {
4970                 return isInteractiveInternal();
4971             } finally {
4972                 Binder.restoreCallingIdentity(ident);
4973             }
4974         }
4975 
4976         @Override // Binder call
4977         public boolean isPowerSaveMode() {
4978             final long ident = Binder.clearCallingIdentity();
4979             try {
4980                 return mBatterySaverController.isEnabled();
4981             } finally {
4982                 Binder.restoreCallingIdentity(ident);
4983             }
4984         }
4985 
4986         // Binder call
4987         public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
4988             final long ident = Binder.clearCallingIdentity();
4989             try {
4990                 return mBatterySaverPolicy.getBatterySaverPolicy(serviceType);
4991             } finally {
4992                 Binder.restoreCallingIdentity(ident);
4993             }
4994         }
4995 
4996         @Override // Binder call
4997         public boolean setPowerSaveModeEnabled(boolean enabled) {
4998             if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER)
4999                     != PackageManager.PERMISSION_GRANTED) {
5000                 mContext.enforceCallingOrSelfPermission(
5001                         android.Manifest.permission.DEVICE_POWER, null);
5002             }
5003             final long ident = Binder.clearCallingIdentity();
5004             try {
5005                 return setLowPowerModeInternal(enabled);
5006             } finally {
5007                 Binder.restoreCallingIdentity(ident);
5008             }
5009         }
5010 
5011         @Override // Binder call
5012         public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold) {
5013             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER,
5014                     "updateDynamicPowerSavings");
5015             final long ident = Binder.clearCallingIdentity();
5016             try {
5017                 final ContentResolver resolver = mContext.getContentResolver();
5018                 boolean success = Settings.Global.putInt(resolver,
5019                         Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD,
5020                         disableThreshold);
5021                 if (success) {
5022                     // abort updating if we weren't able to succeed on the threshold
5023                     success &= Settings.Global.putInt(resolver,
5024                             Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED,
5025                             powerSaveHint ? 1 : 0);
5026                 }
5027                 return success;
5028             } finally {
5029                 Binder.restoreCallingIdentity(ident);
5030             }
5031         }
5032 
5033         @Override // Binder call
5034         public boolean setAdaptivePowerSavePolicy(@NonNull BatterySaverPolicyConfig config) {
5035             if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER)
5036                     != PackageManager.PERMISSION_GRANTED) {
5037                 mContext.enforceCallingOrSelfPermission(
5038                         android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSavePolicy");
5039             }
5040             final long ident = Binder.clearCallingIdentity();
5041             try {
5042                 return mBatterySaverStateMachine.setAdaptiveBatterySaverPolicy(config);
5043             } finally {
5044                 Binder.restoreCallingIdentity(ident);
5045             }
5046         }
5047 
5048         @Override // Binder call
5049         public boolean setAdaptivePowerSaveEnabled(boolean enabled) {
5050             if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER)
5051                     != PackageManager.PERMISSION_GRANTED) {
5052                 mContext.enforceCallingOrSelfPermission(
5053                         android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSaveEnabled");
5054             }
5055             final long ident = Binder.clearCallingIdentity();
5056             try {
5057                 return mBatterySaverStateMachine.setAdaptiveBatterySaverEnabled(enabled);
5058             } finally {
5059                 Binder.restoreCallingIdentity(ident);
5060             }
5061         }
5062 
5063         @Override // Binder call
5064         public int getPowerSaveModeTrigger() {
5065             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER, null);
5066             final long ident = Binder.clearCallingIdentity();
5067             try {
5068                 return Settings.Global.getInt(mContext.getContentResolver(),
5069                         Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
5070                         PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
5071             } finally {
5072                 Binder.restoreCallingIdentity(ident);
5073             }
5074         }
5075 
5076         @Override // Binder call
5077         public boolean isDeviceIdleMode() {
5078             final long ident = Binder.clearCallingIdentity();
5079             try {
5080                 return isDeviceIdleModeInternal();
5081             } finally {
5082                 Binder.restoreCallingIdentity(ident);
5083             }
5084         }
5085 
5086         @Override // Binder call
5087         public boolean isLightDeviceIdleMode() {
5088             final long ident = Binder.clearCallingIdentity();
5089             try {
5090                 return isLightDeviceIdleModeInternal();
5091             } finally {
5092                 Binder.restoreCallingIdentity(ident);
5093             }
5094         }
5095 
5096         /**
5097          * Gets the reason for the last time the phone had to reboot.
5098          *
5099          * @return The reason the phone last shut down as an int or
5100          * {@link PowerManager#SHUTDOWN_REASON_UNKNOWN} if the file could not be opened.
5101          */
5102         @Override // Binder call
5103         public int getLastShutdownReason() {
5104             mContext.enforceCallingOrSelfPermission(
5105                     android.Manifest.permission.DEVICE_POWER, null);
5106 
5107             final long ident = Binder.clearCallingIdentity();
5108             try {
5109                 return getLastShutdownReasonInternal();
5110             } finally {
5111                 Binder.restoreCallingIdentity(ident);
5112             }
5113         }
5114 
5115         @Override // Binder call
5116         public int getLastSleepReason() {
5117             mContext.enforceCallingOrSelfPermission(
5118                     android.Manifest.permission.DEVICE_POWER, null);
5119 
5120             final long ident = Binder.clearCallingIdentity();
5121             try {
5122                 return getLastSleepReasonInternal();
5123             } finally {
5124                 Binder.restoreCallingIdentity(ident);
5125             }
5126         }
5127 
5128         /**
5129          * Reboots the device.
5130          *
5131          * @param confirm If true, shows a reboot confirmation dialog.
5132          * @param reason The reason for the reboot, or null if none.
5133          * @param wait If true, this call waits for the reboot to complete and does not return.
5134          */
5135         @Override // Binder call
5136         public void reboot(boolean confirm, @Nullable String reason, boolean wait) {
5137             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
5138             if (PowerManager.REBOOT_RECOVERY.equals(reason)
5139                     || PowerManager.REBOOT_RECOVERY_UPDATE.equals(reason)) {
5140                 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
5141             }
5142 
5143             final long ident = Binder.clearCallingIdentity();
5144             try {
5145                 shutdownOrRebootInternal(HALT_MODE_REBOOT, confirm, reason, wait);
5146             } finally {
5147                 Binder.restoreCallingIdentity(ident);
5148             }
5149         }
5150 
5151         /**
5152          * Reboots the device into safe mode
5153          *
5154          * @param confirm If true, shows a reboot confirmation dialog.
5155          * @param wait If true, this call waits for the reboot to complete and does not return.
5156          */
5157         @Override // Binder call
5158         public void rebootSafeMode(boolean confirm, boolean wait) {
5159             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
5160 
5161             final long ident = Binder.clearCallingIdentity();
5162             try {
5163                 shutdownOrRebootInternal(HALT_MODE_REBOOT_SAFE_MODE, confirm,
5164                         PowerManager.REBOOT_SAFE_MODE, wait);
5165             } finally {
5166                 Binder.restoreCallingIdentity(ident);
5167             }
5168         }
5169 
5170         /**
5171          * Shuts down the device.
5172          *
5173          * @param confirm If true, shows a shutdown confirmation dialog.
5174          * @param wait If true, this call waits for the shutdown to complete and does not return.
5175          */
5176         @Override // Binder call
5177         public void shutdown(boolean confirm, String reason, boolean wait) {
5178             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
5179 
5180             final long ident = Binder.clearCallingIdentity();
5181             try {
5182                 shutdownOrRebootInternal(HALT_MODE_SHUTDOWN, confirm, reason, wait);
5183             } finally {
5184                 Binder.restoreCallingIdentity(ident);
5185             }
5186         }
5187 
5188         /**
5189          * Crash the runtime (causing a complete restart of the Android framework).
5190          * Requires REBOOT permission.  Mostly for testing.  Should not return.
5191          */
5192         @Override // Binder call
5193         public void crash(String message) {
5194             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
5195 
5196             final long ident = Binder.clearCallingIdentity();
5197             try {
5198                 crashInternal(message);
5199             } finally {
5200                 Binder.restoreCallingIdentity(ident);
5201             }
5202         }
5203 
5204         /**
5205          * Set the setting that determines whether the device stays on when plugged in.
5206          * The argument is a bit string, with each bit specifying a power source that,
5207          * when the device is connected to that source, causes the device to stay on.
5208          * See {@link android.os.BatteryManager} for the list of power sources that
5209          * can be specified. Current values include
5210          * {@link android.os.BatteryManager#BATTERY_PLUGGED_AC}
5211          * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB}
5212          *
5213          * Used by "adb shell svc power stayon ..."
5214          *
5215          * @param val an {@code int} containing the bits that specify which power sources
5216          * should cause the device to stay on.
5217          */
5218         @Override // Binder call
5219         public void setStayOnSetting(int val) {
5220             int uid = Binder.getCallingUid();
5221             // if uid is of root's, we permit this operation straight away
5222             if (uid != Process.ROOT_UID) {
5223                 if (!Settings.checkAndNoteWriteSettingsOperation(mContext, uid,
5224                         Settings.getPackageNameForUid(mContext, uid), true)) {
5225                     return;
5226                 }
5227             }
5228 
5229             final long ident = Binder.clearCallingIdentity();
5230             try {
5231                 setStayOnSettingInternal(val);
5232             } finally {
5233                 Binder.restoreCallingIdentity(ident);
5234             }
5235         }
5236 
5237         /**
5238          * Used by the phone application to make the attention LED flash when ringing.
5239          */
5240         @Override // Binder call
5241         public void setAttentionLight(boolean on, int color) {
5242             mContext.enforceCallingOrSelfPermission(
5243                     android.Manifest.permission.DEVICE_POWER, null);
5244 
5245             final long ident = Binder.clearCallingIdentity();
5246             try {
5247                 setAttentionLightInternal(on, color);
5248             } finally {
5249                 Binder.restoreCallingIdentity(ident);
5250             }
5251         }
5252 
5253         @Override // Binder call
5254         public void setDozeAfterScreenOff(boolean on) {
5255             mContext.enforceCallingOrSelfPermission(
5256                     android.Manifest.permission.DEVICE_POWER, null);
5257 
5258             final long ident = Binder.clearCallingIdentity();
5259             try {
5260                 setDozeAfterScreenOffInternal(on);
5261             } finally {
5262                 Binder.restoreCallingIdentity(ident);
5263             }
5264         }
5265 
5266         @Override // Binder call
5267         public boolean isAmbientDisplayAvailable() {
5268             mContext.enforceCallingOrSelfPermission(
5269                     android.Manifest.permission.READ_DREAM_STATE, null);
5270 
5271             final long ident = Binder.clearCallingIdentity();
5272             try {
5273                 return mAmbientDisplayConfiguration.ambientDisplayAvailable();
5274             } finally {
5275                 Binder.restoreCallingIdentity(ident);
5276             }
5277         }
5278 
5279         @Override // Binder call
5280         public void suppressAmbientDisplay(@NonNull String token, boolean suppress) {
5281             mContext.enforceCallingOrSelfPermission(
5282                     android.Manifest.permission.WRITE_DREAM_STATE, null);
5283 
5284             final int uid = Binder.getCallingUid();
5285             final long ident = Binder.clearCallingIdentity();
5286             try {
5287                 mAmbientDisplaySuppressionController.suppress(token, uid, suppress);
5288             } finally {
5289                 Binder.restoreCallingIdentity(ident);
5290             }
5291         }
5292 
5293         @Override // Binder call
5294         public boolean isAmbientDisplaySuppressedForToken(@NonNull String token) {
5295             mContext.enforceCallingOrSelfPermission(
5296                     android.Manifest.permission.READ_DREAM_STATE, null);
5297 
5298             final int uid = Binder.getCallingUid();
5299             final long ident = Binder.clearCallingIdentity();
5300             try {
5301                 return mAmbientDisplaySuppressionController.isSuppressed(token, uid);
5302             } finally {
5303                 Binder.restoreCallingIdentity(ident);
5304             }
5305         }
5306 
5307         @Override // Binder call
5308         public boolean isAmbientDisplaySuppressedForTokenByApp(@NonNull String token, int appUid) {
5309             mContext.enforceCallingOrSelfPermission(
5310                     android.Manifest.permission.READ_DREAM_STATE, null);
5311             mContext.enforceCallingOrSelfPermission(
5312                     android.Manifest.permission.READ_DREAM_SUPPRESSION, null);
5313 
5314             final long ident = Binder.clearCallingIdentity();
5315             try {
5316                 return isAmbientDisplayAvailable()
5317                         && mAmbientDisplaySuppressionController.isSuppressed(token, appUid);
5318             } finally {
5319                 Binder.restoreCallingIdentity(ident);
5320             }
5321         }
5322 
5323         @Override // Binder call
5324         public boolean isAmbientDisplaySuppressed() {
5325             mContext.enforceCallingOrSelfPermission(
5326                     android.Manifest.permission.READ_DREAM_STATE, null);
5327 
5328             final long ident = Binder.clearCallingIdentity();
5329             try {
5330                 return mAmbientDisplaySuppressionController.isSuppressed();
5331             } finally {
5332                 Binder.restoreCallingIdentity(ident);
5333             }
5334         }
5335 
5336         @Override // Binder call
5337         public void boostScreenBrightness(long eventTime) {
5338             if (eventTime > mClock.uptimeMillis()) {
5339                 throw new IllegalArgumentException("event time must not be in the future");
5340             }
5341 
5342             mContext.enforceCallingOrSelfPermission(
5343                     android.Manifest.permission.DEVICE_POWER, null);
5344 
5345             final int uid = Binder.getCallingUid();
5346             final long ident = Binder.clearCallingIdentity();
5347             try {
5348                 boostScreenBrightnessInternal(eventTime, uid);
5349             } finally {
5350                 Binder.restoreCallingIdentity(ident);
5351             }
5352         }
5353 
5354         @Override // Binder call
5355         public boolean isScreenBrightnessBoosted() {
5356             final long ident = Binder.clearCallingIdentity();
5357             try {
5358                 return isScreenBrightnessBoostedInternal();
5359             } finally {
5360                 Binder.restoreCallingIdentity(ident);
5361             }
5362         }
5363 
5364         @Override // binder call
5365         public boolean forceSuspend() {
5366             mContext.enforceCallingOrSelfPermission(
5367                     android.Manifest.permission.DEVICE_POWER, null);
5368 
5369             final int uid = Binder.getCallingUid();
5370             final long ident = Binder.clearCallingIdentity();
5371             try {
5372                 return forceSuspendInternal(uid);
5373             } finally {
5374                 Binder.restoreCallingIdentity(ident);
5375             }
5376         }
5377 
5378         @Override // Binder call
5379         protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
5380             if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
5381 
5382             final long ident = Binder.clearCallingIdentity();
5383 
5384             boolean isDumpProto = false;
5385             for (String arg : args) {
5386                 if (arg.equals("--proto")) {
5387                     isDumpProto = true;
5388                 }
5389             }
5390             try {
5391                 if (isDumpProto) {
5392                     dumpProto(fd);
5393                 } else {
5394                     dumpInternal(pw);
5395                 }
5396             } finally {
5397                 Binder.restoreCallingIdentity(ident);
5398             }
5399         }
5400     }
5401 
5402     @VisibleForTesting
5403     BinderService getBinderServiceInstance() {
5404         return mBinderService;
5405     }
5406 
5407     @VisibleForTesting
5408     LocalService getLocalServiceInstance() {
5409         return mLocalService;
5410     }
5411 
5412     @VisibleForTesting
5413     int getLastShutdownReasonInternal() {
5414         String line = mSystemProperties.get(SYSTEM_PROPERTY_REBOOT_REASON, null);
5415         switch (line) {
5416             case REASON_SHUTDOWN:
5417                 return PowerManager.SHUTDOWN_REASON_SHUTDOWN;
5418             case REASON_REBOOT:
5419                 return PowerManager.SHUTDOWN_REASON_REBOOT;
5420             case REASON_USERREQUESTED:
5421                 return PowerManager.SHUTDOWN_REASON_USER_REQUESTED;
5422             case REASON_THERMAL_SHUTDOWN:
5423                 return PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN;
5424             case REASON_LOW_BATTERY:
5425                 return PowerManager.SHUTDOWN_REASON_LOW_BATTERY;
5426             case REASON_BATTERY_THERMAL_STATE:
5427                 return PowerManager.SHUTDOWN_REASON_BATTERY_THERMAL;
5428             default:
5429                 return PowerManager.SHUTDOWN_REASON_UNKNOWN;
5430         }
5431     }
5432 
5433     private int getLastSleepReasonInternal() {
5434         synchronized (mLock) {
5435             return mLastSleepReason;
5436         }
5437     }
5438 
5439     private PowerManager.WakeData getLastWakeupInternal() {
5440         synchronized (mLock) {
5441             return new WakeData(mLastWakeTime, mLastWakeReason);
5442         }
5443     }
5444 
5445     /**
5446      * If the user presses power while the proximity sensor is enabled and keeping
5447      * the screen off, then turn the screen back on by telling display manager to
5448      * ignore the proximity sensor.  We don't turn off the proximity sensor because
5449      * we still want it to be reenabled if it's state changes.
5450      *
5451      * @return True if the proximity sensor was successfully ignored and we should
5452      * consume the key event.
5453      */
5454     private boolean interceptPowerKeyDownInternal(KeyEvent event) {
5455         synchronized (mLock) {
5456             // DisplayPowerController only reports proximity positive (near) if it's
5457             // positive and the proximity wasn't already being ignored. So it reliably
5458             // also tells us that we're not already ignoring the proximity sensor.
5459             if (mDisplayPowerRequest.useProximitySensor && mProximityPositive) {
5460                 mDisplayManagerInternal.ignoreProximitySensorUntilChanged();
5461                 return true;
5462             }
5463         }
5464 
5465         return false;
5466     }
5467 
5468     @VisibleForTesting
5469     final class LocalService extends PowerManagerInternal {
5470         @Override
5471         public void setScreenBrightnessOverrideFromWindowManager(float screenBrightness) {
5472             if (screenBrightness < PowerManager.BRIGHTNESS_MIN
5473                     || screenBrightness > PowerManager.BRIGHTNESS_MAX) {
5474                 screenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
5475             }
5476             setScreenBrightnessOverrideFromWindowManagerInternal(screenBrightness);
5477         }
5478 
5479         @Override
5480         public void setDozeOverrideFromDreamManager(int screenState, int screenBrightness) {
5481             switch (screenState) {
5482                 case Display.STATE_UNKNOWN:
5483                 case Display.STATE_OFF:
5484                 case Display.STATE_DOZE:
5485                 case Display.STATE_DOZE_SUSPEND:
5486                 case Display.STATE_ON_SUSPEND:
5487                 case Display.STATE_ON:
5488                 case Display.STATE_VR:
5489                     break;
5490                 default:
5491                     screenState = Display.STATE_UNKNOWN;
5492                     break;
5493             }
5494             if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT
5495                     || screenBrightness > PowerManager.BRIGHTNESS_ON) {
5496                 screenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
5497             }
5498             setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness);
5499         }
5500 
5501         @Override
5502         public void setUserInactiveOverrideFromWindowManager() {
5503             setUserInactiveOverrideFromWindowManagerInternal();
5504         }
5505 
5506         @Override
5507         public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) {
5508             setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis);
5509         }
5510 
5511         @Override
5512         public void setDrawWakeLockOverrideFromSidekick(boolean keepState) {
5513             setDrawWakeLockOverrideFromSidekickInternal(keepState);
5514         }
5515 
5516         @Override
5517         public void setMaximumScreenOffTimeoutFromDeviceAdmin(@UserIdInt int userId, long timeMs) {
5518             setMaximumScreenOffTimeoutFromDeviceAdminInternal(userId, timeMs);
5519         }
5520 
5521         @Override
5522         public PowerSaveState getLowPowerState(@ServiceType int serviceType) {
5523             return mBatterySaverPolicy.getBatterySaverPolicy(serviceType);
5524         }
5525 
5526         @Override
5527         public void registerLowPowerModeObserver(LowPowerModeListener listener) {
5528             mBatterySaverController.addListener(listener);
5529         }
5530 
5531         @Override
5532         public boolean setDeviceIdleMode(boolean enabled) {
5533             return setDeviceIdleModeInternal(enabled);
5534         }
5535 
5536         @Override
5537         public boolean setLightDeviceIdleMode(boolean enabled) {
5538             return setLightDeviceIdleModeInternal(enabled);
5539         }
5540 
5541         @Override
5542         public void setDeviceIdleWhitelist(int[] appids) {
5543             setDeviceIdleWhitelistInternal(appids);
5544         }
5545 
5546         @Override
5547         public void setDeviceIdleTempWhitelist(int[] appids) {
5548             setDeviceIdleTempWhitelistInternal(appids);
5549         }
5550 
5551         @Override
5552         public void startUidChanges() {
5553             startUidChangesInternal();
5554         }
5555 
5556         @Override
5557         public void finishUidChanges() {
5558             finishUidChangesInternal();
5559         }
5560 
5561         @Override
5562         public void updateUidProcState(int uid, int procState) {
5563             updateUidProcStateInternal(uid, procState);
5564         }
5565 
5566         @Override
5567         public void uidGone(int uid) {
5568             uidGoneInternal(uid);
5569         }
5570 
5571         @Override
5572         public void uidActive(int uid) {
5573             uidActiveInternal(uid);
5574         }
5575 
5576         @Override
5577         public void uidIdle(int uid) {
5578             uidIdleInternal(uid);
5579         }
5580 
5581         @Override
5582         public void powerHint(int hintId, int data) {
5583             powerHintInternal(hintId, data);
5584         }
5585 
5586         @Override
5587         public void setPowerBoost(int boost, int durationMs) {
5588             setPowerBoostInternal(boost, durationMs);
5589         }
5590 
5591         @Override
5592         public void setPowerMode(int mode, boolean enabled) {
5593             setPowerModeInternal(mode, enabled);
5594         }
5595        @Override
5596         public boolean wasDeviceIdleFor(long ms) {
5597             return wasDeviceIdleForInternal(ms);
5598         }
5599 
5600         @Override
5601         public WakeData getLastWakeup() {
5602             return getLastWakeupInternal();
5603         }
5604 
5605         @Override
5606         public boolean interceptPowerKeyDown(KeyEvent event) {
5607             return interceptPowerKeyDownInternal(event);
5608         }
5609     }
5610 }
5611