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