diff options
7 files changed, 56 insertions, 0 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 75940e8b6129..77a74e260811 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -416,4 +416,10 @@ interface IWindowManager * Returns true if window trace is enabled. */ boolean isWindowTraceEnabled(); + + /** + * Requests that the WindowManager sends WindowManagerPolicy#ACTION_USER_ACTIVITY_NOTIFICATION + * on the next user activity. + */ + void requestUserActivityNotification(); } diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java index a6f36bbf4ef4..23dc9da694a6 100644 --- a/core/java/android/view/WindowManagerPolicyConstants.java +++ b/core/java/android/view/WindowManagerPolicyConstants.java @@ -51,6 +51,12 @@ public interface WindowManagerPolicyConstants { int NAV_BAR_BOTTOM = 1 << 2; /** + * Broadcast sent when a user activity is detected. + */ + String ACTION_USER_ACTIVITY_NOTIFICATION = + "android.intent.action.USER_ACTIVITY_NOTIFICATION"; + + /** * Sticky broadcast of the current HDMI plugged state. */ String ACTION_HDMI_PLUGGED = "android.intent.action.HDMI_PLUGGED"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ef206f9dde03..7aec8125c7d4 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -87,6 +87,7 @@ <protected-broadcast android:name="android.intent.action.OVERLAY_CHANGED" /> <protected-broadcast android:name="android.intent.action.OVERLAY_REMOVED" /> <protected-broadcast android:name="android.intent.action.OVERLAY_PRIORITY_CHANGED" /> + <protected-broadcast android:name="android.intent.action.USER_ACTIVITY_NOTIFICATION" /> <protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" /> <protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGING" /> diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8bc9830f49d5..173a651ecb4e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -427,6 +427,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { KeyEvent.KEYCODE_CALCULATOR, Intent.CATEGORY_APP_CALCULATOR); } + private static final int USER_ACTIVITY_NOTIFICATION_DELAY = 200; + /** Amount of time (in milliseconds) to wait for windows drawn before powering on. */ static final int WAITING_FOR_DRAWN_TIMEOUT = 1000; @@ -674,6 +676,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mPendingKeyguardOccluded; private boolean mKeyguardOccludedChanged; + private boolean mNotifyUserActivity; boolean mShowingDream; private boolean mLastShowingDream; @@ -828,6 +831,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_LAUNCH_ASSIST = 26; private static final int MSG_LAUNCH_ASSIST_LONG_PRESS = 27; private static final int MSG_POWER_VERY_LONG_PRESS = 28; + private static final int MSG_NOTIFY_USER_ACTIVITY = 29; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; @@ -929,6 +933,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MSG_HANDLE_ALL_APPS: launchAllAppsAction(); break; + case MSG_NOTIFY_USER_ACTIVITY: + removeMessages(MSG_NOTIFY_USER_ACTIVITY); + Intent intent = new Intent(ACTION_USER_ACTIVITY_NOTIFICATION); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, + android.Manifest.permission.USER_ACTIVITY); + break; } } } @@ -7486,6 +7497,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHandler.sendEmptyMessage(MSG_HIDE_BOOT_MESSAGE); } + @Override + public void requestUserActivityNotification() { + if (!mNotifyUserActivity && !mHandler.hasMessages(MSG_NOTIFY_USER_ACTIVITY)) { + mNotifyUserActivity = true; + } + } + /** {@inheritDoc} */ @Override public void userActivity() { @@ -7507,6 +7525,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); } } + + if (mAwake && mNotifyUserActivity) { + mHandler.sendEmptyMessageDelayed(MSG_NOTIFY_USER_ACTIVITY, + USER_ACTIVITY_NOTIFICATION_DELAY); + mNotifyUserActivity = false; + } } class ScreenLockTimeout implements Runnable { diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index d5c12f73cacb..cd6ff30efd13 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1718,4 +1718,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { return Integer.toString(mode); } } + + /** + * Requests that the WindowManager sends WindowManagerPolicy#ACTION_USER_ACTIVITY_NOTIFICATION + * on the next user activity. + */ + public void requestUserActivityNotification(); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 2041c6fc72d6..b44d8a9994e2 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6989,6 +6989,15 @@ public class WindowManagerService extends IWindowManager.Stub mPolicy.registerShortcutKey(shortcutCode, shortcutKeyReceiver); } + @Override + public void requestUserActivityNotification() { + if (!checkCallingPermission(android.Manifest.permission.USER_ACTIVITY, + "requestUserActivityNotification()")) { + throw new SecurityException("Requires USER_ACTIVITY permission"); + } + mPolicy.requestUserActivityNotification(); + } + void markForSeamlessRotation(WindowState w, boolean seamlesslyRotated) { if (seamlesslyRotated == w.mSeamlesslyRotated) { return; diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 34c5db3c220b..6784e302a5c4 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -652,4 +652,8 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { @Override public void onScreenMagnificationStateChanged(boolean active) { } + + @Override + public void requestUserActivityNotification() { + } } |