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