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 static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL; 20 import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT; 21 import static android.os.PowerManagerInternal.MODE_DEVICE_IDLE; 22 import static android.os.PowerManagerInternal.MODE_DISPLAY_INACTIVE; 23 import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; 24 import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; 25 import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; 26 import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; 27 28 import android.annotation.IntDef; 29 import android.annotation.NonNull; 30 import android.annotation.Nullable; 31 import android.annotation.UserIdInt; 32 import android.app.ActivityManager; 33 import android.app.SynchronousUserSwitchObserver; 34 import android.content.BroadcastReceiver; 35 import android.content.ContentResolver; 36 import android.content.Context; 37 import android.content.Intent; 38 import android.content.IntentFilter; 39 import android.content.pm.PackageManager; 40 import android.content.res.Resources; 41 import android.database.ContentObserver; 42 import android.hardware.SensorManager; 43 import android.hardware.SystemSensorManager; 44 import android.hardware.display.AmbientDisplayConfiguration; 45 import android.hardware.display.DisplayManagerInternal; 46 import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; 47 import android.hardware.power.V1_0.PowerHint; 48 import android.net.Uri; 49 import android.os.BatteryManager; 50 import android.os.BatteryManagerInternal; 51 import android.os.BatterySaverPolicyConfig; 52 import android.os.Binder; 53 import android.os.Handler; 54 import android.os.IBinder; 55 import android.os.IPowerManager; 56 import android.os.Looper; 57 import android.os.Message; 58 import android.os.PowerManager; 59 import android.os.PowerManager.ServiceType; 60 import android.os.PowerManager.WakeData; 61 import android.os.PowerManager.WakeReason; 62 import android.os.PowerManagerInternal; 63 import android.os.PowerSaveState; 64 import android.os.Process; 65 import android.os.RemoteException; 66 import android.os.ResultReceiver; 67 import android.os.ShellCallback; 68 import android.os.SystemClock; 69 import android.os.SystemProperties; 70 import android.os.Trace; 71 import android.os.UserHandle; 72 import android.os.UserManager; 73 import android.os.WorkSource; 74 import android.os.WorkSource.WorkChain; 75 import android.provider.Settings; 76 import android.provider.Settings.SettingNotFoundException; 77 import android.service.dreams.DreamManagerInternal; 78 import android.service.vr.IVrManager; 79 import android.service.vr.IVrStateCallbacks; 80 import android.sysprop.InitProperties; 81 import android.util.KeyValueListParser; 82 import android.util.PrintWriterPrinter; 83 import android.util.Slog; 84 import android.util.SparseArray; 85 import android.util.TimeUtils; 86 import android.util.proto.ProtoOutputStream; 87 import android.view.Display; 88 import android.view.KeyEvent; 89 90 import com.android.internal.BrightnessSynchronizer; 91 import com.android.internal.annotations.VisibleForTesting; 92 import com.android.internal.app.IAppOpsService; 93 import com.android.internal.app.IBatteryStats; 94 import com.android.internal.os.BackgroundThread; 95 import com.android.internal.util.DumpUtils; 96 import com.android.server.EventLogTags; 97 import com.android.server.LockGuard; 98 import com.android.server.RescueParty; 99 import com.android.server.ServiceThread; 100 import com.android.server.SystemService; 101 import com.android.server.UiThread; 102 import com.android.server.UserspaceRebootLogger; 103 import com.android.server.Watchdog; 104 import com.android.server.am.BatteryStatsService; 105 import com.android.server.lights.LightsManager; 106 import com.android.server.lights.LogicalLight; 107 import com.android.server.policy.WindowManagerPolicy; 108 import com.android.server.power.batterysaver.BatterySaverController; 109 import com.android.server.power.batterysaver.BatterySaverPolicy; 110 import com.android.server.power.batterysaver.BatterySaverStateMachine; 111 import com.android.server.power.batterysaver.BatterySavingStats; 112 113 import java.io.FileDescriptor; 114 import java.io.PrintWriter; 115 import java.lang.annotation.Retention; 116 import java.lang.annotation.RetentionPolicy; 117 import java.util.ArrayList; 118 import java.util.Arrays; 119 import java.util.List; 120 import java.util.Objects; 121 122 /** 123 * The power manager service is responsible for coordinating power management 124 * functions on the device. 125 */ 126 public final class PowerManagerService extends SystemService 127 implements Watchdog.Monitor { 128 private static final String TAG = "PowerManagerService"; 129 130 private static final boolean DEBUG = false; 131 private static final boolean DEBUG_SPEW = DEBUG && true; 132 133 // Message: Sent when a user activity timeout occurs to update the power state. 134 private static final int MSG_USER_ACTIVITY_TIMEOUT = 1; 135 // Message: Sent when the device enters or exits a dreaming or dozing state. 136 private static final int MSG_SANDMAN = 2; 137 // Message: Sent when the screen brightness boost expires. 138 private static final int MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 3; 139 // Message: Polling to look for long held wake locks. 140 private static final int MSG_CHECK_FOR_LONG_WAKELOCKS = 4; 141 // Message: Sent when an attentive timeout occurs to update the power state. 142 private static final int MSG_ATTENTIVE_TIMEOUT = 5; 143 144 // Dirty bit: mWakeLocks changed 145 private static final int DIRTY_WAKE_LOCKS = 1 << 0; 146 // Dirty bit: mWakefulness changed 147 private static final int DIRTY_WAKEFULNESS = 1 << 1; 148 // Dirty bit: user activity was poked or may have timed out 149 private static final int DIRTY_USER_ACTIVITY = 1 << 2; 150 // Dirty bit: actual display power state was updated asynchronously 151 private static final int DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED = 1 << 3; 152 // Dirty bit: mBootCompleted changed 153 private static final int DIRTY_BOOT_COMPLETED = 1 << 4; 154 // Dirty bit: settings changed 155 private static final int DIRTY_SETTINGS = 1 << 5; 156 // Dirty bit: mIsPowered changed 157 private static final int DIRTY_IS_POWERED = 1 << 6; 158 // Dirty bit: mStayOn changed 159 private static final int DIRTY_STAY_ON = 1 << 7; 160 // Dirty bit: battery state changed 161 private static final int DIRTY_BATTERY_STATE = 1 << 8; 162 // Dirty bit: proximity state changed 163 private static final int DIRTY_PROXIMITY_POSITIVE = 1 << 9; 164 // Dirty bit: dock state changed 165 private static final int DIRTY_DOCK_STATE = 1 << 10; 166 // Dirty bit: brightness boost changed 167 private static final int DIRTY_SCREEN_BRIGHTNESS_BOOST = 1 << 11; 168 // Dirty bit: sQuiescent changed 169 private static final int DIRTY_QUIESCENT = 1 << 12; 170 // Dirty bit: VR Mode enabled changed 171 private static final int DIRTY_VR_MODE_CHANGED = 1 << 13; 172 // Dirty bit: attentive timer may have timed out 173 private static final int DIRTY_ATTENTIVE = 1 << 14; 174 175 // Summarizes the state of all active wakelocks. 176 private static final int WAKE_LOCK_CPU = 1 << 0; 177 private static final int WAKE_LOCK_SCREEN_BRIGHT = 1 << 1; 178 private static final int WAKE_LOCK_SCREEN_DIM = 1 << 2; 179 private static final int WAKE_LOCK_BUTTON_BRIGHT = 1 << 3; 180 private static final int WAKE_LOCK_PROXIMITY_SCREEN_OFF = 1 << 4; 181 private static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake 182 private static final int WAKE_LOCK_DOZE = 1 << 6; 183 private static final int WAKE_LOCK_DRAW = 1 << 7; 184 185 // Summarizes the user activity state. 186 private static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0; 187 private static final int USER_ACTIVITY_SCREEN_DIM = 1 << 1; 188 private static final int USER_ACTIVITY_SCREEN_DREAM = 1 << 2; 189 190 // Default timeout in milliseconds. This is only used until the settings 191 // provider populates the actual default value (R.integer.def_screen_off_timeout). 192 private static final int DEFAULT_SCREEN_OFF_TIMEOUT = 15 * 1000; 193 private static final int DEFAULT_SLEEP_TIMEOUT = -1; 194 195 // Screen brightness boost timeout. 196 // Hardcoded for now until we decide what the right policy should be. 197 // This should perhaps be a setting. 198 private static final int SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 5 * 1000; 199 200 // Float.NaN cannot be stored in config.xml so -2 is used instead 201 private static final float INVALID_BRIGHTNESS_IN_CONFIG = -2f; 202 203 // How long a partial wake lock must be held until we consider it a long wake lock. 204 static final long MIN_LONG_WAKE_CHECK_INTERVAL = 60*1000; 205 206 // Power features defined in hardware/libhardware/include/hardware/power.h. 207 private static final int POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 1; 208 209 // Default setting for double tap to wake. 210 private static final int DEFAULT_DOUBLE_TAP_TO_WAKE = 0; 211 212 // System property indicating that the screen should remain off until an explicit user action 213 private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent"; 214 215 // System Property indicating that retail demo mode is currently enabled. 216 private static final String SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED = "sys.retaildemo.enabled"; 217 218 // System property for last reboot reason 219 private static final String SYSTEM_PROPERTY_REBOOT_REASON = "sys.boot.reason"; 220 221 // Possible reasons for shutting down or reboot for use in 222 // SYSTEM_PROPERTY_REBOOT_REASON(sys.boot.reason) which is set by bootstat 223 private static final String REASON_SHUTDOWN = "shutdown"; 224 private static final String REASON_REBOOT = "reboot"; 225 private static final String REASON_USERREQUESTED = "shutdown,userrequested"; 226 private static final String REASON_THERMAL_SHUTDOWN = "shutdown,thermal"; 227 private static final String REASON_LOW_BATTERY = "shutdown,battery"; 228 private static final String REASON_BATTERY_THERMAL_STATE = "shutdown,thermal,battery"; 229 230 private static final String TRACE_SCREEN_ON = "Screen turning on"; 231 232 /** If turning screen on takes more than this long, we show a warning on logcat. */ 233 private static final int SCREEN_ON_LATENCY_WARNING_MS = 200; 234 235 /** Constants for {@link #shutdownOrRebootInternal} */ 236 @Retention(RetentionPolicy.SOURCE) 237 @IntDef({HALT_MODE_SHUTDOWN, HALT_MODE_REBOOT, HALT_MODE_REBOOT_SAFE_MODE}) 238 public @interface HaltMode {} 239 private static final int HALT_MODE_SHUTDOWN = 0; 240 private static final int HALT_MODE_REBOOT = 1; 241 private static final int HALT_MODE_REBOOT_SAFE_MODE = 2; 242 243 private final Context mContext; 244 private final ServiceThread mHandlerThread; 245 private final Handler mHandler; 246 private final AmbientDisplayConfiguration mAmbientDisplayConfiguration; 247 private final BatterySaverController mBatterySaverController; 248 private final BatterySaverPolicy mBatterySaverPolicy; 249 private final BatterySaverStateMachine mBatterySaverStateMachine; 250 private final BatterySavingStats mBatterySavingStats; 251 private final AttentionDetector mAttentionDetector; 252 private final BinderService mBinderService; 253 private final LocalService mLocalService; 254 private final NativeWrapper mNativeWrapper; 255 private final SystemPropertiesWrapper mSystemProperties; 256 private final Clock mClock; 257 private final Injector mInjector; 258 259 private LightsManager mLightsManager; 260 private BatteryManagerInternal mBatteryManagerInternal; 261 private DisplayManagerInternal mDisplayManagerInternal; 262 private IBatteryStats mBatteryStats; 263 private IAppOpsService mAppOps; 264 private WindowManagerPolicy mPolicy; 265 private Notifier mNotifier; 266 private WirelessChargerDetector mWirelessChargerDetector; 267 private SettingsObserver mSettingsObserver; 268 private DreamManagerInternal mDreamManager; 269 private LogicalLight mAttentionLight; 270 271 private InattentiveSleepWarningController mInattentiveSleepWarningOverlayController; 272 private final AmbientDisplaySuppressionController mAmbientDisplaySuppressionController; 273 274 private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_POWER); 275 276 // A bitfield that indicates what parts of the power state have 277 // changed and need to be recalculated. 278 private int mDirty; 279 280 // Indicates whether the device is awake or asleep or somewhere in between. 281 // This is distinct from the screen power state, which is managed separately. 282 // Do not access directly; always use {@link #setWakefulness} and {@link getWakefulness}. 283 private int mWakefulnessRaw; 284 private boolean mWakefulnessChanging; 285 286 // True if the sandman has just been summoned for the first time since entering the 287 // dreaming or dozing state. Indicates whether a new dream should begin. 288 private boolean mSandmanSummoned; 289 290 // True if MSG_SANDMAN has been scheduled. 291 private boolean mSandmanScheduled; 292 293 // Table of all suspend blockers. 294 // There should only be a few of these. 295 private final ArrayList<SuspendBlocker> mSuspendBlockers = new ArrayList<SuspendBlocker>(); 296 297 // Table of all wake locks acquired by applications. 298 private final ArrayList<WakeLock> mWakeLocks = new ArrayList<WakeLock>(); 299 300 // A bitfield that summarizes the state of all active wakelocks. 301 private int mWakeLockSummary; 302 303 // Have we scheduled a message to check for long wake locks? This is when we will check. 304 private long mNotifyLongScheduled; 305 306 // Last time we checked for long wake locks. 307 private long mNotifyLongDispatched; 308 309 // The time we decided to do next long check. 310 private long mNotifyLongNextCheck; 311 312 // If true, instructs the display controller to wait for the proximity sensor to 313 // go negative before turning the screen on. 314 private boolean mRequestWaitForNegativeProximity; 315 316 // Timestamp of the last time the device was awoken or put to sleep. 317 private long mLastWakeTime; 318 private long mLastSleepTime; 319 320 // Last reason the device went to sleep. 321 private @WakeReason int mLastWakeReason; 322 private int mLastSleepReason; 323 324 // Timestamp of the last call to user activity. 325 private long mLastUserActivityTime; 326 private long mLastUserActivityTimeNoChangeLights; 327 328 // Timestamp of last interactive power hint. 329 private long mLastInteractivePowerHintTime; 330 331 // Timestamp of the last screen brightness boost. 332 private long mLastScreenBrightnessBoostTime; 333 private boolean mScreenBrightnessBoostInProgress; 334 335 // A bitfield that summarizes the effect of the user activity timer. 336 private int mUserActivitySummary; 337 338 // The desired display power state. The actual state may lag behind the 339 // requested because it is updated asynchronously by the display power controller. 340 private final DisplayPowerRequest mDisplayPowerRequest = new DisplayPowerRequest(); 341 342 // True if the display power state has been fully applied, which means the display 343 // is actually on or actually off or whatever was requested. 344 private boolean mDisplayReady; 345 346 // The suspend blocker used to keep the CPU alive when an application has acquired 347 // a wake lock. 348 private final SuspendBlocker mWakeLockSuspendBlocker; 349 350 // True if the wake lock suspend blocker has been acquired. 351 private boolean mHoldingWakeLockSuspendBlocker; 352 353 // The suspend blocker used to keep the CPU alive when the display is on, the 354 // display is getting ready or there is user activity (in which case the display 355 // must be on). 356 private final SuspendBlocker mDisplaySuspendBlocker; 357 358 // True if the display suspend blocker has been acquired. 359 private boolean mHoldingDisplaySuspendBlocker; 360 361 // True if systemReady() has been called. 362 private boolean mSystemReady; 363 364 // True if boot completed occurred. We keep the screen on until this happens. 365 // The screen will be off if we are in quiescent mode. 366 private boolean mBootCompleted; 367 368 // True if auto-suspend mode is enabled. 369 // Refer to autosuspend.h. 370 private boolean mHalAutoSuspendModeEnabled; 371 372 // True if interactive mode is enabled. 373 // Refer to power.h. 374 private boolean mHalInteractiveModeEnabled; 375 376 // True if the device is plugged into a power source. 377 private boolean mIsPowered; 378 379 // The current plug type, such as BatteryManager.BATTERY_PLUGGED_WIRELESS. 380 private int mPlugType; 381 382 // The current battery level percentage. 383 private int mBatteryLevel; 384 385 // The battery level percentage at the time the dream started. 386 // This is used to terminate a dream and go to sleep if the battery is 387 // draining faster than it is charging and the user activity timeout has expired. 388 private int mBatteryLevelWhenDreamStarted; 389 390 // The current dock state. 391 private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; 392 393 // True to decouple auto-suspend mode from the display state. 394 private boolean mDecoupleHalAutoSuspendModeFromDisplayConfig; 395 396 // True to decouple interactive mode from the display state. 397 private boolean mDecoupleHalInteractiveModeFromDisplayConfig; 398 399 // True if the device should wake up when plugged or unplugged. 400 private boolean mWakeUpWhenPluggedOrUnpluggedConfig; 401 402 // True if the device should wake up when plugged or unplugged in theater mode. 403 private boolean mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig; 404 405 // True if the device should suspend when the screen is off due to proximity. 406 private boolean mSuspendWhenScreenOffDueToProximityConfig; 407 408 // Default value for attentive timeout. 409 private int mAttentiveTimeoutConfig; 410 411 // True if dreams are supported on this device. 412 private boolean mDreamsSupportedConfig; 413 414 // Default value for dreams enabled 415 private boolean mDreamsEnabledByDefaultConfig; 416 417 // Default value for dreams activate-on-sleep 418 private boolean mDreamsActivatedOnSleepByDefaultConfig; 419 420 // Default value for dreams activate-on-dock 421 private boolean mDreamsActivatedOnDockByDefaultConfig; 422 423 // True if dreams can run while not plugged in. 424 private boolean mDreamsEnabledOnBatteryConfig; 425 426 // Minimum battery level to allow dreaming when powered. 427 // Use -1 to disable this safety feature. 428 private int mDreamsBatteryLevelMinimumWhenPoweredConfig; 429 430 // Minimum battery level to allow dreaming when not powered. 431 // Use -1 to disable this safety feature. 432 private int mDreamsBatteryLevelMinimumWhenNotPoweredConfig; 433 434 // If the battery level drops by this percentage and the user activity timeout 435 // has expired, then assume the device is receiving insufficient current to charge 436 // effectively and terminate the dream. Use -1 to disable this safety feature. 437 private int mDreamsBatteryLevelDrainCutoffConfig; 438 439 // True if dreams are enabled by the user. 440 private boolean mDreamsEnabledSetting; 441 442 // True if dreams should be activated on sleep. 443 private boolean mDreamsActivateOnSleepSetting; 444 445 // True if dreams should be activated on dock. 446 private boolean mDreamsActivateOnDockSetting; 447 448 // True if doze should not be started until after the screen off transition. 449 private boolean mDozeAfterScreenOff; 450 451 // The minimum screen off timeout, in milliseconds. 452 private long mMinimumScreenOffTimeoutConfig; 453 454 // The screen dim duration, in milliseconds. 455 // This is subtracted from the end of the screen off timeout so the 456 // minimum screen off timeout should be longer than this. 457 private long mMaximumScreenDimDurationConfig; 458 459 // The maximum screen dim time expressed as a ratio relative to the screen 460 // off timeout. If the screen off timeout is very short then we want the 461 // dim timeout to also be quite short so that most of the time is spent on. 462 // Otherwise the user won't get much screen on time before dimming occurs. 463 private float mMaximumScreenDimRatioConfig; 464 465 // Whether device supports double tap to wake. 466 private boolean mSupportsDoubleTapWakeConfig; 467 468 // The screen off timeout setting value in milliseconds. 469 private long mScreenOffTimeoutSetting; 470 471 // Default for attentive warning duration. 472 private long mAttentiveWarningDurationConfig; 473 474 // The sleep timeout setting value in milliseconds. 475 private long mSleepTimeoutSetting; 476 477 // How long to show a warning message to user before the device goes to sleep 478 // after long user inactivity, even if wakelocks are held. 479 private long mAttentiveTimeoutSetting; 480 481 // The maximum allowable screen off timeout according to the device 482 // administration policy. Overrides other settings. 483 private long mMaximumScreenOffTimeoutFromDeviceAdmin = Long.MAX_VALUE; 484 485 // The stay on while plugged in setting. 486 // A bitfield of battery conditions under which to make the screen stay on. 487 private int mStayOnWhilePluggedInSetting; 488 489 // True if the device should stay on. 490 private boolean mStayOn; 491 492 // True if the lights should stay off until an explicit user action. 493 private static boolean sQuiescent; 494 495 // True if the proximity sensor reads a positive result. 496 private boolean mProximityPositive; 497 498 // Screen brightness setting limits. 499 private float mScreenBrightnessSettingMinimum; 500 private float mScreenBrightnessSettingMaximum; 501 private float mScreenBrightnessSettingDefault; 502 public final float mScreenBrightnessMinimum; 503 public final float mScreenBrightnessMaximum; 504 public final float mScreenBrightnessDefault; 505 public final float mScreenBrightnessDoze; 506 public final float mScreenBrightnessDim; 507 public final float mScreenBrightnessMinimumVr; 508 public final float mScreenBrightnessMaximumVr; 509 public final float mScreenBrightnessDefaultVr; 510 511 // The screen brightness mode. 512 // One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants. 513 private int mScreenBrightnessModeSetting; 514 515 // The screen brightness setting override from the window manager 516 // to allow the current foreground activity to override the brightness. 517 private float mScreenBrightnessOverrideFromWindowManager = 518 PowerManager.BRIGHTNESS_INVALID_FLOAT; 519 520 // The window manager has determined the user to be inactive via other means. 521 // Set this to false to disable. 522 private boolean mUserInactiveOverrideFromWindowManager; 523 524 // The next possible user activity timeout after being explicitly told the user is inactive. 525 // Set to -1 when not told the user is inactive since the last period spent dozing or asleep. 526 private long mOverriddenTimeout = -1; 527 528 // The user activity timeout override from the window manager 529 // to allow the current foreground activity to override the user activity timeout. 530 // Use -1 to disable. 531 private long mUserActivityTimeoutOverrideFromWindowManager = -1; 532 533 // The screen state to use while dozing. 534 private int mDozeScreenStateOverrideFromDreamManager = Display.STATE_UNKNOWN; 535 536 // The screen brightness to use while dozing. 537 private int mDozeScreenBrightnessOverrideFromDreamManager = PowerManager.BRIGHTNESS_DEFAULT; 538 539 private float mDozeScreenBrightnessOverrideFromDreamManagerFloat = 540 PowerManager.BRIGHTNESS_INVALID_FLOAT; 541 // Keep display state when dozing. 542 private boolean mDrawWakeLockOverrideFromSidekick; 543 544 // Time when we last logged a warning about calling userActivity() without permission. 545 private long mLastWarningAboutUserActivityPermission = Long.MIN_VALUE; 546 547 // True if the battery level is currently considered low. 548 private boolean mBatteryLevelLow; 549 550 // True if we are currently in device idle mode. 551 private boolean mDeviceIdleMode; 552 553 // True if we are currently in light device idle mode. 554 private boolean mLightDeviceIdleMode; 555 556 // Set of app ids that we will always respect the wake locks for. 557 int[] mDeviceIdleWhitelist = new int[0]; 558 559 // Set of app ids that are temporarily allowed to acquire wakelocks due to high-pri message 560 int[] mDeviceIdleTempWhitelist = new int[0]; 561 562 private final SparseArray<UidState> mUidState = new SparseArray<>(); 563 564 // We are currently in the middle of a batch change of uids. 565 private boolean mUidsChanging; 566 567 // Some uids have actually changed while mUidsChanging was true. 568 private boolean mUidsChanged; 569 570 // True if theater mode is enabled 571 private boolean mTheaterModeEnabled; 572 573 // True if always on display is enabled 574 private boolean mAlwaysOnEnabled; 575 576 // True if double tap to wake is enabled 577 private boolean mDoubleTapWakeEnabled; 578 579 // True if we are currently in VR Mode. 580 private boolean mIsVrModeEnabled; 581 582 // True if we in the process of performing a forceSuspend 583 private boolean mForceSuspendActive; 584 585 // Transition to Doze is in progress. We have transitioned to WAKEFULNESS_DOZING, 586 // but the DreamService has not yet been told to start (it's an async process). 587 private boolean mDozeStartInProgress; 588 589 private final class ForegroundProfileObserver extends SynchronousUserSwitchObserver { 590 @Override onUserSwitching(@serIdInt int newUserId)591 public void onUserSwitching(@UserIdInt int newUserId) throws RemoteException { 592 synchronized (mLock) { 593 mUserId = newUserId; 594 } 595 } 596 597 @Override onForegroundProfileSwitch(@serIdInt int newProfileId)598 public void onForegroundProfileSwitch(@UserIdInt int newProfileId) throws RemoteException { 599 final long now = mClock.uptimeMillis(); 600 synchronized (mLock) { 601 mForegroundProfile = newProfileId; 602 maybeUpdateForegroundProfileLastActivityLocked(now); 603 } 604 } 605 } 606 607 // User id corresponding to activity the user is currently interacting with. 608 private @UserIdInt int mForegroundProfile; 609 // User id of main profile for the current user (doesn't include managed profiles) 610 private @UserIdInt int mUserId; 611 612 // Per-profile state to track when a profile should be locked. 613 private final SparseArray<ProfilePowerState> mProfilePowerState = new SparseArray<>(); 614 615 private static final class ProfilePowerState { 616 // Profile user id. 617 final @UserIdInt int mUserId; 618 // Maximum time to lock set by admin. 619 long mScreenOffTimeout; 620 // Like top-level mWakeLockSummary, but only for wake locks that affect current profile. 621 int mWakeLockSummary; 622 // Last user activity that happened in an app running in the profile. 623 long mLastUserActivityTime; 624 // Whether profile has been locked last time it timed out. 625 boolean mLockingNotified; 626 ProfilePowerState(@serIdInt int userId, long screenOffTimeout, long now)627 public ProfilePowerState(@UserIdInt int userId, long screenOffTimeout, long now) { 628 mUserId = userId; 629 mScreenOffTimeout = screenOffTimeout; 630 // Not accurate but at least won't cause immediate locking of the profile. 631 mLastUserActivityTime = now; 632 } 633 } 634 635 /** 636 * All times are in milliseconds. These constants are kept synchronized with the system 637 * global Settings. Any access to this class or its fields should be done while 638 * holding the PowerManagerService.mLock lock. 639 */ 640 private final class Constants extends ContentObserver { 641 // Key names stored in the settings value. 642 private static final String KEY_NO_CACHED_WAKE_LOCKS = "no_cached_wake_locks"; 643 644 private static final boolean DEFAULT_NO_CACHED_WAKE_LOCKS = true; 645 646 // Prevent processes that are cached from holding wake locks? 647 public boolean NO_CACHED_WAKE_LOCKS = DEFAULT_NO_CACHED_WAKE_LOCKS; 648 649 private ContentResolver mResolver; 650 private final KeyValueListParser mParser = new KeyValueListParser(','); 651 Constants(Handler handler)652 public Constants(Handler handler) { 653 super(handler); 654 } 655 start(ContentResolver resolver)656 public void start(ContentResolver resolver) { 657 mResolver = resolver; 658 mResolver.registerContentObserver(Settings.Global.getUriFor( 659 Settings.Global.POWER_MANAGER_CONSTANTS), false, this); 660 updateConstants(); 661 } 662 663 @Override onChange(boolean selfChange, Uri uri)664 public void onChange(boolean selfChange, Uri uri) { 665 updateConstants(); 666 } 667 updateConstants()668 private void updateConstants() { 669 synchronized (mLock) { 670 try { 671 mParser.setString(Settings.Global.getString(mResolver, 672 Settings.Global.POWER_MANAGER_CONSTANTS)); 673 } catch (IllegalArgumentException e) { 674 // Failed to parse the settings string, log this and move on 675 // with defaults. 676 Slog.e(TAG, "Bad alarm manager settings", e); 677 } 678 679 NO_CACHED_WAKE_LOCKS = mParser.getBoolean(KEY_NO_CACHED_WAKE_LOCKS, 680 DEFAULT_NO_CACHED_WAKE_LOCKS); 681 } 682 } 683 dump(PrintWriter pw)684 void dump(PrintWriter pw) { 685 pw.println(" Settings " + Settings.Global.POWER_MANAGER_CONSTANTS + ":"); 686 687 pw.print(" "); pw.print(KEY_NO_CACHED_WAKE_LOCKS); pw.print("="); 688 pw.println(NO_CACHED_WAKE_LOCKS); 689 } 690 dumpProto(ProtoOutputStream proto)691 void dumpProto(ProtoOutputStream proto) { 692 final long constantsToken = proto.start(PowerManagerServiceDumpProto.CONSTANTS); 693 proto.write(PowerManagerServiceDumpProto.ConstantsProto.IS_NO_CACHED_WAKE_LOCKS, 694 NO_CACHED_WAKE_LOCKS); 695 proto.end(constantsToken); 696 } 697 } 698 699 /** 700 * Wrapper around the static-native methods of PowerManagerService. 701 * 702 * This class exists to allow us to mock static native methods in our tests. If mocking static 703 * methods becomes easier than this in the future, we can delete this class. 704 */ 705 @VisibleForTesting 706 public static class NativeWrapper { 707 /** Wrapper for PowerManager.nativeInit */ nativeInit(PowerManagerService service)708 public void nativeInit(PowerManagerService service) { 709 service.nativeInit(); 710 } 711 712 /** Wrapper for PowerManager.nativeAcquireSuspectBlocker */ nativeAcquireSuspendBlocker(String name)713 public void nativeAcquireSuspendBlocker(String name) { 714 PowerManagerService.nativeAcquireSuspendBlocker(name); 715 } 716 717 /** Wrapper for PowerManager.nativeReleaseSuspendBlocker */ nativeReleaseSuspendBlocker(String name)718 public void nativeReleaseSuspendBlocker(String name) { 719 PowerManagerService.nativeReleaseSuspendBlocker(name); 720 } 721 722 /** Wrapper for PowerManager.nativeSetInteractive */ nativeSetInteractive(boolean enable)723 public void nativeSetInteractive(boolean enable) { 724 PowerManagerService.nativeSetInteractive(enable); 725 } 726 727 /** Wrapper for PowerManager.nativeSetAutoSuspend */ nativeSetAutoSuspend(boolean enable)728 public void nativeSetAutoSuspend(boolean enable) { 729 PowerManagerService.nativeSetAutoSuspend(enable); 730 } 731 732 /** Wrapper for PowerManager.nativeSendPowerHint */ nativeSendPowerHint(int hintId, int data)733 public void nativeSendPowerHint(int hintId, int data) { 734 PowerManagerService.nativeSendPowerHint(hintId, data); 735 } 736 737 /** Wrapper for PowerManager.nativeSetPowerBoost */ nativeSetPowerBoost(int boost, int durationMs)738 public void nativeSetPowerBoost(int boost, int durationMs) { 739 PowerManagerService.nativeSetPowerBoost(boost, durationMs); 740 } 741 742 /** Wrapper for PowerManager.nativeSetPowerMode */ nativeSetPowerMode(int mode, boolean enabled)743 public boolean nativeSetPowerMode(int mode, boolean enabled) { 744 return PowerManagerService.nativeSetPowerMode(mode, enabled); 745 } 746 747 /** Wrapper for PowerManager.nativeSetFeature */ nativeSetFeature(int featureId, int data)748 public void nativeSetFeature(int featureId, int data) { 749 PowerManagerService.nativeSetFeature(featureId, data); 750 } 751 752 /** Wrapper for PowerManager.nativeForceSuspend */ nativeForceSuspend()753 public boolean nativeForceSuspend() { 754 return PowerManagerService.nativeForceSuspend(); 755 } 756 } 757 758 /** Functional interface for providing time. */ 759 @VisibleForTesting 760 interface Clock { 761 /** 762 * Returns current time in milliseconds since boot, not counting time spent in deep sleep. 763 */ uptimeMillis()764 long uptimeMillis(); 765 } 766 767 @VisibleForTesting 768 static class Injector { createNotifier(Looper looper, Context context, IBatteryStats batteryStats, SuspendBlocker suspendBlocker, WindowManagerPolicy policy)769 Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats, 770 SuspendBlocker suspendBlocker, WindowManagerPolicy policy) { 771 return new Notifier(looper, context, batteryStats, suspendBlocker, policy); 772 } 773 createSuspendBlocker(PowerManagerService service, String name)774 SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) { 775 SuspendBlocker suspendBlocker = service.new SuspendBlockerImpl(name); 776 service.mSuspendBlockers.add(suspendBlocker); 777 return suspendBlocker; 778 } 779 createBatterySaverPolicy( Object lock, Context context, BatterySavingStats batterySavingStats)780 BatterySaverPolicy createBatterySaverPolicy( 781 Object lock, Context context, BatterySavingStats batterySavingStats) { 782 return new BatterySaverPolicy(lock, context, batterySavingStats); 783 } 784 createBatterySaverController( Object lock, Context context, BatterySaverPolicy batterySaverPolicy, BatterySavingStats batterySavingStats)785 BatterySaverController createBatterySaverController( 786 Object lock, Context context, BatterySaverPolicy batterySaverPolicy, 787 BatterySavingStats batterySavingStats) { 788 return new BatterySaverController(lock, context, BackgroundThread.get().getLooper(), 789 batterySaverPolicy, batterySavingStats); 790 } 791 createBatterySaverStateMachine(Object lock, Context context, BatterySaverController batterySaverController)792 BatterySaverStateMachine createBatterySaverStateMachine(Object lock, Context context, 793 BatterySaverController batterySaverController) { 794 return new BatterySaverStateMachine(lock, context, batterySaverController); 795 } 796 createNativeWrapper()797 NativeWrapper createNativeWrapper() { 798 return new NativeWrapper(); 799 } 800 createWirelessChargerDetector( SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler)801 WirelessChargerDetector createWirelessChargerDetector( 802 SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) { 803 return new WirelessChargerDetector(sensorManager, suspendBlocker, handler); 804 } 805 createAmbientDisplayConfiguration(Context context)806 AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) { 807 return new AmbientDisplayConfiguration(context); 808 } 809 createAmbientDisplaySuppressionController( Context context)810 AmbientDisplaySuppressionController createAmbientDisplaySuppressionController( 811 Context context) { 812 return new AmbientDisplaySuppressionController(context); 813 } 814 createInattentiveSleepWarningController()815 InattentiveSleepWarningController createInattentiveSleepWarningController() { 816 return new InattentiveSleepWarningController(); 817 } 818 createSystemPropertiesWrapper()819 public SystemPropertiesWrapper createSystemPropertiesWrapper() { 820 return new SystemPropertiesWrapper() { 821 @Override 822 public String get(String key, String def) { 823 return SystemProperties.get(key, def); 824 } 825 826 @Override 827 public void set(String key, String val) { 828 SystemProperties.set(key, val); 829 } 830 }; 831 } 832 createClock()833 Clock createClock() { 834 return SystemClock::uptimeMillis; 835 } 836 837 /** 838 * Handler for asynchronous operations performed by the power manager. 839 */ createHandler(Looper looper, Handler.Callback callback)840 Handler createHandler(Looper looper, Handler.Callback callback) { 841 return new Handler(looper, callback, true /*async*/); 842 } 843 invalidateIsInteractiveCaches()844 void invalidateIsInteractiveCaches() { 845 PowerManager.invalidateIsInteractiveCaches(); 846 } 847 } 848 849 final Constants mConstants; 850 851 private native void nativeInit(); 852 private static native void nativeAcquireSuspendBlocker(String name); 853 private static native void nativeReleaseSuspendBlocker(String name); 854 private static native void nativeSetInteractive(boolean enable); 855 private static native void nativeSetAutoSuspend(boolean enable); 856 private static native void nativeSendPowerHint(int hintId, int data); 857 private static native void nativeSetPowerBoost(int boost, int durationMs); 858 private static native boolean nativeSetPowerMode(int mode, boolean enabled); 859 private static native void nativeSetFeature(int featureId, int data); 860 private static native boolean nativeForceSuspend(); 861 862 public PowerManagerService(Context context) { 863 this(context, new Injector()); 864 } 865 866 @VisibleForTesting 867 PowerManagerService(Context context, Injector injector) { 868 super(context); 869 870 mContext = context; 871 mBinderService = new BinderService(); 872 mLocalService = new LocalService(); 873 mNativeWrapper = injector.createNativeWrapper(); 874 mSystemProperties = injector.createSystemPropertiesWrapper(); 875 mClock = injector.createClock(); 876 mInjector = injector; 877 878 mHandlerThread = new ServiceThread(TAG, 879 Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/); 880 mHandlerThread.start(); 881 mHandler = injector.createHandler(mHandlerThread.getLooper(), 882 new PowerManagerHandlerCallback()); 883 mConstants = new Constants(mHandler); 884 mAmbientDisplayConfiguration = mInjector.createAmbientDisplayConfiguration(context); 885 mAmbientDisplaySuppressionController = 886 mInjector.createAmbientDisplaySuppressionController(context); 887 mAttentionDetector = new AttentionDetector(this::onUserAttention, mLock); 888 889 mBatterySavingStats = new BatterySavingStats(mLock); 890 mBatterySaverPolicy = 891 mInjector.createBatterySaverPolicy(mLock, mContext, mBatterySavingStats); 892 mBatterySaverController = mInjector.createBatterySaverController(mLock, mContext, 893 mBatterySaverPolicy, mBatterySavingStats); 894 mBatterySaverStateMachine = mInjector.createBatterySaverStateMachine(mLock, mContext, 895 mBatterySaverController); 896 897 mInattentiveSleepWarningOverlayController = 898 mInjector.createInattentiveSleepWarningController(); 899 900 // Save brightness values: 901 // Get float values from config. 902 // Store float if valid 903 // Otherwise, get int values and convert to float and then store. 904 final float min = mContext.getResources().getFloat(com.android.internal.R.dimen 905 .config_screenBrightnessSettingMinimumFloat); 906 final float max = mContext.getResources().getFloat(com.android.internal.R.dimen 907 .config_screenBrightnessSettingMaximumFloat); 908 final float def = mContext.getResources().getFloat(com.android.internal.R.dimen 909 .config_screenBrightnessSettingDefaultFloat); 910 final float doze = mContext.getResources().getFloat(com.android.internal.R.dimen 911 .config_screenBrightnessDozeFloat); 912 final float dim = mContext.getResources().getFloat(com.android.internal.R.dimen 913 .config_screenBrightnessDimFloat); 914 915 if (min == INVALID_BRIGHTNESS_IN_CONFIG || max == INVALID_BRIGHTNESS_IN_CONFIG 916 || def == INVALID_BRIGHTNESS_IN_CONFIG) { 917 mScreenBrightnessMinimum = BrightnessSynchronizer.brightnessIntToFloat( 918 mContext.getResources().getInteger(com.android.internal.R.integer 919 .config_screenBrightnessSettingMinimum), 920 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 921 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 922 mScreenBrightnessMaximum = BrightnessSynchronizer.brightnessIntToFloat( 923 mContext.getResources().getInteger(com.android.internal.R.integer 924 .config_screenBrightnessSettingMaximum), 925 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 926 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 927 mScreenBrightnessDefault = BrightnessSynchronizer.brightnessIntToFloat( 928 mContext.getResources().getInteger(com.android.internal.R.integer 929 .config_screenBrightnessSettingDefault), 930 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 931 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 932 } else { 933 mScreenBrightnessMinimum = min; 934 mScreenBrightnessMaximum = max; 935 mScreenBrightnessDefault = def; 936 } 937 if (doze == INVALID_BRIGHTNESS_IN_CONFIG) { 938 mScreenBrightnessDoze = BrightnessSynchronizer.brightnessIntToFloat( 939 mContext.getResources().getInteger(com.android.internal.R.integer 940 .config_screenBrightnessDoze), PowerManager.BRIGHTNESS_OFF + 1, 941 PowerManager.BRIGHTNESS_ON, PowerManager.BRIGHTNESS_MIN, 942 PowerManager.BRIGHTNESS_MAX); 943 } else { 944 mScreenBrightnessDoze = doze; 945 } 946 if (dim == INVALID_BRIGHTNESS_IN_CONFIG) { 947 mScreenBrightnessDim = BrightnessSynchronizer.brightnessIntToFloat( 948 mContext.getResources().getInteger(com.android.internal.R.integer 949 .config_screenBrightnessDim), PowerManager.BRIGHTNESS_OFF + 1, 950 PowerManager.BRIGHTNESS_ON, PowerManager.BRIGHTNESS_MIN, 951 PowerManager.BRIGHTNESS_MAX); 952 } else { 953 mScreenBrightnessDim = dim; 954 } 955 956 final float vrMin = mContext.getResources().getFloat(com.android.internal.R.dimen 957 .config_screenBrightnessSettingForVrMinimumFloat); 958 final float vrMax = mContext.getResources().getFloat(com.android.internal.R.dimen 959 .config_screenBrightnessSettingForVrMaximumFloat); 960 final float vrDef = mContext.getResources().getFloat(com.android.internal.R.dimen 961 .config_screenBrightnessSettingForVrDefaultFloat); 962 if (vrMin == INVALID_BRIGHTNESS_IN_CONFIG || vrMax == INVALID_BRIGHTNESS_IN_CONFIG 963 || vrDef == INVALID_BRIGHTNESS_IN_CONFIG) { 964 mScreenBrightnessMinimumVr = BrightnessSynchronizer.brightnessIntToFloat( 965 mContext.getResources().getInteger(com.android.internal.R.integer 966 .config_screenBrightnessForVrSettingMinimum), 967 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 968 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 969 mScreenBrightnessMaximumVr = BrightnessSynchronizer.brightnessIntToFloat( 970 mContext.getResources().getInteger(com.android.internal.R.integer 971 .config_screenBrightnessForVrSettingMaximum), 972 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 973 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 974 mScreenBrightnessDefaultVr = BrightnessSynchronizer.brightnessIntToFloat( 975 mContext.getResources().getInteger(com.android.internal.R.integer 976 .config_screenBrightnessForVrSettingDefault), 977 PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON, 978 PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX); 979 } else { 980 mScreenBrightnessMinimumVr = vrMin; 981 mScreenBrightnessMaximumVr = vrMax; 982 mScreenBrightnessDefaultVr = vrDef; 983 } 984 985 synchronized (mLock) { 986 mWakeLockSuspendBlocker = 987 mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks"); 988 mDisplaySuspendBlocker = 989 mInjector.createSuspendBlocker(this, "PowerManagerService.Display"); 990 if (mDisplaySuspendBlocker != null) { 991 mDisplaySuspendBlocker.acquire(); 992 mHoldingDisplaySuspendBlocker = true; 993 } 994 mHalAutoSuspendModeEnabled = false; 995 mHalInteractiveModeEnabled = true; 996 997 mWakefulnessRaw = WAKEFULNESS_AWAKE; 998 sQuiescent = mSystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1") 999 || InitProperties.userspace_reboot_in_progress().orElse(false); 1000 1001 mNativeWrapper.nativeInit(this); 1002 mNativeWrapper.nativeSetAutoSuspend(false); 1003 mNativeWrapper.nativeSetInteractive(true); 1004 mNativeWrapper.nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0); 1005 mInjector.invalidateIsInteractiveCaches(); 1006 } 1007 } 1008 1009 @Override 1010 public void onStart() { 1011 publishBinderService(Context.POWER_SERVICE, mBinderService, /* allowIsolated= */ false, 1012 DUMP_FLAG_PRIORITY_DEFAULT | DUMP_FLAG_PRIORITY_CRITICAL); 1013 publishLocalService(PowerManagerInternal.class, mLocalService); 1014 1015 Watchdog.getInstance().addMonitor(this); 1016 Watchdog.getInstance().addThread(mHandler); 1017 } 1018 1019 @Override 1020 public void onBootPhase(int phase) { 1021 synchronized (mLock) { 1022 if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) { 1023 incrementBootCount(); 1024 1025 } else if (phase == PHASE_BOOT_COMPLETED) { 1026 final long now = mClock.uptimeMillis(); 1027 mBootCompleted = true; 1028 mDirty |= DIRTY_BOOT_COMPLETED; 1029 1030 mBatterySaverStateMachine.onBootCompleted(); 1031 userActivityNoUpdateLocked( 1032 now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); 1033 1034 if (sQuiescent) { 1035 goToSleepNoUpdateLocked(mClock.uptimeMillis(), 1036 PowerManager.GO_TO_SLEEP_REASON_QUIESCENT, 1037 PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID); 1038 } 1039 updatePowerStateLocked(); 1040 } 1041 } 1042 } 1043 1044 public void systemReady(IAppOpsService appOps) { 1045 synchronized (mLock) { 1046 mSystemReady = true; 1047 mAppOps = appOps; 1048 mDreamManager = getLocalService(DreamManagerInternal.class); 1049 mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class); 1050 mPolicy = getLocalService(WindowManagerPolicy.class); 1051 mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class); 1052 mAttentionDetector.systemReady(mContext); 1053 1054 PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 1055 mScreenBrightnessSettingMinimum = pm.getBrightnessConstraint( 1056 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM); 1057 mScreenBrightnessSettingMaximum = pm.getBrightnessConstraint( 1058 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM); 1059 mScreenBrightnessSettingDefault = pm.getBrightnessConstraint( 1060 PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT); 1061 1062 SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper()); 1063 1064 // The notifier runs on the system server's main looper so as not to interfere 1065 // with the animations and other critical functions of the power manager. 1066 mBatteryStats = BatteryStatsService.getService(); 1067 mNotifier = mInjector.createNotifier(Looper.getMainLooper(), mContext, mBatteryStats, 1068 mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"), 1069 mPolicy); 1070 1071 mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager, 1072 mInjector.createSuspendBlocker( 1073 this, "PowerManagerService.WirelessChargerDetector"), 1074 mHandler); 1075 mSettingsObserver = new SettingsObserver(mHandler); 1076 1077 mLightsManager = getLocalService(LightsManager.class); 1078 mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION); 1079 1080 // Initialize display power management. 1081 mDisplayManagerInternal.initPowerManagement( 1082 mDisplayPowerCallbacks, mHandler, sensorManager); 1083 1084 try { 1085 final ForegroundProfileObserver observer = new ForegroundProfileObserver(); 1086 ActivityManager.getService().registerUserSwitchObserver(observer, TAG); 1087 } catch (RemoteException e) { 1088 // Shouldn't happen since in-process. 1089 } 1090 1091 // Go. 1092 readConfigurationLocked(); 1093 updateSettingsLocked(); 1094 mDirty |= DIRTY_BATTERY_STATE; 1095 updatePowerStateLocked(); 1096 } 1097 1098 final ContentResolver resolver = mContext.getContentResolver(); 1099 mConstants.start(resolver); 1100 1101 mBatterySaverController.systemReady(); 1102 mBatterySaverPolicy.systemReady(); 1103 1104 // Register for settings changes. 1105 resolver.registerContentObserver(Settings.Secure.getUriFor( 1106 Settings.Secure.SCREENSAVER_ENABLED), 1107 false, mSettingsObserver, UserHandle.USER_ALL); 1108 resolver.registerContentObserver(Settings.Secure.getUriFor( 1109 Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP), 1110 false, mSettingsObserver, UserHandle.USER_ALL); 1111 resolver.registerContentObserver(Settings.Secure.getUriFor( 1112 Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), 1113 false, mSettingsObserver, UserHandle.USER_ALL); 1114 resolver.registerContentObserver(Settings.System.getUriFor( 1115 Settings.System.SCREEN_OFF_TIMEOUT), 1116 false, mSettingsObserver, UserHandle.USER_ALL); 1117 resolver.registerContentObserver(Settings.Secure.getUriFor( 1118 Settings.Secure.SLEEP_TIMEOUT), 1119 false, mSettingsObserver, UserHandle.USER_ALL); 1120 resolver.registerContentObserver(Settings.Secure.getUriFor( 1121 Settings.Secure.ATTENTIVE_TIMEOUT), 1122 false, mSettingsObserver, UserHandle.USER_ALL); 1123 resolver.registerContentObserver(Settings.Global.getUriFor( 1124 Settings.Global.STAY_ON_WHILE_PLUGGED_IN), 1125 false, mSettingsObserver, UserHandle.USER_ALL); 1126 resolver.registerContentObserver(Settings.System.getUriFor( 1127 Settings.System.SCREEN_BRIGHTNESS_MODE), 1128 false, mSettingsObserver, UserHandle.USER_ALL); 1129 resolver.registerContentObserver(Settings.System.getUriFor( 1130 Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ), 1131 false, mSettingsObserver, UserHandle.USER_ALL); 1132 resolver.registerContentObserver(Settings.Global.getUriFor( 1133 Settings.Global.THEATER_MODE_ON), 1134 false, mSettingsObserver, UserHandle.USER_ALL); 1135 resolver.registerContentObserver(Settings.Secure.getUriFor( 1136 Settings.Secure.DOZE_ALWAYS_ON), 1137 false, mSettingsObserver, UserHandle.USER_ALL); 1138 resolver.registerContentObserver(Settings.Secure.getUriFor( 1139 Settings.Secure.DOUBLE_TAP_TO_WAKE), 1140 false, mSettingsObserver, UserHandle.USER_ALL); 1141 resolver.registerContentObserver(Settings.Global.getUriFor( 1142 Settings.Global.DEVICE_DEMO_MODE), 1143 false, mSettingsObserver, UserHandle.USER_SYSTEM); 1144 IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE)); 1145 if (vrManager != null) { 1146 try { 1147 vrManager.registerListener(mVrStateCallbacks); 1148 } catch (RemoteException e) { 1149 Slog.e(TAG, "Failed to register VR mode state listener: " + e); 1150 } 1151 } 1152 1153 // Register for broadcasts from other components of the system. 1154 IntentFilter filter = new IntentFilter(); 1155 filter.addAction(Intent.ACTION_BATTERY_CHANGED); 1156 filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 1157 mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler); 1158 1159 filter = new IntentFilter(); 1160 filter.addAction(Intent.ACTION_DREAMING_STARTED); 1161 filter.addAction(Intent.ACTION_DREAMING_STOPPED); 1162 mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler); 1163 1164 filter = new IntentFilter(); 1165 filter.addAction(Intent.ACTION_USER_SWITCHED); 1166 mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler); 1167 1168 filter = new IntentFilter(); 1169 filter.addAction(Intent.ACTION_DOCK_EVENT); 1170 mContext.registerReceiver(new DockReceiver(), filter, null, mHandler); 1171 } 1172 1173 @VisibleForTesting 1174 void readConfigurationLocked() { 1175 final Resources resources = mContext.getResources(); 1176 1177 mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean( 1178 com.android.internal.R.bool.config_powerDecoupleAutoSuspendModeFromDisplay); 1179 mDecoupleHalInteractiveModeFromDisplayConfig = resources.getBoolean( 1180 com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay); 1181 mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean( 1182 com.android.internal.R.bool.config_unplugTurnsOnScreen); 1183 mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean( 1184 com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug); 1185 mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean( 1186 com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity); 1187 mAttentiveTimeoutConfig = resources.getInteger( 1188 com.android.internal.R.integer.config_attentiveTimeout); 1189 mAttentiveWarningDurationConfig = resources.getInteger( 1190 com.android.internal.R.integer.config_attentiveWarningDuration); 1191 mDreamsSupportedConfig = resources.getBoolean( 1192 com.android.internal.R.bool.config_dreamsSupported); 1193 mDreamsEnabledByDefaultConfig = resources.getBoolean( 1194 com.android.internal.R.bool.config_dreamsEnabledByDefault); 1195 mDreamsActivatedOnSleepByDefaultConfig = resources.getBoolean( 1196 com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); 1197 mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( 1198 com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); 1199 mDreamsEnabledOnBatteryConfig = resources.getBoolean( 1200 com.android.internal.R.bool.config_dreamsEnabledOnBattery); 1201 mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( 1202 com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenPowered); 1203 mDreamsBatteryLevelMinimumWhenNotPoweredConfig = resources.getInteger( 1204 com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered); 1205 mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger( 1206 com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff); 1207 mDozeAfterScreenOff = resources.getBoolean( 1208 com.android.internal.R.bool.config_dozeAfterScreenOffByDefault); 1209 mMinimumScreenOffTimeoutConfig = resources.getInteger( 1210 com.android.internal.R.integer.config_minimumScreenOffTimeout); 1211 mMaximumScreenDimDurationConfig = resources.getInteger( 1212 com.android.internal.R.integer.config_maximumScreenDimDuration); 1213 mMaximumScreenDimRatioConfig = resources.getFraction( 1214 com.android.internal.R.fraction.config_maximumScreenDimRatio, 1, 1); 1215 mSupportsDoubleTapWakeConfig = resources.getBoolean( 1216 com.android.internal.R.bool.config_supportDoubleTapWake); 1217 } 1218 1219 private void updateSettingsLocked() { 1220 final ContentResolver resolver = mContext.getContentResolver(); 1221 1222 mDreamsEnabledSetting = (Settings.Secure.getIntForUser(resolver, 1223 Settings.Secure.SCREENSAVER_ENABLED, 1224 mDreamsEnabledByDefaultConfig ? 1 : 0, 1225 UserHandle.USER_CURRENT) != 0); 1226 mDreamsActivateOnSleepSetting = (Settings.Secure.getIntForUser(resolver, 1227 Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, 1228 mDreamsActivatedOnSleepByDefaultConfig ? 1 : 0, 1229 UserHandle.USER_CURRENT) != 0); 1230 mDreamsActivateOnDockSetting = (Settings.Secure.getIntForUser(resolver, 1231 Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 1232 mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, 1233 UserHandle.USER_CURRENT) != 0); 1234 mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, 1235 Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, 1236 UserHandle.USER_CURRENT); 1237 mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver, 1238 Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT, 1239 UserHandle.USER_CURRENT); 1240 mAttentiveTimeoutSetting = Settings.Secure.getIntForUser(resolver, 1241 Settings.Secure.ATTENTIVE_TIMEOUT, mAttentiveTimeoutConfig, 1242 UserHandle.USER_CURRENT); 1243 mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver, 1244 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC); 1245 mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(), 1246 Settings.Global.THEATER_MODE_ON, 0) == 1; 1247 mAlwaysOnEnabled = mAmbientDisplayConfiguration.alwaysOnEnabled(UserHandle.USER_CURRENT); 1248 1249 if (mSupportsDoubleTapWakeConfig) { 1250 boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver, 1251 Settings.Secure.DOUBLE_TAP_TO_WAKE, DEFAULT_DOUBLE_TAP_TO_WAKE, 1252 UserHandle.USER_CURRENT) != 0; 1253 if (doubleTapWakeEnabled != mDoubleTapWakeEnabled) { 1254 mDoubleTapWakeEnabled = doubleTapWakeEnabled; 1255 mNativeWrapper.nativeSetFeature( 1256 POWER_FEATURE_DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled ? 1 : 0); 1257 } 1258 } 1259 1260 final String retailDemoValue = UserManager.isDeviceInDemoMode(mContext) ? "1" : "0"; 1261 if (!retailDemoValue.equals( 1262 mSystemProperties.get(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, null))) { 1263 mSystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, retailDemoValue); 1264 } 1265 1266 mScreenBrightnessModeSetting = Settings.System.getIntForUser(resolver, 1267 Settings.System.SCREEN_BRIGHTNESS_MODE, 1268 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT); 1269 1270 mDirty |= DIRTY_SETTINGS; 1271 } 1272 1273 private void handleSettingsChangedLocked() { 1274 updateSettingsLocked(); 1275 updatePowerStateLocked(); 1276 } 1277 1278 private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName, 1279 WorkSource ws, String historyTag, int uid, int pid) { 1280 synchronized (mLock) { 1281 if (DEBUG_SPEW) { 1282 Slog.d(TAG, "acquireWakeLockInternal: lock=" + Objects.hashCode(lock) 1283 + ", flags=0x" + Integer.toHexString(flags) 1284 + ", tag=\"" + tag + "\", ws=" + ws + ", uid=" + uid + ", pid=" + pid); 1285 } 1286 1287 WakeLock wakeLock; 1288 int index = findWakeLockIndexLocked(lock); 1289 boolean notifyAcquire; 1290 if (index >= 0) { 1291 wakeLock = mWakeLocks.get(index); 1292 if (!wakeLock.hasSameProperties(flags, tag, ws, uid, pid)) { 1293 // Update existing wake lock. This shouldn't happen but is harmless. 1294 notifyWakeLockChangingLocked(wakeLock, flags, tag, packageName, 1295 uid, pid, ws, historyTag); 1296 wakeLock.updateProperties(flags, tag, packageName, ws, historyTag, uid, pid); 1297 } 1298 notifyAcquire = false; 1299 } else { 1300 UidState state = mUidState.get(uid); 1301 if (state == null) { 1302 state = new UidState(uid); 1303 state.mProcState = ActivityManager.PROCESS_STATE_NONEXISTENT; 1304 mUidState.put(uid, state); 1305 } 1306 state.mNumWakeLocks++; 1307 wakeLock = new WakeLock(lock, flags, tag, packageName, ws, historyTag, uid, pid, 1308 state); 1309 try { 1310 lock.linkToDeath(wakeLock, 0); 1311 } catch (RemoteException ex) { 1312 throw new IllegalArgumentException("Wake lock is already dead."); 1313 } 1314 mWakeLocks.add(wakeLock); 1315 setWakeLockDisabledStateLocked(wakeLock); 1316 notifyAcquire = true; 1317 } 1318 1319 applyWakeLockFlagsOnAcquireLocked(wakeLock, uid); 1320 mDirty |= DIRTY_WAKE_LOCKS; 1321 updatePowerStateLocked(); 1322 if (notifyAcquire) { 1323 // This needs to be done last so we are sure we have acquired the 1324 // kernel wake lock. Otherwise we have a race where the system may 1325 // go to sleep between the time we start the accounting in battery 1326 // stats and when we actually get around to telling the kernel to 1327 // stay awake. 1328 notifyWakeLockAcquiredLocked(wakeLock); 1329 } 1330 } 1331 } 1332 1333 @SuppressWarnings("deprecation") 1334 private static boolean isScreenLock(final WakeLock wakeLock) { 1335 switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 1336 case PowerManager.FULL_WAKE_LOCK: 1337 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 1338 case PowerManager.SCREEN_DIM_WAKE_LOCK: 1339 return true; 1340 } 1341 return false; 1342 } 1343 1344 private static WorkChain getFirstNonEmptyWorkChain(WorkSource workSource) { 1345 if (workSource.getWorkChains() == null) { 1346 return null; 1347 } 1348 1349 for (WorkChain workChain: workSource.getWorkChains()) { 1350 if (workChain.getSize() > 0) { 1351 return workChain; 1352 } 1353 } 1354 1355 return null; 1356 } 1357 1358 private void applyWakeLockFlagsOnAcquireLocked(WakeLock wakeLock, int uid) { 1359 if ((wakeLock.mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0 1360 && isScreenLock(wakeLock)) { 1361 String opPackageName; 1362 int opUid; 1363 if (wakeLock.mWorkSource != null && !wakeLock.mWorkSource.isEmpty()) { 1364 WorkSource workSource = wakeLock.mWorkSource; 1365 WorkChain workChain = getFirstNonEmptyWorkChain(workSource); 1366 if (workChain != null) { 1367 opPackageName = workChain.getAttributionTag(); 1368 opUid = workChain.getAttributionUid(); 1369 } else { 1370 opPackageName = workSource.getPackageName(0) != null 1371 ? workSource.getPackageName(0) : wakeLock.mPackageName; 1372 opUid = workSource.getUid(0); 1373 } 1374 } else { 1375 opPackageName = wakeLock.mPackageName; 1376 opUid = wakeLock.mOwnerUid; 1377 } 1378 wakeUpNoUpdateLocked(mClock.uptimeMillis(), 1379 PowerManager.WAKE_REASON_APPLICATION, wakeLock.mTag, 1380 opUid, opPackageName, opUid); 1381 } 1382 } 1383 1384 private void releaseWakeLockInternal(IBinder lock, int flags) { 1385 synchronized (mLock) { 1386 int index = findWakeLockIndexLocked(lock); 1387 if (index < 0) { 1388 if (DEBUG_SPEW) { 1389 Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) 1390 + " [not found], flags=0x" + Integer.toHexString(flags)); 1391 } 1392 return; 1393 } 1394 1395 WakeLock wakeLock = mWakeLocks.get(index); 1396 if (DEBUG_SPEW) { 1397 Slog.d(TAG, "releaseWakeLockInternal: lock=" + Objects.hashCode(lock) 1398 + " [" + wakeLock.mTag + "], flags=0x" + Integer.toHexString(flags)); 1399 } 1400 1401 if ((flags & PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY) != 0) { 1402 mRequestWaitForNegativeProximity = true; 1403 } 1404 1405 wakeLock.mLock.unlinkToDeath(wakeLock, 0); 1406 removeWakeLockLocked(wakeLock, index); 1407 } 1408 } 1409 1410 private void handleWakeLockDeath(WakeLock wakeLock) { 1411 synchronized (mLock) { 1412 if (DEBUG_SPEW) { 1413 Slog.d(TAG, "handleWakeLockDeath: lock=" + Objects.hashCode(wakeLock.mLock) 1414 + " [" + wakeLock.mTag + "]"); 1415 } 1416 1417 int index = mWakeLocks.indexOf(wakeLock); 1418 if (index < 0) { 1419 return; 1420 } 1421 1422 removeWakeLockLocked(wakeLock, index); 1423 } 1424 } 1425 1426 private void removeWakeLockLocked(WakeLock wakeLock, int index) { 1427 mWakeLocks.remove(index); 1428 UidState state = wakeLock.mUidState; 1429 state.mNumWakeLocks--; 1430 if (state.mNumWakeLocks <= 0 && 1431 state.mProcState == ActivityManager.PROCESS_STATE_NONEXISTENT) { 1432 mUidState.remove(state.mUid); 1433 } 1434 notifyWakeLockReleasedLocked(wakeLock); 1435 1436 applyWakeLockFlagsOnReleaseLocked(wakeLock); 1437 mDirty |= DIRTY_WAKE_LOCKS; 1438 updatePowerStateLocked(); 1439 } 1440 1441 private void applyWakeLockFlagsOnReleaseLocked(WakeLock wakeLock) { 1442 if ((wakeLock.mFlags & PowerManager.ON_AFTER_RELEASE) != 0 1443 && isScreenLock(wakeLock)) { 1444 userActivityNoUpdateLocked(mClock.uptimeMillis(), 1445 PowerManager.USER_ACTIVITY_EVENT_OTHER, 1446 PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS, 1447 wakeLock.mOwnerUid); 1448 } 1449 } 1450 1451 private void updateWakeLockWorkSourceInternal(IBinder lock, WorkSource ws, String historyTag, 1452 int callingUid) { 1453 synchronized (mLock) { 1454 int index = findWakeLockIndexLocked(lock); 1455 if (index < 0) { 1456 if (DEBUG_SPEW) { 1457 Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) 1458 + " [not found], ws=" + ws); 1459 } 1460 throw new IllegalArgumentException("Wake lock not active: " + lock 1461 + " from uid " + callingUid); 1462 } 1463 1464 WakeLock wakeLock = mWakeLocks.get(index); 1465 if (DEBUG_SPEW) { 1466 Slog.d(TAG, "updateWakeLockWorkSourceInternal: lock=" + Objects.hashCode(lock) 1467 + " [" + wakeLock.mTag + "], ws=" + ws); 1468 } 1469 1470 if (!wakeLock.hasSameWorkSource(ws)) { 1471 notifyWakeLockChangingLocked(wakeLock, wakeLock.mFlags, wakeLock.mTag, 1472 wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid, 1473 ws, historyTag); 1474 wakeLock.mHistoryTag = historyTag; 1475 wakeLock.updateWorkSource(ws); 1476 } 1477 } 1478 } 1479 1480 private int findWakeLockIndexLocked(IBinder lock) { 1481 final int count = mWakeLocks.size(); 1482 for (int i = 0; i < count; i++) { 1483 if (mWakeLocks.get(i).mLock == lock) { 1484 return i; 1485 } 1486 } 1487 return -1; 1488 } 1489 1490 private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) { 1491 if (mSystemReady && !wakeLock.mDisabled) { 1492 wakeLock.mNotifiedAcquired = true; 1493 mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName, 1494 wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource, 1495 wakeLock.mHistoryTag); 1496 restartNofifyLongTimerLocked(wakeLock); 1497 } 1498 } 1499 1500 private void enqueueNotifyLongMsgLocked(long time) { 1501 mNotifyLongScheduled = time; 1502 Message msg = mHandler.obtainMessage(MSG_CHECK_FOR_LONG_WAKELOCKS); 1503 msg.setAsynchronous(true); 1504 mHandler.sendMessageAtTime(msg, time); 1505 } 1506 1507 private void restartNofifyLongTimerLocked(WakeLock wakeLock) { 1508 wakeLock.mAcquireTime = mClock.uptimeMillis(); 1509 if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) 1510 == PowerManager.PARTIAL_WAKE_LOCK && mNotifyLongScheduled == 0) { 1511 enqueueNotifyLongMsgLocked(wakeLock.mAcquireTime + MIN_LONG_WAKE_CHECK_INTERVAL); 1512 } 1513 } 1514 1515 private void notifyWakeLockLongStartedLocked(WakeLock wakeLock) { 1516 if (mSystemReady && !wakeLock.mDisabled) { 1517 wakeLock.mNotifiedLong = true; 1518 mNotifier.onLongPartialWakeLockStart(wakeLock.mTag, wakeLock.mOwnerUid, 1519 wakeLock.mWorkSource, wakeLock.mHistoryTag); 1520 } 1521 } 1522 1523 private void notifyWakeLockLongFinishedLocked(WakeLock wakeLock) { 1524 if (wakeLock.mNotifiedLong) { 1525 wakeLock.mNotifiedLong = false; 1526 mNotifier.onLongPartialWakeLockFinish(wakeLock.mTag, wakeLock.mOwnerUid, 1527 wakeLock.mWorkSource, wakeLock.mHistoryTag); 1528 } 1529 } 1530 1531 private void notifyWakeLockChangingLocked(WakeLock wakeLock, int flags, String tag, 1532 String packageName, int uid, int pid, WorkSource ws, String historyTag) { 1533 if (mSystemReady && wakeLock.mNotifiedAcquired) { 1534 mNotifier.onWakeLockChanging(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName, 1535 wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource, 1536 wakeLock.mHistoryTag, flags, tag, packageName, uid, pid, ws, historyTag); 1537 notifyWakeLockLongFinishedLocked(wakeLock); 1538 // Changing the wake lock will count as releasing the old wake lock(s) and 1539 // acquiring the new ones... we do this because otherwise once a wakelock 1540 // becomes long, if we just continued to treat it as long we can get in to 1541 // situations where we spam battery stats with every following change to it. 1542 restartNofifyLongTimerLocked(wakeLock); 1543 } 1544 } 1545 1546 private void notifyWakeLockReleasedLocked(WakeLock wakeLock) { 1547 if (mSystemReady && wakeLock.mNotifiedAcquired) { 1548 wakeLock.mNotifiedAcquired = false; 1549 wakeLock.mAcquireTime = 0; 1550 mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag, 1551 wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid, 1552 wakeLock.mWorkSource, wakeLock.mHistoryTag); 1553 notifyWakeLockLongFinishedLocked(wakeLock); 1554 } 1555 } 1556 1557 @SuppressWarnings("deprecation") 1558 private boolean isWakeLockLevelSupportedInternal(int level) { 1559 synchronized (mLock) { 1560 switch (level) { 1561 case PowerManager.PARTIAL_WAKE_LOCK: 1562 case PowerManager.SCREEN_DIM_WAKE_LOCK: 1563 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 1564 case PowerManager.FULL_WAKE_LOCK: 1565 case PowerManager.DOZE_WAKE_LOCK: 1566 case PowerManager.DRAW_WAKE_LOCK: 1567 return true; 1568 1569 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 1570 return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable(); 1571 1572 default: 1573 return false; 1574 } 1575 } 1576 } 1577 1578 // Called from native code. 1579 private void userActivityFromNative(long eventTime, int event, int flags) { 1580 userActivityInternal(eventTime, event, flags, Process.SYSTEM_UID); 1581 } 1582 1583 private void userActivityInternal(long eventTime, int event, int flags, int uid) { 1584 synchronized (mLock) { 1585 if (userActivityNoUpdateLocked(eventTime, event, flags, uid)) { 1586 updatePowerStateLocked(); 1587 } 1588 } 1589 } 1590 1591 private void onUserAttention() { 1592 synchronized (mLock) { 1593 if (userActivityNoUpdateLocked(mClock.uptimeMillis(), 1594 PowerManager.USER_ACTIVITY_EVENT_ATTENTION, 0 /* flags */, 1595 Process.SYSTEM_UID)) { 1596 updatePowerStateLocked(); 1597 } 1598 } 1599 } 1600 1601 private boolean userActivityNoUpdateLocked(long eventTime, int event, int flags, int uid) { 1602 if (DEBUG_SPEW) { 1603 Slog.d(TAG, "userActivityNoUpdateLocked: eventTime=" + eventTime 1604 + ", event=" + event + ", flags=0x" + Integer.toHexString(flags) 1605 + ", uid=" + uid); 1606 } 1607 1608 if (eventTime < mLastSleepTime || eventTime < mLastWakeTime || !mSystemReady) { 1609 return false; 1610 } 1611 1612 Trace.traceBegin(Trace.TRACE_TAG_POWER, "userActivity"); 1613 try { 1614 if (eventTime > mLastInteractivePowerHintTime) { 1615 powerHintInternal(PowerHint.INTERACTION, 0); 1616 mLastInteractivePowerHintTime = eventTime; 1617 } 1618 1619 mNotifier.onUserActivity(event, uid); 1620 mAttentionDetector.onUserActivity(eventTime, event); 1621 1622 if (mUserInactiveOverrideFromWindowManager) { 1623 mUserInactiveOverrideFromWindowManager = false; 1624 mOverriddenTimeout = -1; 1625 } 1626 1627 if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP 1628 || getWakefulnessLocked() == WAKEFULNESS_DOZING 1629 || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) { 1630 return false; 1631 } 1632 1633 maybeUpdateForegroundProfileLastActivityLocked(eventTime); 1634 1635 if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) { 1636 if (eventTime > mLastUserActivityTimeNoChangeLights 1637 && eventTime > mLastUserActivityTime) { 1638 mLastUserActivityTimeNoChangeLights = eventTime; 1639 mDirty |= DIRTY_USER_ACTIVITY; 1640 if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { 1641 mDirty |= DIRTY_QUIESCENT; 1642 } 1643 1644 return true; 1645 } 1646 } else { 1647 if (eventTime > mLastUserActivityTime) { 1648 mLastUserActivityTime = eventTime; 1649 mDirty |= DIRTY_USER_ACTIVITY; 1650 if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { 1651 mDirty |= DIRTY_QUIESCENT; 1652 } 1653 return true; 1654 } 1655 } 1656 } finally { 1657 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1658 } 1659 return false; 1660 } 1661 1662 private void maybeUpdateForegroundProfileLastActivityLocked(long eventTime) { 1663 final ProfilePowerState profile = mProfilePowerState.get(mForegroundProfile); 1664 if (profile != null && eventTime > profile.mLastUserActivityTime) { 1665 profile.mLastUserActivityTime = eventTime; 1666 } 1667 } 1668 1669 private void wakeUpInternal(long eventTime, @WakeReason int reason, String details, int uid, 1670 String opPackageName, int opUid) { 1671 synchronized (mLock) { 1672 if (wakeUpNoUpdateLocked(eventTime, reason, details, uid, opPackageName, opUid)) { 1673 updatePowerStateLocked(); 1674 } 1675 } 1676 } 1677 1678 private boolean wakeUpNoUpdateLocked(long eventTime, @WakeReason int reason, String details, 1679 int reasonUid, String opPackageName, int opUid) { 1680 if (DEBUG_SPEW) { 1681 Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime + ", uid=" + reasonUid); 1682 } 1683 1684 if (eventTime < mLastSleepTime || getWakefulnessLocked() == WAKEFULNESS_AWAKE 1685 || mForceSuspendActive || !mSystemReady) { 1686 return false; 1687 } 1688 1689 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, 0); 1690 1691 Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakeUp"); 1692 try { 1693 Slog.i(TAG, "Waking up from " 1694 + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked()) 1695 + " (uid=" + reasonUid 1696 + ", reason=" + PowerManager.wakeReasonToString(reason) 1697 + ", details=" + details 1698 + ")..."); 1699 1700 mLastWakeTime = eventTime; 1701 mLastWakeReason = reason; 1702 setWakefulnessLocked(WAKEFULNESS_AWAKE, reason, eventTime); 1703 1704 mNotifier.onWakeUp(reason, details, reasonUid, opPackageName, opUid); 1705 userActivityNoUpdateLocked( 1706 eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid); 1707 1708 if (sQuiescent) { 1709 mDirty |= DIRTY_QUIESCENT; 1710 } 1711 } finally { 1712 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1713 } 1714 return true; 1715 } 1716 1717 private void goToSleepInternal(long eventTime, int reason, int flags, int uid) { 1718 synchronized (mLock) { 1719 if (goToSleepNoUpdateLocked(eventTime, reason, flags, uid)) { 1720 updatePowerStateLocked(); 1721 } 1722 } 1723 } 1724 1725 /** 1726 * Puts the system in doze. 1727 * 1728 * This method is called goToSleep for historical reasons but actually attempts to DOZE, 1729 * and only tucks itself in to SLEEP if requested with the flag 1730 * {@link PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE}. 1731 */ 1732 @SuppressWarnings("deprecation") 1733 private boolean goToSleepNoUpdateLocked(long eventTime, int reason, int flags, int uid) { 1734 if (DEBUG_SPEW) { 1735 Slog.d(TAG, "goToSleepNoUpdateLocked: eventTime=" + eventTime 1736 + ", reason=" + reason + ", flags=" + flags + ", uid=" + uid); 1737 } 1738 1739 if (eventTime < mLastWakeTime 1740 || getWakefulnessLocked() == WAKEFULNESS_ASLEEP 1741 || getWakefulnessLocked() == WAKEFULNESS_DOZING 1742 || !mSystemReady 1743 || !mBootCompleted) { 1744 return false; 1745 } 1746 1747 Trace.traceBegin(Trace.TRACE_TAG_POWER, "goToSleep"); 1748 try { 1749 reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX, 1750 Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN)); 1751 Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason) 1752 + " (uid " + uid + ")..."); 1753 1754 mLastSleepTime = eventTime; 1755 mLastSleepReason = reason; 1756 mSandmanSummoned = true; 1757 mDozeStartInProgress = true; 1758 setWakefulnessLocked(WAKEFULNESS_DOZING, reason, eventTime); 1759 1760 // Report the number of wake locks that will be cleared by going to sleep. 1761 int numWakeLocksCleared = 0; 1762 final int numWakeLocks = mWakeLocks.size(); 1763 for (int i = 0; i < numWakeLocks; i++) { 1764 final WakeLock wakeLock = mWakeLocks.get(i); 1765 switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 1766 case PowerManager.FULL_WAKE_LOCK: 1767 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 1768 case PowerManager.SCREEN_DIM_WAKE_LOCK: 1769 numWakeLocksCleared += 1; 1770 break; 1771 } 1772 } 1773 EventLogTags.writePowerSleepRequested(numWakeLocksCleared); 1774 1775 // Skip dozing if requested. 1776 if ((flags & PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) != 0) { 1777 reallyGoToSleepNoUpdateLocked(eventTime, uid); 1778 } 1779 } finally { 1780 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1781 } 1782 return true; 1783 } 1784 1785 private void napInternal(long eventTime, int uid) { 1786 synchronized (mLock) { 1787 if (napNoUpdateLocked(eventTime, uid)) { 1788 updatePowerStateLocked(); 1789 } 1790 } 1791 } 1792 1793 private boolean napNoUpdateLocked(long eventTime, int uid) { 1794 if (DEBUG_SPEW) { 1795 Slog.d(TAG, "napNoUpdateLocked: eventTime=" + eventTime + ", uid=" + uid); 1796 } 1797 1798 if (eventTime < mLastWakeTime || getWakefulnessLocked() != WAKEFULNESS_AWAKE 1799 || !mBootCompleted || !mSystemReady) { 1800 return false; 1801 } 1802 1803 Trace.traceBegin(Trace.TRACE_TAG_POWER, "nap"); 1804 try { 1805 Slog.i(TAG, "Nap time (uid " + uid +")..."); 1806 1807 mSandmanSummoned = true; 1808 setWakefulnessLocked(WAKEFULNESS_DREAMING, 0, eventTime); 1809 } finally { 1810 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1811 } 1812 return true; 1813 } 1814 1815 // Done dozing, drop everything and go to sleep. 1816 private boolean reallyGoToSleepNoUpdateLocked(long eventTime, int uid) { 1817 if (DEBUG_SPEW) { 1818 Slog.d(TAG, "reallyGoToSleepNoUpdateLocked: eventTime=" + eventTime 1819 + ", uid=" + uid); 1820 } 1821 1822 if (eventTime < mLastWakeTime || getWakefulnessLocked() == WAKEFULNESS_ASLEEP 1823 || !mBootCompleted || !mSystemReady) { 1824 return false; 1825 } 1826 1827 Trace.traceBegin(Trace.TRACE_TAG_POWER, "reallyGoToSleep"); 1828 try { 1829 Slog.i(TAG, "Sleeping (uid " + uid +")..."); 1830 1831 setWakefulnessLocked(WAKEFULNESS_ASLEEP, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 1832 eventTime); 1833 } finally { 1834 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1835 } 1836 return true; 1837 } 1838 1839 @VisibleForTesting 1840 void setWakefulnessLocked(int wakefulness, int reason, long eventTime) { 1841 if (getWakefulnessLocked() != wakefulness) { 1842 // Under lock, invalidate before set ensures caches won't return stale values. 1843 mInjector.invalidateIsInteractiveCaches(); 1844 mWakefulnessRaw = wakefulness; 1845 mWakefulnessChanging = true; 1846 mDirty |= DIRTY_WAKEFULNESS; 1847 1848 // This is only valid while we are in wakefulness dozing. Set to false otherwise. 1849 mDozeStartInProgress &= (getWakefulnessLocked() == WAKEFULNESS_DOZING); 1850 1851 if (mNotifier != null) { 1852 mNotifier.onWakefulnessChangeStarted(wakefulness, reason, eventTime); 1853 } 1854 mAttentionDetector.onWakefulnessChangeStarted(wakefulness); 1855 } 1856 } 1857 1858 @VisibleForTesting 1859 int getWakefulnessLocked() { 1860 return mWakefulnessRaw; 1861 } 1862 1863 /** 1864 * Logs the time the device would have spent awake before user activity timeout, 1865 * had the system not been told the user was inactive. 1866 */ 1867 private void logSleepTimeoutRecapturedLocked() { 1868 final long now = mClock.uptimeMillis(); 1869 final long savedWakeTimeMs = mOverriddenTimeout - now; 1870 if (savedWakeTimeMs >= 0) { 1871 EventLogTags.writePowerSoftSleepRequested(savedWakeTimeMs); 1872 mOverriddenTimeout = -1; 1873 } 1874 } 1875 1876 private void finishWakefulnessChangeIfNeededLocked() { 1877 if (mWakefulnessChanging && mDisplayReady) { 1878 if (getWakefulnessLocked() == WAKEFULNESS_DOZING 1879 && (mWakeLockSummary & WAKE_LOCK_DOZE) == 0) { 1880 return; // wait until dream has enabled dozing 1881 } else { 1882 // Doze wakelock acquired (doze started) or device is no longer dozing. 1883 mDozeStartInProgress = false; 1884 } 1885 if (getWakefulnessLocked() == WAKEFULNESS_DOZING 1886 || getWakefulnessLocked() == WAKEFULNESS_ASLEEP) { 1887 logSleepTimeoutRecapturedLocked(); 1888 } 1889 if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) { 1890 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, 0); 1891 final int latencyMs = (int) (mClock.uptimeMillis() - mLastWakeTime); 1892 if (latencyMs >= SCREEN_ON_LATENCY_WARNING_MS) { 1893 Slog.w(TAG, "Screen on took " + latencyMs + " ms"); 1894 } 1895 } 1896 mWakefulnessChanging = false; 1897 mNotifier.onWakefulnessChangeFinished(); 1898 } 1899 } 1900 1901 /** 1902 * Updates the global power state based on dirty bits recorded in mDirty. 1903 * 1904 * This is the main function that performs power state transitions. 1905 * We centralize them here so that we can recompute the power state completely 1906 * each time something important changes, and ensure that we do it the same 1907 * way each time. The point is to gather all of the transition logic here. 1908 */ 1909 private void updatePowerStateLocked() { 1910 if (!mSystemReady || mDirty == 0) { 1911 return; 1912 } 1913 if (!Thread.holdsLock(mLock)) { 1914 Slog.wtf(TAG, "Power manager lock was not held when calling updatePowerStateLocked"); 1915 } 1916 1917 Trace.traceBegin(Trace.TRACE_TAG_POWER, "updatePowerState"); 1918 try { 1919 // Phase 0: Basic state updates. 1920 updateIsPoweredLocked(mDirty); 1921 updateStayOnLocked(mDirty); 1922 updateScreenBrightnessBoostLocked(mDirty); 1923 1924 // Phase 1: Update wakefulness. 1925 // Loop because the wake lock and user activity computations are influenced 1926 // by changes in wakefulness. 1927 final long now = mClock.uptimeMillis(); 1928 int dirtyPhase2 = 0; 1929 for (;;) { 1930 int dirtyPhase1 = mDirty; 1931 dirtyPhase2 |= dirtyPhase1; 1932 mDirty = 0; 1933 1934 updateWakeLockSummaryLocked(dirtyPhase1); 1935 updateUserActivitySummaryLocked(now, dirtyPhase1); 1936 updateAttentiveStateLocked(now, dirtyPhase1); 1937 if (!updateWakefulnessLocked(dirtyPhase1)) { 1938 break; 1939 } 1940 } 1941 1942 // Phase 2: Lock profiles that became inactive/not kept awake. 1943 updateProfilesLocked(now); 1944 1945 // Phase 3: Update display power state. 1946 final boolean displayBecameReady = updateDisplayPowerStateLocked(dirtyPhase2); 1947 1948 // Phase 4: Update dream state (depends on display ready signal). 1949 updateDreamLocked(dirtyPhase2, displayBecameReady); 1950 1951 // Phase 5: Send notifications, if needed. 1952 finishWakefulnessChangeIfNeededLocked(); 1953 1954 // Phase 6: Update suspend blocker. 1955 // Because we might release the last suspend blocker here, we need to make sure 1956 // we finished everything else first! 1957 updateSuspendBlockerLocked(); 1958 } finally { 1959 Trace.traceEnd(Trace.TRACE_TAG_POWER); 1960 } 1961 } 1962 1963 /** 1964 * Check profile timeouts and notify profiles that should be locked. 1965 */ 1966 private void updateProfilesLocked(long now) { 1967 final int numProfiles = mProfilePowerState.size(); 1968 for (int i = 0; i < numProfiles; i++) { 1969 final ProfilePowerState profile = mProfilePowerState.valueAt(i); 1970 if (isProfileBeingKeptAwakeLocked(profile, now)) { 1971 profile.mLockingNotified = false; 1972 } else if (!profile.mLockingNotified) { 1973 profile.mLockingNotified = true; 1974 mNotifier.onProfileTimeout(profile.mUserId); 1975 } 1976 } 1977 } 1978 1979 private boolean isProfileBeingKeptAwakeLocked(ProfilePowerState profile, long now) { 1980 return (profile.mLastUserActivityTime + profile.mScreenOffTimeout > now) 1981 || (profile.mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0 1982 || (mProximityPositive && 1983 (profile.mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0); 1984 } 1985 1986 /** 1987 * Updates the value of mIsPowered. 1988 * Sets DIRTY_IS_POWERED if a change occurred. 1989 */ 1990 private void updateIsPoweredLocked(int dirty) { 1991 if ((dirty & DIRTY_BATTERY_STATE) != 0) { 1992 final boolean wasPowered = mIsPowered; 1993 final int oldPlugType = mPlugType; 1994 final boolean oldLevelLow = mBatteryLevelLow; 1995 mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY); 1996 mPlugType = mBatteryManagerInternal.getPlugType(); 1997 mBatteryLevel = mBatteryManagerInternal.getBatteryLevel(); 1998 mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow(); 1999 2000 if (DEBUG_SPEW) { 2001 Slog.d(TAG, "updateIsPoweredLocked: wasPowered=" + wasPowered 2002 + ", mIsPowered=" + mIsPowered 2003 + ", oldPlugType=" + oldPlugType 2004 + ", mPlugType=" + mPlugType 2005 + ", mBatteryLevel=" + mBatteryLevel); 2006 } 2007 2008 if (wasPowered != mIsPowered || oldPlugType != mPlugType) { 2009 mDirty |= DIRTY_IS_POWERED; 2010 2011 // Update wireless dock detection state. 2012 final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update( 2013 mIsPowered, mPlugType); 2014 2015 // Treat plugging and unplugging the devices as a user activity. 2016 // Users find it disconcerting when they plug or unplug the device 2017 // and it shuts off right away. 2018 // Some devices also wake the device when plugged or unplugged because 2019 // they don't have a charging LED. 2020 final long now = mClock.uptimeMillis(); 2021 if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, 2022 dockedOnWirelessCharger)) { 2023 wakeUpNoUpdateLocked(now, PowerManager.WAKE_REASON_PLUGGED_IN, 2024 "android.server.power:PLUGGED:" + mIsPowered, Process.SYSTEM_UID, 2025 mContext.getOpPackageName(), Process.SYSTEM_UID); 2026 } 2027 userActivityNoUpdateLocked( 2028 now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); 2029 2030 // only play charging sounds if boot is completed so charging sounds don't play 2031 // with potential notification sounds 2032 if (mBootCompleted) { 2033 if (mIsPowered && !BatteryManager.isPlugWired(oldPlugType) 2034 && BatteryManager.isPlugWired(mPlugType)) { 2035 mNotifier.onWiredChargingStarted(mUserId); 2036 } else if (dockedOnWirelessCharger) { 2037 mNotifier.onWirelessChargingStarted(mBatteryLevel, mUserId); 2038 } 2039 } 2040 } 2041 2042 mBatterySaverStateMachine.setBatteryStatus(mIsPowered, mBatteryLevel, mBatteryLevelLow); 2043 } 2044 } 2045 2046 private boolean shouldWakeUpWhenPluggedOrUnpluggedLocked( 2047 boolean wasPowered, int oldPlugType, boolean dockedOnWirelessCharger) { 2048 // Don't wake when powered unless configured to do so. 2049 if (!mWakeUpWhenPluggedOrUnpluggedConfig) { 2050 return false; 2051 } 2052 2053 // Don't wake when undocked from wireless charger. 2054 // See WirelessChargerDetector for justification. 2055 if (wasPowered && !mIsPowered 2056 && oldPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS) { 2057 return false; 2058 } 2059 2060 // Don't wake when docked on wireless charger unless we are certain of it. 2061 // See WirelessChargerDetector for justification. 2062 if (!wasPowered && mIsPowered 2063 && mPlugType == BatteryManager.BATTERY_PLUGGED_WIRELESS 2064 && !dockedOnWirelessCharger) { 2065 return false; 2066 } 2067 2068 // If already dreaming and becoming powered, then don't wake. 2069 if (mIsPowered && getWakefulnessLocked() == WAKEFULNESS_DREAMING) { 2070 return false; 2071 } 2072 2073 // Don't wake while theater mode is enabled. 2074 if (mTheaterModeEnabled && !mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) { 2075 return false; 2076 } 2077 2078 // On Always On Display, SystemUI shows the charging indicator 2079 if (mAlwaysOnEnabled && getWakefulnessLocked() == WAKEFULNESS_DOZING) { 2080 return false; 2081 } 2082 2083 // Otherwise wake up! 2084 return true; 2085 } 2086 2087 /** 2088 * Updates the value of mStayOn. 2089 * Sets DIRTY_STAY_ON if a change occurred. 2090 */ 2091 private void updateStayOnLocked(int dirty) { 2092 if ((dirty & (DIRTY_BATTERY_STATE | DIRTY_SETTINGS)) != 0) { 2093 final boolean wasStayOn = mStayOn; 2094 if (mStayOnWhilePluggedInSetting != 0 2095 && !isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) { 2096 mStayOn = mBatteryManagerInternal.isPowered(mStayOnWhilePluggedInSetting); 2097 } else { 2098 mStayOn = false; 2099 } 2100 2101 if (mStayOn != wasStayOn) { 2102 mDirty |= DIRTY_STAY_ON; 2103 } 2104 } 2105 } 2106 2107 /** 2108 * Updates the value of mWakeLockSummary to summarize the state of all active wake locks. 2109 * Note that most wake-locks are ignored when the system is asleep. 2110 * 2111 * This function must have no other side-effects. 2112 */ 2113 @SuppressWarnings("deprecation") 2114 private void updateWakeLockSummaryLocked(int dirty) { 2115 if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS)) != 0) { 2116 mWakeLockSummary = 0; 2117 2118 final int numProfiles = mProfilePowerState.size(); 2119 for (int i = 0; i < numProfiles; i++) { 2120 mProfilePowerState.valueAt(i).mWakeLockSummary = 0; 2121 } 2122 2123 final int numWakeLocks = mWakeLocks.size(); 2124 for (int i = 0; i < numWakeLocks; i++) { 2125 final WakeLock wakeLock = mWakeLocks.get(i); 2126 final int wakeLockFlags = getWakeLockSummaryFlags(wakeLock); 2127 mWakeLockSummary |= wakeLockFlags; 2128 for (int j = 0; j < numProfiles; j++) { 2129 final ProfilePowerState profile = mProfilePowerState.valueAt(j); 2130 if (wakeLockAffectsUser(wakeLock, profile.mUserId)) { 2131 profile.mWakeLockSummary |= wakeLockFlags; 2132 } 2133 } 2134 } 2135 2136 mWakeLockSummary = adjustWakeLockSummaryLocked(mWakeLockSummary); 2137 for (int i = 0; i < numProfiles; i++) { 2138 final ProfilePowerState profile = mProfilePowerState.valueAt(i); 2139 profile.mWakeLockSummary = adjustWakeLockSummaryLocked(profile.mWakeLockSummary); 2140 } 2141 2142 if (DEBUG_SPEW) { 2143 Slog.d(TAG, "updateWakeLockSummaryLocked: mWakefulness=" 2144 + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked()) 2145 + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary)); 2146 } 2147 } 2148 } 2149 2150 private int adjustWakeLockSummaryLocked(int wakeLockSummary) { 2151 // Cancel wake locks that make no sense based on the current state. 2152 if (getWakefulnessLocked() != WAKEFULNESS_DOZING) { 2153 wakeLockSummary &= ~(WAKE_LOCK_DOZE | WAKE_LOCK_DRAW); 2154 } 2155 if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP 2156 || (wakeLockSummary & WAKE_LOCK_DOZE) != 0) { 2157 wakeLockSummary &= ~(WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM 2158 | WAKE_LOCK_BUTTON_BRIGHT); 2159 if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP) { 2160 wakeLockSummary &= ~WAKE_LOCK_PROXIMITY_SCREEN_OFF; 2161 } 2162 } 2163 2164 // Infer implied wake locks where necessary based on the current state. 2165 if ((wakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM)) != 0) { 2166 if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) { 2167 wakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE; 2168 } else if (getWakefulnessLocked() == WAKEFULNESS_DREAMING) { 2169 wakeLockSummary |= WAKE_LOCK_CPU; 2170 } 2171 } 2172 if ((wakeLockSummary & WAKE_LOCK_DRAW) != 0) { 2173 wakeLockSummary |= WAKE_LOCK_CPU; 2174 } 2175 2176 return wakeLockSummary; 2177 } 2178 2179 /** Get wake lock summary flags that correspond to the given wake lock. */ 2180 private int getWakeLockSummaryFlags(WakeLock wakeLock) { 2181 switch (wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 2182 case PowerManager.PARTIAL_WAKE_LOCK: 2183 if (!wakeLock.mDisabled) { 2184 // We only respect this if the wake lock is not disabled. 2185 return WAKE_LOCK_CPU; 2186 } 2187 break; 2188 case PowerManager.FULL_WAKE_LOCK: 2189 return WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_BUTTON_BRIGHT; 2190 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 2191 return WAKE_LOCK_SCREEN_BRIGHT; 2192 case PowerManager.SCREEN_DIM_WAKE_LOCK: 2193 return WAKE_LOCK_SCREEN_DIM; 2194 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 2195 return WAKE_LOCK_PROXIMITY_SCREEN_OFF; 2196 case PowerManager.DOZE_WAKE_LOCK: 2197 return WAKE_LOCK_DOZE; 2198 case PowerManager.DRAW_WAKE_LOCK: 2199 return WAKE_LOCK_DRAW; 2200 } 2201 return 0; 2202 } 2203 2204 private boolean wakeLockAffectsUser(WakeLock wakeLock, @UserIdInt int userId) { 2205 if (wakeLock.mWorkSource != null) { 2206 for (int k = 0; k < wakeLock.mWorkSource.size(); k++) { 2207 final int uid = wakeLock.mWorkSource.getUid(k); 2208 if (userId == UserHandle.getUserId(uid)) { 2209 return true; 2210 } 2211 } 2212 2213 final List<WorkChain> workChains = wakeLock.mWorkSource.getWorkChains(); 2214 if (workChains != null) { 2215 for (int k = 0; k < workChains.size(); k++) { 2216 final int uid = workChains.get(k).getAttributionUid(); 2217 if (userId == UserHandle.getUserId(uid)) { 2218 return true; 2219 } 2220 } 2221 } 2222 } 2223 return userId == UserHandle.getUserId(wakeLock.mOwnerUid); 2224 } 2225 2226 void checkForLongWakeLocks() { 2227 synchronized (mLock) { 2228 final long now = mClock.uptimeMillis(); 2229 mNotifyLongDispatched = now; 2230 final long when = now - MIN_LONG_WAKE_CHECK_INTERVAL; 2231 long nextCheckTime = Long.MAX_VALUE; 2232 final int numWakeLocks = mWakeLocks.size(); 2233 for (int i = 0; i < numWakeLocks; i++) { 2234 final WakeLock wakeLock = mWakeLocks.get(i); 2235 if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) 2236 == PowerManager.PARTIAL_WAKE_LOCK) { 2237 if (wakeLock.mNotifiedAcquired && !wakeLock.mNotifiedLong) { 2238 if (wakeLock.mAcquireTime < when) { 2239 // This wake lock has exceeded the long acquire time, report! 2240 notifyWakeLockLongStartedLocked(wakeLock); 2241 } else { 2242 // This wake lock could still become a long one, at this time. 2243 long checkTime = wakeLock.mAcquireTime + MIN_LONG_WAKE_CHECK_INTERVAL; 2244 if (checkTime < nextCheckTime) { 2245 nextCheckTime = checkTime; 2246 } 2247 } 2248 } 2249 } 2250 } 2251 mNotifyLongScheduled = 0; 2252 mHandler.removeMessages(MSG_CHECK_FOR_LONG_WAKELOCKS); 2253 if (nextCheckTime != Long.MAX_VALUE) { 2254 mNotifyLongNextCheck = nextCheckTime; 2255 enqueueNotifyLongMsgLocked(nextCheckTime); 2256 } else { 2257 mNotifyLongNextCheck = 0; 2258 } 2259 } 2260 } 2261 2262 /** 2263 * Updates the value of mUserActivitySummary to summarize the user requested 2264 * state of the system such as whether the screen should be bright or dim. 2265 * Note that user activity is ignored when the system is asleep. 2266 * 2267 * This function must have no other side-effects. 2268 */ 2269 private void updateUserActivitySummaryLocked(long now, int dirty) { 2270 // Update the status of the user activity timeout timer. 2271 if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY 2272 | DIRTY_WAKEFULNESS | DIRTY_SETTINGS)) != 0) { 2273 mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT); 2274 2275 long nextTimeout = 0; 2276 if (getWakefulnessLocked() == WAKEFULNESS_AWAKE 2277 || getWakefulnessLocked() == WAKEFULNESS_DREAMING 2278 || getWakefulnessLocked() == WAKEFULNESS_DOZING) { 2279 final long attentiveTimeout = getAttentiveTimeoutLocked(); 2280 final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout); 2281 final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, 2282 attentiveTimeout); 2283 final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout); 2284 final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager; 2285 final long nextProfileTimeout = getNextProfileTimeoutLocked(now); 2286 2287 mUserActivitySummary = 0; 2288 if (mLastUserActivityTime >= mLastWakeTime) { 2289 nextTimeout = mLastUserActivityTime 2290 + screenOffTimeout - screenDimDuration; 2291 if (now < nextTimeout) { 2292 mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT; 2293 } else { 2294 nextTimeout = mLastUserActivityTime + screenOffTimeout; 2295 if (now < nextTimeout) { 2296 mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM; 2297 } 2298 } 2299 } 2300 if (mUserActivitySummary == 0 2301 && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) { 2302 nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout; 2303 if (now < nextTimeout) { 2304 if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT 2305 || mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) { 2306 mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT; 2307 } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) { 2308 mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM; 2309 } 2310 } 2311 } 2312 2313 if (mUserActivitySummary == 0) { 2314 if (sleepTimeout >= 0) { 2315 final long anyUserActivity = Math.max(mLastUserActivityTime, 2316 mLastUserActivityTimeNoChangeLights); 2317 if (anyUserActivity >= mLastWakeTime) { 2318 nextTimeout = anyUserActivity + sleepTimeout; 2319 if (now < nextTimeout) { 2320 mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM; 2321 } 2322 } 2323 } else { 2324 mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM; 2325 nextTimeout = -1; 2326 } 2327 } 2328 2329 if (mUserActivitySummary != USER_ACTIVITY_SCREEN_DREAM && userInactiveOverride) { 2330 if ((mUserActivitySummary & 2331 (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0) { 2332 // Device is being kept awake by recent user activity 2333 if (nextTimeout >= now && mOverriddenTimeout == -1) { 2334 // Save when the next timeout would have occurred 2335 mOverriddenTimeout = nextTimeout; 2336 } 2337 } 2338 mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM; 2339 nextTimeout = -1; 2340 } 2341 2342 if ((mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0 2343 && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) { 2344 nextTimeout = mAttentionDetector.updateUserActivity(nextTimeout, 2345 screenDimDuration); 2346 } 2347 2348 if (nextProfileTimeout > 0) { 2349 nextTimeout = Math.min(nextTimeout, nextProfileTimeout); 2350 } 2351 2352 if (mUserActivitySummary != 0 && nextTimeout >= 0) { 2353 scheduleUserInactivityTimeout(nextTimeout); 2354 } 2355 } else { 2356 mUserActivitySummary = 0; 2357 } 2358 2359 if (DEBUG_SPEW) { 2360 Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness=" 2361 + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked()) 2362 + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary) 2363 + ", nextTimeout=" + TimeUtils.formatUptime(nextTimeout)); 2364 } 2365 } 2366 } 2367 2368 private void scheduleUserInactivityTimeout(long timeMs) { 2369 final Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT); 2370 msg.setAsynchronous(true); 2371 mHandler.sendMessageAtTime(msg, timeMs); 2372 } 2373 2374 private void scheduleAttentiveTimeout(long timeMs) { 2375 final Message msg = mHandler.obtainMessage(MSG_ATTENTIVE_TIMEOUT); 2376 msg.setAsynchronous(true); 2377 mHandler.sendMessageAtTime(msg, timeMs); 2378 } 2379 2380 /** 2381 * Finds the next profile timeout time or returns -1 if there are no profiles to be locked. 2382 */ 2383 private long getNextProfileTimeoutLocked(long now) { 2384 long nextTimeout = -1; 2385 final int numProfiles = mProfilePowerState.size(); 2386 for (int i = 0; i < numProfiles; i++) { 2387 final ProfilePowerState profile = mProfilePowerState.valueAt(i); 2388 final long timeout = profile.mLastUserActivityTime + profile.mScreenOffTimeout; 2389 if (timeout > now && (nextTimeout == -1 || timeout < nextTimeout)) { 2390 nextTimeout = timeout; 2391 } 2392 } 2393 return nextTimeout; 2394 } 2395 2396 private void updateAttentiveStateLocked(long now, int dirty) { 2397 long attentiveTimeout = getAttentiveTimeoutLocked(); 2398 long goToSleepTime = mLastUserActivityTime + attentiveTimeout; 2399 long showWarningTime = goToSleepTime - mAttentiveWarningDurationConfig; 2400 2401 boolean warningDismissed = maybeHideInattentiveSleepWarningLocked(now, showWarningTime); 2402 2403 if (attentiveTimeout >= 0 && (warningDismissed 2404 || (dirty & (DIRTY_ATTENTIVE | DIRTY_STAY_ON | DIRTY_SCREEN_BRIGHTNESS_BOOST 2405 | DIRTY_PROXIMITY_POSITIVE | DIRTY_WAKEFULNESS | DIRTY_BOOT_COMPLETED 2406 | DIRTY_SETTINGS)) != 0)) { 2407 if (DEBUG_SPEW) { 2408 Slog.d(TAG, "Updating attentive state"); 2409 } 2410 2411 mHandler.removeMessages(MSG_ATTENTIVE_TIMEOUT); 2412 2413 if (isBeingKeptFromShowingInattentiveSleepWarningLocked()) { 2414 return; 2415 } 2416 2417 long nextTimeout = -1; 2418 2419 if (now < showWarningTime) { 2420 nextTimeout = showWarningTime; 2421 } else if (now < goToSleepTime) { 2422 if (DEBUG) { 2423 long timeToSleep = goToSleepTime - now; 2424 Slog.d(TAG, "Going to sleep in " + timeToSleep 2425 + "ms if there is no user activity"); 2426 } 2427 mInattentiveSleepWarningOverlayController.show(); 2428 nextTimeout = goToSleepTime; 2429 } else { 2430 if (DEBUG && getWakefulnessLocked() != WAKEFULNESS_ASLEEP) { 2431 Slog.i(TAG, "Going to sleep now due to long user inactivity"); 2432 } 2433 } 2434 2435 if (nextTimeout >= 0) { 2436 scheduleAttentiveTimeout(nextTimeout); 2437 } 2438 } 2439 } 2440 2441 private boolean maybeHideInattentiveSleepWarningLocked(long now, long showWarningTime) { 2442 long attentiveTimeout = getAttentiveTimeoutLocked(); 2443 2444 if (!mInattentiveSleepWarningOverlayController.isShown()) { 2445 return false; 2446 } 2447 2448 if (getWakefulnessLocked() != WAKEFULNESS_AWAKE) { 2449 mInattentiveSleepWarningOverlayController.dismiss(false); 2450 return true; 2451 } else if (attentiveTimeout < 0 || isBeingKeptFromShowingInattentiveSleepWarningLocked() 2452 || now < showWarningTime) { 2453 mInattentiveSleepWarningOverlayController.dismiss(true); 2454 return true; 2455 } 2456 2457 return false; 2458 } 2459 2460 private boolean isAttentiveTimeoutExpired(long now) { 2461 long attentiveTimeout = getAttentiveTimeoutLocked(); 2462 return attentiveTimeout >= 0 && now >= mLastUserActivityTime + attentiveTimeout; 2463 } 2464 2465 /** 2466 * Called when a user activity timeout has occurred. 2467 * Simply indicates that something about user activity has changed so that the new 2468 * state can be recomputed when the power state is updated. 2469 * 2470 * This function must have no other side-effects besides setting the dirty 2471 * bit and calling update power state. Wakefulness transitions are handled elsewhere. 2472 */ 2473 private void handleUserActivityTimeout() { // runs on handler thread 2474 synchronized (mLock) { 2475 if (DEBUG_SPEW) { 2476 Slog.d(TAG, "handleUserActivityTimeout"); 2477 } 2478 2479 mDirty |= DIRTY_USER_ACTIVITY; 2480 updatePowerStateLocked(); 2481 } 2482 } 2483 2484 private void handleAttentiveTimeout() { // runs on handler thread 2485 synchronized (mLock) { 2486 if (DEBUG_SPEW) { 2487 Slog.d(TAG, "handleAttentiveTimeout"); 2488 } 2489 2490 mDirty |= DIRTY_ATTENTIVE; 2491 updatePowerStateLocked(); 2492 } 2493 } 2494 2495 private long getAttentiveTimeoutLocked() { 2496 long timeout = mAttentiveTimeoutSetting; 2497 if (timeout <= 0) { 2498 return -1; 2499 } 2500 2501 return Math.max(timeout, mMinimumScreenOffTimeoutConfig); 2502 } 2503 2504 private long getSleepTimeoutLocked(long attentiveTimeout) { 2505 long timeout = mSleepTimeoutSetting; 2506 if (timeout <= 0) { 2507 return -1; 2508 } 2509 if (attentiveTimeout >= 0) { 2510 timeout = Math.min(timeout, attentiveTimeout); 2511 } 2512 return Math.max(timeout, mMinimumScreenOffTimeoutConfig); 2513 } 2514 2515 private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) { 2516 long timeout = mScreenOffTimeoutSetting; 2517 if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) { 2518 timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin); 2519 } 2520 if (mUserActivityTimeoutOverrideFromWindowManager >= 0) { 2521 timeout = Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager); 2522 } 2523 if (sleepTimeout >= 0) { 2524 timeout = Math.min(timeout, sleepTimeout); 2525 } 2526 if (attentiveTimeout >= 0) { 2527 timeout = Math.min(timeout, attentiveTimeout); 2528 } 2529 return Math.max(timeout, mMinimumScreenOffTimeoutConfig); 2530 } 2531 2532 private long getScreenDimDurationLocked(long screenOffTimeout) { 2533 return Math.min(mMaximumScreenDimDurationConfig, 2534 (long)(screenOffTimeout * mMaximumScreenDimRatioConfig)); 2535 } 2536 2537 /** 2538 * Updates the wakefulness of the device. 2539 * 2540 * This is the function that decides whether the device should start dreaming 2541 * based on the current wake locks and user activity state. It may modify mDirty 2542 * if the wakefulness changes. 2543 * 2544 * Returns true if the wakefulness changed and we need to restart power state calculation. 2545 */ 2546 private boolean updateWakefulnessLocked(int dirty) { 2547 boolean changed = false; 2548 if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED 2549 | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE 2550 | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS 2551 | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) { 2552 if (getWakefulnessLocked() == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) { 2553 if (DEBUG_SPEW) { 2554 Slog.d(TAG, "updateWakefulnessLocked: Bed time..."); 2555 } 2556 final long time = mClock.uptimeMillis(); 2557 if (isAttentiveTimeoutExpired(time)) { 2558 changed = goToSleepNoUpdateLocked(time, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 2559 PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID); 2560 } else if (shouldNapAtBedTimeLocked()) { 2561 changed = napNoUpdateLocked(time, Process.SYSTEM_UID); 2562 } else { 2563 changed = goToSleepNoUpdateLocked(time, 2564 PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID); 2565 } 2566 } 2567 } 2568 return changed; 2569 } 2570 2571 /** 2572 * Returns true if the device should automatically nap and start dreaming when the user 2573 * activity timeout has expired and it's bedtime. 2574 */ 2575 private boolean shouldNapAtBedTimeLocked() { 2576 return mDreamsActivateOnSleepSetting 2577 || (mDreamsActivateOnDockSetting 2578 && mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED); 2579 } 2580 2581 /** 2582 * Returns true if the device should go to sleep now. 2583 * Also used when exiting a dream to determine whether we should go back 2584 * to being fully awake or else go to sleep for good. 2585 */ 2586 private boolean isItBedTimeYetLocked() { 2587 if (!mBootCompleted) { 2588 return false; 2589 } 2590 2591 long now = mClock.uptimeMillis(); 2592 if (isAttentiveTimeoutExpired(now)) { 2593 return !isBeingKeptFromInattentiveSleepLocked(); 2594 } else { 2595 return !isBeingKeptAwakeLocked(); 2596 } 2597 } 2598 2599 /** 2600 * Returns true if the device is being kept awake by a wake lock, user activity 2601 * or the stay on while powered setting. We also keep the phone awake when 2602 * the proximity sensor returns a positive result so that the device does not 2603 * lock while in a phone call. This function only controls whether the device 2604 * will go to sleep or dream which is independent of whether it will be allowed 2605 * to suspend. 2606 */ 2607 private boolean isBeingKeptAwakeLocked() { 2608 return mStayOn 2609 || mProximityPositive 2610 || (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0 2611 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT 2612 | USER_ACTIVITY_SCREEN_DIM)) != 0 2613 || mScreenBrightnessBoostInProgress; 2614 } 2615 2616 /** 2617 * Returns true if the device is prevented from going into inattentive sleep by the stay on 2618 * while powered setting. We also keep the device awake when the proximity sensor returns a 2619 * positive result so that the device does not lock while in a phone call. This function only 2620 * controls whether the device will go to sleep which is independent of whether it will be 2621 * allowed to suspend. 2622 */ 2623 private boolean isBeingKeptFromInattentiveSleepLocked() { 2624 return mStayOn || mScreenBrightnessBoostInProgress || mProximityPositive 2625 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT 2626 | USER_ACTIVITY_SCREEN_DIM)) != 0; 2627 } 2628 2629 private boolean isBeingKeptFromShowingInattentiveSleepWarningLocked() { 2630 return mStayOn || mScreenBrightnessBoostInProgress || mProximityPositive || !mBootCompleted; 2631 } 2632 2633 /** 2634 * Determines whether to post a message to the sandman to update the dream state. 2635 */ 2636 private void updateDreamLocked(int dirty, boolean displayBecameReady) { 2637 if ((dirty & (DIRTY_WAKEFULNESS 2638 | DIRTY_USER_ACTIVITY 2639 | DIRTY_ATTENTIVE 2640 | DIRTY_WAKE_LOCKS 2641 | DIRTY_BOOT_COMPLETED 2642 | DIRTY_SETTINGS 2643 | DIRTY_IS_POWERED 2644 | DIRTY_STAY_ON 2645 | DIRTY_PROXIMITY_POSITIVE 2646 | DIRTY_BATTERY_STATE)) != 0 || displayBecameReady) { 2647 if (mDisplayReady) { 2648 scheduleSandmanLocked(); 2649 } 2650 } 2651 } 2652 2653 private void scheduleSandmanLocked() { 2654 if (!mSandmanScheduled) { 2655 mSandmanScheduled = true; 2656 Message msg = mHandler.obtainMessage(MSG_SANDMAN); 2657 msg.setAsynchronous(true); 2658 mHandler.sendMessage(msg); 2659 } 2660 } 2661 2662 /** 2663 * Called when the device enters or exits a dreaming or dozing state. 2664 * 2665 * We do this asynchronously because we must call out of the power manager to start 2666 * the dream and we don't want to hold our lock while doing so. There is a risk that 2667 * the device will wake or go to sleep in the meantime so we have to handle that case. 2668 */ 2669 private void handleSandman() { // runs on handler thread 2670 // Handle preconditions. 2671 final boolean startDreaming; 2672 final int wakefulness; 2673 synchronized (mLock) { 2674 mSandmanScheduled = false; 2675 wakefulness = getWakefulnessLocked(); 2676 if (mSandmanSummoned && mDisplayReady) { 2677 startDreaming = canDreamLocked() || canDozeLocked(); 2678 mSandmanSummoned = false; 2679 } else { 2680 startDreaming = false; 2681 } 2682 } 2683 2684 // Start dreaming if needed. 2685 // We only control the dream on the handler thread, so we don't need to worry about 2686 // concurrent attempts to start or stop the dream. 2687 final boolean isDreaming; 2688 if (mDreamManager != null) { 2689 // Restart the dream whenever the sandman is summoned. 2690 if (startDreaming) { 2691 mDreamManager.stopDream(false /*immediate*/); 2692 mDreamManager.startDream(wakefulness == WAKEFULNESS_DOZING); 2693 } 2694 isDreaming = mDreamManager.isDreaming(); 2695 } else { 2696 isDreaming = false; 2697 } 2698 2699 // At this point, we either attempted to start the dream or no attempt will be made, 2700 // so stop holding the display suspend blocker for Doze. 2701 mDozeStartInProgress = false; 2702 2703 // Update dream state. 2704 synchronized (mLock) { 2705 // Remember the initial battery level when the dream started. 2706 if (startDreaming && isDreaming) { 2707 mBatteryLevelWhenDreamStarted = mBatteryLevel; 2708 if (wakefulness == WAKEFULNESS_DOZING) { 2709 Slog.i(TAG, "Dozing..."); 2710 } else { 2711 Slog.i(TAG, "Dreaming..."); 2712 } 2713 } 2714 2715 // If preconditions changed, wait for the next iteration to determine 2716 // whether the dream should continue (or be restarted). 2717 if (mSandmanSummoned || getWakefulnessLocked() != wakefulness) { 2718 return; // wait for next cycle 2719 } 2720 2721 // Determine whether the dream should continue. 2722 long now = mClock.uptimeMillis(); 2723 if (wakefulness == WAKEFULNESS_DREAMING) { 2724 if (isDreaming && canDreamLocked()) { 2725 if (mDreamsBatteryLevelDrainCutoffConfig >= 0 2726 && mBatteryLevel < mBatteryLevelWhenDreamStarted 2727 - mDreamsBatteryLevelDrainCutoffConfig 2728 && !isBeingKeptAwakeLocked()) { 2729 // If the user activity timeout expired and the battery appears 2730 // to be draining faster than it is charging then stop dreaming 2731 // and go to sleep. 2732 Slog.i(TAG, "Stopping dream because the battery appears to " 2733 + "be draining faster than it is charging. " 2734 + "Battery level when dream started: " 2735 + mBatteryLevelWhenDreamStarted + "%. " 2736 + "Battery level now: " + mBatteryLevel + "%."); 2737 } else { 2738 return; // continue dreaming 2739 } 2740 } 2741 2742 // Dream has ended or will be stopped. Update the power state. 2743 if (isItBedTimeYetLocked()) { 2744 int flags = 0; 2745 if (isAttentiveTimeoutExpired(now)) { 2746 flags |= PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE; 2747 } 2748 goToSleepNoUpdateLocked(now, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, flags, 2749 Process.SYSTEM_UID); 2750 updatePowerStateLocked(); 2751 } else { 2752 wakeUpNoUpdateLocked(now, 2753 PowerManager.WAKE_REASON_UNKNOWN, 2754 "android.server.power:DREAM_FINISHED", Process.SYSTEM_UID, 2755 mContext.getOpPackageName(), Process.SYSTEM_UID); 2756 updatePowerStateLocked(); 2757 } 2758 } else if (wakefulness == WAKEFULNESS_DOZING) { 2759 if (isDreaming) { 2760 return; // continue dozing 2761 } 2762 2763 // Doze has ended or will be stopped. Update the power state. 2764 reallyGoToSleepNoUpdateLocked(now, Process.SYSTEM_UID); 2765 updatePowerStateLocked(); 2766 } 2767 } 2768 2769 // Stop dream. 2770 if (isDreaming) { 2771 mDreamManager.stopDream(false /*immediate*/); 2772 } 2773 } 2774 2775 /** 2776 * Returns true if the device is allowed to dream in its current state. 2777 */ 2778 private boolean canDreamLocked() { 2779 if (getWakefulnessLocked() != WAKEFULNESS_DREAMING 2780 || !mDreamsSupportedConfig 2781 || !mDreamsEnabledSetting 2782 || !mDisplayPowerRequest.isBrightOrDim() 2783 || mDisplayPowerRequest.isVr() 2784 || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT 2785 | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0 2786 || !mBootCompleted) { 2787 return false; 2788 } 2789 if (!isBeingKeptAwakeLocked()) { 2790 if (!mIsPowered && !mDreamsEnabledOnBatteryConfig) { 2791 return false; 2792 } 2793 if (!mIsPowered 2794 && mDreamsBatteryLevelMinimumWhenNotPoweredConfig >= 0 2795 && mBatteryLevel < mDreamsBatteryLevelMinimumWhenNotPoweredConfig) { 2796 return false; 2797 } 2798 if (mIsPowered 2799 && mDreamsBatteryLevelMinimumWhenPoweredConfig >= 0 2800 && mBatteryLevel < mDreamsBatteryLevelMinimumWhenPoweredConfig) { 2801 return false; 2802 } 2803 } 2804 return true; 2805 } 2806 2807 /** 2808 * Returns true if the device is allowed to doze in its current state. 2809 */ 2810 private boolean canDozeLocked() { 2811 return getWakefulnessLocked() == WAKEFULNESS_DOZING; 2812 } 2813 2814 /** 2815 * Updates the display power state asynchronously. 2816 * When the update is finished, mDisplayReady will be set to true. The display 2817 * controller posts a message to tell us when the actual display power state 2818 * has been updated so we come back here to double-check and finish up. 2819 * 2820 * This function recalculates the display power state each time. 2821 * 2822 * @return True if the display became ready. 2823 */ 2824 private boolean updateDisplayPowerStateLocked(int dirty) { 2825 final boolean oldDisplayReady = mDisplayReady; 2826 if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS 2827 | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED 2828 | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_VR_MODE_CHANGED | 2829 DIRTY_QUIESCENT)) != 0) { 2830 if ((dirty & DIRTY_QUIESCENT) != 0) { 2831 sQuiescent = false; 2832 } 2833 2834 mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked(); 2835 2836 // Determine appropriate screen brightness and auto-brightness adjustments. 2837 final boolean autoBrightness; 2838 final float screenBrightnessOverride; 2839 if (!mBootCompleted) { 2840 // Keep the brightness steady during boot. This requires the 2841 // bootloader brightness and the default brightness to be identical. 2842 autoBrightness = false; 2843 screenBrightnessOverride = mScreenBrightnessSettingDefault; 2844 } else if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) { 2845 autoBrightness = false; 2846 screenBrightnessOverride = mScreenBrightnessOverrideFromWindowManager; 2847 } else { 2848 autoBrightness = (mScreenBrightnessModeSetting == 2849 Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); 2850 screenBrightnessOverride = PowerManager.BRIGHTNESS_INVALID_FLOAT; 2851 } 2852 2853 // Update display power request. 2854 mDisplayPowerRequest.screenBrightnessOverride = screenBrightnessOverride; 2855 mDisplayPowerRequest.useAutoBrightness = autoBrightness; 2856 mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked(); 2857 mDisplayPowerRequest.boostScreenBrightness = shouldBoostScreenBrightness(); 2858 2859 updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest); 2860 2861 if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { 2862 mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; 2863 if ((mWakeLockSummary & WAKE_LOCK_DRAW) != 0 2864 && !mDrawWakeLockOverrideFromSidekick) { 2865 if (mDisplayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) { 2866 mDisplayPowerRequest.dozeScreenState = Display.STATE_DOZE; 2867 } 2868 if (mDisplayPowerRequest.dozeScreenState == Display.STATE_ON_SUSPEND) { 2869 mDisplayPowerRequest.dozeScreenState = Display.STATE_ON; 2870 } 2871 } 2872 mDisplayPowerRequest.dozeScreenBrightness = 2873 mDozeScreenBrightnessOverrideFromDreamManagerFloat; 2874 } else { 2875 mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN; 2876 mDisplayPowerRequest.dozeScreenBrightness = 2877 PowerManager.BRIGHTNESS_INVALID_FLOAT; 2878 } 2879 2880 mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest, 2881 mRequestWaitForNegativeProximity); 2882 mRequestWaitForNegativeProximity = false; 2883 2884 if (DEBUG_SPEW) { 2885 Slog.d(TAG, "updateDisplayPowerStateLocked: mDisplayReady=" + mDisplayReady 2886 + ", policy=" + mDisplayPowerRequest.policy 2887 + ", mWakefulness=" + getWakefulnessLocked() 2888 + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary) 2889 + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary) 2890 + ", mBootCompleted=" + mBootCompleted 2891 + ", screenBrightnessOverride=" + screenBrightnessOverride 2892 + ", useAutoBrightness=" + autoBrightness 2893 + ", mScreenBrightnessBoostInProgress=" + mScreenBrightnessBoostInProgress 2894 + ", mIsVrModeEnabled= " + mIsVrModeEnabled 2895 + ", sQuiescent=" + sQuiescent); 2896 } 2897 } 2898 return mDisplayReady && !oldDisplayReady; 2899 } 2900 2901 private void updateScreenBrightnessBoostLocked(int dirty) { 2902 if ((dirty & DIRTY_SCREEN_BRIGHTNESS_BOOST) != 0) { 2903 if (mScreenBrightnessBoostInProgress) { 2904 final long now = mClock.uptimeMillis(); 2905 mHandler.removeMessages(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT); 2906 if (mLastScreenBrightnessBoostTime > mLastSleepTime) { 2907 final long boostTimeout = mLastScreenBrightnessBoostTime + 2908 SCREEN_BRIGHTNESS_BOOST_TIMEOUT; 2909 if (boostTimeout > now) { 2910 Message msg = mHandler.obtainMessage(MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT); 2911 msg.setAsynchronous(true); 2912 mHandler.sendMessageAtTime(msg, boostTimeout); 2913 return; 2914 } 2915 } 2916 mScreenBrightnessBoostInProgress = false; 2917 userActivityNoUpdateLocked(now, 2918 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); 2919 } 2920 } 2921 } 2922 2923 private boolean shouldBoostScreenBrightness() { 2924 return !mIsVrModeEnabled && mScreenBrightnessBoostInProgress; 2925 } 2926 2927 private static boolean isValidBrightness(float value) { 2928 return value >= PowerManager.BRIGHTNESS_MIN && value <= PowerManager.BRIGHTNESS_MAX; 2929 } 2930 2931 @VisibleForTesting 2932 int getDesiredScreenPolicyLocked() { 2933 if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP || sQuiescent) { 2934 return DisplayPowerRequest.POLICY_OFF; 2935 } 2936 2937 if (getWakefulnessLocked() == WAKEFULNESS_DOZING) { 2938 if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) { 2939 return DisplayPowerRequest.POLICY_DOZE; 2940 } 2941 if (mDozeAfterScreenOff) { 2942 return DisplayPowerRequest.POLICY_OFF; 2943 } 2944 // Fall through and preserve the current screen policy if not configured to 2945 // doze after screen off. This causes the screen off transition to be skipped. 2946 } 2947 2948 // It is important that POLICY_VR check happens after the wakefulness checks above so 2949 // that VR-mode does not prevent displays from transitioning to the correct state when 2950 // dozing or sleeping. 2951 if (mIsVrModeEnabled) { 2952 return DisplayPowerRequest.POLICY_VR; 2953 } 2954 2955 if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0 2956 || (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0 2957 || !mBootCompleted 2958 || mScreenBrightnessBoostInProgress) { 2959 return DisplayPowerRequest.POLICY_BRIGHT; 2960 } 2961 2962 return DisplayPowerRequest.POLICY_DIM; 2963 } 2964 2965 private final DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks = 2966 new DisplayManagerInternal.DisplayPowerCallbacks() { 2967 private int mDisplayState = Display.STATE_UNKNOWN; 2968 2969 @Override 2970 public void onStateChanged() { 2971 synchronized (mLock) { 2972 mDirty |= DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED; 2973 updatePowerStateLocked(); 2974 } 2975 } 2976 2977 @Override 2978 public void onProximityPositive() { 2979 synchronized (mLock) { 2980 mProximityPositive = true; 2981 mDirty |= DIRTY_PROXIMITY_POSITIVE; 2982 updatePowerStateLocked(); 2983 } 2984 } 2985 2986 @Override 2987 public void onProximityNegative() { 2988 synchronized (mLock) { 2989 mProximityPositive = false; 2990 mDirty |= DIRTY_PROXIMITY_POSITIVE; 2991 userActivityNoUpdateLocked(mClock.uptimeMillis(), 2992 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); 2993 updatePowerStateLocked(); 2994 } 2995 } 2996 2997 @Override 2998 public void onDisplayStateChange(int state) { 2999 // This method is only needed to support legacy display blanking behavior 3000 // where the display's power state is coupled to suspend or to the power HAL. 3001 // The order of operations matters here. 3002 synchronized (mLock) { 3003 if (mDisplayState != state) { 3004 mDisplayState = state; 3005 setPowerModeInternal(MODE_DISPLAY_INACTIVE, 3006 !Display.isActiveState(state)); 3007 if (state == Display.STATE_OFF) { 3008 if (!mDecoupleHalInteractiveModeFromDisplayConfig) { 3009 setHalInteractiveModeLocked(false); 3010 } 3011 if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) { 3012 setHalAutoSuspendModeLocked(true); 3013 } 3014 } else { 3015 if (!mDecoupleHalAutoSuspendModeFromDisplayConfig) { 3016 setHalAutoSuspendModeLocked(false); 3017 } 3018 if (!mDecoupleHalInteractiveModeFromDisplayConfig) { 3019 setHalInteractiveModeLocked(true); 3020 } 3021 } 3022 } 3023 } 3024 } 3025 3026 @Override 3027 public void acquireSuspendBlocker() { 3028 mDisplaySuspendBlocker.acquire(); 3029 } 3030 3031 @Override 3032 public void releaseSuspendBlocker() { 3033 mDisplaySuspendBlocker.release(); 3034 } 3035 3036 @Override 3037 public String toString() { 3038 synchronized (this) { 3039 return "state=" + Display.stateToString(mDisplayState); 3040 } 3041 } 3042 }; 3043 3044 private boolean shouldUseProximitySensorLocked() { 3045 return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; 3046 } 3047 3048 /** 3049 * Updates the suspend blocker that keeps the CPU alive. 3050 * 3051 * This function must have no other side-effects. 3052 */ 3053 private void updateSuspendBlockerLocked() { 3054 final boolean needWakeLockSuspendBlocker = ((mWakeLockSummary & WAKE_LOCK_CPU) != 0); 3055 final boolean needDisplaySuspendBlocker = needDisplaySuspendBlockerLocked(); 3056 final boolean autoSuspend = !needDisplaySuspendBlocker; 3057 final boolean interactive = mDisplayPowerRequest.isBrightOrDim(); 3058 3059 // Disable auto-suspend if needed. 3060 // FIXME We should consider just leaving auto-suspend enabled forever since 3061 // we already hold the necessary wakelocks. 3062 if (!autoSuspend && mDecoupleHalAutoSuspendModeFromDisplayConfig) { 3063 setHalAutoSuspendModeLocked(false); 3064 } 3065 3066 // First acquire suspend blockers if needed. 3067 if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) { 3068 mWakeLockSuspendBlocker.acquire(); 3069 mHoldingWakeLockSuspendBlocker = true; 3070 } 3071 if (needDisplaySuspendBlocker && !mHoldingDisplaySuspendBlocker) { 3072 mDisplaySuspendBlocker.acquire(); 3073 mHoldingDisplaySuspendBlocker = true; 3074 } 3075 3076 // Inform the power HAL about interactive mode. 3077 // Although we could set interactive strictly based on the wakefulness 3078 // as reported by isInteractive(), it is actually more desirable to track 3079 // the display policy state instead so that the interactive state observed 3080 // by the HAL more accurately tracks transitions between AWAKE and DOZING. 3081 // Refer to getDesiredScreenPolicyLocked() for details. 3082 if (mDecoupleHalInteractiveModeFromDisplayConfig) { 3083 // When becoming non-interactive, we want to defer sending this signal 3084 // until the display is actually ready so that all transitions have 3085 // completed. This is probably a good sign that things have gotten 3086 // too tangled over here... 3087 if (interactive || mDisplayReady) { 3088 setHalInteractiveModeLocked(interactive); 3089 } 3090 } 3091 3092 // Then release suspend blockers if needed. 3093 if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) { 3094 mWakeLockSuspendBlocker.release(); 3095 mHoldingWakeLockSuspendBlocker = false; 3096 } 3097 if (!needDisplaySuspendBlocker && mHoldingDisplaySuspendBlocker) { 3098 mDisplaySuspendBlocker.release(); 3099 mHoldingDisplaySuspendBlocker = false; 3100 } 3101 3102 // Enable auto-suspend if needed. 3103 if (autoSuspend && mDecoupleHalAutoSuspendModeFromDisplayConfig) { 3104 setHalAutoSuspendModeLocked(true); 3105 } 3106 } 3107 3108 /** 3109 * Return true if we must keep a suspend blocker active on behalf of the display. 3110 * We do so if the screen is on or is in transition between states. 3111 */ 3112 private boolean needDisplaySuspendBlockerLocked() { 3113 if (!mDisplayReady) { 3114 return true; 3115 } 3116 if (mDisplayPowerRequest.isBrightOrDim()) { 3117 // If we asked for the screen to be on but it is off due to the proximity 3118 // sensor then we may suspend but only if the configuration allows it. 3119 // On some hardware it may not be safe to suspend because the proximity 3120 // sensor may not be correctly configured as a wake-up source. 3121 if (!mDisplayPowerRequest.useProximitySensor || !mProximityPositive 3122 || !mSuspendWhenScreenOffDueToProximityConfig) { 3123 return true; 3124 } 3125 } 3126 3127 if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE 3128 && mDisplayPowerRequest.dozeScreenState == Display.STATE_ON) { 3129 // Although we are in DOZE and would normally allow the device to suspend, 3130 // the doze service has explicitly requested the display to remain in the ON 3131 // state which means we should hold the display suspend blocker. 3132 return true; 3133 } 3134 if (mScreenBrightnessBoostInProgress) { 3135 return true; 3136 } 3137 3138 // When we transition to DOZING, we have to keep the display suspend blocker 3139 // up until the Doze service has a change to acquire the DOZE wakelock. 3140 // Here we wait for mWakefulnessChanging to become false since the wakefulness 3141 // transition to DOZING isn't considered "changed" until the doze wake lock is 3142 // acquired. 3143 if (getWakefulnessLocked() == WAKEFULNESS_DOZING && mDozeStartInProgress) { 3144 return true; 3145 } 3146 3147 // Let the system suspend if the screen is off or dozing. 3148 return false; 3149 } 3150 3151 private void setHalAutoSuspendModeLocked(boolean enable) { 3152 if (enable != mHalAutoSuspendModeEnabled) { 3153 if (DEBUG) { 3154 Slog.d(TAG, "Setting HAL auto-suspend mode to " + enable); 3155 } 3156 mHalAutoSuspendModeEnabled = enable; 3157 Trace.traceBegin(Trace.TRACE_TAG_POWER, "setHalAutoSuspend(" + enable + ")"); 3158 try { 3159 mNativeWrapper.nativeSetAutoSuspend(enable); 3160 } finally { 3161 Trace.traceEnd(Trace.TRACE_TAG_POWER); 3162 } 3163 } 3164 } 3165 3166 private void setHalInteractiveModeLocked(boolean enable) { 3167 if (enable != mHalInteractiveModeEnabled) { 3168 if (DEBUG) { 3169 Slog.d(TAG, "Setting HAL interactive mode to " + enable); 3170 } 3171 mHalInteractiveModeEnabled = enable; 3172 Trace.traceBegin(Trace.TRACE_TAG_POWER, "setHalInteractive(" + enable + ")"); 3173 try { 3174 mNativeWrapper.nativeSetInteractive(enable); 3175 } finally { 3176 Trace.traceEnd(Trace.TRACE_TAG_POWER); 3177 } 3178 } 3179 } 3180 3181 private boolean isInteractiveInternal() { 3182 synchronized (mLock) { 3183 return PowerManagerInternal.isInteractive(getWakefulnessLocked()); 3184 } 3185 } 3186 3187 private boolean setLowPowerModeInternal(boolean enabled) { 3188 synchronized (mLock) { 3189 if (DEBUG) { 3190 Slog.d(TAG, "setLowPowerModeInternal " + enabled + " mIsPowered=" + mIsPowered); 3191 } 3192 if (mIsPowered) { 3193 return false; 3194 } 3195 3196 mBatterySaverStateMachine.setBatterySaverEnabledManually(enabled); 3197 3198 return true; 3199 } 3200 } 3201 3202 boolean isDeviceIdleModeInternal() { 3203 synchronized (mLock) { 3204 return mDeviceIdleMode; 3205 } 3206 } 3207 3208 boolean isLightDeviceIdleModeInternal() { 3209 synchronized (mLock) { 3210 return mLightDeviceIdleMode; 3211 } 3212 } 3213 3214 private void handleBatteryStateChangedLocked() { 3215 mDirty |= DIRTY_BATTERY_STATE; 3216 updatePowerStateLocked(); 3217 } 3218 3219 private void shutdownOrRebootInternal(final @HaltMode int haltMode, final boolean confirm, 3220 @Nullable final String reason, boolean wait) { 3221 if (PowerManager.REBOOT_USERSPACE.equals(reason)) { 3222 if (!PowerManager.isRebootingUserspaceSupportedImpl()) { 3223 throw new UnsupportedOperationException( 3224 "Attempted userspace reboot on a device that doesn't support it"); 3225 } 3226 UserspaceRebootLogger.noteUserspaceRebootWasRequested(); 3227 } 3228 if (mHandler == null || !mSystemReady) { 3229 if (RescueParty.isAttemptingFactoryReset()) { 3230 // If we're stuck in a really low-level reboot loop, and a 3231 // rescue party is trying to prompt the user for a factory data 3232 // reset, we must GET TO DA CHOPPA! 3233 PowerManagerService.lowLevelReboot(reason); 3234 } else { 3235 throw new IllegalStateException("Too early to call shutdown() or reboot()"); 3236 } 3237 } 3238 3239 Runnable runnable = new Runnable() { 3240 @Override 3241 public void run() { 3242 synchronized (this) { 3243 if (haltMode == HALT_MODE_REBOOT_SAFE_MODE) { 3244 ShutdownThread.rebootSafeMode(getUiContext(), confirm); 3245 } else if (haltMode == HALT_MODE_REBOOT) { 3246 ShutdownThread.reboot(getUiContext(), reason, confirm); 3247 } else { 3248 ShutdownThread.shutdown(getUiContext(), reason, confirm); 3249 } 3250 } 3251 } 3252 }; 3253 3254 // ShutdownThread must run on a looper capable of displaying the UI. 3255 Message msg = Message.obtain(UiThread.getHandler(), runnable); 3256 msg.setAsynchronous(true); 3257 UiThread.getHandler().sendMessage(msg); 3258 3259 // PowerManager.reboot() is documented not to return so just wait for the inevitable. 3260 if (wait) { 3261 synchronized (runnable) { 3262 while (true) { 3263 try { 3264 runnable.wait(); 3265 } catch (InterruptedException e) { 3266 } 3267 } 3268 } 3269 } 3270 } 3271 3272 private void crashInternal(final String message) { 3273 Thread t = new Thread("PowerManagerService.crash()") { 3274 @Override 3275 public void run() { 3276 throw new RuntimeException(message); 3277 } 3278 }; 3279 try { 3280 t.start(); 3281 t.join(); 3282 } catch (InterruptedException e) { 3283 Slog.wtf(TAG, e); 3284 } 3285 } 3286 3287 @VisibleForTesting 3288 void updatePowerRequestFromBatterySaverPolicy(DisplayPowerRequest displayPowerRequest) { 3289 PowerSaveState state = mBatterySaverPolicy. 3290 getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS); 3291 displayPowerRequest.lowPowerMode = state.batterySaverEnabled; 3292 displayPowerRequest.screenLowPowerBrightnessFactor = state.brightnessFactor; 3293 } 3294 3295 void setStayOnSettingInternal(int val) { 3296 Settings.Global.putInt(mContext.getContentResolver(), 3297 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, val); 3298 } 3299 3300 void setMaximumScreenOffTimeoutFromDeviceAdminInternal(@UserIdInt int userId, long timeMs) { 3301 if (userId < 0) { 3302 Slog.wtf(TAG, "Attempt to set screen off timeout for invalid user: " + userId); 3303 return; 3304 } 3305 synchronized (mLock) { 3306 // System-wide timeout 3307 if (userId == UserHandle.USER_SYSTEM) { 3308 mMaximumScreenOffTimeoutFromDeviceAdmin = timeMs; 3309 } else if (timeMs == Long.MAX_VALUE || timeMs == 0) { 3310 mProfilePowerState.delete(userId); 3311 } else { 3312 final ProfilePowerState profile = mProfilePowerState.get(userId); 3313 if (profile != null) { 3314 profile.mScreenOffTimeout = timeMs; 3315 } else { 3316 mProfilePowerState.put(userId, new ProfilePowerState(userId, timeMs, 3317 mClock.uptimeMillis())); 3318 // We need to recalculate wake locks for the new profile state. 3319 mDirty |= DIRTY_WAKE_LOCKS; 3320 } 3321 } 3322 mDirty |= DIRTY_SETTINGS; 3323 updatePowerStateLocked(); 3324 } 3325 } 3326 3327 boolean setDeviceIdleModeInternal(boolean enabled) { 3328 synchronized (mLock) { 3329 if (mDeviceIdleMode == enabled) { 3330 return false; 3331 } 3332 mDeviceIdleMode = enabled; 3333 updateWakeLockDisabledStatesLocked(); 3334 setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode); 3335 } 3336 if (enabled) { 3337 EventLogTags.writeDeviceIdleOnPhase("power"); 3338 } else { 3339 EventLogTags.writeDeviceIdleOffPhase("power"); 3340 } 3341 return true; 3342 } 3343 3344 boolean setLightDeviceIdleModeInternal(boolean enabled) { 3345 synchronized (mLock) { 3346 if (mLightDeviceIdleMode != enabled) { 3347 mLightDeviceIdleMode = enabled; 3348 setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode); 3349 return true; 3350 } 3351 return false; 3352 } 3353 } 3354 3355 void setDeviceIdleWhitelistInternal(int[] appids) { 3356 synchronized (mLock) { 3357 mDeviceIdleWhitelist = appids; 3358 if (mDeviceIdleMode) { 3359 updateWakeLockDisabledStatesLocked(); 3360 } 3361 } 3362 } 3363 3364 void setDeviceIdleTempWhitelistInternal(int[] appids) { 3365 synchronized (mLock) { 3366 mDeviceIdleTempWhitelist = appids; 3367 if (mDeviceIdleMode) { 3368 updateWakeLockDisabledStatesLocked(); 3369 } 3370 } 3371 } 3372 3373 void startUidChangesInternal() { 3374 synchronized (mLock) { 3375 mUidsChanging = true; 3376 } 3377 } 3378 3379 void finishUidChangesInternal() { 3380 synchronized (mLock) { 3381 mUidsChanging = false; 3382 if (mUidsChanged) { 3383 updateWakeLockDisabledStatesLocked(); 3384 mUidsChanged = false; 3385 } 3386 } 3387 } 3388 3389 private void handleUidStateChangeLocked() { 3390 if (mUidsChanging) { 3391 mUidsChanged = true; 3392 } else { 3393 updateWakeLockDisabledStatesLocked(); 3394 } 3395 } 3396 3397 void updateUidProcStateInternal(int uid, int procState) { 3398 synchronized (mLock) { 3399 UidState state = mUidState.get(uid); 3400 if (state == null) { 3401 state = new UidState(uid); 3402 mUidState.put(uid, state); 3403 } 3404 final boolean oldShouldAllow = state.mProcState 3405 <= ActivityManager.PROCESS_STATE_RECEIVER; 3406 state.mProcState = procState; 3407 if (state.mNumWakeLocks > 0) { 3408 if (mDeviceIdleMode) { 3409 handleUidStateChangeLocked(); 3410 } else if (!state.mActive && oldShouldAllow != 3411 (procState <= ActivityManager.PROCESS_STATE_RECEIVER)) { 3412 // If this uid is not active, but the process state has changed such 3413 // that we may still want to allow it to hold a wake lock, then take care of it. 3414 handleUidStateChangeLocked(); 3415 } 3416 } 3417 } 3418 } 3419 3420 void uidGoneInternal(int uid) { 3421 synchronized (mLock) { 3422 final int index = mUidState.indexOfKey(uid); 3423 if (index >= 0) { 3424 UidState state = mUidState.valueAt(index); 3425 state.mProcState = ActivityManager.PROCESS_STATE_NONEXISTENT; 3426 state.mActive = false; 3427 mUidState.removeAt(index); 3428 if (mDeviceIdleMode && state.mNumWakeLocks > 0) { 3429 handleUidStateChangeLocked(); 3430 } 3431 } 3432 } 3433 } 3434 3435 void uidActiveInternal(int uid) { 3436 synchronized (mLock) { 3437 UidState state = mUidState.get(uid); 3438 if (state == null) { 3439 state = new UidState(uid); 3440 state.mProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY; 3441 mUidState.put(uid, state); 3442 } 3443 state.mActive = true; 3444 if (state.mNumWakeLocks > 0) { 3445 handleUidStateChangeLocked(); 3446 } 3447 } 3448 } 3449 3450 void uidIdleInternal(int uid) { 3451 synchronized (mLock) { 3452 UidState state = mUidState.get(uid); 3453 if (state != null) { 3454 state.mActive = false; 3455 if (state.mNumWakeLocks > 0) { 3456 handleUidStateChangeLocked(); 3457 } 3458 } 3459 } 3460 } 3461 3462 private void updateWakeLockDisabledStatesLocked() { 3463 boolean changed = false; 3464 final int numWakeLocks = mWakeLocks.size(); 3465 for (int i = 0; i < numWakeLocks; i++) { 3466 final WakeLock wakeLock = mWakeLocks.get(i); 3467 if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) 3468 == PowerManager.PARTIAL_WAKE_LOCK) { 3469 if (setWakeLockDisabledStateLocked(wakeLock)) { 3470 changed = true; 3471 if (wakeLock.mDisabled) { 3472 // This wake lock is no longer being respected. 3473 notifyWakeLockReleasedLocked(wakeLock); 3474 } else { 3475 notifyWakeLockAcquiredLocked(wakeLock); 3476 } 3477 } 3478 } 3479 } 3480 if (changed) { 3481 mDirty |= DIRTY_WAKE_LOCKS; 3482 updatePowerStateLocked(); 3483 } 3484 } 3485 3486 private boolean setWakeLockDisabledStateLocked(WakeLock wakeLock) { 3487 if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) 3488 == PowerManager.PARTIAL_WAKE_LOCK) { 3489 boolean disabled = false; 3490 final int appid = UserHandle.getAppId(wakeLock.mOwnerUid); 3491 if (appid >= Process.FIRST_APPLICATION_UID) { 3492 // Cached inactive processes are never allowed to hold wake locks. 3493 if (mConstants.NO_CACHED_WAKE_LOCKS) { 3494 disabled = mForceSuspendActive 3495 || (!wakeLock.mUidState.mActive && wakeLock.mUidState.mProcState 3496 != ActivityManager.PROCESS_STATE_NONEXISTENT && 3497 wakeLock.mUidState.mProcState > ActivityManager.PROCESS_STATE_RECEIVER); 3498 } 3499 if (mDeviceIdleMode) { 3500 // If we are in idle mode, we will also ignore all partial wake locks that are 3501 // for application uids that are not whitelisted. 3502 final UidState state = wakeLock.mUidState; 3503 if (Arrays.binarySearch(mDeviceIdleWhitelist, appid) < 0 && 3504 Arrays.binarySearch(mDeviceIdleTempWhitelist, appid) < 0 && 3505 state.mProcState != ActivityManager.PROCESS_STATE_NONEXISTENT && 3506 state.mProcState > 3507 ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { 3508 disabled = true; 3509 } 3510 } 3511 } 3512 if (wakeLock.mDisabled != disabled) { 3513 wakeLock.mDisabled = disabled; 3514 return true; 3515 } 3516 } 3517 return false; 3518 } 3519 3520 private boolean isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() { 3521 return mMaximumScreenOffTimeoutFromDeviceAdmin >= 0 3522 && mMaximumScreenOffTimeoutFromDeviceAdmin < Long.MAX_VALUE; 3523 } 3524 3525 private void setAttentionLightInternal(boolean on, int color) { 3526 LogicalLight light; 3527 synchronized (mLock) { 3528 if (!mSystemReady) { 3529 return; 3530 } 3531 light = mAttentionLight; 3532 } 3533 3534 // Control light outside of lock. 3535 if (light != null) { 3536 light.setFlashing(color, LogicalLight.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0); 3537 } 3538 } 3539 3540 private void setDozeAfterScreenOffInternal(boolean on) { 3541 synchronized (mLock) { 3542 mDozeAfterScreenOff = on; 3543 } 3544 } 3545 3546 private void boostScreenBrightnessInternal(long eventTime, int uid) { 3547 synchronized (mLock) { 3548 if (!mSystemReady || getWakefulnessLocked() == WAKEFULNESS_ASLEEP 3549 || eventTime < mLastScreenBrightnessBoostTime) { 3550 return; 3551 } 3552 3553 Slog.i(TAG, "Brightness boost activated (uid " + uid +")..."); 3554 mLastScreenBrightnessBoostTime = eventTime; 3555 mScreenBrightnessBoostInProgress = true; 3556 mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST; 3557 3558 userActivityNoUpdateLocked(eventTime, 3559 PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); 3560 updatePowerStateLocked(); 3561 } 3562 } 3563 3564 private boolean isScreenBrightnessBoostedInternal() { 3565 synchronized (mLock) { 3566 return mScreenBrightnessBoostInProgress; 3567 } 3568 } 3569 3570 /** 3571 * Called when a screen brightness boost timeout has occurred. 3572 * 3573 * This function must have no other side-effects besides setting the dirty 3574 * bit and calling update power state. 3575 */ 3576 private void handleScreenBrightnessBoostTimeout() { // runs on handler thread 3577 synchronized (mLock) { 3578 if (DEBUG_SPEW) { 3579 Slog.d(TAG, "handleScreenBrightnessBoostTimeout"); 3580 } 3581 3582 mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST; 3583 updatePowerStateLocked(); 3584 } 3585 } 3586 3587 private void setScreenBrightnessOverrideFromWindowManagerInternal(float brightness) { 3588 synchronized (mLock) { 3589 if (!BrightnessSynchronizer.floatEquals(mScreenBrightnessOverrideFromWindowManager, 3590 brightness)) { 3591 mScreenBrightnessOverrideFromWindowManager = brightness; 3592 mDirty |= DIRTY_SETTINGS; 3593 updatePowerStateLocked(); 3594 } 3595 } 3596 } 3597 3598 private void setUserInactiveOverrideFromWindowManagerInternal() { 3599 synchronized (mLock) { 3600 mUserInactiveOverrideFromWindowManager = true; 3601 mDirty |= DIRTY_USER_ACTIVITY; 3602 updatePowerStateLocked(); 3603 } 3604 } 3605 3606 private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { 3607 synchronized (mLock) { 3608 if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { 3609 mUserActivityTimeoutOverrideFromWindowManager = timeoutMillis; 3610 EventLogTags.writeUserActivityTimeoutOverride(timeoutMillis); 3611 mDirty |= DIRTY_SETTINGS; 3612 updatePowerStateLocked(); 3613 } 3614 } 3615 } 3616 3617 private void setDozeOverrideFromDreamManagerInternal( 3618 int screenState, int screenBrightness) { 3619 synchronized (mLock) { 3620 if (mDozeScreenStateOverrideFromDreamManager != screenState 3621 || mDozeScreenBrightnessOverrideFromDreamManager != screenBrightness) { 3622 mDozeScreenStateOverrideFromDreamManager = screenState; 3623 mDozeScreenBrightnessOverrideFromDreamManager = screenBrightness; 3624 mDozeScreenBrightnessOverrideFromDreamManagerFloat = 3625 BrightnessSynchronizer.brightnessIntToFloat(mContext, 3626 mDozeScreenBrightnessOverrideFromDreamManager); 3627 mDirty |= DIRTY_SETTINGS; 3628 updatePowerStateLocked(); 3629 } 3630 } 3631 } 3632 3633 private void setDrawWakeLockOverrideFromSidekickInternal(boolean keepState) { 3634 synchronized (mLock) { 3635 if (mDrawWakeLockOverrideFromSidekick != keepState) { 3636 mDrawWakeLockOverrideFromSidekick = keepState; 3637 mDirty |= DIRTY_SETTINGS; 3638 updatePowerStateLocked(); 3639 } 3640 } 3641 } 3642 3643 @VisibleForTesting 3644 void setVrModeEnabled(boolean enabled) { 3645 mIsVrModeEnabled = enabled; 3646 } 3647 3648 private void powerHintInternal(int hintId, int data) { 3649 // Maybe filter the event. 3650 switch (hintId) { 3651 case PowerHint.LAUNCH: // 1: activate launch boost 0: deactivate. 3652 if (data == 1 && mBatterySaverController.isLaunchBoostDisabled()) { 3653 return; 3654 } 3655 break; 3656 } 3657 3658 mNativeWrapper.nativeSendPowerHint(hintId, data); 3659 } 3660 3661 private void setPowerBoostInternal(int boost, int durationMs) { 3662 // Maybe filter the event. 3663 mNativeWrapper.nativeSetPowerBoost(boost, durationMs); 3664 } 3665 3666 private boolean setPowerModeInternal(int mode, boolean enabled) { 3667 // Maybe filter the event. 3668 return mNativeWrapper.nativeSetPowerMode(mode, enabled); 3669 } 3670 3671 @VisibleForTesting 3672 boolean wasDeviceIdleForInternal(long ms) { 3673 synchronized (mLock) { 3674 return mLastUserActivityTime + ms < mClock.uptimeMillis(); 3675 } 3676 } 3677 3678 @VisibleForTesting 3679 void onUserActivity() { 3680 synchronized (mLock) { 3681 mLastUserActivityTime = mClock.uptimeMillis(); 3682 } 3683 } 3684 3685 private boolean forceSuspendInternal(int uid) { 3686 try { 3687 synchronized (mLock) { 3688 mForceSuspendActive = true; 3689 // Place the system in an non-interactive state 3690 goToSleepInternal(mClock.uptimeMillis(), 3691 PowerManager.GO_TO_SLEEP_REASON_FORCE_SUSPEND, 3692 PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, uid); 3693 3694 // Disable all the partial wake locks as well 3695 updateWakeLockDisabledStatesLocked(); 3696 } 3697 3698 Slog.i(TAG, "Force-Suspending (uid " + uid + ")..."); 3699 boolean success = mNativeWrapper.nativeForceSuspend(); 3700 if (!success) { 3701 Slog.i(TAG, "Force-Suspending failed in native."); 3702 } 3703 return success; 3704 } finally { 3705 synchronized (mLock) { 3706 mForceSuspendActive = false; 3707 // Re-enable wake locks once again. 3708 updateWakeLockDisabledStatesLocked(); 3709 } 3710 } 3711 } 3712 3713 /** 3714 * Low-level function turn the device off immediately, without trying 3715 * to be clean. Most people should use {@link ShutdownThread} for a clean shutdown. 3716 * 3717 * @param reason code to pass to android_reboot() (e.g. "userrequested"), or null. 3718 */ 3719 public static void lowLevelShutdown(String reason) { 3720 if (reason == null) { 3721 reason = ""; 3722 } 3723 SystemProperties.set("sys.powerctl", "shutdown," + reason); 3724 } 3725 3726 /** 3727 * Low-level function to reboot the device. On success, this 3728 * function doesn't return. If more than 20 seconds passes from 3729 * the time a reboot is requested, this method returns. 3730 * 3731 * @param reason code to pass to the kernel (e.g. "recovery"), or null. 3732 */ 3733 public static void lowLevelReboot(String reason) { 3734 if (reason == null) { 3735 reason = ""; 3736 } 3737 3738 // If the reason is "quiescent", it means that the boot process should proceed 3739 // without turning on the screen/lights. 3740 // The "quiescent" property is sticky, meaning that any number 3741 // of subsequent reboots should honor the property until it is reset. 3742 if (reason.equals(PowerManager.REBOOT_QUIESCENT)) { 3743 sQuiescent = true; 3744 reason = ""; 3745 } else if (reason.endsWith("," + PowerManager.REBOOT_QUIESCENT)) { 3746 sQuiescent = true; 3747 reason = reason.substring(0, 3748 reason.length() - PowerManager.REBOOT_QUIESCENT.length() - 1); 3749 } 3750 3751 if (reason.equals(PowerManager.REBOOT_RECOVERY) 3752 || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) { 3753 reason = "recovery"; 3754 } 3755 3756 if (sQuiescent) { 3757 // Pass the optional "quiescent" argument to the bootloader to let it know 3758 // that it should not turn the screen/lights on. 3759 reason = reason + ",quiescent"; 3760 } 3761 3762 SystemProperties.set("sys.powerctl", "reboot," + reason); 3763 try { 3764 Thread.sleep(20 * 1000L); 3765 } catch (InterruptedException e) { 3766 Thread.currentThread().interrupt(); 3767 } 3768 Slog.wtf(TAG, "Unexpected return from lowLevelReboot!"); 3769 } 3770 3771 @Override // Watchdog.Monitor implementation 3772 public void monitor() { 3773 // Grab and release lock for watchdog monitor to detect deadlocks. 3774 synchronized (mLock) { 3775 } 3776 } 3777 3778 private void dumpInternal(PrintWriter pw) { 3779 pw.println("POWER MANAGER (dumpsys power)\n"); 3780 3781 final WirelessChargerDetector wcd; 3782 synchronized (mLock) { 3783 pw.println("Power Manager State:"); 3784 mConstants.dump(pw); 3785 pw.println(" mDirty=0x" + Integer.toHexString(mDirty)); 3786 pw.println(" mWakefulness=" 3787 + PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())); 3788 pw.println(" mWakefulnessChanging=" + mWakefulnessChanging); 3789 pw.println(" mIsPowered=" + mIsPowered); 3790 pw.println(" mPlugType=" + mPlugType); 3791 pw.println(" mBatteryLevel=" + mBatteryLevel); 3792 pw.println(" mBatteryLevelWhenDreamStarted=" + mBatteryLevelWhenDreamStarted); 3793 pw.println(" mDockState=" + mDockState); 3794 pw.println(" mStayOn=" + mStayOn); 3795 pw.println(" mProximityPositive=" + mProximityPositive); 3796 pw.println(" mBootCompleted=" + mBootCompleted); 3797 pw.println(" mSystemReady=" + mSystemReady); 3798 pw.println(" mHalAutoSuspendModeEnabled=" + mHalAutoSuspendModeEnabled); 3799 pw.println(" mHalInteractiveModeEnabled=" + mHalInteractiveModeEnabled); 3800 pw.println(" mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary)); 3801 pw.print(" mNotifyLongScheduled="); 3802 if (mNotifyLongScheduled == 0) { 3803 pw.print("(none)"); 3804 } else { 3805 TimeUtils.formatDuration(mNotifyLongScheduled, mClock.uptimeMillis(), pw); 3806 } 3807 pw.println(); 3808 pw.print(" mNotifyLongDispatched="); 3809 if (mNotifyLongDispatched == 0) { 3810 pw.print("(none)"); 3811 } else { 3812 TimeUtils.formatDuration(mNotifyLongDispatched, mClock.uptimeMillis(), pw); 3813 } 3814 pw.println(); 3815 pw.print(" mNotifyLongNextCheck="); 3816 if (mNotifyLongNextCheck == 0) { 3817 pw.print("(none)"); 3818 } else { 3819 TimeUtils.formatDuration(mNotifyLongNextCheck, mClock.uptimeMillis(), pw); 3820 } 3821 pw.println(); 3822 pw.println(" mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary)); 3823 pw.println(" mRequestWaitForNegativeProximity=" + mRequestWaitForNegativeProximity); 3824 pw.println(" mSandmanScheduled=" + mSandmanScheduled); 3825 pw.println(" mSandmanSummoned=" + mSandmanSummoned); 3826 pw.println(" mBatteryLevelLow=" + mBatteryLevelLow); 3827 pw.println(" mLightDeviceIdleMode=" + mLightDeviceIdleMode); 3828 pw.println(" mDeviceIdleMode=" + mDeviceIdleMode); 3829 pw.println(" mDeviceIdleWhitelist=" + Arrays.toString(mDeviceIdleWhitelist)); 3830 pw.println(" mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist)); 3831 pw.println(" mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime)); 3832 pw.println(" mLastSleepTime=" + TimeUtils.formatUptime(mLastSleepTime)); 3833 pw.println(" mLastSleepReason=" + PowerManager.sleepReasonToString(mLastSleepReason)); 3834 pw.println(" mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime)); 3835 pw.println(" mLastUserActivityTimeNoChangeLights=" 3836 + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights)); 3837 pw.println(" mLastInteractivePowerHintTime=" 3838 + TimeUtils.formatUptime(mLastInteractivePowerHintTime)); 3839 pw.println(" mLastScreenBrightnessBoostTime=" 3840 + TimeUtils.formatUptime(mLastScreenBrightnessBoostTime)); 3841 pw.println(" mScreenBrightnessBoostInProgress=" 3842 + mScreenBrightnessBoostInProgress); 3843 pw.println(" mDisplayReady=" + mDisplayReady); 3844 pw.println(" mHoldingWakeLockSuspendBlocker=" + mHoldingWakeLockSuspendBlocker); 3845 pw.println(" mHoldingDisplaySuspendBlocker=" + mHoldingDisplaySuspendBlocker); 3846 3847 pw.println(); 3848 pw.println("Settings and Configuration:"); 3849 pw.println(" mDecoupleHalAutoSuspendModeFromDisplayConfig=" 3850 + mDecoupleHalAutoSuspendModeFromDisplayConfig); 3851 pw.println(" mDecoupleHalInteractiveModeFromDisplayConfig=" 3852 + mDecoupleHalInteractiveModeFromDisplayConfig); 3853 pw.println(" mWakeUpWhenPluggedOrUnpluggedConfig=" 3854 + mWakeUpWhenPluggedOrUnpluggedConfig); 3855 pw.println(" mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig=" 3856 + mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig); 3857 pw.println(" mTheaterModeEnabled=" 3858 + mTheaterModeEnabled); 3859 pw.println(" mSuspendWhenScreenOffDueToProximityConfig=" 3860 + mSuspendWhenScreenOffDueToProximityConfig); 3861 pw.println(" mDreamsSupportedConfig=" + mDreamsSupportedConfig); 3862 pw.println(" mDreamsEnabledByDefaultConfig=" + mDreamsEnabledByDefaultConfig); 3863 pw.println(" mDreamsActivatedOnSleepByDefaultConfig=" 3864 + mDreamsActivatedOnSleepByDefaultConfig); 3865 pw.println(" mDreamsActivatedOnDockByDefaultConfig=" 3866 + mDreamsActivatedOnDockByDefaultConfig); 3867 pw.println(" mDreamsEnabledOnBatteryConfig=" 3868 + mDreamsEnabledOnBatteryConfig); 3869 pw.println(" mDreamsBatteryLevelMinimumWhenPoweredConfig=" 3870 + mDreamsBatteryLevelMinimumWhenPoweredConfig); 3871 pw.println(" mDreamsBatteryLevelMinimumWhenNotPoweredConfig=" 3872 + mDreamsBatteryLevelMinimumWhenNotPoweredConfig); 3873 pw.println(" mDreamsBatteryLevelDrainCutoffConfig=" 3874 + mDreamsBatteryLevelDrainCutoffConfig); 3875 pw.println(" mDreamsEnabledSetting=" + mDreamsEnabledSetting); 3876 pw.println(" mDreamsActivateOnSleepSetting=" + mDreamsActivateOnSleepSetting); 3877 pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting); 3878 pw.println(" mDozeAfterScreenOff=" + mDozeAfterScreenOff); 3879 pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig); 3880 pw.println(" mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig); 3881 pw.println(" mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig); 3882 pw.println(" mAttentiveTimeoutConfig=" + mAttentiveTimeoutConfig); 3883 pw.println(" mAttentiveTimeoutSetting=" + mAttentiveTimeoutSetting); 3884 pw.println(" mAttentiveWarningDurationConfig=" + mAttentiveWarningDurationConfig); 3885 pw.println(" mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting); 3886 pw.println(" mSleepTimeoutSetting=" + mSleepTimeoutSetting); 3887 pw.println(" mMaximumScreenOffTimeoutFromDeviceAdmin=" 3888 + mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced=" 3889 + isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")"); 3890 pw.println(" mStayOnWhilePluggedInSetting=" + mStayOnWhilePluggedInSetting); 3891 pw.println(" mScreenBrightnessModeSetting=" + mScreenBrightnessModeSetting); 3892 pw.println(" mScreenBrightnessOverrideFromWindowManager=" 3893 + mScreenBrightnessOverrideFromWindowManager); 3894 pw.println(" mUserActivityTimeoutOverrideFromWindowManager=" 3895 + mUserActivityTimeoutOverrideFromWindowManager); 3896 pw.println(" mUserInactiveOverrideFromWindowManager=" 3897 + mUserInactiveOverrideFromWindowManager); 3898 pw.println(" mDozeScreenStateOverrideFromDreamManager=" 3899 + mDozeScreenStateOverrideFromDreamManager); 3900 pw.println(" mDrawWakeLockOverrideFromSidekick=" + mDrawWakeLockOverrideFromSidekick); 3901 pw.println(" mDozeScreenBrightnessOverrideFromDreamManager=" 3902 + mDozeScreenBrightnessOverrideFromDreamManager); 3903 pw.println(" mScreenBrightnessSettingMinimumFloat=" + mScreenBrightnessSettingMinimum); 3904 pw.println(" mScreenBrightnessSettingMaximumFloat=" + mScreenBrightnessSettingMaximum); 3905 pw.println(" mScreenBrightnessSettingDefaultFloat=" + mScreenBrightnessSettingDefault); 3906 pw.println(" mDoubleTapWakeEnabled=" + mDoubleTapWakeEnabled); 3907 pw.println(" mIsVrModeEnabled=" + mIsVrModeEnabled); 3908 pw.println(" mForegroundProfile=" + mForegroundProfile); 3909 pw.println(" mUserId=" + mUserId); 3910 3911 final long attentiveTimeout = getAttentiveTimeoutLocked(); 3912 final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout); 3913 final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, attentiveTimeout); 3914 final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout); 3915 pw.println(); 3916 pw.println("Attentive timeout: " + attentiveTimeout + " ms"); 3917 pw.println("Sleep timeout: " + sleepTimeout + " ms"); 3918 pw.println("Screen off timeout: " + screenOffTimeout + " ms"); 3919 pw.println("Screen dim duration: " + screenDimDuration + " ms"); 3920 3921 pw.println(); 3922 pw.print("UID states (changing="); 3923 pw.print(mUidsChanging); 3924 pw.print(" changed="); 3925 pw.print(mUidsChanged); 3926 pw.println("):"); 3927 for (int i=0; i<mUidState.size(); i++) { 3928 final UidState state = mUidState.valueAt(i); 3929 pw.print(" UID "); UserHandle.formatUid(pw, mUidState.keyAt(i)); 3930 pw.print(": "); 3931 if (state.mActive) pw.print(" ACTIVE "); 3932 else pw.print("INACTIVE "); 3933 pw.print(" count="); 3934 pw.print(state.mNumWakeLocks); 3935 pw.print(" state="); 3936 pw.println(state.mProcState); 3937 } 3938 3939 pw.println(); 3940 pw.println("Looper state:"); 3941 mHandler.getLooper().dump(new PrintWriterPrinter(pw), " "); 3942 3943 pw.println(); 3944 pw.println("Wake Locks: size=" + mWakeLocks.size()); 3945 for (WakeLock wl : mWakeLocks) { 3946 pw.println(" " + wl); 3947 } 3948 3949 pw.println(); 3950 pw.println("Suspend Blockers: size=" + mSuspendBlockers.size()); 3951 for (SuspendBlocker sb : mSuspendBlockers) { 3952 pw.println(" " + sb); 3953 } 3954 3955 pw.println(); 3956 pw.println("Display Power: " + mDisplayPowerCallbacks); 3957 3958 mBatterySaverPolicy.dump(pw); 3959 mBatterySaverStateMachine.dump(pw); 3960 mAttentionDetector.dump(pw); 3961 3962 pw.println(); 3963 final int numProfiles = mProfilePowerState.size(); 3964 pw.println("Profile power states: size=" + numProfiles); 3965 for (int i = 0; i < numProfiles; i++) { 3966 final ProfilePowerState profile = mProfilePowerState.valueAt(i); 3967 pw.print(" mUserId="); 3968 pw.print(profile.mUserId); 3969 pw.print(" mScreenOffTimeout="); 3970 pw.print(profile.mScreenOffTimeout); 3971 pw.print(" mWakeLockSummary="); 3972 pw.print(profile.mWakeLockSummary); 3973 pw.print(" mLastUserActivityTime="); 3974 pw.print(profile.mLastUserActivityTime); 3975 pw.print(" mLockingNotified="); 3976 pw.println(profile.mLockingNotified); 3977 } 3978 3979 wcd = mWirelessChargerDetector; 3980 } 3981 3982 if (wcd != null) { 3983 wcd.dump(pw); 3984 } 3985 3986 if (mNotifier != null) { 3987 mNotifier.dump(pw); 3988 } 3989 3990 mAmbientDisplaySuppressionController.dump(pw); 3991 } 3992 3993 private void dumpProto(FileDescriptor fd) { 3994 final WirelessChargerDetector wcd; 3995 final ProtoOutputStream proto = new ProtoOutputStream(fd); 3996 3997 synchronized (mLock) { 3998 mConstants.dumpProto(proto); 3999 proto.write(PowerManagerServiceDumpProto.DIRTY, mDirty); 4000 proto.write(PowerManagerServiceDumpProto.WAKEFULNESS, getWakefulnessLocked()); 4001 proto.write(PowerManagerServiceDumpProto.IS_WAKEFULNESS_CHANGING, mWakefulnessChanging); 4002 proto.write(PowerManagerServiceDumpProto.IS_POWERED, mIsPowered); 4003 proto.write(PowerManagerServiceDumpProto.PLUG_TYPE, mPlugType); 4004 proto.write(PowerManagerServiceDumpProto.BATTERY_LEVEL, mBatteryLevel); 4005 proto.write( 4006 PowerManagerServiceDumpProto.BATTERY_LEVEL_WHEN_DREAM_STARTED, 4007 mBatteryLevelWhenDreamStarted); 4008 proto.write(PowerManagerServiceDumpProto.DOCK_STATE, mDockState); 4009 proto.write(PowerManagerServiceDumpProto.IS_STAY_ON, mStayOn); 4010 proto.write(PowerManagerServiceDumpProto.IS_PROXIMITY_POSITIVE, mProximityPositive); 4011 proto.write(PowerManagerServiceDumpProto.IS_BOOT_COMPLETED, mBootCompleted); 4012 proto.write(PowerManagerServiceDumpProto.IS_SYSTEM_READY, mSystemReady); 4013 proto.write( 4014 PowerManagerServiceDumpProto.IS_HAL_AUTO_SUSPEND_MODE_ENABLED, 4015 mHalAutoSuspendModeEnabled); 4016 proto.write( 4017 PowerManagerServiceDumpProto.IS_HAL_AUTO_INTERACTIVE_MODE_ENABLED, 4018 mHalInteractiveModeEnabled); 4019 4020 final long activeWakeLocksToken = proto.start(PowerManagerServiceDumpProto.ACTIVE_WAKE_LOCKS); 4021 proto.write( 4022 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_CPU, 4023 (mWakeLockSummary & WAKE_LOCK_CPU) != 0); 4024 proto.write( 4025 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_BRIGHT, 4026 (mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0); 4027 proto.write( 4028 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_SCREEN_DIM, 4029 (mWakeLockSummary & WAKE_LOCK_SCREEN_DIM) != 0); 4030 proto.write( 4031 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_BUTTON_BRIGHT, 4032 (mWakeLockSummary & WAKE_LOCK_BUTTON_BRIGHT) != 0); 4033 proto.write( 4034 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_PROXIMITY_SCREEN_OFF, 4035 (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0); 4036 proto.write( 4037 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_STAY_AWAKE, 4038 (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0); 4039 proto.write( 4040 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_DOZE, 4041 (mWakeLockSummary & WAKE_LOCK_DOZE) != 0); 4042 proto.write( 4043 PowerManagerServiceDumpProto.ActiveWakeLocksProto.IS_DRAW, 4044 (mWakeLockSummary & WAKE_LOCK_DRAW) != 0); 4045 proto.end(activeWakeLocksToken); 4046 4047 proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_SCHEDULED_MS, mNotifyLongScheduled); 4048 proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_DISPATCHED_MS, mNotifyLongDispatched); 4049 proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_NEXT_CHECK_MS, mNotifyLongNextCheck); 4050 4051 final long userActivityToken = proto.start(PowerManagerServiceDumpProto.USER_ACTIVITY); 4052 proto.write( 4053 PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_BRIGHT, 4054 (mUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0); 4055 proto.write( 4056 PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_DIM, 4057 (mUserActivitySummary & USER_ACTIVITY_SCREEN_DIM) != 0); 4058 proto.write( 4059 PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_DREAM, 4060 (mUserActivitySummary & USER_ACTIVITY_SCREEN_DREAM) != 0); 4061 proto.end(userActivityToken); 4062 4063 proto.write( 4064 PowerManagerServiceDumpProto.IS_REQUEST_WAIT_FOR_NEGATIVE_PROXIMITY, 4065 mRequestWaitForNegativeProximity); 4066 proto.write(PowerManagerServiceDumpProto.IS_SANDMAN_SCHEDULED, mSandmanScheduled); 4067 proto.write(PowerManagerServiceDumpProto.IS_SANDMAN_SUMMONED, mSandmanSummoned); 4068 proto.write(PowerManagerServiceDumpProto.IS_BATTERY_LEVEL_LOW, mBatteryLevelLow); 4069 proto.write(PowerManagerServiceDumpProto.IS_LIGHT_DEVICE_IDLE_MODE, mLightDeviceIdleMode); 4070 proto.write(PowerManagerServiceDumpProto.IS_DEVICE_IDLE_MODE, mDeviceIdleMode); 4071 4072 for (int id : mDeviceIdleWhitelist) { 4073 proto.write(PowerManagerServiceDumpProto.DEVICE_IDLE_WHITELIST, id); 4074 } 4075 for (int id : mDeviceIdleTempWhitelist) { 4076 proto.write(PowerManagerServiceDumpProto.DEVICE_IDLE_TEMP_WHITELIST, id); 4077 } 4078 4079 proto.write(PowerManagerServiceDumpProto.LAST_WAKE_TIME_MS, mLastWakeTime); 4080 proto.write(PowerManagerServiceDumpProto.LAST_SLEEP_TIME_MS, mLastSleepTime); 4081 proto.write(PowerManagerServiceDumpProto.LAST_USER_ACTIVITY_TIME_MS, mLastUserActivityTime); 4082 proto.write( 4083 PowerManagerServiceDumpProto.LAST_USER_ACTIVITY_TIME_NO_CHANGE_LIGHTS_MS, 4084 mLastUserActivityTimeNoChangeLights); 4085 proto.write( 4086 PowerManagerServiceDumpProto.LAST_INTERACTIVE_POWER_HINT_TIME_MS, 4087 mLastInteractivePowerHintTime); 4088 proto.write( 4089 PowerManagerServiceDumpProto.LAST_SCREEN_BRIGHTNESS_BOOST_TIME_MS, 4090 mLastScreenBrightnessBoostTime); 4091 proto.write( 4092 PowerManagerServiceDumpProto.IS_SCREEN_BRIGHTNESS_BOOST_IN_PROGRESS, 4093 mScreenBrightnessBoostInProgress); 4094 proto.write(PowerManagerServiceDumpProto.IS_DISPLAY_READY, mDisplayReady); 4095 proto.write( 4096 PowerManagerServiceDumpProto.IS_HOLDING_WAKE_LOCK_SUSPEND_BLOCKER, 4097 mHoldingWakeLockSuspendBlocker); 4098 proto.write( 4099 PowerManagerServiceDumpProto.IS_HOLDING_DISPLAY_SUSPEND_BLOCKER, 4100 mHoldingDisplaySuspendBlocker); 4101 4102 final long settingsAndConfigurationToken = 4103 proto.start(PowerManagerServiceDumpProto.SETTINGS_AND_CONFIGURATION); 4104 proto.write( 4105 PowerServiceSettingsAndConfigurationDumpProto 4106 .IS_DECOUPLE_HAL_AUTO_SUSPEND_MODE_FROM_DISPLAY_CONFIG, 4107 mDecoupleHalAutoSuspendModeFromDisplayConfig); 4108 proto.write( 4109 PowerServiceSettingsAndConfigurationDumpProto 4110 .IS_DECOUPLE_HAL_INTERACTIVE_MODE_FROM_DISPLAY_CONFIG, 4111 mDecoupleHalInteractiveModeFromDisplayConfig); 4112 proto.write( 4113 PowerServiceSettingsAndConfigurationDumpProto 4114 .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_CONFIG, 4115 mWakeUpWhenPluggedOrUnpluggedConfig); 4116 proto.write( 4117 PowerServiceSettingsAndConfigurationDumpProto 4118 .IS_WAKE_UP_WHEN_PLUGGED_OR_UNPLUGGED_IN_THEATER_MODE_CONFIG, 4119 mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig); 4120 proto.write( 4121 PowerServiceSettingsAndConfigurationDumpProto.IS_THEATER_MODE_ENABLED, 4122 mTheaterModeEnabled); 4123 proto.write( 4124 PowerServiceSettingsAndConfigurationDumpProto 4125 .IS_SUSPEND_WHEN_SCREEN_OFF_DUE_TO_PROXIMITY_CONFIG, 4126 mSuspendWhenScreenOffDueToProximityConfig); 4127 proto.write( 4128 PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_SUPPORTED_CONFIG, 4129 mDreamsSupportedConfig); 4130 proto.write( 4131 PowerServiceSettingsAndConfigurationDumpProto 4132 .ARE_DREAMS_ENABLED_BY_DEFAULT_CONFIG, 4133 mDreamsEnabledByDefaultConfig); 4134 proto.write( 4135 PowerServiceSettingsAndConfigurationDumpProto 4136 .ARE_DREAMS_ACTIVATED_ON_SLEEP_BY_DEFAULT_CONFIG, 4137 mDreamsActivatedOnSleepByDefaultConfig); 4138 proto.write( 4139 PowerServiceSettingsAndConfigurationDumpProto 4140 .ARE_DREAMS_ACTIVATED_ON_DOCK_BY_DEFAULT_CONFIG, 4141 mDreamsActivatedOnDockByDefaultConfig); 4142 proto.write( 4143 PowerServiceSettingsAndConfigurationDumpProto 4144 .ARE_DREAMS_ENABLED_ON_BATTERY_CONFIG, 4145 mDreamsEnabledOnBatteryConfig); 4146 proto.write( 4147 PowerServiceSettingsAndConfigurationDumpProto 4148 .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_POWERED_CONFIG, 4149 mDreamsBatteryLevelMinimumWhenPoweredConfig); 4150 proto.write( 4151 PowerServiceSettingsAndConfigurationDumpProto 4152 .DREAMS_BATTERY_LEVEL_MINIMUM_WHEN_NOT_POWERED_CONFIG, 4153 mDreamsBatteryLevelMinimumWhenNotPoweredConfig); 4154 proto.write( 4155 PowerServiceSettingsAndConfigurationDumpProto 4156 .DREAMS_BATTERY_LEVEL_DRAIN_CUTOFF_CONFIG, 4157 mDreamsBatteryLevelDrainCutoffConfig); 4158 proto.write( 4159 PowerServiceSettingsAndConfigurationDumpProto.ARE_DREAMS_ENABLED_SETTING, 4160 mDreamsEnabledSetting); 4161 proto.write( 4162 PowerServiceSettingsAndConfigurationDumpProto 4163 .ARE_DREAMS_ACTIVATE_ON_SLEEP_SETTING, 4164 mDreamsActivateOnSleepSetting); 4165 proto.write( 4166 PowerServiceSettingsAndConfigurationDumpProto 4167 .ARE_DREAMS_ACTIVATE_ON_DOCK_SETTING, 4168 mDreamsActivateOnDockSetting); 4169 proto.write( 4170 PowerServiceSettingsAndConfigurationDumpProto.IS_DOZE_AFTER_SCREEN_OFF_CONFIG, 4171 mDozeAfterScreenOff); 4172 proto.write( 4173 PowerServiceSettingsAndConfigurationDumpProto 4174 .MINIMUM_SCREEN_OFF_TIMEOUT_CONFIG_MS, 4175 mMinimumScreenOffTimeoutConfig); 4176 proto.write( 4177 PowerServiceSettingsAndConfigurationDumpProto 4178 .MAXIMUM_SCREEN_DIM_DURATION_CONFIG_MS, 4179 mMaximumScreenDimDurationConfig); 4180 proto.write( 4181 PowerServiceSettingsAndConfigurationDumpProto.MAXIMUM_SCREEN_DIM_RATIO_CONFIG, 4182 mMaximumScreenDimRatioConfig); 4183 proto.write( 4184 PowerServiceSettingsAndConfigurationDumpProto.SCREEN_OFF_TIMEOUT_SETTING_MS, 4185 mScreenOffTimeoutSetting); 4186 proto.write( 4187 PowerServiceSettingsAndConfigurationDumpProto.SLEEP_TIMEOUT_SETTING_MS, 4188 mSleepTimeoutSetting); 4189 proto.write( 4190 PowerServiceSettingsAndConfigurationDumpProto.ATTENTIVE_TIMEOUT_SETTING_MS, 4191 mAttentiveTimeoutSetting); 4192 proto.write( 4193 PowerServiceSettingsAndConfigurationDumpProto.ATTENTIVE_TIMEOUT_CONFIG_MS, 4194 mAttentiveTimeoutConfig); 4195 proto.write( 4196 PowerServiceSettingsAndConfigurationDumpProto 4197 .ATTENTIVE_WARNING_DURATION_CONFIG_MS, 4198 mAttentiveWarningDurationConfig); 4199 proto.write( 4200 PowerServiceSettingsAndConfigurationDumpProto 4201 .MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_MS, 4202 // Clamp to int32 4203 Math.min(mMaximumScreenOffTimeoutFromDeviceAdmin, Integer.MAX_VALUE)); 4204 proto.write( 4205 PowerServiceSettingsAndConfigurationDumpProto 4206 .IS_MAXIMUM_SCREEN_OFF_TIMEOUT_FROM_DEVICE_ADMIN_ENFORCED_LOCKED, 4207 isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()); 4208 4209 final long stayOnWhilePluggedInToken = 4210 proto.start( 4211 PowerServiceSettingsAndConfigurationDumpProto.STAY_ON_WHILE_PLUGGED_IN); 4212 proto.write( 4213 PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto 4214 .IS_STAY_ON_WHILE_PLUGGED_IN_AC, 4215 ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_AC) != 0)); 4216 proto.write( 4217 PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto 4218 .IS_STAY_ON_WHILE_PLUGGED_IN_USB, 4219 ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_USB) != 0)); 4220 proto.write( 4221 PowerServiceSettingsAndConfigurationDumpProto.StayOnWhilePluggedInProto 4222 .IS_STAY_ON_WHILE_PLUGGED_IN_WIRELESS, 4223 ((mStayOnWhilePluggedInSetting & BatteryManager.BATTERY_PLUGGED_WIRELESS) 4224 != 0)); 4225 proto.end(stayOnWhilePluggedInToken); 4226 4227 proto.write( 4228 PowerServiceSettingsAndConfigurationDumpProto.SCREEN_BRIGHTNESS_MODE_SETTING, 4229 mScreenBrightnessModeSetting); 4230 proto.write( 4231 PowerServiceSettingsAndConfigurationDumpProto 4232 .SCREEN_BRIGHTNESS_OVERRIDE_FROM_WINDOW_MANAGER, 4233 mScreenBrightnessOverrideFromWindowManager); 4234 proto.write( 4235 PowerServiceSettingsAndConfigurationDumpProto 4236 .USER_ACTIVITY_TIMEOUT_OVERRIDE_FROM_WINDOW_MANAGER_MS, 4237 mUserActivityTimeoutOverrideFromWindowManager); 4238 proto.write( 4239 PowerServiceSettingsAndConfigurationDumpProto 4240 .IS_USER_INACTIVE_OVERRIDE_FROM_WINDOW_MANAGER, 4241 mUserInactiveOverrideFromWindowManager); 4242 proto.write( 4243 PowerServiceSettingsAndConfigurationDumpProto 4244 .DOZE_SCREEN_STATE_OVERRIDE_FROM_DREAM_MANAGER, 4245 mDozeScreenStateOverrideFromDreamManager); 4246 proto.write( 4247 PowerServiceSettingsAndConfigurationDumpProto 4248 .DRAW_WAKE_LOCK_OVERRIDE_FROM_SIDEKICK, 4249 mDrawWakeLockOverrideFromSidekick); 4250 proto.write( 4251 PowerServiceSettingsAndConfigurationDumpProto 4252 .DOZED_SCREEN_BRIGHTNESS_OVERRIDE_FROM_DREAM_MANAGER, 4253 mDozeScreenBrightnessOverrideFromDreamManager); 4254 4255 final long screenBrightnessSettingLimitsToken = 4256 proto.start( 4257 PowerServiceSettingsAndConfigurationDumpProto 4258 .SCREEN_BRIGHTNESS_SETTING_LIMITS); 4259 proto.write( 4260 PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto 4261 .SETTING_MINIMUM_FLOAT, 4262 mScreenBrightnessSettingMinimum); 4263 proto.write( 4264 PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto 4265 .SETTING_MAXIMUM_FLOAT, 4266 mScreenBrightnessSettingMaximum); 4267 proto.write( 4268 PowerServiceSettingsAndConfigurationDumpProto.ScreenBrightnessSettingLimitsProto 4269 .SETTING_DEFAULT_FLOAT, 4270 mScreenBrightnessSettingDefault); 4271 proto.end(screenBrightnessSettingLimitsToken); 4272 4273 proto.write( 4274 PowerServiceSettingsAndConfigurationDumpProto.IS_DOUBLE_TAP_WAKE_ENABLED, 4275 mDoubleTapWakeEnabled); 4276 proto.write( 4277 PowerServiceSettingsAndConfigurationDumpProto.IS_VR_MODE_ENABLED, 4278 mIsVrModeEnabled); 4279 proto.end(settingsAndConfigurationToken); 4280 4281 final long attentiveTimeout = getAttentiveTimeoutLocked(); 4282 final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout); 4283 final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout, attentiveTimeout); 4284 final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout); 4285 proto.write(PowerManagerServiceDumpProto.ATTENTIVE_TIMEOUT_MS, attentiveTimeout); 4286 proto.write(PowerManagerServiceDumpProto.SLEEP_TIMEOUT_MS, sleepTimeout); 4287 proto.write(PowerManagerServiceDumpProto.SCREEN_OFF_TIMEOUT_MS, screenOffTimeout); 4288 proto.write(PowerManagerServiceDumpProto.SCREEN_DIM_DURATION_MS, screenDimDuration); 4289 proto.write(PowerManagerServiceDumpProto.ARE_UIDS_CHANGING, mUidsChanging); 4290 proto.write(PowerManagerServiceDumpProto.ARE_UIDS_CHANGED, mUidsChanged); 4291 4292 for (int i = 0; i < mUidState.size(); i++) { 4293 final UidState state = mUidState.valueAt(i); 4294 final long uIDToken = proto.start(PowerManagerServiceDumpProto.UID_STATES); 4295 final int uid = mUidState.keyAt(i); 4296 proto.write(PowerManagerServiceDumpProto.UidStateProto.UID, uid); 4297 proto.write(PowerManagerServiceDumpProto.UidStateProto.UID_STRING, UserHandle.formatUid(uid)); 4298 proto.write(PowerManagerServiceDumpProto.UidStateProto.IS_ACTIVE, state.mActive); 4299 proto.write(PowerManagerServiceDumpProto.UidStateProto.NUM_WAKE_LOCKS, state.mNumWakeLocks); 4300 proto.write(PowerManagerServiceDumpProto.UidStateProto.PROCESS_STATE, 4301 ActivityManager.processStateAmToProto(state.mProcState)); 4302 proto.end(uIDToken); 4303 } 4304 4305 mBatterySaverStateMachine.dumpProto(proto, 4306 PowerManagerServiceDumpProto.BATTERY_SAVER_STATE_MACHINE); 4307 4308 mHandler.getLooper().dumpDebug(proto, PowerManagerServiceDumpProto.LOOPER); 4309 4310 for (WakeLock wl : mWakeLocks) { 4311 wl.dumpDebug(proto, PowerManagerServiceDumpProto.WAKE_LOCKS); 4312 } 4313 4314 for (SuspendBlocker sb : mSuspendBlockers) { 4315 sb.dumpDebug(proto, PowerManagerServiceDumpProto.SUSPEND_BLOCKERS); 4316 } 4317 wcd = mWirelessChargerDetector; 4318 } 4319 4320 if (wcd != null) { 4321 wcd.dumpDebug(proto, PowerManagerServiceDumpProto.WIRELESS_CHARGER_DETECTOR); 4322 } 4323 proto.flush(); 4324 } 4325 4326 private void incrementBootCount() { 4327 synchronized (mLock) { 4328 int count; 4329 try { 4330 count = Settings.Global.getInt( 4331 getContext().getContentResolver(), Settings.Global.BOOT_COUNT); 4332 } catch (SettingNotFoundException e) { 4333 count = 0; 4334 } 4335 Settings.Global.putInt( 4336 getContext().getContentResolver(), Settings.Global.BOOT_COUNT, count + 1); 4337 } 4338 } 4339 4340 private static WorkSource copyWorkSource(WorkSource workSource) { 4341 return workSource != null ? new WorkSource(workSource) : null; 4342 } 4343 4344 @VisibleForTesting 4345 final class BatteryReceiver extends BroadcastReceiver { 4346 @Override 4347 public void onReceive(Context context, Intent intent) { 4348 synchronized (mLock) { 4349 handleBatteryStateChangedLocked(); 4350 } 4351 } 4352 } 4353 4354 private final class DreamReceiver extends BroadcastReceiver { 4355 @Override 4356 public void onReceive(Context context, Intent intent) { 4357 synchronized (mLock) { 4358 scheduleSandmanLocked(); 4359 } 4360 } 4361 } 4362 4363 @VisibleForTesting 4364 final class UserSwitchedReceiver extends BroadcastReceiver { 4365 @Override 4366 public void onReceive(Context context, Intent intent) { 4367 synchronized (mLock) { 4368 handleSettingsChangedLocked(); 4369 } 4370 } 4371 } 4372 4373 private final class DockReceiver extends BroadcastReceiver { 4374 @Override 4375 public void onReceive(Context context, Intent intent) { 4376 synchronized (mLock) { 4377 int dockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, 4378 Intent.EXTRA_DOCK_STATE_UNDOCKED); 4379 if (mDockState != dockState) { 4380 mDockState = dockState; 4381 mDirty |= DIRTY_DOCK_STATE; 4382 updatePowerStateLocked(); 4383 } 4384 } 4385 } 4386 } 4387 4388 private final class SettingsObserver extends ContentObserver { 4389 public SettingsObserver(Handler handler) { 4390 super(handler); 4391 } 4392 4393 @Override 4394 public void onChange(boolean selfChange, Uri uri) { 4395 synchronized (mLock) { 4396 handleSettingsChangedLocked(); 4397 } 4398 } 4399 } 4400 4401 private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { 4402 @Override 4403 public void onVrStateChanged(boolean enabled) { 4404 powerHintInternal(PowerHint.VR_MODE, enabled ? 1 : 0); 4405 4406 synchronized (mLock) { 4407 if (mIsVrModeEnabled != enabled) { 4408 setVrModeEnabled(enabled); 4409 mDirty |= DIRTY_VR_MODE_CHANGED; 4410 updatePowerStateLocked(); 4411 } 4412 } 4413 } 4414 }; 4415 4416 /** 4417 * Callback for asynchronous operations performed by the power manager. 4418 */ 4419 private final class PowerManagerHandlerCallback implements Handler.Callback { 4420 @Override 4421 public boolean handleMessage(Message msg) { 4422 switch (msg.what) { 4423 case MSG_USER_ACTIVITY_TIMEOUT: 4424 handleUserActivityTimeout(); 4425 break; 4426 case MSG_SANDMAN: 4427 handleSandman(); 4428 break; 4429 case MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT: 4430 handleScreenBrightnessBoostTimeout(); 4431 break; 4432 case MSG_CHECK_FOR_LONG_WAKELOCKS: 4433 checkForLongWakeLocks(); 4434 break; 4435 case MSG_ATTENTIVE_TIMEOUT: 4436 handleAttentiveTimeout(); 4437 break; 4438 } 4439 4440 return true; 4441 } 4442 } 4443 4444 /** 4445 * Represents a wake lock that has been acquired by an application. 4446 */ 4447 /* package */ final class WakeLock implements IBinder.DeathRecipient { 4448 public final IBinder mLock; 4449 public int mFlags; 4450 public String mTag; 4451 public final String mPackageName; 4452 public WorkSource mWorkSource; 4453 public String mHistoryTag; 4454 public final int mOwnerUid; 4455 public final int mOwnerPid; 4456 public final UidState mUidState; 4457 public long mAcquireTime; 4458 public boolean mNotifiedAcquired; 4459 public boolean mNotifiedLong; 4460 public boolean mDisabled; 4461 4462 public WakeLock(IBinder lock, int flags, String tag, String packageName, 4463 WorkSource workSource, String historyTag, int ownerUid, int ownerPid, 4464 UidState uidState) { 4465 mLock = lock; 4466 mFlags = flags; 4467 mTag = tag; 4468 mPackageName = packageName; 4469 mWorkSource = copyWorkSource(workSource); 4470 mHistoryTag = historyTag; 4471 mOwnerUid = ownerUid; 4472 mOwnerPid = ownerPid; 4473 mUidState = uidState; 4474 } 4475 4476 @Override 4477 public void binderDied() { 4478 PowerManagerService.this.handleWakeLockDeath(this); 4479 } 4480 4481 public boolean hasSameProperties(int flags, String tag, WorkSource workSource, 4482 int ownerUid, int ownerPid) { 4483 return mFlags == flags 4484 && mTag.equals(tag) 4485 && hasSameWorkSource(workSource) 4486 && mOwnerUid == ownerUid 4487 && mOwnerPid == ownerPid; 4488 } 4489 4490 public void updateProperties(int flags, String tag, String packageName, 4491 WorkSource workSource, String historyTag, int ownerUid, int ownerPid) { 4492 if (!mPackageName.equals(packageName)) { 4493 throw new IllegalStateException("Existing wake lock package name changed: " 4494 + mPackageName + " to " + packageName); 4495 } 4496 if (mOwnerUid != ownerUid) { 4497 throw new IllegalStateException("Existing wake lock uid changed: " 4498 + mOwnerUid + " to " + ownerUid); 4499 } 4500 if (mOwnerPid != ownerPid) { 4501 throw new IllegalStateException("Existing wake lock pid changed: " 4502 + mOwnerPid + " to " + ownerPid); 4503 } 4504 mFlags = flags; 4505 mTag = tag; 4506 updateWorkSource(workSource); 4507 mHistoryTag = historyTag; 4508 } 4509 4510 public boolean hasSameWorkSource(WorkSource workSource) { 4511 return Objects.equals(mWorkSource, workSource); 4512 } 4513 4514 public void updateWorkSource(WorkSource workSource) { 4515 mWorkSource = copyWorkSource(workSource); 4516 } 4517 4518 @Override 4519 public String toString() { 4520 StringBuilder sb = new StringBuilder(); 4521 sb.append(getLockLevelString()); 4522 sb.append(" '"); 4523 sb.append(mTag); 4524 sb.append("'"); 4525 sb.append(getLockFlagsString()); 4526 if (mDisabled) { 4527 sb.append(" DISABLED"); 4528 } 4529 if (mNotifiedAcquired) { 4530 sb.append(" ACQ="); 4531 TimeUtils.formatDuration(mAcquireTime-mClock.uptimeMillis(), sb); 4532 } 4533 if (mNotifiedLong) { 4534 sb.append(" LONG"); 4535 } 4536 sb.append(" (uid="); 4537 sb.append(mOwnerUid); 4538 if (mOwnerPid != 0) { 4539 sb.append(" pid="); 4540 sb.append(mOwnerPid); 4541 } 4542 if (mWorkSource != null) { 4543 sb.append(" ws="); 4544 sb.append(mWorkSource); 4545 } 4546 sb.append(")"); 4547 return sb.toString(); 4548 } 4549 4550 public void dumpDebug(ProtoOutputStream proto, long fieldId) { 4551 final long wakeLockToken = proto.start(fieldId); 4552 proto.write(WakeLockProto.LOCK_LEVEL, (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)); 4553 proto.write(WakeLockProto.TAG, mTag); 4554 4555 final long wakeLockFlagsToken = proto.start(WakeLockProto.FLAGS); 4556 proto.write(WakeLockProto.WakeLockFlagsProto.IS_ACQUIRE_CAUSES_WAKEUP, 4557 (mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP)!=0); 4558 proto.write(WakeLockProto.WakeLockFlagsProto.IS_ON_AFTER_RELEASE, 4559 (mFlags & PowerManager.ON_AFTER_RELEASE)!=0); 4560 proto.end(wakeLockFlagsToken); 4561 4562 proto.write(WakeLockProto.IS_DISABLED, mDisabled); 4563 if (mNotifiedAcquired) { 4564 proto.write(WakeLockProto.ACQ_MS, mAcquireTime); 4565 } 4566 proto.write(WakeLockProto.IS_NOTIFIED_LONG, mNotifiedLong); 4567 proto.write(WakeLockProto.UID, mOwnerUid); 4568 proto.write(WakeLockProto.PID, mOwnerPid); 4569 4570 if (mWorkSource != null) { 4571 mWorkSource.dumpDebug(proto, WakeLockProto.WORK_SOURCE); 4572 } 4573 proto.end(wakeLockToken); 4574 } 4575 4576 @SuppressWarnings("deprecation") 4577 private String getLockLevelString() { 4578 switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) { 4579 case PowerManager.FULL_WAKE_LOCK: 4580 return "FULL_WAKE_LOCK "; 4581 case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: 4582 return "SCREEN_BRIGHT_WAKE_LOCK "; 4583 case PowerManager.SCREEN_DIM_WAKE_LOCK: 4584 return "SCREEN_DIM_WAKE_LOCK "; 4585 case PowerManager.PARTIAL_WAKE_LOCK: 4586 return "PARTIAL_WAKE_LOCK "; 4587 case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: 4588 return "PROXIMITY_SCREEN_OFF_WAKE_LOCK"; 4589 case PowerManager.DOZE_WAKE_LOCK: 4590 return "DOZE_WAKE_LOCK "; 4591 case PowerManager.DRAW_WAKE_LOCK: 4592 return "DRAW_WAKE_LOCK "; 4593 default: 4594 return "??? "; 4595 } 4596 } 4597 4598 private String getLockFlagsString() { 4599 String result = ""; 4600 if ((mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) { 4601 result += " ACQUIRE_CAUSES_WAKEUP"; 4602 } 4603 if ((mFlags & PowerManager.ON_AFTER_RELEASE) != 0) { 4604 result += " ON_AFTER_RELEASE"; 4605 } 4606 return result; 4607 } 4608 } 4609 4610 private final class SuspendBlockerImpl implements SuspendBlocker { 4611 private final String mName; 4612 private final String mTraceName; 4613 private int mReferenceCount; 4614 4615 public SuspendBlockerImpl(String name) { 4616 mName = name; 4617 mTraceName = "SuspendBlocker (" + name + ")"; 4618 } 4619 4620 @Override 4621 protected void finalize() throws Throwable { 4622 try { 4623 if (mReferenceCount != 0) { 4624 Slog.wtf(TAG, "Suspend blocker \"" + mName 4625 + "\" was finalized without being released!"); 4626 mReferenceCount = 0; 4627 mNativeWrapper.nativeReleaseSuspendBlocker(mName); 4628 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0); 4629 } 4630 } finally { 4631 super.finalize(); 4632 } 4633 } 4634 4635 @Override 4636 public void acquire() { 4637 synchronized (this) { 4638 mReferenceCount += 1; 4639 if (mReferenceCount == 1) { 4640 if (DEBUG_SPEW) { 4641 Slog.d(TAG, "Acquiring suspend blocker \"" + mName + "\"."); 4642 } 4643 Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0); 4644 mNativeWrapper.nativeAcquireSuspendBlocker(mName); 4645 } 4646 } 4647 } 4648 4649 @Override 4650 public void release() { 4651 synchronized (this) { 4652 mReferenceCount -= 1; 4653 if (mReferenceCount == 0) { 4654 if (DEBUG_SPEW) { 4655 Slog.d(TAG, "Releasing suspend blocker \"" + mName + "\"."); 4656 } 4657 mNativeWrapper.nativeReleaseSuspendBlocker(mName); 4658 Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0); 4659 } else if (mReferenceCount < 0) { 4660 Slog.wtf(TAG, "Suspend blocker \"" + mName 4661 + "\" was released without being acquired!", new Throwable()); 4662 mReferenceCount = 0; 4663 } 4664 } 4665 } 4666 4667 @Override 4668 public String toString() { 4669 synchronized (this) { 4670 return mName + ": ref count=" + mReferenceCount; 4671 } 4672 } 4673 4674 public void dumpDebug(ProtoOutputStream proto, long fieldId) { 4675 final long sbToken = proto.start(fieldId); 4676 synchronized (this) { 4677 proto.write(SuspendBlockerProto.NAME, mName); 4678 proto.write(SuspendBlockerProto.REFERENCE_COUNT, mReferenceCount); 4679 } 4680 proto.end(sbToken); 4681 } 4682 } 4683 4684 static final class UidState { 4685 final int mUid; 4686 int mNumWakeLocks; 4687 int mProcState; 4688 boolean mActive; 4689 4690 UidState(int uid) { 4691 mUid = uid; 4692 } 4693 } 4694 4695 @VisibleForTesting 4696 final class BinderService extends IPowerManager.Stub { 4697 @Override 4698 public void onShellCommand(FileDescriptor in, FileDescriptor out, 4699 FileDescriptor err, String[] args, ShellCallback callback, 4700 ResultReceiver resultReceiver) { 4701 (new PowerManagerShellCommand(this)).exec( 4702 this, in, out, err, args, callback, resultReceiver); 4703 } 4704 4705 @Override // Binder call 4706 public void acquireWakeLockWithUid(IBinder lock, int flags, String tag, 4707 String packageName, int uid) { 4708 if (uid < 0) { 4709 uid = Binder.getCallingUid(); 4710 } 4711 acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null); 4712 } 4713 4714 @Override // Binder call 4715 public void powerHint(int hintId, int data) { 4716 if (!mSystemReady) { 4717 // Service not ready yet, so who the heck cares about power hints, bah. 4718 return; 4719 } 4720 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 4721 powerHintInternal(hintId, data); 4722 } 4723 4724 @Override // Binder call 4725 public void setPowerBoost(int boost, int durationMs) { 4726 if (!mSystemReady) { 4727 // Service not ready yet, so who the heck cares about power hints, bah. 4728 return; 4729 } 4730 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 4731 setPowerBoostInternal(boost, durationMs); 4732 } 4733 4734 @Override // Binder call 4735 public void setPowerMode(int mode, boolean enabled) { 4736 if (!mSystemReady) { 4737 // Service not ready yet, so who the heck cares about power hints, bah. 4738 return; 4739 } 4740 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 4741 setPowerModeInternal(mode, enabled); // Intentionally ignore return value 4742 } 4743 4744 @Override // Binder call 4745 public boolean setPowerModeChecked(int mode, boolean enabled) { 4746 if (!mSystemReady) { 4747 // Service not ready yet, so who the heck cares about power hints, bah. 4748 return false; 4749 } 4750 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); 4751 return setPowerModeInternal(mode, enabled); 4752 } 4753 4754 @Override // Binder call 4755 public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName, 4756 WorkSource ws, String historyTag) { 4757 if (lock == null) { 4758 throw new IllegalArgumentException("lock must not be null"); 4759 } 4760 if (packageName == null) { 4761 throw new IllegalArgumentException("packageName must not be null"); 4762 } 4763 PowerManager.validateWakeLockParameters(flags, tag); 4764 4765 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); 4766 if ((flags & PowerManager.DOZE_WAKE_LOCK) != 0) { 4767 mContext.enforceCallingOrSelfPermission( 4768 android.Manifest.permission.DEVICE_POWER, null); 4769 } 4770 if (ws != null && !ws.isEmpty()) { 4771 mContext.enforceCallingOrSelfPermission( 4772 android.Manifest.permission.UPDATE_DEVICE_STATS, null); 4773 } else { 4774 ws = null; 4775 } 4776 4777 final int uid = Binder.getCallingUid(); 4778 final int pid = Binder.getCallingPid(); 4779 final long ident = Binder.clearCallingIdentity(); 4780 try { 4781 acquireWakeLockInternal(lock, flags, tag, packageName, ws, historyTag, uid, pid); 4782 } finally { 4783 Binder.restoreCallingIdentity(ident); 4784 } 4785 } 4786 4787 @Override // Binder call 4788 public void releaseWakeLock(IBinder lock, int flags) { 4789 if (lock == null) { 4790 throw new IllegalArgumentException("lock must not be null"); 4791 } 4792 4793 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); 4794 4795 final long ident = Binder.clearCallingIdentity(); 4796 try { 4797 releaseWakeLockInternal(lock, flags); 4798 } finally { 4799 Binder.restoreCallingIdentity(ident); 4800 } 4801 } 4802 4803 @Override // Binder call 4804 public void updateWakeLockUids(IBinder lock, int[] uids) { 4805 WorkSource ws = null; 4806 4807 if (uids != null) { 4808 ws = new WorkSource(); 4809 // XXX should WorkSource have a way to set uids as an int[] instead of adding them 4810 // one at a time? 4811 for (int i = 0; i < uids.length; i++) { 4812 ws.add(uids[i]); 4813 } 4814 } 4815 updateWakeLockWorkSource(lock, ws, null); 4816 } 4817 4818 @Override // Binder call 4819 public void updateWakeLockWorkSource(IBinder lock, WorkSource ws, String historyTag) { 4820 if (lock == null) { 4821 throw new IllegalArgumentException("lock must not be null"); 4822 } 4823 4824 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); 4825 if (ws != null && !ws.isEmpty()) { 4826 mContext.enforceCallingOrSelfPermission( 4827 android.Manifest.permission.UPDATE_DEVICE_STATS, null); 4828 } else { 4829 ws = null; 4830 } 4831 4832 final int callingUid = Binder.getCallingUid(); 4833 final long ident = Binder.clearCallingIdentity(); 4834 try { 4835 updateWakeLockWorkSourceInternal(lock, ws, historyTag, callingUid); 4836 } finally { 4837 Binder.restoreCallingIdentity(ident); 4838 } 4839 } 4840 4841 @Override // Binder call 4842 public boolean isWakeLockLevelSupported(int level) { 4843 final long ident = Binder.clearCallingIdentity(); 4844 try { 4845 return isWakeLockLevelSupportedInternal(level); 4846 } finally { 4847 Binder.restoreCallingIdentity(ident); 4848 } 4849 } 4850 4851 @Override // Binder call 4852 public void userActivity(long eventTime, int event, int flags) { 4853 final long now = mClock.uptimeMillis(); 4854 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER) 4855 != PackageManager.PERMISSION_GRANTED 4856 && mContext.checkCallingOrSelfPermission( 4857 android.Manifest.permission.USER_ACTIVITY) 4858 != PackageManager.PERMISSION_GRANTED) { 4859 // Once upon a time applications could call userActivity(). 4860 // Now we require the DEVICE_POWER permission. Log a warning and ignore the 4861 // request instead of throwing a SecurityException so we don't break old apps. 4862 synchronized (mLock) { 4863 if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) { 4864 mLastWarningAboutUserActivityPermission = now; 4865 Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the " 4866 + "caller does not have DEVICE_POWER or USER_ACTIVITY " 4867 + "permission. Please fix your app! " 4868 + " pid=" + Binder.getCallingPid() 4869 + " uid=" + Binder.getCallingUid()); 4870 } 4871 } 4872 return; 4873 } 4874 4875 if (eventTime > now) { 4876 throw new IllegalArgumentException("event time must not be in the future"); 4877 } 4878 4879 final int uid = Binder.getCallingUid(); 4880 final long ident = Binder.clearCallingIdentity(); 4881 try { 4882 userActivityInternal(eventTime, event, flags, uid); 4883 } finally { 4884 Binder.restoreCallingIdentity(ident); 4885 } 4886 } 4887 4888 @Override // Binder call 4889 public void wakeUp(long eventTime, @WakeReason int reason, String details, 4890 String opPackageName) { 4891 if (eventTime > mClock.uptimeMillis()) { 4892 throw new IllegalArgumentException("event time must not be in the future"); 4893 } 4894 4895 mContext.enforceCallingOrSelfPermission( 4896 android.Manifest.permission.DEVICE_POWER, null); 4897 4898 final int uid = Binder.getCallingUid(); 4899 final long ident = Binder.clearCallingIdentity(); 4900 try { 4901 wakeUpInternal(eventTime, reason, details, uid, opPackageName, uid); 4902 } finally { 4903 Binder.restoreCallingIdentity(ident); 4904 } 4905 } 4906 4907 @Override // Binder call 4908 public void goToSleep(long eventTime, int reason, int flags) { 4909 if (eventTime > mClock.uptimeMillis()) { 4910 throw new IllegalArgumentException("event time must not be in the future"); 4911 } 4912 4913 mContext.enforceCallingOrSelfPermission( 4914 android.Manifest.permission.DEVICE_POWER, null); 4915 4916 final int uid = Binder.getCallingUid(); 4917 final long ident = Binder.clearCallingIdentity(); 4918 try { 4919 goToSleepInternal(eventTime, reason, flags, uid); 4920 } finally { 4921 Binder.restoreCallingIdentity(ident); 4922 } 4923 } 4924 4925 @Override // Binder call 4926 public void nap(long eventTime) { 4927 if (eventTime > mClock.uptimeMillis()) { 4928 throw new IllegalArgumentException("event time must not be in the future"); 4929 } 4930 4931 mContext.enforceCallingOrSelfPermission( 4932 android.Manifest.permission.DEVICE_POWER, null); 4933 4934 final int uid = Binder.getCallingUid(); 4935 final long ident = Binder.clearCallingIdentity(); 4936 try { 4937 napInternal(eventTime, uid); 4938 } finally { 4939 Binder.restoreCallingIdentity(ident); 4940 } 4941 } 4942 4943 public float getBrightnessConstraint(int constraint) { 4944 switch (constraint) { 4945 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM: 4946 return mScreenBrightnessMinimum; 4947 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM: 4948 return mScreenBrightnessMaximum; 4949 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT: 4950 return mScreenBrightnessDefault; 4951 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM: 4952 return mScreenBrightnessDim; 4953 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE: 4954 return mScreenBrightnessDoze; 4955 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM_VR: 4956 return mScreenBrightnessMinimumVr; 4957 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM_VR: 4958 return mScreenBrightnessMaximumVr; 4959 case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT_VR: 4960 return mScreenBrightnessDefaultVr; 4961 default: 4962 return PowerManager.BRIGHTNESS_INVALID_FLOAT; 4963 } 4964 } 4965 4966 @Override // Binder call 4967 public boolean isInteractive() { 4968 final long ident = Binder.clearCallingIdentity(); 4969 try { 4970 return isInteractiveInternal(); 4971 } finally { 4972 Binder.restoreCallingIdentity(ident); 4973 } 4974 } 4975 4976 @Override // Binder call 4977 public boolean isPowerSaveMode() { 4978 final long ident = Binder.clearCallingIdentity(); 4979 try { 4980 return mBatterySaverController.isEnabled(); 4981 } finally { 4982 Binder.restoreCallingIdentity(ident); 4983 } 4984 } 4985 4986 // Binder call 4987 public PowerSaveState getPowerSaveState(@ServiceType int serviceType) { 4988 final long ident = Binder.clearCallingIdentity(); 4989 try { 4990 return mBatterySaverPolicy.getBatterySaverPolicy(serviceType); 4991 } finally { 4992 Binder.restoreCallingIdentity(ident); 4993 } 4994 } 4995 4996 @Override // Binder call 4997 public boolean setPowerSaveModeEnabled(boolean enabled) { 4998 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER) 4999 != PackageManager.PERMISSION_GRANTED) { 5000 mContext.enforceCallingOrSelfPermission( 5001 android.Manifest.permission.DEVICE_POWER, null); 5002 } 5003 final long ident = Binder.clearCallingIdentity(); 5004 try { 5005 return setLowPowerModeInternal(enabled); 5006 } finally { 5007 Binder.restoreCallingIdentity(ident); 5008 } 5009 } 5010 5011 @Override // Binder call 5012 public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold) { 5013 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER, 5014 "updateDynamicPowerSavings"); 5015 final long ident = Binder.clearCallingIdentity(); 5016 try { 5017 final ContentResolver resolver = mContext.getContentResolver(); 5018 boolean success = Settings.Global.putInt(resolver, 5019 Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD, 5020 disableThreshold); 5021 if (success) { 5022 // abort updating if we weren't able to succeed on the threshold 5023 success &= Settings.Global.putInt(resolver, 5024 Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED, 5025 powerSaveHint ? 1 : 0); 5026 } 5027 return success; 5028 } finally { 5029 Binder.restoreCallingIdentity(ident); 5030 } 5031 } 5032 5033 @Override // Binder call 5034 public boolean setAdaptivePowerSavePolicy(@NonNull BatterySaverPolicyConfig config) { 5035 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER) 5036 != PackageManager.PERMISSION_GRANTED) { 5037 mContext.enforceCallingOrSelfPermission( 5038 android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSavePolicy"); 5039 } 5040 final long ident = Binder.clearCallingIdentity(); 5041 try { 5042 return mBatterySaverStateMachine.setAdaptiveBatterySaverPolicy(config); 5043 } finally { 5044 Binder.restoreCallingIdentity(ident); 5045 } 5046 } 5047 5048 @Override // Binder call 5049 public boolean setAdaptivePowerSaveEnabled(boolean enabled) { 5050 if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER) 5051 != PackageManager.PERMISSION_GRANTED) { 5052 mContext.enforceCallingOrSelfPermission( 5053 android.Manifest.permission.DEVICE_POWER, "setAdaptivePowerSaveEnabled"); 5054 } 5055 final long ident = Binder.clearCallingIdentity(); 5056 try { 5057 return mBatterySaverStateMachine.setAdaptiveBatterySaverEnabled(enabled); 5058 } finally { 5059 Binder.restoreCallingIdentity(ident); 5060 } 5061 } 5062 5063 @Override // Binder call 5064 public int getPowerSaveModeTrigger() { 5065 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.POWER_SAVER, null); 5066 final long ident = Binder.clearCallingIdentity(); 5067 try { 5068 return Settings.Global.getInt(mContext.getContentResolver(), 5069 Settings.Global.AUTOMATIC_POWER_SAVE_MODE, 5070 PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE); 5071 } finally { 5072 Binder.restoreCallingIdentity(ident); 5073 } 5074 } 5075 5076 @Override // Binder call 5077 public boolean isDeviceIdleMode() { 5078 final long ident = Binder.clearCallingIdentity(); 5079 try { 5080 return isDeviceIdleModeInternal(); 5081 } finally { 5082 Binder.restoreCallingIdentity(ident); 5083 } 5084 } 5085 5086 @Override // Binder call 5087 public boolean isLightDeviceIdleMode() { 5088 final long ident = Binder.clearCallingIdentity(); 5089 try { 5090 return isLightDeviceIdleModeInternal(); 5091 } finally { 5092 Binder.restoreCallingIdentity(ident); 5093 } 5094 } 5095 5096 /** 5097 * Gets the reason for the last time the phone had to reboot. 5098 * 5099 * @return The reason the phone last shut down as an int or 5100 * {@link PowerManager#SHUTDOWN_REASON_UNKNOWN} if the file could not be opened. 5101 */ 5102 @Override // Binder call 5103 public int getLastShutdownReason() { 5104 mContext.enforceCallingOrSelfPermission( 5105 android.Manifest.permission.DEVICE_POWER, null); 5106 5107 final long ident = Binder.clearCallingIdentity(); 5108 try { 5109 return getLastShutdownReasonInternal(); 5110 } finally { 5111 Binder.restoreCallingIdentity(ident); 5112 } 5113 } 5114 5115 @Override // Binder call 5116 public int getLastSleepReason() { 5117 mContext.enforceCallingOrSelfPermission( 5118 android.Manifest.permission.DEVICE_POWER, null); 5119 5120 final long ident = Binder.clearCallingIdentity(); 5121 try { 5122 return getLastSleepReasonInternal(); 5123 } finally { 5124 Binder.restoreCallingIdentity(ident); 5125 } 5126 } 5127 5128 /** 5129 * Reboots the device. 5130 * 5131 * @param confirm If true, shows a reboot confirmation dialog. 5132 * @param reason The reason for the reboot, or null if none. 5133 * @param wait If true, this call waits for the reboot to complete and does not return. 5134 */ 5135 @Override // Binder call 5136 public void reboot(boolean confirm, @Nullable String reason, boolean wait) { 5137 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 5138 if (PowerManager.REBOOT_RECOVERY.equals(reason) 5139 || PowerManager.REBOOT_RECOVERY_UPDATE.equals(reason)) { 5140 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); 5141 } 5142 5143 final long ident = Binder.clearCallingIdentity(); 5144 try { 5145 shutdownOrRebootInternal(HALT_MODE_REBOOT, confirm, reason, wait); 5146 } finally { 5147 Binder.restoreCallingIdentity(ident); 5148 } 5149 } 5150 5151 /** 5152 * Reboots the device into safe mode 5153 * 5154 * @param confirm If true, shows a reboot confirmation dialog. 5155 * @param wait If true, this call waits for the reboot to complete and does not return. 5156 */ 5157 @Override // Binder call 5158 public void rebootSafeMode(boolean confirm, boolean wait) { 5159 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 5160 5161 final long ident = Binder.clearCallingIdentity(); 5162 try { 5163 shutdownOrRebootInternal(HALT_MODE_REBOOT_SAFE_MODE, confirm, 5164 PowerManager.REBOOT_SAFE_MODE, wait); 5165 } finally { 5166 Binder.restoreCallingIdentity(ident); 5167 } 5168 } 5169 5170 /** 5171 * Shuts down the device. 5172 * 5173 * @param confirm If true, shows a shutdown confirmation dialog. 5174 * @param wait If true, this call waits for the shutdown to complete and does not return. 5175 */ 5176 @Override // Binder call 5177 public void shutdown(boolean confirm, String reason, boolean wait) { 5178 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 5179 5180 final long ident = Binder.clearCallingIdentity(); 5181 try { 5182 shutdownOrRebootInternal(HALT_MODE_SHUTDOWN, confirm, reason, wait); 5183 } finally { 5184 Binder.restoreCallingIdentity(ident); 5185 } 5186 } 5187 5188 /** 5189 * Crash the runtime (causing a complete restart of the Android framework). 5190 * Requires REBOOT permission. Mostly for testing. Should not return. 5191 */ 5192 @Override // Binder call 5193 public void crash(String message) { 5194 mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); 5195 5196 final long ident = Binder.clearCallingIdentity(); 5197 try { 5198 crashInternal(message); 5199 } finally { 5200 Binder.restoreCallingIdentity(ident); 5201 } 5202 } 5203 5204 /** 5205 * Set the setting that determines whether the device stays on when plugged in. 5206 * The argument is a bit string, with each bit specifying a power source that, 5207 * when the device is connected to that source, causes the device to stay on. 5208 * See {@link android.os.BatteryManager} for the list of power sources that 5209 * can be specified. Current values include 5210 * {@link android.os.BatteryManager#BATTERY_PLUGGED_AC} 5211 * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB} 5212 * 5213 * Used by "adb shell svc power stayon ..." 5214 * 5215 * @param val an {@code int} containing the bits that specify which power sources 5216 * should cause the device to stay on. 5217 */ 5218 @Override // Binder call 5219 public void setStayOnSetting(int val) { 5220 int uid = Binder.getCallingUid(); 5221 // if uid is of root's, we permit this operation straight away 5222 if (uid != Process.ROOT_UID) { 5223 if (!Settings.checkAndNoteWriteSettingsOperation(mContext, uid, 5224 Settings.getPackageNameForUid(mContext, uid), true)) { 5225 return; 5226 } 5227 } 5228 5229 final long ident = Binder.clearCallingIdentity(); 5230 try { 5231 setStayOnSettingInternal(val); 5232 } finally { 5233 Binder.restoreCallingIdentity(ident); 5234 } 5235 } 5236 5237 /** 5238 * Used by the phone application to make the attention LED flash when ringing. 5239 */ 5240 @Override // Binder call 5241 public void setAttentionLight(boolean on, int color) { 5242 mContext.enforceCallingOrSelfPermission( 5243 android.Manifest.permission.DEVICE_POWER, null); 5244 5245 final long ident = Binder.clearCallingIdentity(); 5246 try { 5247 setAttentionLightInternal(on, color); 5248 } finally { 5249 Binder.restoreCallingIdentity(ident); 5250 } 5251 } 5252 5253 @Override // Binder call 5254 public void setDozeAfterScreenOff(boolean on) { 5255 mContext.enforceCallingOrSelfPermission( 5256 android.Manifest.permission.DEVICE_POWER, null); 5257 5258 final long ident = Binder.clearCallingIdentity(); 5259 try { 5260 setDozeAfterScreenOffInternal(on); 5261 } finally { 5262 Binder.restoreCallingIdentity(ident); 5263 } 5264 } 5265 5266 @Override // Binder call 5267 public boolean isAmbientDisplayAvailable() { 5268 mContext.enforceCallingOrSelfPermission( 5269 android.Manifest.permission.READ_DREAM_STATE, null); 5270 5271 final long ident = Binder.clearCallingIdentity(); 5272 try { 5273 return mAmbientDisplayConfiguration.ambientDisplayAvailable(); 5274 } finally { 5275 Binder.restoreCallingIdentity(ident); 5276 } 5277 } 5278 5279 @Override // Binder call 5280 public void suppressAmbientDisplay(@NonNull String token, boolean suppress) { 5281 mContext.enforceCallingOrSelfPermission( 5282 android.Manifest.permission.WRITE_DREAM_STATE, null); 5283 5284 final int uid = Binder.getCallingUid(); 5285 final long ident = Binder.clearCallingIdentity(); 5286 try { 5287 mAmbientDisplaySuppressionController.suppress(token, uid, suppress); 5288 } finally { 5289 Binder.restoreCallingIdentity(ident); 5290 } 5291 } 5292 5293 @Override // Binder call 5294 public boolean isAmbientDisplaySuppressedForToken(@NonNull String token) { 5295 mContext.enforceCallingOrSelfPermission( 5296 android.Manifest.permission.READ_DREAM_STATE, null); 5297 5298 final int uid = Binder.getCallingUid(); 5299 final long ident = Binder.clearCallingIdentity(); 5300 try { 5301 return mAmbientDisplaySuppressionController.isSuppressed(token, uid); 5302 } finally { 5303 Binder.restoreCallingIdentity(ident); 5304 } 5305 } 5306 5307 @Override // Binder call 5308 public boolean isAmbientDisplaySuppressedForTokenByApp(@NonNull String token, int appUid) { 5309 mContext.enforceCallingOrSelfPermission( 5310 android.Manifest.permission.READ_DREAM_STATE, null); 5311 mContext.enforceCallingOrSelfPermission( 5312 android.Manifest.permission.READ_DREAM_SUPPRESSION, null); 5313 5314 final long ident = Binder.clearCallingIdentity(); 5315 try { 5316 return isAmbientDisplayAvailable() 5317 && mAmbientDisplaySuppressionController.isSuppressed(token, appUid); 5318 } finally { 5319 Binder.restoreCallingIdentity(ident); 5320 } 5321 } 5322 5323 @Override // Binder call 5324 public boolean isAmbientDisplaySuppressed() { 5325 mContext.enforceCallingOrSelfPermission( 5326 android.Manifest.permission.READ_DREAM_STATE, null); 5327 5328 final long ident = Binder.clearCallingIdentity(); 5329 try { 5330 return mAmbientDisplaySuppressionController.isSuppressed(); 5331 } finally { 5332 Binder.restoreCallingIdentity(ident); 5333 } 5334 } 5335 5336 @Override // Binder call 5337 public void boostScreenBrightness(long eventTime) { 5338 if (eventTime > mClock.uptimeMillis()) { 5339 throw new IllegalArgumentException("event time must not be in the future"); 5340 } 5341 5342 mContext.enforceCallingOrSelfPermission( 5343 android.Manifest.permission.DEVICE_POWER, null); 5344 5345 final int uid = Binder.getCallingUid(); 5346 final long ident = Binder.clearCallingIdentity(); 5347 try { 5348 boostScreenBrightnessInternal(eventTime, uid); 5349 } finally { 5350 Binder.restoreCallingIdentity(ident); 5351 } 5352 } 5353 5354 @Override // Binder call 5355 public boolean isScreenBrightnessBoosted() { 5356 final long ident = Binder.clearCallingIdentity(); 5357 try { 5358 return isScreenBrightnessBoostedInternal(); 5359 } finally { 5360 Binder.restoreCallingIdentity(ident); 5361 } 5362 } 5363 5364 @Override // binder call 5365 public boolean forceSuspend() { 5366 mContext.enforceCallingOrSelfPermission( 5367 android.Manifest.permission.DEVICE_POWER, null); 5368 5369 final int uid = Binder.getCallingUid(); 5370 final long ident = Binder.clearCallingIdentity(); 5371 try { 5372 return forceSuspendInternal(uid); 5373 } finally { 5374 Binder.restoreCallingIdentity(ident); 5375 } 5376 } 5377 5378 @Override // Binder call 5379 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 5380 if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; 5381 5382 final long ident = Binder.clearCallingIdentity(); 5383 5384 boolean isDumpProto = false; 5385 for (String arg : args) { 5386 if (arg.equals("--proto")) { 5387 isDumpProto = true; 5388 } 5389 } 5390 try { 5391 if (isDumpProto) { 5392 dumpProto(fd); 5393 } else { 5394 dumpInternal(pw); 5395 } 5396 } finally { 5397 Binder.restoreCallingIdentity(ident); 5398 } 5399 } 5400 } 5401 5402 @VisibleForTesting 5403 BinderService getBinderServiceInstance() { 5404 return mBinderService; 5405 } 5406 5407 @VisibleForTesting 5408 LocalService getLocalServiceInstance() { 5409 return mLocalService; 5410 } 5411 5412 @VisibleForTesting 5413 int getLastShutdownReasonInternal() { 5414 String line = mSystemProperties.get(SYSTEM_PROPERTY_REBOOT_REASON, null); 5415 switch (line) { 5416 case REASON_SHUTDOWN: 5417 return PowerManager.SHUTDOWN_REASON_SHUTDOWN; 5418 case REASON_REBOOT: 5419 return PowerManager.SHUTDOWN_REASON_REBOOT; 5420 case REASON_USERREQUESTED: 5421 return PowerManager.SHUTDOWN_REASON_USER_REQUESTED; 5422 case REASON_THERMAL_SHUTDOWN: 5423 return PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN; 5424 case REASON_LOW_BATTERY: 5425 return PowerManager.SHUTDOWN_REASON_LOW_BATTERY; 5426 case REASON_BATTERY_THERMAL_STATE: 5427 return PowerManager.SHUTDOWN_REASON_BATTERY_THERMAL; 5428 default: 5429 return PowerManager.SHUTDOWN_REASON_UNKNOWN; 5430 } 5431 } 5432 5433 private int getLastSleepReasonInternal() { 5434 synchronized (mLock) { 5435 return mLastSleepReason; 5436 } 5437 } 5438 5439 private PowerManager.WakeData getLastWakeupInternal() { 5440 synchronized (mLock) { 5441 return new WakeData(mLastWakeTime, mLastWakeReason); 5442 } 5443 } 5444 5445 /** 5446 * If the user presses power while the proximity sensor is enabled and keeping 5447 * the screen off, then turn the screen back on by telling display manager to 5448 * ignore the proximity sensor. We don't turn off the proximity sensor because 5449 * we still want it to be reenabled if it's state changes. 5450 * 5451 * @return True if the proximity sensor was successfully ignored and we should 5452 * consume the key event. 5453 */ 5454 private boolean interceptPowerKeyDownInternal(KeyEvent event) { 5455 synchronized (mLock) { 5456 // DisplayPowerController only reports proximity positive (near) if it's 5457 // positive and the proximity wasn't already being ignored. So it reliably 5458 // also tells us that we're not already ignoring the proximity sensor. 5459 if (mDisplayPowerRequest.useProximitySensor && mProximityPositive) { 5460 mDisplayManagerInternal.ignoreProximitySensorUntilChanged(); 5461 return true; 5462 } 5463 } 5464 5465 return false; 5466 } 5467 5468 @VisibleForTesting 5469 final class LocalService extends PowerManagerInternal { 5470 @Override 5471 public void setScreenBrightnessOverrideFromWindowManager(float screenBrightness) { 5472 if (screenBrightness < PowerManager.BRIGHTNESS_MIN 5473 || screenBrightness > PowerManager.BRIGHTNESS_MAX) { 5474 screenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; 5475 } 5476 setScreenBrightnessOverrideFromWindowManagerInternal(screenBrightness); 5477 } 5478 5479 @Override 5480 public void setDozeOverrideFromDreamManager(int screenState, int screenBrightness) { 5481 switch (screenState) { 5482 case Display.STATE_UNKNOWN: 5483 case Display.STATE_OFF: 5484 case Display.STATE_DOZE: 5485 case Display.STATE_DOZE_SUSPEND: 5486 case Display.STATE_ON_SUSPEND: 5487 case Display.STATE_ON: 5488 case Display.STATE_VR: 5489 break; 5490 default: 5491 screenState = Display.STATE_UNKNOWN; 5492 break; 5493 } 5494 if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT 5495 || screenBrightness > PowerManager.BRIGHTNESS_ON) { 5496 screenBrightness = PowerManager.BRIGHTNESS_DEFAULT; 5497 } 5498 setDozeOverrideFromDreamManagerInternal(screenState, screenBrightness); 5499 } 5500 5501 @Override 5502 public void setUserInactiveOverrideFromWindowManager() { 5503 setUserInactiveOverrideFromWindowManagerInternal(); 5504 } 5505 5506 @Override 5507 public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) { 5508 setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis); 5509 } 5510 5511 @Override 5512 public void setDrawWakeLockOverrideFromSidekick(boolean keepState) { 5513 setDrawWakeLockOverrideFromSidekickInternal(keepState); 5514 } 5515 5516 @Override 5517 public void setMaximumScreenOffTimeoutFromDeviceAdmin(@UserIdInt int userId, long timeMs) { 5518 setMaximumScreenOffTimeoutFromDeviceAdminInternal(userId, timeMs); 5519 } 5520 5521 @Override 5522 public PowerSaveState getLowPowerState(@ServiceType int serviceType) { 5523 return mBatterySaverPolicy.getBatterySaverPolicy(serviceType); 5524 } 5525 5526 @Override 5527 public void registerLowPowerModeObserver(LowPowerModeListener listener) { 5528 mBatterySaverController.addListener(listener); 5529 } 5530 5531 @Override 5532 public boolean setDeviceIdleMode(boolean enabled) { 5533 return setDeviceIdleModeInternal(enabled); 5534 } 5535 5536 @Override 5537 public boolean setLightDeviceIdleMode(boolean enabled) { 5538 return setLightDeviceIdleModeInternal(enabled); 5539 } 5540 5541 @Override 5542 public void setDeviceIdleWhitelist(int[] appids) { 5543 setDeviceIdleWhitelistInternal(appids); 5544 } 5545 5546 @Override 5547 public void setDeviceIdleTempWhitelist(int[] appids) { 5548 setDeviceIdleTempWhitelistInternal(appids); 5549 } 5550 5551 @Override 5552 public void startUidChanges() { 5553 startUidChangesInternal(); 5554 } 5555 5556 @Override 5557 public void finishUidChanges() { 5558 finishUidChangesInternal(); 5559 } 5560 5561 @Override 5562 public void updateUidProcState(int uid, int procState) { 5563 updateUidProcStateInternal(uid, procState); 5564 } 5565 5566 @Override 5567 public void uidGone(int uid) { 5568 uidGoneInternal(uid); 5569 } 5570 5571 @Override 5572 public void uidActive(int uid) { 5573 uidActiveInternal(uid); 5574 } 5575 5576 @Override 5577 public void uidIdle(int uid) { 5578 uidIdleInternal(uid); 5579 } 5580 5581 @Override 5582 public void powerHint(int hintId, int data) { 5583 powerHintInternal(hintId, data); 5584 } 5585 5586 @Override 5587 public void setPowerBoost(int boost, int durationMs) { 5588 setPowerBoostInternal(boost, durationMs); 5589 } 5590 5591 @Override 5592 public void setPowerMode(int mode, boolean enabled) { 5593 setPowerModeInternal(mode, enabled); 5594 } 5595 @Override 5596 public boolean wasDeviceIdleFor(long ms) { 5597 return wasDeviceIdleForInternal(ms); 5598 } 5599 5600 @Override 5601 public WakeData getLastWakeup() { 5602 return getLastWakeupInternal(); 5603 } 5604 5605 @Override 5606 public boolean interceptPowerKeyDown(KeyEvent event) { 5607 return interceptPowerKeyDownInternal(event); 5608 } 5609 } 5610 } 5611