diff options
author | Dianne Hackborn <hackbod@google.com> | 2015-07-13 14:48:08 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2015-07-15 09:59:07 -0700 |
commit | 280a64e793d081847c5dcea23ed9be38aa5332d2 (patch) | |
tree | a9ea0a4aca5e578efb1b9e252477cedfa79c547f /services/core/java | |
parent | 18709f9a0095afe6dba11f9dd71e3210c5f4e1db (diff) | |
download | frameworks_base-280a64e793d081847c5dcea23ed9be38aa5332d2.zip frameworks_base-280a64e793d081847c5dcea23ed9be38aa5332d2.tar.gz frameworks_base-280a64e793d081847c5dcea23ed9be38aa5332d2.tar.bz2 |
Improve tracking of screen on reasons.
- New screen on app op to record the last time each app has
caused the screen to be turned on.
- New battery stats event that tells us the reason the screen
has been asked to turn on.
- Propagate out power manager API to specify the reason a caller
is asking to have the screen turned on.
Note that currently the window flag to turn the screen on bypasses
much of this because it is being handled in the window manager by
just directly telling the power manager to turn the screen on. To
make this better we need a new API where it can specify who it is
calling the API for.
Change-Id: I667e56cb1f80508d054da004db667efbcc22e971
Diffstat (limited to 'services/core/java')
9 files changed, 79 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/DockObserver.java b/services/core/java/com/android/server/DockObserver.java index 41ce25d..5388f10 100644 --- a/services/core/java/com/android/server/DockObserver.java +++ b/services/core/java/com/android/server/DockObserver.java @@ -134,7 +134,8 @@ final class DockObserver extends SystemService { if (mAllowTheaterModeWakeFromDock || Settings.Global.getInt(getContext().getContentResolver(), Settings.Global.THEATER_MODE_ON, 0) == 0) { - mPowerManager.wakeUp(SystemClock.uptimeMillis()); + mPowerManager.wakeUp(SystemClock.uptimeMillis(), + "android.server:DOCK"); } updateLocked(); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 13b75ab..4b0b924 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -493,6 +493,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + public void noteWakeUp(String reason, int reasonUid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteWakeUpLocked(reason, reasonUid); + } + } + public void noteInteractive(boolean interactive) { enforceCallingPermission(); synchronized (mStats) { diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index 458928f..8813a61 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -648,7 +648,8 @@ public final class DreamManagerService extends SystemService { if (mCurrentDreamName != null && mCurrentDreamCanDoze && !mCurrentDreamName.equals(getDozeComponent())) { // May have updated the doze component, wake up - mPowerManager.wakeUp(SystemClock.uptimeMillis()); + mPowerManager.wakeUp(SystemClock.uptimeMillis(), + "android.server.dreams:SYSPROP"); } } } diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 4d8d105..a71dfcd 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -565,7 +565,8 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe // For fingerprint devices that support touch-to-wake, this will ensure the device // wakes up and turns the screen on when fingerprint is authenticated. if (mIsKeyguard && authenticated) { - mPowerManager.wakeUp(SystemClock.uptimeMillis()); + mPowerManager.wakeUp(SystemClock.uptimeMillis(), + "android.server.fingerprint:AUTH"); } return result; } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index c37f619..cfc5f7d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1969,7 +1969,7 @@ public final class HdmiControlService extends SystemService { void wakeUp() { assertRunOnServiceThread(); mWakeUpMessageReceived = true; - mPowerManager.wakeUp(SystemClock.uptimeMillis()); + mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.server.hdmi:WAKE"); // PowerManger will send the broadcast Intent.ACTION_SCREEN_ON and after this gets // the intent, the sequence will continue at onWakeUp(). } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 9e41f70..978ed51 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -753,7 +753,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { synchronized (mLock) { if (shouldEnableWakeGestureLp()) { performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false); - wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromWakeGesture); + wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromWakeGesture, + "android.policy:GESTURE"); } } } @@ -4691,7 +4692,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateRotation(true); if (lidOpen) { - wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromLidSwitch); + wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromLidSwitch, + "android.policy:LID"); } else if (!mLidControlsSleep) { mPowerManager.userActivity(SystemClock.uptimeMillis(), false); } @@ -4713,7 +4715,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else { intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); } - wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromCameraLens); + wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromCameraLens, + "android.policy:CAMERA_COVER"); startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); } mCameraLensCoverState = lensCoverState; @@ -4892,7 +4895,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (isValidGlobalKey(keyCode) && mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) { if (isWakeKey) { - wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey); + wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY"); } return result; } @@ -5123,7 +5126,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (isWakeKey) { - wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey); + wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY"); } return result; @@ -5184,7 +5187,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) { if ((policyFlags & FLAG_WAKE) != 0) { - if (wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion)) { + if (wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion, + "android.policy:MOTION")) { return 0; } } @@ -5197,7 +5201,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // there will be no dream to intercept the touch and wake into ambient. The device should // wake up in this case. if (isTheaterModeEnabled() && (policyFlags & FLAG_WAKE) != 0) { - wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotionWhenNotDreaming); + wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotionWhenNotDreaming, + "android.policy:MOTION"); } return 0; @@ -5493,10 +5498,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void wakeUpFromPowerKey(long eventTime) { - wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey); + wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey, "android.policy:POWER"); } - private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode) { + private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode, String reason) { final boolean theaterModeEnabled = isTheaterModeEnabled(); if (!wakeInTheaterMode && theaterModeEnabled) { return false; @@ -5507,7 +5512,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Global.THEATER_MODE_ON, 0); } - mPowerManager.wakeUp(wakeTime); + mPowerManager.wakeUp(wakeTime, reason); return true; } diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index d21c6d2..c5ad7fe 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -472,6 +472,26 @@ final class Notifier { } /** + * Called when the screen has turned on. + */ + public void onWakeUp(String reason, int reasonUid, String opPackageName, int opUid) { + if (DEBUG) { + Slog.d(TAG, "onWakeUp: event=" + reason + ", reasonUid=" + reasonUid + + " opPackageName=" + opPackageName + " opUid=" + opUid); + } + + try { + mBatteryStats.noteWakeUp(reason, reasonUid); + if (opPackageName != null) { + mAppOps.noteOperation(AppOpsManager.OP_TURN_SCREEN_ON, opUid, opPackageName); + } + } catch (RemoteException ex) { + // Ignore + } + + } + + /** * Called when wireless charging has started so as to provide user feedback. */ public void onWirelessChargingStarted() { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 3f59755..88476ce 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -830,7 +830,18 @@ public final class PowerManagerService extends SystemService private void applyWakeLockFlagsOnAcquireLocked(WakeLock wakeLock, int uid) { if ((wakeLock.mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0 && isScreenLock(wakeLock)) { - wakeUpNoUpdateLocked(SystemClock.uptimeMillis(), uid); + String opPackageName; + int opUid; + if (wakeLock.mWorkSource != null && wakeLock.mWorkSource.getName(0) != null) { + opPackageName = wakeLock.mWorkSource.getName(0); + opUid = wakeLock.mWorkSource.get(0); + } else { + opPackageName = wakeLock.mPackageName; + opUid = wakeLock.mWorkSource != null ? wakeLock.mWorkSource.get(0) + : wakeLock.mOwnerUid; + } + wakeUpNoUpdateLocked(SystemClock.uptimeMillis(), wakeLock.mTag, opUid, + opPackageName, opUid); } } @@ -1042,17 +1053,19 @@ public final class PowerManagerService extends SystemService return false; } - private void wakeUpInternal(long eventTime, int uid) { + private void wakeUpInternal(long eventTime, String reason, int uid, String opPackageName, + int opUid) { synchronized (mLock) { - if (wakeUpNoUpdateLocked(eventTime, uid)) { + if (wakeUpNoUpdateLocked(eventTime, reason, uid, opPackageName, opUid)) { updatePowerStateLocked(); } } } - private boolean wakeUpNoUpdateLocked(long eventTime, int uid) { + private boolean wakeUpNoUpdateLocked(long eventTime, String reason, int reasonUid, + String opPackageName, int opUid) { if (DEBUG_SPEW) { - Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime + ", uid=" + uid); + Slog.d(TAG, "wakeUpNoUpdateLocked: eventTime=" + eventTime + ", uid=" + reasonUid); } if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE @@ -1064,21 +1077,22 @@ public final class PowerManagerService extends SystemService try { switch (mWakefulness) { case WAKEFULNESS_ASLEEP: - Slog.i(TAG, "Waking up from sleep (uid " + uid +")..."); + Slog.i(TAG, "Waking up from sleep (uid " + reasonUid +")..."); break; case WAKEFULNESS_DREAMING: - Slog.i(TAG, "Waking up from dream (uid " + uid +")..."); + Slog.i(TAG, "Waking up from dream (uid " + reasonUid +")..."); break; case WAKEFULNESS_DOZING: - Slog.i(TAG, "Waking up from dozing (uid " + uid +")..."); + Slog.i(TAG, "Waking up from dozing (uid " + reasonUid +")..."); break; } mLastWakeTime = eventTime; setWakefulnessLocked(WAKEFULNESS_AWAKE, 0); + mNotifier.onWakeUp(reason, reasonUid, opPackageName, opUid); userActivityNoUpdateLocked( - eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); + eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } @@ -1334,7 +1348,8 @@ public final class PowerManagerService extends SystemService final long now = SystemClock.uptimeMillis(); if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, dockedOnWirelessCharger)) { - wakeUpNoUpdateLocked(now, Process.SYSTEM_UID); + wakeUpNoUpdateLocked(now, "android.server.power:POWER", Process.SYSTEM_UID, + mContext.getOpPackageName(), Process.SYSTEM_UID); } userActivityNoUpdateLocked( now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); @@ -1788,7 +1803,8 @@ public final class PowerManagerService extends SystemService PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID); updatePowerStateLocked(); } else { - wakeUpNoUpdateLocked(SystemClock.uptimeMillis(), Process.SYSTEM_UID); + wakeUpNoUpdateLocked(SystemClock.uptimeMillis(), "android.server.power:DREAM", + Process.SYSTEM_UID, mContext.getOpPackageName(), Process.SYSTEM_UID); updatePowerStateLocked(); } } else if (wakefulness == WAKEFULNESS_DOZING) { @@ -3136,7 +3152,7 @@ public final class PowerManagerService extends SystemService } @Override // Binder call - public void wakeUp(long eventTime) { + public void wakeUp(long eventTime, String reason, String opPackageName) { if (eventTime > SystemClock.uptimeMillis()) { throw new IllegalArgumentException("event time must not be in the future"); } @@ -3147,7 +3163,7 @@ public final class PowerManagerService extends SystemService final int uid = Binder.getCallingUid(); final long ident = Binder.clearCallingIdentity(); try { - wakeUpInternal(eventTime, uid); + wakeUpInternal(eventTime, reason, uid, opPackageName, uid); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ec566bc..05c111c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -10307,7 +10307,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_VISIBILITY || DEBUG_POWER) { Slog.v(TAG, "Turning screen on after layout!"); } - mPowerManager.wakeUp(SystemClock.uptimeMillis()); + mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.server.wm:TURN_ON"); } mTurnOnScreen = false; } |