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