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