From 4c29c7a7a7aebf8594e839ec249520169d4f8a08 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 19 Mar 2021 12:02:07 -0700 Subject: [PATCH] Ensure accessibility updates during the recents animation - There is no focused window (only the input consumer) during the recents animation so depending on when the window changes are computed for accessibility, it is possible that accessibility will not updated to reflect Launcher being visible. In these cases where we are swiping up to home, we already prevent input from going to the app (via the input consumer) and the home app should be considered for accessibility. Bug: 183238051 Test: Enable live tile, swipe up to enter Overview repeatedly Change-Id: I2503010c9e5dd1898f9c21ff9a9ee91c1be0d16f --- .../server/wm/AccessibilityController.java | 13 +++++++++---- .../server/wm/RecentsAnimationController.java | 16 +++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index e6d37b60882e2..b947c8883d074 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -1511,10 +1511,15 @@ final class AccessibilityController { IBinder topFocusedWindowToken = null; synchronized (mService.mGlobalLock) { - // Do not send the windows if there is no top focus as - // the window manager is still looking for where to put it. - // We will do the work when we get a focus change callback. - final WindowState topFocusedWindowState = getTopFocusWindow(); + // If there is a recents animation running, then use the animation target as the + // top window state. Otherwise,do not send the windows if there is no top focus as + // the window manager is still looking for where to put it. We will do the work when + // we get a focus change callback. + final RecentsAnimationController controller = + mService.getRecentsAnimationController(); + final WindowState topFocusedWindowState = controller != null + ? controller.getTargetAppMainWindow() + : getTopFocusWindow(); if (topFocusedWindowState == null) { if (DEBUG) { Slog.d(LOG_TAG, "top focused window is null, compute it again later"); diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 64ff1084a6b81..d0bab06c53361 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -568,8 +568,9 @@ public class RecentsAnimationController implements DeathRecipient { ? mMinimizedHomeBounds : null; final Rect contentInsets; - if (mTargetActivityRecord != null && mTargetActivityRecord.findMainWindow() != null) { - contentInsets = mTargetActivityRecord.findMainWindow() + final WindowState targetAppMainWindow = getTargetAppMainWindow(); + if (targetAppMainWindow != null) { + contentInsets = targetAppMainWindow .getInsetsStateWithVisibilityOverride() .calculateInsets(mTargetActivityRecord.getBounds(), Type.systemBars(), false /* ignoreVisibility */); @@ -1004,9 +1005,7 @@ public class RecentsAnimationController implements DeathRecipient { boolean updateInputConsumerForApp(InputWindowHandle inputWindowHandle) { // Update the input consumer touchable region to match the target app main window - final WindowState targetAppMainWindow = mTargetActivityRecord != null - ? mTargetActivityRecord.findMainWindow() - : null; + final WindowState targetAppMainWindow = getTargetAppMainWindow(); if (targetAppMainWindow != null) { targetAppMainWindow.getBounds(mTmpRect); inputWindowHandle.touchableRegion.set(mTmpRect); @@ -1026,6 +1025,13 @@ public class RecentsAnimationController implements DeathRecipient { return mTargetActivityRecord.windowsCanBeWallpaperTarget(); } + WindowState getTargetAppMainWindow() { + if (mTargetActivityRecord == null) { + return null; + } + return mTargetActivityRecord.findMainWindow(); + } + boolean isAnimatingTask(Task task) { for (int i = mPendingAnimations.size() - 1; i >= 0; i--) { if (task == mPendingAnimations.get(i).mTask) {