PowerManagerService.java revision 6d2a9492e2b19421165f0cd918d9f28595bfb770
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 com.android.internal.app.IAppOpsService;
20import com.android.internal.app.IBatteryStats;
21import com.android.internal.os.BackgroundThread;
22import com.android.server.EventLogTags;
23import com.android.server.LocalServices;
24import com.android.server.ServiceThread;
25import com.android.server.am.BatteryStatsService;
26import com.android.server.lights.Light;
27import com.android.server.lights.LightsManager;
28import com.android.server.Watchdog;
29
30import android.Manifest;
31import android.content.BroadcastReceiver;
32import android.content.ContentResolver;
33import android.content.Context;
34import android.content.Intent;
35import android.content.IntentFilter;
36import android.content.pm.PackageManager;
37import android.content.res.Resources;
38import android.database.ContentObserver;
39import android.hardware.SensorManager;
40import android.hardware.SystemSensorManager;
41import android.hardware.display.DisplayManagerInternal;
42import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
43import android.net.Uri;
44import android.os.BatteryManager;
45import android.os.BatteryManagerInternal;
46import android.os.Binder;
47import android.os.Handler;
48import android.os.IBinder;
49import android.os.IPowerManager;
50import android.os.Looper;
51import android.os.Message;
52import android.os.PowerManager;
53import android.os.PowerManagerInternal;
54import android.os.Process;
55import android.os.RemoteException;
56import android.os.SystemClock;
57import android.os.SystemProperties;
58import android.os.SystemService;
59import android.os.UserHandle;
60import android.os.WorkSource;
61import android.os.Parcel;
62import android.os.ServiceManager;
63import android.provider.Settings;
64import android.service.dreams.DreamManagerInternal;
65import android.util.EventLog;
66import android.util.Log;
67import android.util.Slog;
68import android.util.TimeUtils;
69import android.view.Display;
70import android.view.WindowManagerPolicy;
71
72import java.io.FileDescriptor;
73import java.io.PrintWriter;
74import java.util.ArrayList;
75
76import libcore.util.Objects;
77
78/**
79 * The power manager service is responsible for coordinating power management
80 * functions on the device.
81 */
82public final class PowerManagerService extends com.android.server.SystemService
83        implements Watchdog.Monitor {
84    private static final String TAG = "PowerManagerService";
85
86    private static final boolean DEBUG = false;
87    private static final boolean DEBUG_SPEW = DEBUG && true;
88
89    // Message: Sent when a user activity timeout occurs to update the power state.
90    private static final int MSG_USER_ACTIVITY_TIMEOUT = 1;
91    // Message: Sent when the device enters or exits a dreaming or dozing state.
92    private static final int MSG_SANDMAN = 2;
93    // Message: Sent when the screen on blocker is released.
94    private static final int MSG_SCREEN_ON_BLOCKER_RELEASED = 3;
95    // Message: Sent to poll whether the boot animation has terminated.
96    private static final int MSG_CHECK_IF_BOOT_ANIMATION_FINISHED = 4;
97
98    // Dirty bit: mWakeLocks changed
99    private static final int DIRTY_WAKE_LOCKS = 1 << 0;
100    // Dirty bit: mWakefulness changed
101    private static final int DIRTY_WAKEFULNESS = 1 << 1;
102    // Dirty bit: user activity was poked or may have timed out
103    private static final int DIRTY_USER_ACTIVITY = 1 << 2;
104    // Dirty bit: actual display power state was updated asynchronously
105    private static final int DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED = 1 << 3;
106    // Dirty bit: mBootCompleted changed
107    private static final int DIRTY_BOOT_COMPLETED = 1 << 4;
108    // Dirty bit: settings changed
109    private static final int DIRTY_SETTINGS = 1 << 5;
110    // Dirty bit: mIsPowered changed
111    private static final int DIRTY_IS_POWERED = 1 << 6;
112    // Dirty bit: mStayOn changed
113    private static final int DIRTY_STAY_ON = 1 << 7;
114    // Dirty bit: battery state changed
115    private static final int DIRTY_BATTERY_STATE = 1 << 8;
116    // Dirty bit: proximity state changed
117    private static final int DIRTY_PROXIMITY_POSITIVE = 1 << 9;
118    // Dirty bit: screen on blocker state became held or unheld
119    private static final int DIRTY_SCREEN_ON_BLOCKER_RELEASED = 1 << 10;
120    // Dirty bit: dock state changed
121    private static final int DIRTY_DOCK_STATE = 1 << 11;
122
123    // Wakefulness: The device is asleep and can only be awoken by a call to wakeUp().
124    // The screen should be off or in the process of being turned off by the display controller.
125    // The device typically passes through the dozing state first.
126    private static final int WAKEFULNESS_ASLEEP = 0;
127    // Wakefulness: The device is fully awake.  It can be put to sleep by a call to goToSleep().
128    // When the user activity timeout expires, the device may start dreaming or go to sleep.
129    private static final int WAKEFULNESS_AWAKE = 1;
130    // Wakefulness: The device is dreaming.  It can be awoken by a call to wakeUp(),
131    // which ends the dream.  The device goes to sleep when goToSleep() is called, when
132    // the dream ends or when unplugged.
133    // User activity may brighten the screen but does not end the dream.
134    private static final int WAKEFULNESS_DREAMING = 2;
135    // Wakefulness: The device is dozing.  It is almost asleep but is allowing a special
136    // low-power "doze" dream to run which keeps the display on but lets the application
137    // processor be suspended.  It can be awoken by a call to wakeUp() which ends the dream.
138    // The device fully goes to sleep if the dream cannot be started or ends on its own.
139    private static final int WAKEFULNESS_DOZING = 3;
140
141    // Summarizes the state of all active wakelocks.
142    private static final int WAKE_LOCK_CPU = 1 << 0;
143    private static final int WAKE_LOCK_SCREEN_BRIGHT = 1 << 1;
144    private static final int WAKE_LOCK_SCREEN_DIM = 1 << 2;
145    private static final int WAKE_LOCK_BUTTON_BRIGHT = 1 << 3;
146    private static final int WAKE_LOCK_PROXIMITY_SCREEN_OFF = 1 << 4;
147    private static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
148    private static final int WAKE_LOCK_DOZE = 1 << 6;
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
154    // Default timeout in milliseconds.  This is only used until the settings
155    // provider populates the actual default value (R.integer.def_screen_off_timeout).
156    private static final int DEFAULT_SCREEN_OFF_TIMEOUT = 15 * 1000;
157
158    // The name of the boot animation service in init.rc.
159    private static final String BOOT_ANIMATION_SERVICE = "bootanim";
160
161    // Poll interval in milliseconds for watching boot animation finished.
162    private static final int BOOT_ANIMATION_POLL_INTERVAL = 200;
163
164    // Used to send the hint to the PowerHAL indicating transitions
165    // from and to the low power mode.
166    private static final int POWER_HINT_LOW_POWER_MODE = 5;
167
168    private final Context mContext;
169    private final ServiceThread mHandlerThread;
170    private final PowerManagerHandler mHandler;
171
172    private LightsManager mLightsManager;
173    private BatteryManagerInternal mBatteryManagerInternal;
174    private DisplayManagerInternal mDisplayManagerInternal;
175    private IBatteryStats mBatteryStats;
176    private IAppOpsService mAppOps;
177    private WindowManagerPolicy mPolicy;
178    private Notifier mNotifier;
179    private WirelessChargerDetector mWirelessChargerDetector;
180    private SettingsObserver mSettingsObserver;
181    private DreamManagerInternal mDreamManager;
182    private Light mAttentionLight;
183
184    private final Object mLock = new Object();
185
186    // A bitfield that indicates what parts of the power state have
187    // changed and need to be recalculated.
188    private int mDirty;
189
190    // Indicates whether the device is awake or asleep or somewhere in between.
191    // This is distinct from the screen power state, which is managed separately.
192    private int mWakefulness;
193
194    // True if the sandman has just been summoned for the first time since entering the
195    // dreaming or dozing state.  Indicates whether a new dream should begin.
196    private boolean mSandmanSummoned;
197
198    // True if MSG_SANDMAN has been scheduled.
199    private boolean mSandmanScheduled;
200
201    // Table of all suspend blockers.
202    // There should only be a few of these.
203    private final ArrayList<SuspendBlocker> mSuspendBlockers = new ArrayList<SuspendBlocker>();
204
205    // Table of all wake locks acquired by applications.
206    private final ArrayList<WakeLock> mWakeLocks = new ArrayList<WakeLock>();
207
208    // A bitfield that summarizes the state of all active wakelocks.
209    private int mWakeLockSummary;
210
211    // True if the device is in an interactive state.
212    private boolean mInteractive;
213    private boolean mInteractiveChanging;
214
215    // If true, instructs the display controller to wait for the proximity sensor to
216    // go negative before turning the screen on.
217    private boolean mRequestWaitForNegativeProximity;
218
219    // Timestamp of the last time the device was awoken or put to sleep.
220    private long mLastWakeTime;
221    private long mLastSleepTime;
222
223    // Timestamp of the last call to user activity.
224    private long mLastUserActivityTime;
225    private long mLastUserActivityTimeNoChangeLights;
226
227    // A bitfield that summarizes the effect of the user activity timer.
228    // A zero value indicates that the user activity timer has expired.
229    private int mUserActivitySummary;
230
231    // The desired display power state.  The actual state may lag behind the
232    // requested because it is updated asynchronously by the display power controller.
233    private final DisplayPowerRequest mDisplayPowerRequest = new DisplayPowerRequest();
234
235    // True if the display power state has been fully applied, which means the display
236    // is actually on or actually off or whatever was requested.
237    private boolean mDisplayReady;
238
239    // The suspend blocker used to keep the CPU alive when an application has acquired
240    // a wake lock.
241    private final SuspendBlocker mWakeLockSuspendBlocker;
242
243    // True if the wake lock suspend blocker has been acquired.
244    private boolean mHoldingWakeLockSuspendBlocker;
245
246    // The suspend blocker used to keep the CPU alive when the display is on, the
247    // display is getting ready or there is user activity (in which case the display
248    // must be on).
249    private final SuspendBlocker mDisplaySuspendBlocker;
250
251    // True if the display suspend blocker has been acquired.
252    private boolean mHoldingDisplaySuspendBlocker;
253
254    // The screen on blocker used to keep the screen from turning on while the lock
255    // screen is coming up.
256    private final ScreenOnBlockerImpl mScreenOnBlocker;
257
258    // True if systemReady() has been called.
259    private boolean mSystemReady;
260
261    // True if boot completed occurred.  We keep the screen on until this happens.
262    private boolean mBootCompleted;
263
264    // True if auto-suspend mode is enabled.
265    // Refer to autosuspend.h.
266    private boolean mHalAutoSuspendModeEnabled;
267
268    // True if interactive mode is enabled.
269    // Refer to power.h.
270    private boolean mHalInteractiveModeEnabled;
271
272    // True if the device is plugged into a power source.
273    private boolean mIsPowered;
274
275    // The current plug type, such as BatteryManager.BATTERY_PLUGGED_WIRELESS.
276    private int mPlugType;
277
278    // The current battery level percentage.
279    private int mBatteryLevel;
280
281    // The battery level percentage at the time the dream started.
282    // This is used to terminate a dream and go to sleep if the battery is
283    // draining faster than it is charging and the user activity timeout has expired.
284    private int mBatteryLevelWhenDreamStarted;
285
286    // The current dock state.
287    private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
288
289    // True to decouple auto-suspend mode from the display state.
290    private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig;
291
292    // True to decouple interactive mode from the display state.
293    private boolean mDecoupleHalInteractiveModeFromDisplayConfig;
294
295    // True if the device should wake up when plugged or unplugged.
296    private boolean mWakeUpWhenPluggedOrUnpluggedConfig;
297
298    // True if the device should suspend when the screen is off due to proximity.
299    private boolean mSuspendWhenScreenOffDueToProximityConfig;
300
301    // True if dreams are supported on this device.
302    private boolean mDreamsSupportedConfig;
303
304    // Default value for dreams enabled
305    private boolean mDreamsEnabledByDefaultConfig;
306
307    // Default value for dreams activate-on-sleep
308    private boolean mDreamsActivatedOnSleepByDefaultConfig;
309
310    // Default value for dreams activate-on-dock
311    private boolean mDreamsActivatedOnDockByDefaultConfig;
312
313    // True if dreams can run while not plugged in.
314    private boolean mDreamsEnabledOnBatteryConfig;
315
316    // Minimum battery level to allow dreaming when powered.
317    // Use -1 to disable this safety feature.
318    private int mDreamsBatteryLevelMinimumWhenPoweredConfig;
319
320    // Minimum battery level to allow dreaming when not powered.
321    // Use -1 to disable this safety feature.
322    private int mDreamsBatteryLevelMinimumWhenNotPoweredConfig;
323
324    // If the battery level drops by this percentage and the user activity timeout
325    // has expired, then assume the device is receiving insufficient current to charge
326    // effectively and terminate the dream.  Use -1 to disable this safety feature.
327    private int mDreamsBatteryLevelDrainCutoffConfig;
328
329    // True if dreams are enabled by the user.
330    private boolean mDreamsEnabledSetting;
331
332    // True if dreams should be activated on sleep.
333    private boolean mDreamsActivateOnSleepSetting;
334
335    // True if dreams should be activated on dock.
336    private boolean mDreamsActivateOnDockSetting;
337
338    // The minimum screen off timeout, in milliseconds.
339    private int mMinimumScreenOffTimeoutConfig;
340
341    // The screen dim duration, in milliseconds.
342    // This is subtracted from the end of the screen off timeout so the
343    // minimum screen off timeout should be longer than this.
344    private int mMaximumScreenDimDurationConfig;
345
346    // The maximum screen dim time expressed as a ratio relative to the screen
347    // off timeout.  If the screen off timeout is very short then we want the
348    // dim timeout to also be quite short so that most of the time is spent on.
349    // Otherwise the user won't get much screen on time before dimming occurs.
350    private float mMaximumScreenDimRatioConfig;
351
352    // The screen off timeout setting value in milliseconds.
353    private int mScreenOffTimeoutSetting;
354
355    // The maximum allowable screen off timeout according to the device
356    // administration policy.  Overrides other settings.
357    private int mMaximumScreenOffTimeoutFromDeviceAdmin = Integer.MAX_VALUE;
358
359    // The stay on while plugged in setting.
360    // A bitfield of battery conditions under which to make the screen stay on.
361    private int mStayOnWhilePluggedInSetting;
362
363    // True if the device should stay on.
364    private boolean mStayOn;
365
366    // True if the proximity sensor reads a positive result.
367    private boolean mProximityPositive;
368
369    // Screen brightness setting limits.
370    private int mScreenBrightnessSettingMinimum;
371    private int mScreenBrightnessSettingMaximum;
372    private int mScreenBrightnessSettingDefault;
373
374    // The screen brightness setting, from 0 to 255.
375    // Use -1 if no value has been set.
376    private int mScreenBrightnessSetting;
377
378    // The screen auto-brightness adjustment setting, from -1 to 1.
379    // Use 0 if there is no adjustment.
380    private float mScreenAutoBrightnessAdjustmentSetting;
381
382    // The screen brightness mode.
383    // One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
384    private int mScreenBrightnessModeSetting;
385
386    // The screen brightness setting override from the window manager
387    // to allow the current foreground activity to override the brightness.
388    // Use -1 to disable.
389    private int mScreenBrightnessOverrideFromWindowManager = -1;
390
391    // The user activity timeout override from the window manager
392    // to allow the current foreground activity to override the user activity timeout.
393    // Use -1 to disable.
394    private long mUserActivityTimeoutOverrideFromWindowManager = -1;
395
396    // The screen brightness setting override from the settings application
397    // to temporarily adjust the brightness until next updated,
398    // Use -1 to disable.
399    private int mTemporaryScreenBrightnessSettingOverride = -1;
400
401    // The screen brightness adjustment setting override from the settings
402    // application to temporarily adjust the auto-brightness adjustment factor
403    // until next updated, in the range -1..1.
404    // Use NaN to disable.
405    private float mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = Float.NaN;
406
407    // The screen state to use while dozing.
408    private int mDozeScreenStateOverrideFromDreamManager = Display.STATE_UNKNOWN;
409
410    // The screen brightness to use while dozing.
411    private int mDozeScreenBrightnessOverrideFromDreamManager = PowerManager.BRIGHTNESS_DEFAULT;
412
413    // Time when we last logged a warning about calling userActivity() without permission.
414    private long mLastWarningAboutUserActivityPermission = Long.MIN_VALUE;
415
416    // If true, the device is in low power mode.
417    private boolean mLowPowerModeEnabled;
418
419    // Current state of the low power mode setting.
420    private boolean mLowPowerModeSetting;
421
422    // Current state of whether the settings are allowing auto low power mode.
423    private boolean mAutoLowPowerModeEnabled;
424
425   // The user turned off low power mode below the trigger level
426    private boolean mAutoLowPowerModeSnoozing;
427
428    // True if the battery level is currently considered low.
429    private boolean mBatteryLevelLow;
430
431    private final ArrayList<PowerManagerInternal.LowPowerModeListener> mLowPowerModeListeners
432            = new ArrayList<PowerManagerInternal.LowPowerModeListener>();
433
434    private native void nativeInit();
435
436    private static native void nativeAcquireSuspendBlocker(String name);
437    private static native void nativeReleaseSuspendBlocker(String name);
438    private static native void nativeSetInteractive(boolean enable);
439    private static native void nativeSetAutoSuspend(boolean enable);
440    private static native void nativeSendPowerHint(int hintId, int data);
441
442    public PowerManagerService(Context context) {
443        super(context);
444        mContext = context;
445        mHandlerThread = new ServiceThread(TAG,
446                Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
447        mHandlerThread.start();
448        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
449
450        synchronized (mLock) {
451            mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
452            mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
453            mDisplaySuspendBlocker.acquire();
454            mHoldingDisplaySuspendBlocker = true;
455            mHalAutoSuspendModeEnabled = false;
456            mHalInteractiveModeEnabled = true;
457
458            mScreenOnBlocker = new ScreenOnBlockerImpl();
459            mWakefulness = WAKEFULNESS_AWAKE;
460            mInteractive = true;
461
462            nativeInit();
463            nativeSetAutoSuspend(false);
464            nativeSetInteractive(true);
465        }
466    }
467
468    @Override
469    public void onStart() {
470        publishBinderService(Context.POWER_SERVICE, new BinderService());
471        publishLocalService(PowerManagerInternal.class, new LocalService());
472
473        Watchdog.getInstance().addMonitor(this);
474        Watchdog.getInstance().addThread(mHandler);
475    }
476
477    @Override
478    public void onBootPhase(int phase) {
479        if (phase == PHASE_BOOT_COMPLETED) {
480            // This is our early signal that the system thinks it has finished booting.
481            // However, the boot animation may still be running for a few more seconds
482            // since it is ultimately in charge of when it terminates.
483            // Defer transitioning into the boot completed state until the animation exits.
484            // We do this so that the screen does not start to dim prematurely before
485            // the user has actually had a chance to interact with the device.
486            startWatchingForBootAnimationFinished();
487        }
488    }
489
490    public void systemReady(IAppOpsService appOps) {
491        synchronized (mLock) {
492            mSystemReady = true;
493            mAppOps = appOps;
494            mDreamManager = getLocalService(DreamManagerInternal.class);
495            mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);
496            mPolicy = getLocalService(WindowManagerPolicy.class);
497            mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);
498
499            PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
500            mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();
501            mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();
502            mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();
503
504            SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
505
506            // The notifier runs on the system server's main looper so as not to interfere
507            // with the animations and other critical functions of the power manager.
508            mBatteryStats = BatteryStatsService.getService();
509            mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
510                    mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
511                    mScreenOnBlocker, mPolicy);
512
513            mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
514                    createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
515                    mHandler);
516            mSettingsObserver = new SettingsObserver(mHandler);
517
518            mLightsManager = getLocalService(LightsManager.class);
519            mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
520
521            // Initialize display power management.
522            mDisplayManagerInternal.initPowerManagement(
523                    mDisplayPowerCallbacks, mHandler, sensorManager);
524
525            // Register for broadcasts from other components of the system.
526            IntentFilter filter = new IntentFilter();
527            filter.addAction(Intent.ACTION_BATTERY_CHANGED);
528            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
529            mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);
530
531            filter = new IntentFilter();
532            filter.addAction(Intent.ACTION_DREAMING_STARTED);
533            filter.addAction(Intent.ACTION_DREAMING_STOPPED);
534            mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);
535
536            filter = new IntentFilter();
537            filter.addAction(Intent.ACTION_USER_SWITCHED);
538            mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
539
540            filter = new IntentFilter();
541            filter.addAction(Intent.ACTION_DOCK_EVENT);
542            mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
543
544            // Register for settings changes.
545            final ContentResolver resolver = mContext.getContentResolver();
546            resolver.registerContentObserver(Settings.Secure.getUriFor(
547                    Settings.Secure.SCREENSAVER_ENABLED),
548                    false, mSettingsObserver, UserHandle.USER_ALL);
549            resolver.registerContentObserver(Settings.Secure.getUriFor(
550                    Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
551                    false, mSettingsObserver, UserHandle.USER_ALL);
552            resolver.registerContentObserver(Settings.Secure.getUriFor(
553                    Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
554                    false, mSettingsObserver, UserHandle.USER_ALL);
555            resolver.registerContentObserver(Settings.System.getUriFor(
556                    Settings.System.SCREEN_OFF_TIMEOUT),
557                    false, mSettingsObserver, UserHandle.USER_ALL);
558            resolver.registerContentObserver(Settings.Global.getUriFor(
559                    Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
560                    false, mSettingsObserver, UserHandle.USER_ALL);
561            resolver.registerContentObserver(Settings.System.getUriFor(
562                    Settings.System.SCREEN_BRIGHTNESS),
563                    false, mSettingsObserver, UserHandle.USER_ALL);
564            resolver.registerContentObserver(Settings.System.getUriFor(
565                    Settings.System.SCREEN_BRIGHTNESS_MODE),
566                    false, mSettingsObserver, UserHandle.USER_ALL);
567            resolver.registerContentObserver(Settings.System.getUriFor(
568                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
569                    false, mSettingsObserver, UserHandle.USER_ALL);
570            resolver.registerContentObserver(Settings.Global.getUriFor(
571                    Settings.Global.LOW_POWER_MODE),
572                    false, mSettingsObserver, UserHandle.USER_ALL);
573            resolver.registerContentObserver(Settings.Global.getUriFor(
574                    Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
575                    false, mSettingsObserver, UserHandle.USER_ALL);
576            // Go.
577            readConfigurationLocked();
578            updateSettingsLocked();
579            mDirty |= DIRTY_BATTERY_STATE;
580            updatePowerStateLocked();
581        }
582    }
583
584    private void readConfigurationLocked() {
585        final Resources resources = mContext.getResources();
586
587        mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean(
588                com.android.internal.R.bool.config_powerDecoupleAutoSuspendModeFromDisplay);
589        mDecoupleHalInteractiveModeFromDisplayConfig = resources.getBoolean(
590                com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay);
591        mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean(
592                com.android.internal.R.bool.config_unplugTurnsOnScreen);
593        mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean(
594                com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity);
595        mDreamsSupportedConfig = resources.getBoolean(
596                com.android.internal.R.bool.config_dreamsSupported);
597        mDreamsEnabledByDefaultConfig = resources.getBoolean(
598                com.android.internal.R.bool.config_dreamsEnabledByDefault);
599        mDreamsActivatedOnSleepByDefaultConfig = resources.getBoolean(
600                com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
601        mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean(
602                com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
603        mDreamsEnabledOnBatteryConfig = resources.getBoolean(
604                com.android.internal.R.bool.config_dreamsEnabledOnBattery);
605        mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger(
606                com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenPowered);
607        mDreamsBatteryLevelMinimumWhenNotPoweredConfig = resources.getInteger(
608                com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered);
609        mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger(
610                com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff);
611        mMinimumScreenOffTimeoutConfig = resources.getInteger(
612                com.android.internal.R.integer.config_minimumScreenOffTimeout);
613        mMaximumScreenDimDurationConfig = resources.getInteger(
614                com.android.internal.R.integer.config_maximumScreenDimDuration);
615        mMaximumScreenDimRatioConfig = resources.getFraction(
616                com.android.internal.R.fraction.config_maximumScreenDimRatio, 1, 1);
617    }
618
619    private void updateSettingsLocked() {
620        final ContentResolver resolver = mContext.getContentResolver();
621
622        mDreamsEnabledSetting = (Settings.Secure.getIntForUser(resolver,
623                Settings.Secure.SCREENSAVER_ENABLED,
624                mDreamsEnabledByDefaultConfig ? 1 : 0,
625                UserHandle.USER_CURRENT) != 0);
626        mDreamsActivateOnSleepSetting = (Settings.Secure.getIntForUser(resolver,
627                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
628                mDreamsActivatedOnSleepByDefaultConfig ? 1 : 0,
629                UserHandle.USER_CURRENT) != 0);
630        mDreamsActivateOnDockSetting = (Settings.Secure.getIntForUser(resolver,
631                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
632                mDreamsActivatedOnDockByDefaultConfig ? 1 : 0,
633                UserHandle.USER_CURRENT) != 0);
634        mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,
635                Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,
636                UserHandle.USER_CURRENT);
637        mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver,
638                Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
639
640        final int oldScreenBrightnessSetting = mScreenBrightnessSetting;
641        mScreenBrightnessSetting = Settings.System.getIntForUser(resolver,
642                Settings.System.SCREEN_BRIGHTNESS, mScreenBrightnessSettingDefault,
643                UserHandle.USER_CURRENT);
644        if (oldScreenBrightnessSetting != mScreenBrightnessSetting) {
645            mTemporaryScreenBrightnessSettingOverride = -1;
646        }
647
648        final float oldScreenAutoBrightnessAdjustmentSetting =
649                mScreenAutoBrightnessAdjustmentSetting;
650        mScreenAutoBrightnessAdjustmentSetting = Settings.System.getFloatForUser(resolver,
651                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f,
652                UserHandle.USER_CURRENT);
653        if (oldScreenAutoBrightnessAdjustmentSetting != mScreenAutoBrightnessAdjustmentSetting) {
654            mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = Float.NaN;
655        }
656
657        mScreenBrightnessModeSetting = Settings.System.getIntForUser(resolver,
658                Settings.System.SCREEN_BRIGHTNESS_MODE,
659                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT);
660
661        final boolean lowPowerModeEnabled = Settings.Global.getInt(resolver,
662                Settings.Global.LOW_POWER_MODE, 0) != 0;
663        final boolean autoLowPowerModeEnabled = Settings.Global.getInt(resolver,
664                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) != 0;
665        if (lowPowerModeEnabled != mLowPowerModeSetting
666                || autoLowPowerModeEnabled != mAutoLowPowerModeEnabled) {
667            if (lowPowerModeEnabled != mLowPowerModeSetting) {
668                if (!mAutoLowPowerModeSnoozing && !lowPowerModeEnabled && !mIsPowered
669                        && mAutoLowPowerModeEnabled) {
670                    if (DEBUG_SPEW) {
671                        Slog.d(TAG, "updateSettingsLocked: snoozing low power mode");
672                    }
673                    mAutoLowPowerModeSnoozing = true;
674                } else if (mAutoLowPowerModeSnoozing && lowPowerModeEnabled) {
675                    if (DEBUG_SPEW) {
676                        Slog.d(TAG, "updateSettingsLocked: no longer snoozing low power mode");
677                    }
678                    mAutoLowPowerModeSnoozing = true;
679                }
680            }
681            mLowPowerModeSetting = lowPowerModeEnabled;
682            mAutoLowPowerModeEnabled = autoLowPowerModeEnabled;
683            updateLowPowerModeLocked();
684        }
685
686        mDirty |= DIRTY_SETTINGS;
687    }
688
689    void updateLowPowerModeLocked() {
690        if (mIsPowered && mLowPowerModeSetting) {
691            if (DEBUG_SPEW) {
692                Slog.d(TAG, "updateLowPowerModeLocked: powered, turning setting off");
693            }
694            // Turn setting off if powered
695            Settings.Global.putInt(mContext.getContentResolver(),
696                    Settings.Global.LOW_POWER_MODE, 0);
697            mLowPowerModeSetting = false;
698        } else if (!mIsPowered && mAutoLowPowerModeEnabled && !mAutoLowPowerModeSnoozing
699                && mBatteryLevelLow && !mLowPowerModeSetting) {
700            if (DEBUG_SPEW) {
701                Slog.d(TAG, "updateLowPowerModeLocked: trigger level reached, turning setting on");
702            }
703            // Turn setting on if trigger level is enabled, and we're now below it
704            Settings.Global.putInt(mContext.getContentResolver(),
705                    Settings.Global.LOW_POWER_MODE, 1);
706            mLowPowerModeSetting = true;
707        }
708        final boolean lowPowerModeEnabled = mLowPowerModeSetting;
709        if (mLowPowerModeEnabled != lowPowerModeEnabled) {
710            mLowPowerModeEnabled = lowPowerModeEnabled;
711            powerHintInternal(POWER_HINT_LOW_POWER_MODE, lowPowerModeEnabled ? 1 : 0);
712            setSurfaceFlingerLowPowerMode(lowPowerModeEnabled ? 1 : 0);
713            mLowPowerModeEnabled = lowPowerModeEnabled;
714            BackgroundThread.getHandler().post(new Runnable() {
715                @Override
716                public void run() {
717                    Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)
718                            .putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, mLowPowerModeEnabled)
719                            .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
720                    mContext.sendBroadcast(intent);
721                    ArrayList<PowerManagerInternal.LowPowerModeListener> listeners;
722                    synchronized (mLock) {
723                        listeners = new ArrayList<PowerManagerInternal.LowPowerModeListener>(
724                                mLowPowerModeListeners);
725                    }
726                    for (int i=0; i<listeners.size(); i++) {
727                        listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled);
728                    }
729                    intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
730                    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
731                    mContext.sendBroadcast(intent);
732                }
733            });
734        }
735    }
736
737    private void handleSettingsChangedLocked() {
738        updateSettingsLocked();
739        updatePowerStateLocked();
740    }
741
742    private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName,
743            WorkSource ws, String historyTag, int uid, int pid) {
744        synchronized (mLock) {
745            if (DEBUG_SPEW) {
746                Slog.d(TAG, "acquireWakeLockInternal: lock=" + Objects.hashCode(lock)
747                        + ", flags=0x" + Integer.toHexString(flags)
748                        + ", tag=\"" + tag + "\", ws=" + ws + ", uid=" + uid + ", pid=" + pid);
749            }
750
751            WakeLock wakeLock;
752            int index = findWakeLockIndexLocked(lock);
753            boolean notifyAcquire;
754            if (index >= 0) {
755                wakeLock = mWakeLocks.get(index);
756                if (!wakeLock.hasSameProperties(flags, tag, ws, uid, pid)) {
757                    // Update existing wake lock.  This shouldn't happen but is harmless.
758                    notifyWakeLockChangingLocked(wakeLock, flags, tag, packageName,
759                            uid, pid, ws, historyTag);
760                    wakeLock.updateProperties(flags, tag, packageName, ws, historyTag, uid, pid);
761                }
762                notifyAcquire = false;
763            } else {
764                wakeLock = new WakeLock(lock, flags, tag, packageName, ws, historyTag, uid, pid);
765                try {
766                    lock.linkToDeath(wakeLock, 0);
767                } catch (RemoteException ex) {
768                    throw new IllegalArgumentException("Wake lock is already dead.");
769                }
770                mWakeLocks.add(wakeLock);
771                notifyAcquire = true;
772            }
773
774            applyWakeLockFlagsOnAcquireLocked(wakeLock);
775            mDirty |= DIRTY_WAKE_LOCKS;
776            updatePowerStateLocked();
777            if (notifyAcquire) {
778                // This needs to be done last so we are sure we have acquired the
779                // kernel wake lock.  Otherwise we have a race where the system may
780                // go to sleep between the time we start the accounting in battery
781                // stats and when we actually get around to telling the kernel to
782                // stay awake.
783                notifyWakeLockAcquiredLocked(wakeLock);
784            }
785        }
786    }
787
788    @SuppressWarnings("deprecation")
789    private static boolean isScreenLock(final WakeLock wakeLock) {
790        switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
791            case PowerManager.FULL_WAKE_LOCK:
792            case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
793            case PowerManager.SCREEN_DIM_WAKE_LOCK:
794                return true;
795        }
796        return false;
797    }
798
799    private void applyWakeLockFlagsOnAcquireLocked(WakeLock wakeLock) {
800        if ((wakeLock.mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0
801                && isScreenLock(wakeLock)) {
802            wakeUpNoUpdateLocked(SystemClock.uptimeMillis());
803        }
804    }
805
806    private void releaseWakeLockInternal(IBinder lock, int flags) {
807        synchronized (mLock) {
808            int index = findWakeLockIndexLocked(lock);
809            if (index < 0) {
810                if (DEBUG_SPEW) {
811                    Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock)
812                            + " [not found], flags=0x" + Integer.toHexString(flags));
813                }
814                return;
815            }
816
817            WakeLock wakeLock = mWakeLocks.get(index);
818            if (DEBUG_SPEW) {
819                Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock)
820                        + " [" + wakeLock.mTag + "], flags=0x" + Integer.toHexString(flags));
821            }
822
823            mWakeLocks.remove(index);
824            notifyWakeLockReleasedLocked(wakeLock);
825            wakeLock.mLock.unlinkToDeath(wakeLock, 0);
826
827            if ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0) {
828                mRequestWaitForNegativeProximity = true;
829            }
830
831            applyWakeLockFlagsOnReleaseLocked(wakeLock);
832            mDirty |= DIRTY_WAKE_LOCKS;
833            updatePowerStateLocked();
834        }
835    }
836
837    private void handleWakeLockDeath(WakeLock wakeLock) {
838        synchronized (mLock) {
839            if (DEBUG_SPEW) {
840                Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock)
841                        + " [" + wakeLock.mTag + "]");
842            }
843
844            int index = mWakeLocks.indexOf(wakeLock);
845            if (index < 0) {
846                return;
847            }
848
849            mWakeLocks.remove(index);
850            notifyWakeLockReleasedLocked(wakeLock);
851
852            applyWakeLockFlagsOnReleaseLocked(wakeLock);
853            mDirty |= DIRTY_WAKE_LOCKS;
854            updatePowerStateLocked();
855        }
856    }
857
858    private void applyWakeLockFlagsOnReleaseLocked(WakeLock wakeLock) {
859        if ((wakeLock.mFlags & PowerManager.ON_AFTER_RELEASE) != 0
860                && isScreenLock(wakeLock)) {
861            userActivityNoUpdateLocked(SystemClock.uptimeMillis(),
862                    PowerManager.USER_ACTIVITY_EVENT_OTHER,
863                    PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS,
864                    wakeLock.mOwnerUid);
865        }
866    }
867
868    private void updateWakeLockWorkSourceInternal(IBinder lock, WorkSource ws, String historyTag) {
869        synchronized (mLock) {
870            int index = findWakeLockIndexLocked(lock);
871            if (index < 0) {
872                if (DEBUG_SPEW) {
873                    Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock)
874                            + " [not found], ws=" + ws);
875                }
876                throw new IllegalArgumentException("Wake lock not active");
877            }
878
879            WakeLock wakeLock = mWakeLocks.get(index);
880            if (DEBUG_SPEW) {
881                Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock)
882                        + " [" + wakeLock.mTag + "], ws=" + ws);
883            }
884
885            if (!wakeLock.hasSameWorkSource(ws)) {
886                notifyWakeLockChangingLocked(wakeLock, wakeLock.mFlags, wakeLock.mTag,
887                        wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid,
888                        ws, historyTag);
889                wakeLock.mHistoryTag = historyTag;
890                wakeLock.updateWorkSource(ws);
891            }
892        }
893    }
894
895    private int findWakeLockIndexLocked(IBinder lock) {
896        final int count = mWakeLocks.size();
897        for (int i = 0; i < count; i++) {
898            if (mWakeLocks.get(i).mLock == lock) {
899                return i;
900            }
901        }
902        return -1;
903    }
904
905    private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) {
906        if (mSystemReady) {
907            wakeLock.mNotifiedAcquired = true;
908            mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
909                    wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource,
910                    wakeLock.mHistoryTag);
911        }
912    }
913
914    private void notifyWakeLockChangingLocked(WakeLock wakeLock, int flags, String tag,
915            String packageName, int uid, int pid, WorkSource ws, String historyTag) {
916        if (mSystemReady && wakeLock.mNotifiedAcquired) {
917            mNotifier.onWakeLockChanging(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
918                    wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource,
919                    wakeLock.mHistoryTag, flags, tag, packageName, uid, pid, ws, historyTag);
920        }
921    }
922
923    private void notifyWakeLockReleasedLocked(WakeLock wakeLock) {
924        if (mSystemReady && wakeLock.mNotifiedAcquired) {
925            wakeLock.mNotifiedAcquired = false;
926            mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag,
927                    wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid,
928                    wakeLock.mWorkSource, wakeLock.mHistoryTag);
929        }
930    }
931
932    @SuppressWarnings("deprecation")
933    private boolean isWakeLockLevelSupportedInternal(int level) {
934        synchronized (mLock) {
935            switch (level) {
936                case PowerManager.PARTIAL_WAKE_LOCK:
937                case PowerManager.SCREEN_DIM_WAKE_LOCK:
938                case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
939                case PowerManager.FULL_WAKE_LOCK:
940                case PowerManager.DOZE_WAKE_LOCK:
941                    return true;
942
943                case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
944                    return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
945
946                default:
947                    return false;
948            }
949        }
950    }
951
952    // Called from native code.
953    private void userActivityFromNative(long eventTime, int event, int flags) {
954        userActivityInternal(eventTime, event, flags, Process.SYSTEM_UID);
955    }
956
957    private void userActivityInternal(long eventTime, int event, int flags, int uid) {
958        synchronized (mLock) {
959            if (userActivityNoUpdateLocked(eventTime, event, flags, uid)) {
960                updatePowerStateLocked();
961            }
962        }
963    }
964
965    private boolean userActivityNoUpdateLocked(long eventTime, int event, int flags, int uid) {
966        if (DEBUG_SPEW) {
967            Slog.d(TAG, "userActivityNoUpdateLocked: eventTime=" + eventTime
968                    + ", event=" + event + ", flags=0x" + Integer.toHexString(flags)
969                    + ", uid=" + uid);
970        }
971
972        if (eventTime < mLastSleepTime || eventTime < mLastWakeTime
973                || mWakefulness == WAKEFULNESS_ASLEEP || mWakefulness == WAKEFULNESS_DOZING
974                || !mBootCompleted || !mSystemReady) {
975            return false;
976        }
977
978        mNotifier.onUserActivity(event, uid);
979
980        if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) {
981            if (eventTime > mLastUserActivityTimeNoChangeLights
982                    && eventTime > mLastUserActivityTime) {
983                mLastUserActivityTimeNoChangeLights = eventTime;
984                mDirty |= DIRTY_USER_ACTIVITY;
985                return true;
986            }
987        } else {
988            if (eventTime > mLastUserActivityTime) {
989                mLastUserActivityTime = eventTime;
990                mDirty |= DIRTY_USER_ACTIVITY;
991                return true;
992            }
993        }
994        return false;
995    }
996
997    private void wakeUpInternal(long eventTime) {
998        synchronized (mLock) {
999            if (wakeUpNoUpdateLocked(eventTime)) {
1000                updatePowerStateLocked();
1001            }
1002        }
1003    }
1004
1005    private boolean wakeUpNoUpdateLocked(long eventTime) {
1006        if (DEBUG_SPEW) {
1007            Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime);
1008        }
1009
1010        if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE
1011                || !mBootCompleted || !mSystemReady) {
1012            return false;
1013        }
1014
1015        switch (mWakefulness) {
1016            case WAKEFULNESS_ASLEEP:
1017                Slog.i(TAG, "Waking up from sleep...");
1018                break;
1019            case WAKEFULNESS_DREAMING:
1020                Slog.i(TAG, "Waking up from dream...");
1021                break;
1022            case WAKEFULNESS_DOZING:
1023                Slog.i(TAG, "Waking up from dozing...");
1024                break;
1025        }
1026
1027        mLastWakeTime = eventTime;
1028        mDirty |= DIRTY_WAKEFULNESS;
1029        mWakefulness = WAKEFULNESS_AWAKE;
1030        setInteractiveStateLocked(true, 0);
1031
1032        userActivityNoUpdateLocked(
1033                eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
1034        return true;
1035    }
1036
1037    private void goToSleepInternal(long eventTime, int reason, int flags) {
1038        synchronized (mLock) {
1039            if (goToSleepNoUpdateLocked(eventTime, reason, flags)) {
1040                updatePowerStateLocked();
1041            }
1042        }
1043    }
1044
1045    // This method is called goToSleep for historical reasons but we actually start
1046    // dozing before really going to sleep.
1047    @SuppressWarnings("deprecation")
1048    private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags) {
1049        if (DEBUG_SPEW) {
1050            Slog.d(TAG, "goToSleepNoUpdateLocked: eventTime=" + eventTime
1051                    + ", reason=" + reason + ", flags=" + flags);
1052        }
1053
1054        if (eventTime < mLastWakeTime
1055                || mWakefulness == WAKEFULNESS_ASLEEP
1056                || mWakefulness == WAKEFULNESS_DOZING
1057                || !mBootCompleted || !mSystemReady) {
1058            return false;
1059        }
1060
1061        switch (reason) {
1062            case PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN:
1063                Slog.i(TAG, "Going to sleep due to device administration policy...");
1064                break;
1065            case PowerManager.GO_TO_SLEEP_REASON_TIMEOUT:
1066                Slog.i(TAG, "Going to sleep due to screen timeout...");
1067                break;
1068            default:
1069                Slog.i(TAG, "Going to sleep by user request...");
1070                reason = PowerManager.GO_TO_SLEEP_REASON_USER;
1071                break;
1072        }
1073
1074        mLastSleepTime = eventTime;
1075        mDirty |= DIRTY_WAKEFULNESS;
1076        mWakefulness = WAKEFULNESS_DOZING;
1077        mSandmanSummoned = true;
1078        setInteractiveStateLocked(false, reason);
1079
1080        // Report the number of wake locks that will be cleared by going to sleep.
1081        int numWakeLocksCleared = 0;
1082        final int numWakeLocks = mWakeLocks.size();
1083        for (int i = 0; i < numWakeLocks; i++) {
1084            final WakeLock wakeLock = mWakeLocks.get(i);
1085            switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
1086                case PowerManager.FULL_WAKE_LOCK:
1087                case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
1088                case PowerManager.SCREEN_DIM_WAKE_LOCK:
1089                    numWakeLocksCleared += 1;
1090                    break;
1091            }
1092        }
1093        EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numWakeLocksCleared);
1094
1095        // Skip dozing if requested.
1096        if ((flags & PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) != 0) {
1097            reallyGoToSleepNoUpdateLocked(eventTime);
1098        }
1099        return true;
1100    }
1101
1102    private void napInternal(long eventTime) {
1103        synchronized (mLock) {
1104            if (napNoUpdateLocked(eventTime)) {
1105                updatePowerStateLocked();
1106            }
1107        }
1108    }
1109
1110    private boolean napNoUpdateLocked(long eventTime) {
1111        if (DEBUG_SPEW) {
1112            Slog.d(TAG, "napNoUpdateLocked: eventTime=" + eventTime);
1113        }
1114
1115        if (eventTime < mLastWakeTime || mWakefulness != WAKEFULNESS_AWAKE
1116                || !mBootCompleted || !mSystemReady) {
1117            return false;
1118        }
1119
1120        Slog.i(TAG, "Nap time...");
1121
1122        mDirty |= DIRTY_WAKEFULNESS;
1123        mWakefulness = WAKEFULNESS_DREAMING;
1124        mSandmanSummoned = true;
1125        setInteractiveStateLocked(true, 0);
1126        return true;
1127    }
1128
1129    // Done dozing, drop everything and go to sleep.
1130    private boolean reallyGoToSleepNoUpdateLocked(long eventTime) {
1131        if (DEBUG_SPEW) {
1132            Slog.d(TAG, "reallyGoToSleepNoUpdateLocked: eventTime=" + eventTime);
1133        }
1134
1135        if (eventTime < mLastWakeTime || mWakefulness == WAKEFULNESS_ASLEEP
1136                || !mBootCompleted || !mSystemReady) {
1137            return false;
1138        }
1139
1140        Slog.i(TAG, "Sleeping...");
1141
1142        mDirty |= DIRTY_WAKEFULNESS;
1143        mWakefulness = WAKEFULNESS_ASLEEP;
1144        setInteractiveStateLocked(false, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT);
1145        return true;
1146    }
1147
1148    private void setInteractiveStateLocked(boolean interactive, int reason) {
1149        if (mInteractive != interactive) {
1150            finishInteractiveStateChangeLocked();
1151
1152            mInteractive = interactive;
1153            mInteractiveChanging = true;
1154            mNotifier.onInteractiveStateChangeStarted(interactive, reason);
1155        }
1156    }
1157
1158    private void finishInteractiveStateChangeLocked() {
1159        if (mInteractiveChanging) {
1160            mNotifier.onInteractiveStateChangeFinished(mInteractive);
1161            mInteractiveChanging = false;
1162        }
1163    }
1164
1165    /**
1166     * Updates the global power state based on dirty bits recorded in mDirty.
1167     *
1168     * This is the main function that performs power state transitions.
1169     * We centralize them here so that we can recompute the power state completely
1170     * each time something important changes, and ensure that we do it the same
1171     * way each time.  The point is to gather all of the transition logic here.
1172     */
1173    private void updatePowerStateLocked() {
1174        if (!mSystemReady || mDirty == 0) {
1175            return;
1176        }
1177        if (!Thread.holdsLock(mLock)) {
1178            Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked");
1179        }
1180
1181        // Phase 0: Basic state updates.
1182        updateIsPoweredLocked(mDirty);
1183        updateStayOnLocked(mDirty);
1184
1185        // Phase 1: Update wakefulness.
1186        // Loop because the wake lock and user activity computations are influenced
1187        // by changes in wakefulness.
1188        final long now = SystemClock.uptimeMillis();
1189        int dirtyPhase2 = 0;
1190        for (;;) {
1191            int dirtyPhase1 = mDirty;
1192            dirtyPhase2 |= dirtyPhase1;
1193            mDirty = 0;
1194
1195            updateWakeLockSummaryLocked(dirtyPhase1);
1196            updateUserActivitySummaryLocked(now, dirtyPhase1);
1197            if (!updateWakefulnessLocked(dirtyPhase1)) {
1198                break;
1199            }
1200        }
1201
1202        // Phase 2: Update dreams and display power state.
1203        updateDreamLocked(dirtyPhase2);
1204        updateDisplayPowerStateLocked(dirtyPhase2);
1205
1206        // Phase 3: Send notifications, if needed.
1207        if (mDisplayReady) {
1208            finishInteractiveStateChangeLocked();
1209        }
1210
1211        // Phase 4: Update suspend blocker.
1212        // Because we might release the last suspend blocker here, we need to make sure
1213        // we finished everything else first!
1214        updateSuspendBlockerLocked();
1215    }
1216
1217    /**
1218     * Updates the value of mIsPowered.
1219     * Sets DIRTY_IS_POWERED if a change occurred.
1220     */
1221    private void updateIsPoweredLocked(int dirty) {
1222        if ((dirty & DIRTY_BATTERY_STATE) != 0) {
1223            final boolean wasPowered = mIsPowered;
1224            final int oldPlugType = mPlugType;
1225            final boolean oldLevelLow = mBatteryLevelLow;
1226            mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
1227            mPlugType = mBatteryManagerInternal.getPlugType();
1228            mBatteryLevel = mBatteryManagerInternal.getBatteryLevel();
1229            mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow();
1230
1231            if (DEBUG_SPEW) {
1232                Slog.d(TAG, "updateIsPoweredLocked: wasPowered=" + wasPowered
1233                        + ", mIsPowered=" + mIsPowered
1234                        + ", oldPlugType=" + oldPlugType
1235                        + ", mPlugType=" + mPlugType
1236                        + ", mBatteryLevel=" + mBatteryLevel);
1237            }
1238
1239            if (wasPowered != mIsPowered || oldPlugType != mPlugType) {
1240                mDirty |= DIRTY_IS_POWERED;
1241
1242                // Update wireless dock detection state.
1243                final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(
1244                        mIsPowered, mPlugType, mBatteryLevel);
1245
1246                // Treat plugging and unplugging the devices as a user activity.
1247                // Users find it disconcerting when they plug or unplug the device
1248                // and it shuts off right away.
1249                // Some devices also wake the device when plugged or unplugged because
1250                // they don't have a charging LED.
1251                final long now = SystemClock.uptimeMillis();
1252                if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType,
1253                        dockedOnWirelessCharger)) {
1254                    wakeUpNoUpdateLocked(now);
1255                }
1256                userActivityNoUpdateLocked(
1257                        now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
1258
1259                // Tell the notifier whether wireless charging has started so that
1260                // it can provide feedback to the user.
1261                if (dockedOnWirelessCharger) {
1262                    mNotifier.onWirelessChargingStarted();
1263                }
1264            }
1265
1266            if (wasPowered != mIsPowered || oldLevelLow != mBatteryLevelLow) {
1267                if (oldLevelLow != mBatteryLevelLow && !mBatteryLevelLow) {
1268                    if (DEBUG_SPEW) {
1269                        Slog.d(TAG, "updateIsPoweredLocked: resetting low power snooze");
1270                    }
1271                    mAutoLowPowerModeSnoozing = false;
1272                }
1273                updateLowPowerModeLocked();
1274            }
1275        }
1276    }
1277
1278    private boolean shouldWakeUpWhenPluggedOrUnpluggedLocked(
1279            boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) {
1280        // Don't wake when powered unless configured to do so.
1281        if (!mWakeUpWhenPluggedOrUnpluggedConfig) {
1282            return false;
1283        }
1284
1285        // Don't wake when undocked from wireless charger.
1286        // See WirelessChargerDetector for justification.
1287        if (wasPowered && !mIsPowered
1288                && oldPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS) {
1289            return false;
1290        }
1291
1292        // Don't wake when docked on wireless charger unless we are certain of it.
1293        // See WirelessChargerDetector for justification.
1294        if (!wasPowered && mIsPowered
1295                && mPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS
1296                && !dockedOnWirelessCharger) {
1297            return false;
1298        }
1299
1300        // If already dreaming and becoming powered, then don't wake.
1301        if (mIsPowered && mWakefulness == WAKEFULNESS_DREAMING) {
1302            return false;
1303        }
1304
1305        // Otherwise wake up!
1306        return true;
1307    }
1308
1309    /**
1310     * Updates the value of mStayOn.
1311     * Sets DIRTY_STAY_ON if a change occurred.
1312     */
1313    private void updateStayOnLocked(int dirty) {
1314        if ((dirty & (DIRTY_BATTERY_STATE | DIRTY_SETTINGS)) != 0) {
1315            final boolean wasStayOn = mStayOn;
1316            if (mStayOnWhilePluggedInSetting != 0
1317                    && !isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
1318                mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting);
1319            } else {
1320                mStayOn = false;
1321            }
1322
1323            if (mStayOn != wasStayOn) {
1324                mDirty |= DIRTY_STAY_ON;
1325            }
1326        }
1327    }
1328
1329    /**
1330     * Updates the value of mWakeLockSummary to summarize the state of all active wake locks.
1331     * Note that most wake-locks are ignored when the system is asleep.
1332     *
1333     * This function must have no other side-effects.
1334     */
1335    @SuppressWarnings("deprecation")
1336    private void updateWakeLockSummaryLocked(int dirty) {
1337        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS)) != 0) {
1338            mWakeLockSummary = 0;
1339
1340            final int numWakeLocks = mWakeLocks.size();
1341            for (int i = 0; i < numWakeLocks; i++) {
1342                final WakeLock wakeLock = mWakeLocks.get(i);
1343                switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
1344                    case PowerManager.PARTIAL_WAKE_LOCK:
1345                        mWakeLockSummary |= WAKE_LOCK_CPU;
1346                        break;
1347                    case PowerManager.FULL_WAKE_LOCK:
1348                        mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT;
1349                        break;
1350                    case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
1351                        mWakeLockSummary |= WAKE_LOCK_SCREEN_BRIGHT;
1352                        break;
1353                    case PowerManager.SCREEN_DIM_WAKE_LOCK:
1354                        mWakeLockSummary |= WAKE_LOCK_SCREEN_DIM;
1355                        break;
1356                    case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
1357                        mWakeLockSummary |= WAKE_LOCK_PROXIMITY_SCREEN_OFF;
1358                        break;
1359                    case PowerManager.DOZE_WAKE_LOCK:
1360                        mWakeLockSummary |= WAKE_LOCK_DOZE;
1361                        break;
1362                }
1363            }
1364
1365            // Cancel wake locks that make no sense based on the current state.
1366            if (mWakefulness != WAKEFULNESS_DOZING) {
1367                mWakeLockSummary &= ~WAKE_LOCK_DOZE;
1368            }
1369            if (mWakefulness == WAKEFULNESS_ASLEEP
1370                    || (mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
1371                mWakeLockSummary &= ~(WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM
1372                        | WAKE_LOCK_BUTTON_BRIGHT);
1373                if (mWakefulness == WAKEFULNESS_ASLEEP) {
1374                    mWakeLockSummary &= ~WAKE_LOCK_PROXIMITY_SCREEN_OFF;
1375                }
1376            }
1377
1378            // Infer implied wake locks where necessary based on the current state.
1379            if ((mWakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM)) != 0) {
1380                if (mWakefulness == WAKEFULNESS_AWAKE) {
1381                    mWakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE;
1382                } else if (mWakefulness == WAKEFULNESS_DREAMING) {
1383                    mWakeLockSummary |= WAKE_LOCK_CPU;
1384                }
1385            }
1386
1387            if (DEBUG_SPEW) {
1388                Slog.d(TAG, "updateWakeLockSummaryLocked: mWakefulness="
1389                        + wakefulnessToString(mWakefulness)
1390                        + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));
1391            }
1392        }
1393    }
1394
1395    /**
1396     * Updates the value of mUserActivitySummary to summarize the user requested
1397     * state of the system such as whether the screen should be bright or dim.
1398     * Note that user activity is ignored when the system is asleep.
1399     *
1400     * This function must have no other side-effects.
1401     */
1402    private void updateUserActivitySummaryLocked(long now, int dirty) {
1403        // Update the status of the user activity timeout timer.
1404        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY
1405                | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) {
1406            mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
1407
1408            long nextTimeout = 0;
1409            if (mWakefulness == WAKEFULNESS_AWAKE
1410                    || mWakefulness == WAKEFULNESS_DREAMING
1411                    || mWakefulness == WAKEFULNESS_DOZING) {
1412                final int screenOffTimeout = getScreenOffTimeoutLocked();
1413                final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
1414
1415                mUserActivitySummary = 0;
1416                if (mLastUserActivityTime >= mLastWakeTime) {
1417                    nextTimeout = mLastUserActivityTime
1418                            + screenOffTimeout - screenDimDuration;
1419                    if (now < nextTimeout) {
1420                        mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
1421                    } else {
1422                        nextTimeout = mLastUserActivityTime + screenOffTimeout;
1423                        if (now < nextTimeout) {
1424                            mUserActivitySummary |= USER_ACTIVITY_SCREEN_DIM;
1425                        }
1426                    }
1427                }
1428                if (mUserActivitySummary == 0
1429                        && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
1430                    nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
1431                    if (now < nextTimeout) {
1432                        if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {
1433                            mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
1434                        } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
1435                            mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
1436                        }
1437                    }
1438                }
1439                if (mUserActivitySummary != 0) {
1440                    Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
1441                    msg.setAsynchronous(true);
1442                    mHandler.sendMessageAtTime(msg, nextTimeout);
1443                }
1444            } else {
1445                mUserActivitySummary = 0;
1446            }
1447
1448            if (DEBUG_SPEW) {
1449                Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness="
1450                        + wakefulnessToString(mWakefulness)
1451                        + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
1452                        + ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout));
1453            }
1454        }
1455    }
1456
1457    /**
1458     * Called when a user activity timeout has occurred.
1459     * Simply indicates that something about user activity has changed so that the new
1460     * state can be recomputed when the power state is updated.
1461     *
1462     * This function must have no other side-effects besides setting the dirty
1463     * bit and calling update power state.  Wakefulness transitions are handled elsewhere.
1464     */
1465    private void handleUserActivityTimeout() { // runs on handler thread
1466        synchronized (mLock) {
1467            if (DEBUG_SPEW) {
1468                Slog.d(TAG, "handleUserActivityTimeout");
1469            }
1470
1471            mDirty |= DIRTY_USER_ACTIVITY;
1472            updatePowerStateLocked();
1473        }
1474    }
1475
1476    private int getScreenOffTimeoutLocked() {
1477        int timeout = mScreenOffTimeoutSetting;
1478        if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
1479            timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
1480        }
1481        if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
1482            timeout = (int)Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
1483        }
1484        return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
1485    }
1486
1487    private int getScreenDimDurationLocked(int screenOffTimeout) {
1488        return Math.min(mMaximumScreenDimDurationConfig,
1489                (int)(screenOffTimeout * mMaximumScreenDimRatioConfig));
1490    }
1491
1492    /**
1493     * Updates the wakefulness of the device.
1494     *
1495     * This is the function that decides whether the device should start dreaming
1496     * based on the current wake locks and user activity state.  It may modify mDirty
1497     * if the wakefulness changes.
1498     *
1499     * Returns true if the wakefulness changed and we need to restart power state calculation.
1500     */
1501    private boolean updateWakefulnessLocked(int dirty) {
1502        boolean changed = false;
1503        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED
1504                | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE
1505                | DIRTY_DOCK_STATE)) != 0) {
1506            if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) {
1507                if (DEBUG_SPEW) {
1508                    Slog.d(TAG, "updateWakefulnessLocked: Bed time...");
1509                }
1510                final long time = SystemClock.uptimeMillis();
1511                if (shouldNapAtBedTimeLocked()) {
1512                    changed = napNoUpdateLocked(time);
1513                } else {
1514                    changed = goToSleepNoUpdateLocked(time,
1515                            PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0);
1516                }
1517            }
1518        }
1519        return changed;
1520    }
1521
1522    /**
1523     * Returns true if the device should automatically nap and start dreaming when the user
1524     * activity timeout has expired and it's bedtime.
1525     */
1526    private boolean shouldNapAtBedTimeLocked() {
1527        return mDreamsActivateOnSleepSetting
1528                || (mDreamsActivateOnDockSetting
1529                        && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED);
1530    }
1531
1532    /**
1533     * Returns true if the device should go to sleep now.
1534     * Also used when exiting a dream to determine whether we should go back
1535     * to being fully awake or else go to sleep for good.
1536     */
1537    private boolean isItBedTimeYetLocked() {
1538        return mBootCompleted && !isBeingKeptAwakeLocked();
1539    }
1540
1541    /**
1542     * Returns true if the device is being kept awake by a wake lock, user activity
1543     * or the stay on while powered setting.  We also keep the phone awake when
1544     * the proximity sensor returns a positive result so that the device does not
1545     * lock while in a phone call.  This function only controls whether the device
1546     * will go to sleep or dream which is independent of whether it will be allowed
1547     * to suspend.
1548     */
1549    private boolean isBeingKeptAwakeLocked() {
1550        return mStayOn
1551                || mProximityPositive
1552                || (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0
1553                || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
1554                        | USER_ACTIVITY_SCREEN_DIM)) != 0;
1555    }
1556
1557    /**
1558     * Determines whether to post a message to the sandman to update the dream state.
1559     */
1560    private void updateDreamLocked(int dirty) {
1561        if ((dirty & (DIRTY_WAKEFULNESS
1562                | DIRTY_USER_ACTIVITY
1563                | DIRTY_WAKE_LOCKS
1564                | DIRTY_BOOT_COMPLETED
1565                | DIRTY_SETTINGS
1566                | DIRTY_IS_POWERED
1567                | DIRTY_STAY_ON
1568                | DIRTY_PROXIMITY_POSITIVE
1569                | DIRTY_BATTERY_STATE)) != 0) {
1570            scheduleSandmanLocked();
1571        }
1572    }
1573
1574    private void scheduleSandmanLocked() {
1575        if (!mSandmanScheduled) {
1576            mSandmanScheduled = true;
1577            Message msg = mHandler.obtainMessage(MSG_SANDMAN);
1578            msg.setAsynchronous(true);
1579            mHandler.sendMessage(msg);
1580        }
1581    }
1582
1583    /**
1584     * Called when the device enters or exits a dreaming or dozing state.
1585     *
1586     * We do this asynchronously because we must call out of the power manager to start
1587     * the dream and we don't want to hold our lock while doing so.  There is a risk that
1588     * the device will wake or go to sleep in the meantime so we have to handle that case.
1589     */
1590    private void handleSandman() { // runs on handler thread
1591        // Handle preconditions.
1592        final boolean startDreaming;
1593        final int wakefulness;
1594        synchronized (mLock) {
1595            mSandmanScheduled = false;
1596            wakefulness = mWakefulness;
1597            if (mSandmanSummoned) {
1598                startDreaming = ((wakefulness == WAKEFULNESS_DREAMING && canDreamLocked())
1599                        || wakefulness == WAKEFULNESS_DOZING);
1600                mSandmanSummoned = false;
1601            } else {
1602                startDreaming = false;
1603            }
1604        }
1605
1606        // Start dreaming if needed.
1607        // We only control the dream on the handler thread, so we don't need to worry about
1608        // concurrent attempts to start or stop the dream.
1609        final boolean isDreaming;
1610        if (mDreamManager != null) {
1611            // Restart the dream whenever the sandman is summoned.
1612            if (startDreaming) {
1613                mDreamManager.stopDream(false /*immediate*/);
1614                mDreamManager.startDream(wakefulness == WAKEFULNESS_DOZING);
1615            }
1616            isDreaming = mDreamManager.isDreaming();
1617        } else {
1618            isDreaming = false;
1619        }
1620
1621        // Update dream state.
1622        synchronized (mLock) {
1623            // Remember the initial battery level when the dream started.
1624            if (startDreaming && isDreaming) {
1625                mBatteryLevelWhenDreamStarted = mBatteryLevel;
1626                if (wakefulness == WAKEFULNESS_DOZING) {
1627                    Slog.i(TAG, "Dozing...");
1628                } else {
1629                    Slog.i(TAG, "Dreaming...");
1630                }
1631            }
1632
1633            // If preconditions changed, wait for the next iteration to determine
1634            // whether the dream should continue (or be restarted).
1635            if (mSandmanSummoned || mWakefulness != wakefulness) {
1636                return; // wait for next cycle
1637            }
1638
1639            // Determine whether the dream should continue.
1640            if (wakefulness == WAKEFULNESS_DREAMING) {
1641                if (isDreaming && canDreamLocked()) {
1642                    if (mDreamsBatteryLevelDrainCutoffConfig >= 0
1643                            && mBatteryLevel < mBatteryLevelWhenDreamStarted
1644                                    - mDreamsBatteryLevelDrainCutoffConfig
1645                            && !isBeingKeptAwakeLocked()) {
1646                        // If the user activity timeout expired and the battery appears
1647                        // to be draining faster than it is charging then stop dreaming
1648                        // and go to sleep.
1649                        Slog.i(TAG, "Stopping dream because the battery appears to "
1650                                + "be draining faster than it is charging.  "
1651                                + "Battery level when dream started: "
1652                                + mBatteryLevelWhenDreamStarted + "%.  "
1653                                + "Battery level now: " + mBatteryLevel + "%.");
1654                    } else {
1655                        return; // continue dreaming
1656                    }
1657                }
1658
1659                // Dream has ended or will be stopped.  Update the power state.
1660                if (isItBedTimeYetLocked()) {
1661                    goToSleepNoUpdateLocked(SystemClock.uptimeMillis(),
1662                            PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0);
1663                    updatePowerStateLocked();
1664                } else {
1665                    wakeUpNoUpdateLocked(SystemClock.uptimeMillis());
1666                    updatePowerStateLocked();
1667                }
1668            } else if (wakefulness == WAKEFULNESS_DOZING) {
1669                if (isDreaming) {
1670                    return; // continue dozing
1671                }
1672
1673                // Doze has ended or will be stopped.  Update the power state.
1674                reallyGoToSleepNoUpdateLocked(SystemClock.uptimeMillis());
1675                updatePowerStateLocked();
1676            }
1677        }
1678
1679        // Stop dream.
1680        if (isDreaming) {
1681            mDreamManager.stopDream(false /*immediate*/);
1682        }
1683    }
1684
1685    /**
1686     * Returns true if the device is allowed to dream in its current state.
1687     * This function is not called when dozing.
1688     */
1689    private boolean canDreamLocked() {
1690        if (mWakefulness != WAKEFULNESS_DREAMING
1691                || !mDreamsSupportedConfig
1692                || !mDreamsEnabledSetting
1693                || !mDisplayPowerRequest.isBrightOrDim()
1694                || !mBootCompleted) {
1695            return false;
1696        }
1697        if (!isBeingKeptAwakeLocked()) {
1698            if (!mIsPowered && !mDreamsEnabledOnBatteryConfig) {
1699                return false;
1700            }
1701            if (!mIsPowered
1702                    && mDreamsBatteryLevelMinimumWhenNotPoweredConfig >= 0
1703                    && mBatteryLevel < mDreamsBatteryLevelMinimumWhenNotPoweredConfig) {
1704                return false;
1705            }
1706            if (mIsPowered
1707                    && mDreamsBatteryLevelMinimumWhenPoweredConfig >= 0
1708                    && mBatteryLevel < mDreamsBatteryLevelMinimumWhenPoweredConfig) {
1709                return false;
1710            }
1711        }
1712        return true;
1713    }
1714
1715    private void handleScreenOnBlockerReleased() {
1716        synchronized (mLock) {
1717            mDirty |= DIRTY_SCREEN_ON_BLOCKER_RELEASED;
1718            updatePowerStateLocked();
1719        }
1720    }
1721
1722    /**
1723     * Updates the display power state asynchronously.
1724     * When the update is finished, mDisplayReady will be set to true.  The display
1725     * controller posts a message to tell us when the actual display power state
1726     * has been updated so we come back here to double-check and finish up.
1727     *
1728     * This function recalculates the display power state each time.
1729     */
1730    private void updateDisplayPowerStateLocked(int dirty) {
1731        if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
1732                | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
1733                | DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) {
1734            mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();
1735
1736            int screenBrightness = mScreenBrightnessSettingDefault;
1737            float screenAutoBrightnessAdjustment = 0.0f;
1738            boolean autoBrightness = (mScreenBrightnessModeSetting ==
1739                    Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
1740            if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {
1741                screenBrightness = mScreenBrightnessOverrideFromWindowManager;
1742                autoBrightness = false;
1743            } else if (isValidBrightness(mTemporaryScreenBrightnessSettingOverride)) {
1744                screenBrightness = mTemporaryScreenBrightnessSettingOverride;
1745            } else if (isValidBrightness(mScreenBrightnessSetting)) {
1746                screenBrightness = mScreenBrightnessSetting;
1747            }
1748            if (autoBrightness) {
1749                screenBrightness = mScreenBrightnessSettingDefault;
1750                if (isValidAutoBrightnessAdjustment(
1751                        mTemporaryScreenAutoBrightnessAdjustmentSettingOverride)) {
1752                    screenAutoBrightnessAdjustment =
1753                            mTemporaryScreenAutoBrightnessAdjustmentSettingOverride;
1754                } else if (isValidAutoBrightnessAdjustment(
1755                        mScreenAutoBrightnessAdjustmentSetting)) {
1756                    screenAutoBrightnessAdjustment = mScreenAutoBrightnessAdjustmentSetting;
1757                }
1758            }
1759            screenBrightness = Math.max(Math.min(screenBrightness,
1760                    mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum);
1761            screenAutoBrightnessAdjustment = Math.max(Math.min(
1762                    screenAutoBrightnessAdjustment, 1.0f), -1.0f);
1763            mDisplayPowerRequest.screenBrightness = screenBrightness;
1764            mDisplayPowerRequest.screenAutoBrightnessAdjustment =
1765                    screenAutoBrightnessAdjustment;
1766            mDisplayPowerRequest.useAutoBrightness = autoBrightness;
1767
1768            mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
1769
1770            mDisplayPowerRequest.blockScreenOn = mScreenOnBlocker.isHeld();
1771
1772            mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled;
1773
1774            if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
1775                mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager;
1776                mDisplayPowerRequest.dozeScreenBrightness =
1777                        mDozeScreenBrightnessOverrideFromDreamManager;
1778            } else {
1779                mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;
1780                mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
1781            }
1782
1783            mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
1784                    mRequestWaitForNegativeProximity);
1785            mRequestWaitForNegativeProximity = false;
1786
1787            if (DEBUG_SPEW) {
1788                Slog.d(TAG, "updateScreenStateLocked: mDisplayReady=" + mDisplayReady
1789                        + ", policy=" + mDisplayPowerRequest.policy
1790                        + ", mWakefulness=" + mWakefulness
1791                        + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary)
1792                        + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)
1793                        + ", mBootCompleted=" + mBootCompleted);
1794            }
1795        }
1796    }
1797
1798    private static boolean isValidBrightness(int value) {
1799        return value >= 0 && value <= 255;
1800    }
1801
1802    private static boolean isValidAutoBrightnessAdjustment(float value) {
1803        // Handles NaN by always returning false.
1804        return value >= -1.0f && value <= 1.0f;
1805    }
1806
1807    private int getDesiredScreenPolicyLocked() {
1808        if (mWakefulness == WAKEFULNESS_ASLEEP) {
1809            return DisplayPowerRequest.POLICY_OFF;
1810        }
1811
1812        if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) {
1813            return DisplayPowerRequest.POLICY_DOZE;
1814        }
1815
1816        if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0
1817                || (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
1818                || !mBootCompleted) {
1819            return DisplayPowerRequest.POLICY_BRIGHT;
1820        }
1821
1822        return DisplayPowerRequest.POLICY_DIM;
1823    }
1824
1825    private final DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks =
1826            new DisplayManagerInternal.DisplayPowerCallbacks() {
1827        private int mDisplayState = Display.STATE_UNKNOWN;
1828
1829        @Override
1830        public void onStateChanged() {
1831            synchronized (mLock) {
1832                mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED;
1833                updatePowerStateLocked();
1834            }
1835        }
1836
1837        @Override
1838        public void onProximityPositive() {
1839            synchronized (mLock) {
1840                mProximityPositive = true;
1841                mDirty |= DIRTY_PROXIMITY_POSITIVE;
1842                updatePowerStateLocked();
1843            }
1844        }
1845
1846        @Override
1847        public void onProximityNegative() {
1848            synchronized (mLock) {
1849                mProximityPositive = false;
1850                mDirty |= DIRTY_PROXIMITY_POSITIVE;
1851                userActivityNoUpdateLocked(SystemClock.uptimeMillis(),
1852                        PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
1853                updatePowerStateLocked();
1854            }
1855        }
1856
1857        @Override
1858        public void onDisplayStateChange(int state) {
1859            // This method is only needed to support legacy display blanking behavior
1860            // where the display's power state is coupled to suspend or to the power HAL.
1861            // The order of operations matters here.
1862            synchronized (mLock) {
1863                if (mDisplayState != state) {
1864                    mDisplayState = state;
1865                    if (state == Display.STATE_OFF) {
1866                        if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
1867                            setHalInteractiveModeLocked(false);
1868                        }
1869                        if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
1870                            setHalAutoSuspendModeLocked(true);
1871                        }
1872                    } else {
1873                        if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) {
1874                            setHalAutoSuspendModeLocked(false);
1875                        }
1876                        if (!mDecoupleHalInteractiveModeFromDisplayConfig) {
1877                            setHalInteractiveModeLocked(true);
1878                        }
1879                    }
1880                }
1881            }
1882        }
1883
1884        @Override
1885        public void acquireSuspendBlocker() {
1886            mDisplaySuspendBlocker.acquire();
1887        }
1888
1889        @Override
1890        public void releaseSuspendBlocker() {
1891            mDisplaySuspendBlocker.release();
1892        }
1893
1894        @Override
1895        public String toString() {
1896            synchronized (this) {
1897                return "state=" + Display.stateToString(mDisplayState);
1898            }
1899        }
1900    };
1901
1902    private boolean shouldUseProximitySensorLocked() {
1903        return (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0;
1904    }
1905
1906    /**
1907     * Updates the suspend blocker that keeps the CPU alive.
1908     *
1909     * This function must have no other side-effects.
1910     */
1911    private void updateSuspendBlockerLocked() {
1912        final boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0);
1913        final boolean needDisplaySuspendBlocker = needDisplaySuspendBlockerLocked();
1914        final boolean autoSuspend = !needDisplaySuspendBlocker;
1915
1916        // Disable auto-suspend if needed.
1917        if (!autoSuspend) {
1918            if (mDecoupleHalAutoSuspendModeFromDisplayConfig) {
1919                setHalAutoSuspendModeLocked(false);
1920            }
1921            if (mDecoupleHalInteractiveModeFromDisplayConfig) {
1922                setHalInteractiveModeLocked(true);
1923            }
1924        }
1925
1926        // First acquire suspend blockers if needed.
1927        if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) {
1928            mWakeLockSuspendBlocker.acquire();
1929            mHoldingWakeLockSuspendBlocker = true;
1930        }
1931        if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) {
1932            mDisplaySuspendBlocker.acquire();
1933            mHoldingDisplaySuspendBlocker = true;
1934        }
1935
1936        // Then release suspend blockers if needed.
1937        if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) {
1938            mWakeLockSuspendBlocker.release();
1939            mHoldingWakeLockSuspendBlocker = false;
1940        }
1941        if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) {
1942            mDisplaySuspendBlocker.release();
1943            mHoldingDisplaySuspendBlocker = false;
1944        }
1945
1946        // Enable auto-suspend if needed.
1947        if (autoSuspend) {
1948            if (mDecoupleHalInteractiveModeFromDisplayConfig) {
1949                setHalInteractiveModeLocked(false);
1950            }
1951            if (mDecoupleHalAutoSuspendModeFromDisplayConfig) {
1952                setHalAutoSuspendModeLocked(true);
1953            }
1954        }
1955    }
1956
1957    /**
1958     * Return true if we must keep a suspend blocker active on behalf of the display.
1959     * We do so if the screen is on or is in transition between states.
1960     */
1961    private boolean needDisplaySuspendBlockerLocked() {
1962        if (!mDisplayReady) {
1963            return true;
1964        }
1965        if (mDisplayPowerRequest.isBrightOrDim()) {
1966            // If we asked for the screen to be on but it is off due to the proximity
1967            // sensor then we may suspend but only if the configuration allows it.
1968            // On some hardware it may not be safe to suspend because the proximity
1969            // sensor may not be correctly configured as a wake-up source.
1970            if (!mDisplayPowerRequest.useProximitySensor || !mProximityPositive
1971                    || !mSuspendWhenScreenOffDueToProximityConfig) {
1972                return true;
1973            }
1974        }
1975        // Let the system suspend if the screen is off or dozing.
1976        return false;
1977    }
1978
1979    private void setHalAutoSuspendModeLocked(boolean enable) {
1980        if (enable != mHalAutoSuspendModeEnabled) {
1981            if (DEBUG) {
1982                Slog.d(TAG, "Setting HAL auto-suspend mode to " + enable);
1983            }
1984            mHalAutoSuspendModeEnabled = enable;
1985            nativeSetAutoSuspend(enable);
1986        }
1987    }
1988
1989    private void setHalInteractiveModeLocked(boolean enable) {
1990        if (enable != mHalInteractiveModeEnabled) {
1991            if (DEBUG) {
1992                Slog.d(TAG, "Setting HAL interactive mode to " + enable);
1993            }
1994            mHalInteractiveModeEnabled = enable;
1995            nativeSetInteractive(enable);
1996        }
1997    }
1998
1999    private boolean isInteractiveInternal() {
2000        synchronized (mLock) {
2001            return mInteractive;
2002        }
2003    }
2004
2005    private boolean isLowPowerModeInternal() {
2006        synchronized (mLock) {
2007            return mLowPowerModeEnabled;
2008        }
2009    }
2010
2011    private void handleBatteryStateChangedLocked() {
2012        mDirty |= DIRTY_BATTERY_STATE;
2013        updatePowerStateLocked();
2014    }
2015
2016    private void startWatchingForBootAnimationFinished() {
2017        mHandler.sendEmptyMessage(MSG_CHECK_IF_BOOT_ANIMATION_FINISHED);
2018    }
2019
2020    private void checkIfBootAnimationFinished() {
2021        if (DEBUG) {
2022            Slog.d(TAG, "Check if boot animation finished...");
2023        }
2024
2025        if (SystemService.isRunning(BOOT_ANIMATION_SERVICE)) {
2026            mHandler.sendEmptyMessageDelayed(MSG_CHECK_IF_BOOT_ANIMATION_FINISHED,
2027                    BOOT_ANIMATION_POLL_INTERVAL);
2028            return;
2029        }
2030
2031        synchronized (mLock) {
2032            if (!mBootCompleted) {
2033                Slog.i(TAG, "Boot animation finished.");
2034                handleBootCompletedLocked();
2035            }
2036        }
2037    }
2038
2039    private void handleBootCompletedLocked() {
2040        final long now = SystemClock.uptimeMillis();
2041        mBootCompleted = true;
2042        mDirty |= DIRTY_BOOT_COMPLETED;
2043        userActivityNoUpdateLocked(
2044                now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
2045        updatePowerStateLocked();
2046    }
2047
2048    private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,
2049            final String reason, boolean wait) {
2050        if (mHandler == null || !mSystemReady) {
2051            throw new IllegalStateException("Too early to call shutdown() or reboot()");
2052        }
2053
2054        Runnable runnable = new Runnable() {
2055            @Override
2056            public void run() {
2057                synchronized (this) {
2058                    if (shutdown) {
2059                        ShutdownThread.shutdown(mContext, confirm);
2060                    } else {
2061                        ShutdownThread.reboot(mContext, reason, confirm);
2062                    }
2063                }
2064            }
2065        };
2066
2067        // ShutdownThread must run on a looper capable of displaying the UI.
2068        Message msg = Message.obtain(mHandler, runnable);
2069        msg.setAsynchronous(true);
2070        mHandler.sendMessage(msg);
2071
2072        // PowerManager.reboot() is documented not to return so just wait for the inevitable.
2073        if (wait) {
2074            synchronized (runnable) {
2075                while (true) {
2076                    try {
2077                        runnable.wait();
2078                    } catch (InterruptedException e) {
2079                    }
2080                }
2081            }
2082        }
2083    }
2084
2085    private void crashInternal(final String message) {
2086        Thread t = new Thread("PowerManagerService.crash()") {
2087            @Override
2088            public void run() {
2089                throw new RuntimeException(message);
2090            }
2091        };
2092        try {
2093            t.start();
2094            t.join();
2095        } catch (InterruptedException e) {
2096            Log.wtf(TAG, e);
2097        }
2098    }
2099
2100    private void setStayOnSettingInternal(int val) {
2101        Settings.Global.putInt(mContext.getContentResolver(),
2102                Settings.Global.STAY_ON_WHILE_PLUGGED_IN, val);
2103    }
2104
2105    private void setMaximumScreenOffTimeoutFromDeviceAdminInternal(int timeMs) {
2106        synchronized (mLock) {
2107            mMaximumScreenOffTimeoutFromDeviceAdmin = timeMs;
2108            mDirty |= DIRTY_SETTINGS;
2109            updatePowerStateLocked();
2110        }
2111    }
2112
2113    private boolean isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() {
2114        return mMaximumScreenOffTimeoutFromDeviceAdmin >= 0
2115                && mMaximumScreenOffTimeoutFromDeviceAdmin < Integer.MAX_VALUE;
2116    }
2117
2118    private void setAttentionLightInternal(boolean on, int color) {
2119        Light light;
2120        synchronized (mLock) {
2121            if (!mSystemReady) {
2122                return;
2123            }
2124            light = mAttentionLight;
2125        }
2126
2127        // Control light outside of lock.
2128        light.setFlashing(color, Light.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0);
2129    }
2130
2131    private void setScreenBrightnessOverrideFromWindowManagerInternal(int brightness) {
2132        synchronized (mLock) {
2133            if (mScreenBrightnessOverrideFromWindowManager != brightness) {
2134                mScreenBrightnessOverrideFromWindowManager = brightness;
2135                mDirty |= DIRTY_SETTINGS;
2136                updatePowerStateLocked();
2137            }
2138        }
2139    }
2140
2141    private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) {
2142        synchronized (mLock) {
2143            if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) {
2144                mUserActivityTimeoutOverrideFromWindowManager = timeoutMillis;
2145                mDirty |= DIRTY_SETTINGS;
2146                updatePowerStateLocked();
2147            }
2148        }
2149    }
2150
2151    private void setTemporaryScreenBrightnessSettingOverrideInternal(int brightness) {
2152        synchronized (mLock) {
2153            if (mTemporaryScreenBrightnessSettingOverride != brightness) {
2154                mTemporaryScreenBrightnessSettingOverride = brightness;
2155                mDirty |= DIRTY_SETTINGS;
2156                updatePowerStateLocked();
2157            }
2158        }
2159    }
2160
2161    private void setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(float adj) {
2162        synchronized (mLock) {
2163            // Note: This condition handles NaN because NaN is not equal to any other
2164            // value, including itself.
2165            if (mTemporaryScreenAutoBrightnessAdjustmentSettingOverride != adj) {
2166                mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = adj;
2167                mDirty |= DIRTY_SETTINGS;
2168                updatePowerStateLocked();
2169            }
2170        }
2171    }
2172
2173    private void setDozeOverrideFromDreamManagerInternal(
2174            int screenState, int screenBrightness) {
2175        synchronized (mLock) {
2176            if (mDozeScreenStateOverrideFromDreamManager != screenState
2177                    || mDozeScreenBrightnessOverrideFromDreamManager != screenBrightness) {
2178                mDozeScreenStateOverrideFromDreamManager = screenState;
2179                mDozeScreenBrightnessOverrideFromDreamManager = screenBrightness;
2180                mDirty |= DIRTY_SETTINGS;
2181                updatePowerStateLocked();
2182            }
2183        }
2184    }
2185
2186    private void powerHintInternal(int hintId, int data) {
2187        nativeSendPowerHint(hintId, data);
2188    }
2189
2190    private static void setSurfaceFlingerLowPowerMode(int enabled) {
2191        try {
2192            final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
2193            if (flinger != null) {
2194                final Parcel data = Parcel.obtain();
2195                data.writeInterfaceToken("android.ui.ISurfaceComposer");
2196                data.writeInt(enabled);
2197                flinger.transact(1016, data, null, 0);
2198                data.recycle();
2199            }
2200        } catch (RemoteException ex) {
2201            Slog.e(TAG, "Failed to reduce refresh rate", ex);
2202        }
2203    }
2204
2205    /**
2206     * Low-level function turn the device off immediately, without trying
2207     * to be clean.  Most people should use {@link ShutdownThread} for a clean shutdown.
2208     */
2209    public static void lowLevelShutdown() {
2210        SystemProperties.set("sys.powerctl", "shutdown");
2211    }
2212
2213    /**
2214     * Low-level function to reboot the device. On success, this
2215     * function doesn't return. If more than 20 seconds passes from
2216     * the time a reboot is requested (120 seconds for reboot to
2217     * recovery), this method returns.
2218     *
2219     * @param reason code to pass to the kernel (e.g. "recovery"), or null.
2220     */
2221    public static void lowLevelReboot(String reason) {
2222        if (reason == null) {
2223            reason = "";
2224        }
2225        long duration;
2226        if (reason.equals(PowerManager.REBOOT_RECOVERY)) {
2227            // If we are rebooting to go into recovery, instead of
2228            // setting sys.powerctl directly we'll start the
2229            // pre-recovery service which will do some preparation for
2230            // recovery and then reboot for us.
2231            //
2232            // This preparation can take more than 20 seconds if
2233            // there's a very large update package, so lengthen the
2234            // timeout.
2235            SystemProperties.set("ctl.start", "pre-recovery");
2236            duration = 120 * 1000L;
2237        } else {
2238            SystemProperties.set("sys.powerctl", "reboot," + reason);
2239            duration = 20 * 1000L;
2240        }
2241        try {
2242            Thread.sleep(duration);
2243        } catch (InterruptedException e) {
2244            Thread.currentThread().interrupt();
2245        }
2246    }
2247
2248    @Override // Watchdog.Monitor implementation
2249    public void monitor() {
2250        // Grab and release lock for watchdog monitor to detect deadlocks.
2251        synchronized (mLock) {
2252        }
2253    }
2254
2255    private void dumpInternal(PrintWriter pw) {
2256        pw.println("POWER MANAGER (dumpsys power)\n");
2257
2258        final WirelessChargerDetector wcd;
2259        synchronized (mLock) {
2260            pw.println("Power Manager State:");
2261            pw.println("  mDirty=0x" + Integer.toHexString(mDirty));
2262            pw.println("  mWakefulness=" + wakefulnessToString(mWakefulness));
2263            pw.println("  mInteractive=" + mInteractive);
2264            pw.println("  mIsPowered=" + mIsPowered);
2265            pw.println("  mPlugType=" + mPlugType);
2266            pw.println("  mBatteryLevel=" + mBatteryLevel);
2267            pw.println("  mBatteryLevelWhenDreamStarted=" + mBatteryLevelWhenDreamStarted);
2268            pw.println("  mDockState=" + mDockState);
2269            pw.println("  mStayOn=" + mStayOn);
2270            pw.println("  mProximityPositive=" + mProximityPositive);
2271            pw.println("  mBootCompleted=" + mBootCompleted);
2272            pw.println("  mSystemReady=" + mSystemReady);
2273            pw.println("  mHalAutoSuspendModeEnabled=" + mHalAutoSuspendModeEnabled);
2274            pw.println("  mHalInteractiveModeEnabled=" + mHalInteractiveModeEnabled);
2275            pw.println("  mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary));
2276            pw.println("  mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary));
2277            pw.println("  mRequestWaitForNegativeProximity=" + mRequestWaitForNegativeProximity);
2278            pw.println("  mSandmanScheduled=" + mSandmanScheduled);
2279            pw.println("  mSandmanSummoned=" + mSandmanSummoned);
2280            pw.println("  mLowPowerModeEnabled=" + mLowPowerModeEnabled);
2281            pw.println("  mBatteryLevelLow=" + mBatteryLevelLow);
2282            pw.println("  mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime));
2283            pw.println("  mLastSleepTime=" + TimeUtils.formatUptime(mLastSleepTime));
2284            pw.println("  mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime));
2285            pw.println("  mLastUserActivityTimeNoChangeLights="
2286                    + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights));
2287            pw.println("  mDisplayReady=" + mDisplayReady);
2288            pw.println("  mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker);
2289            pw.println("  mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker);
2290
2291            pw.println();
2292            pw.println("Settings and Configuration:");
2293            pw.println("  mDecoupleHalAutoSuspendModeFromDisplayConfig="
2294                    + mDecoupleHalAutoSuspendModeFromDisplayConfig);
2295            pw.println("  mDecoupleHalInteractiveModeFromDisplayConfig="
2296                    + mDecoupleHalInteractiveModeFromDisplayConfig);
2297            pw.println("  mWakeUpWhenPluggedOrUnpluggedConfig="
2298                    + mWakeUpWhenPluggedOrUnpluggedConfig);
2299            pw.println("  mSuspendWhenScreenOffDueToProximityConfig="
2300                    + mSuspendWhenScreenOffDueToProximityConfig);
2301            pw.println("  mDreamsSupportedConfig=" + mDreamsSupportedConfig);
2302            pw.println("  mDreamsEnabledByDefaultConfig=" + mDreamsEnabledByDefaultConfig);
2303            pw.println("  mDreamsActivatedOnSleepByDefaultConfig="
2304                    + mDreamsActivatedOnSleepByDefaultConfig);
2305            pw.println("  mDreamsActivatedOnDockByDefaultConfig="
2306                    + mDreamsActivatedOnDockByDefaultConfig);
2307            pw.println("  mDreamsEnabledOnBatteryConfig="
2308                    + mDreamsEnabledOnBatteryConfig);
2309            pw.println("  mDreamsBatteryLevelMinimumWhenPoweredConfig="
2310                    + mDreamsBatteryLevelMinimumWhenPoweredConfig);
2311            pw.println("  mDreamsBatteryLevelMinimumWhenNotPoweredConfig="
2312                    + mDreamsBatteryLevelMinimumWhenNotPoweredConfig);
2313            pw.println("  mDreamsBatteryLevelDrainCutoffConfig="
2314                    + mDreamsBatteryLevelDrainCutoffConfig);
2315            pw.println("  mDreamsEnabledSetting=" + mDreamsEnabledSetting);
2316            pw.println("  mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting);
2317            pw.println("  mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);
2318            pw.println("  mLowPowerModeSetting=" + mLowPowerModeSetting);
2319            pw.println("  mAutoLowPowerModeEnabled=" + mAutoLowPowerModeEnabled);
2320            pw.println("  mAutoLowPowerModeSnoozing=" + mAutoLowPowerModeSnoozing);
2321            pw.println("  mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig);
2322            pw.println("  mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig);
2323            pw.println("  mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig);
2324            pw.println("  mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting);
2325            pw.println("  mMaximumScreenOffTimeoutFromDeviceAdmin="
2326                    + mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="
2327                    + isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
2328            pw.println("  mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting);
2329            pw.println("  mScreenBrightnessSetting=" + mScreenBrightnessSetting);
2330            pw.println("  mScreenAutoBrightnessAdjustmentSetting="
2331                    + mScreenAutoBrightnessAdjustmentSetting);
2332            pw.println("  mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting);
2333            pw.println("  mScreenBrightnessOverrideFromWindowManager="
2334                    + mScreenBrightnessOverrideFromWindowManager);
2335            pw.println("  mUserActivityTimeoutOverrideFromWindowManager="
2336                    + mUserActivityTimeoutOverrideFromWindowManager);
2337            pw.println("  mTemporaryScreenBrightnessSettingOverride="
2338                    + mTemporaryScreenBrightnessSettingOverride);
2339            pw.println("  mTemporaryScreenAutoBrightnessAdjustmentSettingOverride="
2340                    + mTemporaryScreenAutoBrightnessAdjustmentSettingOverride);
2341            pw.println("  mDozeScreenStateOverrideFromDreamManager="
2342                    + mDozeScreenStateOverrideFromDreamManager);
2343            pw.println("  mDozeScreenBrightnessOverrideFromDreamManager="
2344                    + mDozeScreenBrightnessOverrideFromDreamManager);
2345            pw.println("  mScreenBrightnessSettingMinimum=" + mScreenBrightnessSettingMinimum);
2346            pw.println("  mScreenBrightnessSettingMaximum=" + mScreenBrightnessSettingMaximum);
2347            pw.println("  mScreenBrightnessSettingDefault=" + mScreenBrightnessSettingDefault);
2348
2349            final int screenOffTimeout = getScreenOffTimeoutLocked();
2350            final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
2351            pw.println();
2352            pw.println("Screen off timeout: " + screenOffTimeout + " ms");
2353            pw.println("Screen dim duration: " + screenDimDuration + " ms");
2354
2355            pw.println();
2356            pw.println("Wake Locks: size=" + mWakeLocks.size());
2357            for (WakeLock wl : mWakeLocks) {
2358                pw.println("  " + wl);
2359            }
2360
2361            pw.println();
2362            pw.println("Suspend Blockers: size=" + mSuspendBlockers.size());
2363            for (SuspendBlocker sb : mSuspendBlockers) {
2364                pw.println("  " + sb);
2365            }
2366
2367            pw.println();
2368            pw.println("Screen On Blocker: " + mScreenOnBlocker);
2369
2370            pw.println();
2371            pw.println("Display Power: " + mDisplayPowerCallbacks);
2372
2373            wcd = mWirelessChargerDetector;
2374        }
2375
2376        if (wcd != null) {
2377            wcd.dump(pw);
2378        }
2379    }
2380
2381    private SuspendBlocker createSuspendBlockerLocked(String name) {
2382        SuspendBlocker suspendBlocker = new SuspendBlockerImpl(name);
2383        mSuspendBlockers.add(suspendBlocker);
2384        return suspendBlocker;
2385    }
2386
2387    private static String wakefulnessToString(int wakefulness) {
2388        switch (wakefulness) {
2389            case WAKEFULNESS_ASLEEP:
2390                return "Asleep";
2391            case WAKEFULNESS_AWAKE:
2392                return "Awake";
2393            case WAKEFULNESS_DREAMING:
2394                return "Dreaming";
2395            case WAKEFULNESS_DOZING:
2396                return "Dozing";
2397            default:
2398                return Integer.toString(wakefulness);
2399        }
2400    }
2401
2402    private static WorkSource copyWorkSource(WorkSource workSource) {
2403        return workSource != null ? new WorkSource(workSource) : null;
2404    }
2405
2406    private final class BatteryReceiver extends BroadcastReceiver {
2407        @Override
2408        public void onReceive(Context context, Intent intent) {
2409            synchronized (mLock) {
2410                handleBatteryStateChangedLocked();
2411            }
2412        }
2413    }
2414
2415    private final class DreamReceiver extends BroadcastReceiver {
2416        @Override
2417        public void onReceive(Context context, Intent intent) {
2418            synchronized (mLock) {
2419                scheduleSandmanLocked();
2420            }
2421        }
2422    }
2423
2424    private final class UserSwitchedReceiver extends BroadcastReceiver {
2425        @Override
2426        public void onReceive(Context context, Intent intent) {
2427            synchronized (mLock) {
2428                handleSettingsChangedLocked();
2429            }
2430        }
2431    }
2432
2433    private final class DockReceiver extends BroadcastReceiver {
2434        @Override
2435        public void onReceive(Context context, Intent intent) {
2436            synchronized (mLock) {
2437                int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE,
2438                        Intent.EXTRA_DOCK_STATE_UNDOCKED);
2439                if (mDockState != dockState) {
2440                    mDockState = dockState;
2441                    mDirty |= DIRTY_DOCK_STATE;
2442                    updatePowerStateLocked();
2443                }
2444            }
2445        }
2446    }
2447
2448    private final class SettingsObserver extends ContentObserver {
2449        public SettingsObserver(Handler handler) {
2450            super(handler);
2451        }
2452
2453        @Override
2454        public void onChange(boolean selfChange, Uri uri) {
2455            synchronized (mLock) {
2456                handleSettingsChangedLocked();
2457            }
2458        }
2459    }
2460
2461    /**
2462     * Handler for asynchronous operations performed by the power manager.
2463     */
2464    private final class PowerManagerHandler extends Handler {
2465        public PowerManagerHandler(Looper looper) {
2466            super(looper, null, true /*async*/);
2467        }
2468
2469        @Override
2470        public void handleMessage(Message msg) {
2471            switch (msg.what) {
2472                case MSG_USER_ACTIVITY_TIMEOUT:
2473                    handleUserActivityTimeout();
2474                    break;
2475                case MSG_SANDMAN:
2476                    handleSandman();
2477                    break;
2478                case MSG_SCREEN_ON_BLOCKER_RELEASED:
2479                    handleScreenOnBlockerReleased();
2480                    break;
2481                case MSG_CHECK_IF_BOOT_ANIMATION_FINISHED:
2482                    checkIfBootAnimationFinished();
2483                    break;
2484            }
2485        }
2486    }
2487
2488    /**
2489     * Represents a wake lock that has been acquired by an application.
2490     */
2491    private final class WakeLock implements IBinder.DeathRecipient {
2492        public final IBinder mLock;
2493        public int mFlags;
2494        public String mTag;
2495        public final String mPackageName;
2496        public WorkSource mWorkSource;
2497        public String mHistoryTag;
2498        public final int mOwnerUid;
2499        public final int mOwnerPid;
2500        public boolean mNotifiedAcquired;
2501
2502        public WakeLock(IBinder lock, int flags, String tag, String packageName,
2503                WorkSource workSource, String historyTag, int ownerUid, int ownerPid) {
2504            mLock = lock;
2505            mFlags = flags;
2506            mTag = tag;
2507            mPackageName = packageName;
2508            mWorkSource = copyWorkSource(workSource);
2509            mHistoryTag = historyTag;
2510            mOwnerUid = ownerUid;
2511            mOwnerPid = ownerPid;
2512        }
2513
2514        @Override
2515        public void binderDied() {
2516            PowerManagerService.this.handleWakeLockDeath(this);
2517        }
2518
2519        public boolean hasSameProperties(int flags, String tag, WorkSource workSource,
2520                int ownerUid, int ownerPid) {
2521            return mFlags == flags
2522                    && mTag.equals(tag)
2523                    && hasSameWorkSource(workSource)
2524                    && mOwnerUid == ownerUid
2525                    && mOwnerPid == ownerPid;
2526        }
2527
2528        public void updateProperties(int flags, String tag, String packageName,
2529                WorkSource workSource, String historyTag, int ownerUid, int ownerPid) {
2530            if (!mPackageName.equals(packageName)) {
2531                throw new IllegalStateException("Existing wake lock package name changed: "
2532                        + mPackageName + " to " + packageName);
2533            }
2534            if (mOwnerUid != ownerUid) {
2535                throw new IllegalStateException("Existing wake lock uid changed: "
2536                        + mOwnerUid + " to " + ownerUid);
2537            }
2538            if (mOwnerPid != ownerPid) {
2539                throw new IllegalStateException("Existing wake lock pid changed: "
2540                        + mOwnerPid + " to " + ownerPid);
2541            }
2542            mFlags = flags;
2543            mTag = tag;
2544            updateWorkSource(workSource);
2545            mHistoryTag = historyTag;
2546        }
2547
2548        public boolean hasSameWorkSource(WorkSource workSource) {
2549            return Objects.equal(mWorkSource, workSource);
2550        }
2551
2552        public void updateWorkSource(WorkSource workSource) {
2553            mWorkSource = copyWorkSource(workSource);
2554        }
2555
2556        @Override
2557        public String toString() {
2558            return getLockLevelString()
2559                    + " '" + mTag + "'" + getLockFlagsString()
2560                    + " (uid=" + mOwnerUid + ", pid=" + mOwnerPid + ", ws=" + mWorkSource + ")";
2561        }
2562
2563        @SuppressWarnings("deprecation")
2564        private String getLockLevelString() {
2565            switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
2566                case PowerManager.FULL_WAKE_LOCK:
2567                    return "FULL_WAKE_LOCK                ";
2568                case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
2569                    return "SCREEN_BRIGHT_WAKE_LOCK       ";
2570                case PowerManager.SCREEN_DIM_WAKE_LOCK:
2571                    return "SCREEN_DIM_WAKE_LOCK          ";
2572                case PowerManager.PARTIAL_WAKE_LOCK:
2573                    return "PARTIAL_WAKE_LOCK             ";
2574                case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
2575                    return "PROXIMITY_SCREEN_OFF_WAKE_LOCK";
2576                case PowerManager.DOZE_WAKE_LOCK:
2577                    return "DOZE_WAKE_LOCK                ";
2578                default:
2579                    return "???                           ";
2580            }
2581        }
2582
2583        private String getLockFlagsString() {
2584            String result = "";
2585            if ((mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) {
2586                result += " ACQUIRE_CAUSES_WAKEUP";
2587            }
2588            if ((mFlags & PowerManager.ON_AFTER_RELEASE) != 0) {
2589                result += " ON_AFTER_RELEASE";
2590            }
2591            return result;
2592        }
2593    }
2594
2595    private final class SuspendBlockerImpl implements SuspendBlocker {
2596        private final String mName;
2597        private int mReferenceCount;
2598
2599        public SuspendBlockerImpl(String name) {
2600            mName = name;
2601        }
2602
2603        @Override
2604        protected void finalize() throws Throwable {
2605            try {
2606                if (mReferenceCount != 0) {
2607                    Log.wtf(TAG, "Suspend blocker \"" + mName
2608                            + "\" was finalized without being released!");
2609                    mReferenceCount = 0;
2610                    nativeReleaseSuspendBlocker(mName);
2611                }
2612            } finally {
2613                super.finalize();
2614            }
2615        }
2616
2617        @Override
2618        public void acquire() {
2619            synchronized (this) {
2620                mReferenceCount += 1;
2621                if (mReferenceCount == 1) {
2622                    if (DEBUG_SPEW) {
2623                        Slog.d(TAG, "Acquiring suspend blocker \"" + mName + "\".");
2624                    }
2625                    nativeAcquireSuspendBlocker(mName);
2626                }
2627            }
2628        }
2629
2630        @Override
2631        public void release() {
2632            synchronized (this) {
2633                mReferenceCount -= 1;
2634                if (mReferenceCount == 0) {
2635                    if (DEBUG_SPEW) {
2636                        Slog.d(TAG, "Releasing suspend blocker \"" + mName + "\".");
2637                    }
2638                    nativeReleaseSuspendBlocker(mName);
2639                } else if (mReferenceCount < 0) {
2640                    Log.wtf(TAG, "Suspend blocker \"" + mName
2641                            + "\" was released without being acquired!", new Throwable());
2642                    mReferenceCount = 0;
2643                }
2644            }
2645        }
2646
2647        @Override
2648        public String toString() {
2649            synchronized (this) {
2650                return mName + ": ref count=" + mReferenceCount;
2651            }
2652        }
2653    }
2654
2655    private final class ScreenOnBlockerImpl implements ScreenOnBlocker {
2656        private int mNestCount;
2657
2658        public boolean isHeld() {
2659            synchronized (this) {
2660                return mNestCount != 0;
2661            }
2662        }
2663
2664        @Override
2665        public void acquire() {
2666            synchronized (this) {
2667                mNestCount += 1;
2668                if (DEBUG) {
2669                    Slog.d(TAG, "Screen on blocked: mNestCount=" + mNestCount);
2670                }
2671            }
2672        }
2673
2674        @Override
2675        public void release() {
2676            synchronized (this) {
2677                mNestCount -= 1;
2678                if (mNestCount < 0) {
2679                    Log.wtf(TAG, "Screen on blocker was released without being acquired!",
2680                            new Throwable());
2681                    mNestCount = 0;
2682                }
2683                if (mNestCount == 0) {
2684                    mHandler.sendEmptyMessage(MSG_SCREEN_ON_BLOCKER_RELEASED);
2685                }
2686                if (DEBUG) {
2687                    Slog.d(TAG, "Screen on unblocked: mNestCount=" + mNestCount);
2688                }
2689            }
2690        }
2691
2692        @Override
2693        public String toString() {
2694            synchronized (this) {
2695                return "held=" + (mNestCount != 0) + ", mNestCount=" + mNestCount;
2696            }
2697        }
2698    }
2699
2700    private final class BinderService extends IPowerManager.Stub {
2701        @Override // Binder call
2702        public void acquireWakeLockWithUid(IBinder lock, int flags, String tag,
2703                String packageName, int uid) {
2704            if (uid < 0) {
2705                uid = Binder.getCallingUid();
2706            }
2707            acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null);
2708        }
2709
2710        @Override // Binder call
2711        public void powerHint(int hintId, int data) {
2712            if (!mSystemReady) {
2713                // Service not ready yet, so who the heck cares about power hints, bah.
2714                return;
2715            }
2716            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
2717            powerHintInternal(hintId, data);
2718        }
2719
2720        @Override // Binder call
2721        public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName,
2722                WorkSource ws, String historyTag) {
2723            if (lock == null) {
2724                throw new IllegalArgumentException("lock must not be null");
2725            }
2726            if (packageName == null) {
2727                throw new IllegalArgumentException("packageName must not be null");
2728            }
2729            PowerManager.validateWakeLockParameters(flags, tag);
2730
2731            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
2732            if (ws != null && ws.size() != 0) {
2733                mContext.enforceCallingOrSelfPermission(
2734                        android.Manifest.permission.UPDATE_DEVICE_STATS, null);
2735            } else {
2736                ws = null;
2737            }
2738
2739            final int uid = Binder.getCallingUid();
2740            final int pid = Binder.getCallingPid();
2741            final long ident = Binder.clearCallingIdentity();
2742            try {
2743                acquireWakeLockInternal(lock, flags, tag, packageName, ws, historyTag, uid, pid);
2744            } finally {
2745                Binder.restoreCallingIdentity(ident);
2746            }
2747        }
2748
2749        @Override // Binder call
2750        public void releaseWakeLock(IBinder lock, int flags) {
2751            if (lock == null) {
2752                throw new IllegalArgumentException("lock must not be null");
2753            }
2754
2755            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
2756
2757            final long ident = Binder.clearCallingIdentity();
2758            try {
2759                releaseWakeLockInternal(lock, flags);
2760            } finally {
2761                Binder.restoreCallingIdentity(ident);
2762            }
2763        }
2764
2765        @Override // Binder call
2766        public void updateWakeLockUids(IBinder lock, int[] uids) {
2767            WorkSource ws = null;
2768
2769            if (uids != null) {
2770                ws = new WorkSource();
2771                // XXX should WorkSource have a way to set uids as an int[] instead of adding them
2772                // one at a time?
2773                for (int i = 0; i < uids.length; i++) {
2774                    ws.add(uids[i]);
2775                }
2776            }
2777            updateWakeLockWorkSource(lock, ws, null);
2778        }
2779
2780        @Override // Binder call
2781        public void updateWakeLockWorkSource(IBinder lock, WorkSource ws, String historyTag) {
2782            if (lock == null) {
2783                throw new IllegalArgumentException("lock must not be null");
2784            }
2785
2786            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
2787            if (ws != null && ws.size() != 0) {
2788                mContext.enforceCallingOrSelfPermission(
2789                        android.Manifest.permission.UPDATE_DEVICE_STATS, null);
2790            } else {
2791                ws = null;
2792            }
2793
2794            final long ident = Binder.clearCallingIdentity();
2795            try {
2796                updateWakeLockWorkSourceInternal(lock, ws, historyTag);
2797            } finally {
2798                Binder.restoreCallingIdentity(ident);
2799            }
2800        }
2801
2802        @Override // Binder call
2803        public boolean isWakeLockLevelSupported(int level) {
2804            final long ident = Binder.clearCallingIdentity();
2805            try {
2806                return isWakeLockLevelSupportedInternal(level);
2807            } finally {
2808                Binder.restoreCallingIdentity(ident);
2809            }
2810        }
2811
2812        @Override // Binder call
2813        public void userActivity(long eventTime, int event, int flags) {
2814            final long now = SystemClock.uptimeMillis();
2815            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER)
2816                    != PackageManager.PERMISSION_GRANTED) {
2817                // Once upon a time applications could call userActivity().
2818                // Now we require the DEVICE_POWER permission.  Log a warning and ignore the
2819                // request instead of throwing a SecurityException so we don't break old apps.
2820                synchronized (mLock) {
2821                    if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) {
2822                        mLastWarningAboutUserActivityPermission = now;
2823                        Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the "
2824                                + "caller does not have DEVICE_POWER permission.  "
2825                                + "Please fix your app!  "
2826                                + " pid=" + Binder.getCallingPid()
2827                                + " uid=" + Binder.getCallingUid());
2828                    }
2829                }
2830                return;
2831            }
2832
2833            if (eventTime > SystemClock.uptimeMillis()) {
2834                throw new IllegalArgumentException("event time must not be in the future");
2835            }
2836
2837            final int uid = Binder.getCallingUid();
2838            final long ident = Binder.clearCallingIdentity();
2839            try {
2840                userActivityInternal(eventTime, event, flags, uid);
2841            } finally {
2842                Binder.restoreCallingIdentity(ident);
2843            }
2844        }
2845
2846        @Override // Binder call
2847        public void wakeUp(long eventTime) {
2848            if (eventTime > SystemClock.uptimeMillis()) {
2849                throw new IllegalArgumentException("event time must not be in the future");
2850            }
2851
2852            mContext.enforceCallingOrSelfPermission(
2853                    android.Manifest.permission.DEVICE_POWER, null);
2854
2855            final long ident = Binder.clearCallingIdentity();
2856            try {
2857                wakeUpInternal(eventTime);
2858            } finally {
2859                Binder.restoreCallingIdentity(ident);
2860            }
2861        }
2862
2863        @Override // Binder call
2864        public void goToSleep(long eventTime, int reason, int flags) {
2865            if (eventTime > SystemClock.uptimeMillis()) {
2866                throw new IllegalArgumentException("event time must not be in the future");
2867            }
2868
2869            mContext.enforceCallingOrSelfPermission(
2870                    android.Manifest.permission.DEVICE_POWER, null);
2871
2872            final long ident = Binder.clearCallingIdentity();
2873            try {
2874                goToSleepInternal(eventTime, reason, flags);
2875            } finally {
2876                Binder.restoreCallingIdentity(ident);
2877            }
2878        }
2879
2880        @Override // Binder call
2881        public void nap(long eventTime) {
2882            if (eventTime > SystemClock.uptimeMillis()) {
2883                throw new IllegalArgumentException("event time must not be in the future");
2884            }
2885
2886            mContext.enforceCallingOrSelfPermission(
2887                    android.Manifest.permission.DEVICE_POWER, null);
2888
2889            final long ident = Binder.clearCallingIdentity();
2890            try {
2891                napInternal(eventTime);
2892            } finally {
2893                Binder.restoreCallingIdentity(ident);
2894            }
2895        }
2896
2897        @Override // Binder call
2898        public boolean isInteractive() {
2899            final long ident = Binder.clearCallingIdentity();
2900            try {
2901                return isInteractiveInternal();
2902            } finally {
2903                Binder.restoreCallingIdentity(ident);
2904            }
2905        }
2906
2907        @Override // Binder call
2908        public boolean isPowerSaveMode() {
2909            final long ident = Binder.clearCallingIdentity();
2910            try {
2911                return isLowPowerModeInternal();
2912            } finally {
2913                Binder.restoreCallingIdentity(ident);
2914            }
2915        }
2916
2917        /**
2918         * Reboots the device.
2919         *
2920         * @param confirm If true, shows a reboot confirmation dialog.
2921         * @param reason The reason for the reboot, or null if none.
2922         * @param wait If true, this call waits for the reboot to complete and does not return.
2923         */
2924        @Override // Binder call
2925        public void reboot(boolean confirm, String reason, boolean wait) {
2926            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
2927            if (PowerManager.REBOOT_RECOVERY.equals(reason)) {
2928                mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
2929            }
2930
2931            final long ident = Binder.clearCallingIdentity();
2932            try {
2933                shutdownOrRebootInternal(false, confirm, reason, wait);
2934            } finally {
2935                Binder.restoreCallingIdentity(ident);
2936            }
2937        }
2938
2939        /**
2940         * Shuts down the device.
2941         *
2942         * @param confirm If true, shows a shutdown confirmation dialog.
2943         * @param wait If true, this call waits for the shutdown to complete and does not return.
2944         */
2945        @Override // Binder call
2946        public void shutdown(boolean confirm, boolean wait) {
2947            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
2948
2949            final long ident = Binder.clearCallingIdentity();
2950            try {
2951                shutdownOrRebootInternal(true, confirm, null, wait);
2952            } finally {
2953                Binder.restoreCallingIdentity(ident);
2954            }
2955        }
2956
2957        /**
2958         * Crash the runtime (causing a complete restart of the Android framework).
2959         * Requires REBOOT permission.  Mostly for testing.  Should not return.
2960         */
2961        @Override // Binder call
2962        public void crash(String message) {
2963            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
2964
2965            final long ident = Binder.clearCallingIdentity();
2966            try {
2967                crashInternal(message);
2968            } finally {
2969                Binder.restoreCallingIdentity(ident);
2970            }
2971        }
2972
2973        /**
2974         * Set the setting that determines whether the device stays on when plugged in.
2975         * The argument is a bit string, with each bit specifying a power source that,
2976         * when the device is connected to that source, causes the device to stay on.
2977         * See {@link android.os.BatteryManager} for the list of power sources that
2978         * can be specified. Current values include
2979         * {@link android.os.BatteryManager#BATTERY_PLUGGED_AC}
2980         * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB}
2981         *
2982         * Used by "adb shell svc power stayon ..."
2983         *
2984         * @param val an {@code int} containing the bits that specify which power sources
2985         * should cause the device to stay on.
2986         */
2987        @Override // Binder call
2988        public void setStayOnSetting(int val) {
2989            mContext.enforceCallingOrSelfPermission(
2990                    android.Manifest.permission.WRITE_SETTINGS, null);
2991
2992            final long ident = Binder.clearCallingIdentity();
2993            try {
2994                setStayOnSettingInternal(val);
2995            } finally {
2996                Binder.restoreCallingIdentity(ident);
2997            }
2998        }
2999
3000        /**
3001         * Used by device administration to set the maximum screen off timeout.
3002         *
3003         * This method must only be called by the device administration policy manager.
3004         */
3005        @Override // Binder call
3006        public void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs) {
3007            final long ident = Binder.clearCallingIdentity();
3008            try {
3009                setMaximumScreenOffTimeoutFromDeviceAdminInternal(timeMs);
3010            } finally {
3011                Binder.restoreCallingIdentity(ident);
3012            }
3013        }
3014
3015        /**
3016         * Used by the settings application and brightness control widgets to
3017         * temporarily override the current screen brightness setting so that the
3018         * user can observe the effect of an intended settings change without applying
3019         * it immediately.
3020         *
3021         * The override will be canceled when the setting value is next updated.
3022         *
3023         * @param brightness The overridden brightness.
3024         *
3025         * @see android.provider.Settings.System#SCREEN_BRIGHTNESS
3026         */
3027        @Override // Binder call
3028        public void setTemporaryScreenBrightnessSettingOverride(int brightness) {
3029            mContext.enforceCallingOrSelfPermission(
3030                    android.Manifest.permission.DEVICE_POWER, null);
3031
3032            final long ident = Binder.clearCallingIdentity();
3033            try {
3034                setTemporaryScreenBrightnessSettingOverrideInternal(brightness);
3035            } finally {
3036                Binder.restoreCallingIdentity(ident);
3037            }
3038        }
3039
3040        /**
3041         * Used by the settings application and brightness control widgets to
3042         * temporarily override the current screen auto-brightness adjustment setting so that the
3043         * user can observe the effect of an intended settings change without applying
3044         * it immediately.
3045         *
3046         * The override will be canceled when the setting value is next updated.
3047         *
3048         * @param adj The overridden brightness, or Float.NaN to disable the override.
3049         *
3050         * @see android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ
3051         */
3052        @Override // Binder call
3053        public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj) {
3054            mContext.enforceCallingOrSelfPermission(
3055                    android.Manifest.permission.DEVICE_POWER, null);
3056
3057            final long ident = Binder.clearCallingIdentity();
3058            try {
3059                setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(adj);
3060            } finally {
3061                Binder.restoreCallingIdentity(ident);
3062            }
3063        }
3064
3065        /**
3066         * Used by the phone application to make the attention LED flash when ringing.
3067         */
3068        @Override // Binder call
3069        public void setAttentionLight(boolean on, int color) {
3070            mContext.enforceCallingOrSelfPermission(
3071                    android.Manifest.permission.DEVICE_POWER, null);
3072
3073            final long ident = Binder.clearCallingIdentity();
3074            try {
3075                setAttentionLightInternal(on, color);
3076            } finally {
3077                Binder.restoreCallingIdentity(ident);
3078            }
3079        }
3080
3081        @Override // Binder call
3082        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
3083            if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP)
3084                    != PackageManager.PERMISSION_GRANTED) {
3085                pw.println("Permission Denial: can't dump PowerManager from from pid="
3086                        + Binder.getCallingPid()
3087                        + ", uid=" + Binder.getCallingUid());
3088                return;
3089            }
3090
3091            final long ident = Binder.clearCallingIdentity();
3092            try {
3093                dumpInternal(pw);
3094            } finally {
3095                Binder.restoreCallingIdentity(ident);
3096            }
3097        }
3098    }
3099
3100    private final class LocalService extends PowerManagerInternal {
3101        @Override
3102        public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {
3103            if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT
3104                    || screenBrightness > PowerManager.BRIGHTNESS_ON) {
3105                screenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
3106            }
3107            setScreenBrightnessOverrideFromWindowManagerInternal(screenBrightness);
3108        }
3109
3110        @Override
3111        public void setButtonBrightnessOverrideFromWindowManager(int screenBrightness) {
3112            // Do nothing.
3113            // Button lights are not currently supported in the new implementation.
3114        }
3115
3116        @Override
3117        public void setDozeOverrideFromDreamManager(int screenState, int screenBrightness) {
3118            switch (screenState) {
3119                case Display.STATE_UNKNOWN:
3120                case Display.STATE_OFF:
3121                case Display.STATE_DOZE:
3122                case Display.STATE_DOZE_SUSPEND:
3123                case Display.STATE_ON:
3124                    break;
3125                default:
3126                    screenState = Display.STATE_UNKNOWN;
3127                    break;
3128            }
3129            if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT
3130                    || screenBrightness > PowerManager.BRIGHTNESS_ON) {
3131                screenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
3132            }
3133            setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness);
3134        }
3135
3136        @Override
3137        public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) {
3138            setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis);
3139        }
3140
3141        @Override
3142        public boolean getLowPowerModeEnabled() {
3143            synchronized (mLock) {
3144                return mLowPowerModeEnabled;
3145            }
3146        }
3147
3148        @Override
3149        public void registerLowPowerModeObserver(LowPowerModeListener listener) {
3150            synchronized (mLock) {
3151                mLowPowerModeListeners.add(listener);
3152            }
3153        }
3154    }
3155}
3156