summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java5
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java16
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java2
-rw-r--r--services/core/java/com/android/server/power/Notifier.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java14
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java15
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java2
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