diff options
| author | 2022-08-22 12:59:14 +0000 | |
|---|---|---|
| committer | 2022-08-22 12:59:14 +0000 | |
| commit | 9a3435ddd333964b1ba3f23aeef4b779c4f212e7 (patch) | |
| tree | 80d3a3afbf739f01979bf42acf799bc5aa435850 | |
| parent | eeee9520381d4a7ad612c655837322dbbc6dee20 (diff) | |
| parent | 60b15c178b0824d0e56206e1b8c10746375d3415 (diff) | |
Merge "Use user activity touch event to reduce latency of UDFPS" into tm-qpr-dev am: 0e1079f6f3 am: 60b15c178b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19668183
Change-Id: I1283c0e3c5d6a7d150293f3568f55609f58afa0f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
8 files changed, 36 insertions, 24 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index cf50f7f8524b..d1589b23454d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -517,8 +517,6 @@ public class UdfpsController implements DozeReceiver { scaledMajor); Log.v(TAG, "onTouch | finger down: " + touchInfo); mTouchLogTime = mSystemClock.elapsedRealtime(); - mPowerManager.userActivity(mSystemClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); handled = true; } else if (sinceLastLog >= MIN_TOUCH_LOG_INTERVAL) { Log.v(TAG, "onTouch | finger move: " + touchInfo); @@ -846,6 +844,9 @@ public class UdfpsController implements DozeReceiver { return; } mLatencyTracker.onActionStart(LatencyTracker.ACTION_UDFPS_ILLUMINATE); + // Refresh screen timeout and boost process priority if possible. + mPowerManager.userActivity(mSystemClock.uptimeMillis(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); if (!mOnFingerDown) { playStartHaptic(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 1b46d4433e8c..51bf55759962 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5118,18 +5118,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override - public void userActivity() { - // *************************************** - // NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE - // *************************************** - // THIS IS CALLED FROM DEEP IN THE POWER MANAGER - // WITH ITS LOCKS HELD. - // - // This code must be VERY careful about the locks - // it acquires. - // In fact, the current code acquires way too many, - // and probably has lurking deadlocks. - + public void userActivity(int displayGroupId, int event) { + if (displayGroupId == DEFAULT_DISPLAY && event == PowerManager.USER_ACTIVITY_EVENT_TOUCH) { + mDefaultDisplayPolicy.onUserActivityEventTouch(); + } synchronized (mScreenLockTimeout) { if (mLockScreenTimerActive) { // reset the timer diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 6fcdb7de52be..2b0405073323 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1006,7 +1006,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Called when userActivity is signalled in the power manager. * This is safe to call from any thread, with any window manager locks held or not. */ - public void userActivity(); + void userActivity(int displayGroupId, int event); /** * Called when we have finished booting and can now display the home diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 28ba6343c923..dad9584c6722 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -713,7 +713,7 @@ public class Notifier { } TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); tm.notifyUserActivity(); - mPolicy.userActivity(); + mPolicy.userActivity(displayGroupId, event); mFaceDownDetector.userActivity(event); mScreenUndimDetector.userActivity(displayGroupId); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 87a4fe9b9817..0a4bc60d7ece 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -311,7 +311,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** * The duration to keep a process in animating state (top scheduling group) when the - * wakefulness is changing from awake to doze or sleep. + * wakefulness is dozing (unlocking) or changing from awake to doze or sleep (locking). */ private static final long DOZE_ANIMATING_STATE_RETAIN_TIME_MS = 2000; @@ -2927,12 +2927,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mDemoteTopAppReasons &= ~DEMOTE_TOP_REASON_DURING_UNLOCKING; final WindowState notificationShade = mRootWindowContainer.getDefaultDisplay() .getDisplayPolicy().getNotificationShade(); - proc = notificationShade != null - ? mProcessMap.getProcess(notificationShade.mSession.mPid) : null; - } - if (proc == null) { - return; + proc = notificationShade != null ? notificationShade.getProcess() : null; } + setProcessAnimatingWhileDozing(proc); + } + + // The caller MUST NOT hold the global lock because it calls AM method directly. + void setProcessAnimatingWhileDozing(WindowProcessController proc) { + if (proc == null) return; // Set to activity manager directly to make sure the state can be seen by the subsequent // update of scheduling group. proc.setRunningAnimationUnsafe(); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 05f4de19186e..24cef31dde7c 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -258,7 +258,7 @@ public class DisplayPolicy { private volatile boolean mWindowManagerDrawComplete; private WindowState mStatusBar = null; - private WindowState mNotificationShade = null; + private volatile WindowState mNotificationShade; private final int[] mStatusBarHeightForRotation = new int[4]; private WindowState mNavigationBar = null; @NavigationBarPosition @@ -2746,6 +2746,19 @@ public class DisplayPolicy { mImmersiveModeConfirmation.onLockTaskModeChangedLw(lockTaskState); } + /** Called when a {@link android.os.PowerManager#USER_ACTIVITY_EVENT_TOUCH} is sent. */ + public void onUserActivityEventTouch() { + // If there is keyguard, it may use INPUT_FEATURE_DISABLE_USER_ACTIVITY (InputDispatcher + // won't trigger user activity for touch). So while the device is not interactive, the user + // event is only sent explicitly from SystemUI. + if (mAwake) return; + // If the event is triggered while the display is not awake, the screen may be showing + // dozing UI such as AOD or overlay UI of under display fingerprint. Then set the animating + // state temporarily to make the process more responsive. + final WindowState w = mNotificationShade; + mService.mAtmService.setProcessAnimatingWhileDozing(w != null ? w.getProcess() : null); + } + boolean onSystemUiSettingsChanged() { return mImmersiveModeConfirmation.onSettingChanged(mService.mCurrentUserId); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index d222a566bd9d..a85dcbf24361 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3802,6 +3802,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return wpc != null && wpc.registeredForDisplayAreaConfigChanges(); } + WindowProcessController getProcess() { + return mWpcForDisplayAreaConfigChanges; + } + /** * Fills the given window frames and merged configuration for the client. * diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 030af308a520..13da1543cfb8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -245,7 +245,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public void userActivity() { + public void userActivity(int displayGroupId, int event) { } @Override |