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