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