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