From d72d79375c90240dc2939bf77432ee4000a7c2e9 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Wed, 8 Sep 2021 16:32:09 -0700 Subject: [PATCH] WM: Make AccessibilityController persistent Keep the AccessibilityController alive so we can keep track of focus changes from input. This will allow Accessibility service to query the focus window and get the focused embedded window as well. Bug: b/188792659 Test: presubmit Change-Id: I5741ed373938963da129c410c5226dff5a84ce30 Merged-In: I5741ed373938963da129c410c5226dff5a84ce30 --- .../server/wm/AppTransitionController.java | 2 +- .../com/android/server/wm/DisplayContent.java | 8 +-- .../wm/DockedTaskDividerController.java | 2 +- .../java/com/android/server/wm/ShellRoot.java | 2 +- .../com/android/server/wm/WindowAnimator.java | 2 +- .../server/wm/WindowManagerService.java | 53 ++++++------------- .../com/android/server/wm/WindowState.java | 14 ++--- .../server/wm/WindowStateAnimator.java | 2 +- 8 files changed, 31 insertions(+), 54 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 0e04c426ce1e2..ffaf710523eeb 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -904,7 +904,7 @@ public class AppTransitionController { final AccessibilityController accessibilityController = mDisplayContent.mWmService.mAccessibilityController; - if (accessibilityController != null) { + if (accessibilityController.hasCallbacks()) { accessibilityController.onAppWindowTransition(mDisplayContent.getDisplayId(), transit); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1db4c1da20232..b581e5bbd23ff 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1284,7 +1284,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp addWindowToken(token.token, token); - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { final int prevDisplayId = prevDc != null ? prevDc.getDisplayId() : INVALID_DISPLAY; mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(prevDisplayId, getDisplayId()); @@ -3569,7 +3569,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // focused one starts firing events. // TODO(b/151179149) investigate what info accessibility service needs before input can // dispatch focus to clients. - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mH.sendMessage(PooledLambda.obtainMessage( this::updateAccessibilityOnWindowFocusChanged, mWmService.mAccessibilityController)); @@ -5216,7 +5216,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } if (!mLocationInParentWindow.equals(x, y)) { mLocationInParentWindow.set(x, y); - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(mDisplayId); } notifyLocationInParentDisplayChanged(); @@ -5774,7 +5774,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @Override void onResize() { super.onResize(); - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onDisplaySizeChanged(this); } } diff --git a/services/core/java/com/android/server/wm/DockedTaskDividerController.java b/services/core/java/com/android/server/wm/DockedTaskDividerController.java index fb9d06441536a..925a6d858a3d0 100644 --- a/services/core/java/com/android/server/wm/DockedTaskDividerController.java +++ b/services/core/java/com/android/server/wm/DockedTaskDividerController.java @@ -46,7 +46,7 @@ public class DockedTaskDividerController { void setTouchRegion(Rect touchRegion) { mTouchRegion.set(touchRegion); // We need to report touchable region changes to accessibility. - if (mDisplayContent.mWmService.mAccessibilityController != null) { + if (mDisplayContent.mWmService.mAccessibilityController.hasCallbacks()) { mDisplayContent.mWmService.mAccessibilityController.onSomeWindowResizedOrMoved( mDisplayContent.getDisplayId()); } diff --git a/services/core/java/com/android/server/wm/ShellRoot.java b/services/core/java/com/android/server/wm/ShellRoot.java index be6a5d2fe27ba..6ed59e96c7002 100644 --- a/services/core/java/com/android/server/wm/ShellRoot.java +++ b/services/core/java/com/android/server/wm/ShellRoot.java @@ -197,7 +197,7 @@ public class ShellRoot { mAccessibilityWindow = null; } } - if (mDisplayContent.mWmService.mAccessibilityController != null) { + if (mDisplayContent.mWmService.mAccessibilityController.hasCallbacks()) { mDisplayContent.mWmService.mAccessibilityController.onSomeWindowResizedOrMoved( mDisplayContent.getDisplayId()); } diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index eb32486d6023c..4a43f4f73edaf 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -164,7 +164,7 @@ public class WindowAnimator { final DisplayContent dc = root.getDisplayContent(displayId); dc.checkAppWindowsReadyToShow(); - if (accessibilityController != null) { + if (accessibilityController.hasCallbacks()) { accessibilityController.drawMagnifiedRegionBorderIfNeeded(displayId, mTransaction); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c77cd509ca4f5..4cf8c97eb1326 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -636,7 +636,7 @@ public class WindowManagerService extends IWindowManager.Stub /** List of window currently causing non-system overlay windows to be hidden. */ private ArrayList mHidingNonSystemOverlayWindows = new ArrayList<>(); - AccessibilityController mAccessibilityController; + final AccessibilityController mAccessibilityController; private RecentsAnimationController mRecentsAnimationController; Watermark mWatermark; @@ -1387,6 +1387,7 @@ public class WindowManagerService extends IWindowManager.Stub mStartingSurfaceController = new StartingSurfaceController(this); mBlurController = new BlurController(mContext, mPowerManager); + mAccessibilityController = new AccessibilityController(this); } DisplayAreaPolicy.Provider getDisplayAreaPolicyProvider() { @@ -2164,7 +2165,7 @@ public class WindowManagerService extends IWindowManager.Stub mWindowPlacerLocked.performSurfacePlacement(); // We need to report touchable region changes to accessibility. - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.onSomeWindowResizedOrMovedWithCallingUid( uid, w.getDisplayContent().getDisplayId()); } @@ -2177,7 +2178,7 @@ public class WindowManagerService extends IWindowManager.Stub public void onRectangleOnScreenRequested(IBinder token, Rect rectangle) { synchronized (mGlobalLock) { - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { WindowState window = mWindowMap.get(token); if (window != null) { mAccessibilityController.onRectangleOnScreenRequested( @@ -2267,7 +2268,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mActivityRecord.checkKeyguardFlagsChanged(); } if (((attrChanges & LayoutParams.ACCESSIBILITY_TITLE_CHANGED) != 0) - && (mAccessibilityController != null)) { + && (mAccessibilityController.hasCallbacks())) { // No move or resize, but the controller checks for title changes as well mAccessibilityController.onSomeWindowResizedOrMovedWithCallingUid( uid, win.getDisplayContent().getDisplayId()); @@ -2594,7 +2595,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mDestroying = true; win.destroySurface(false, stopped); } - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.onWindowTransition(win, transit); } @@ -6423,7 +6424,7 @@ public class WindowManagerService extends IWindowManager.Stub mInputManagerCallback.dump(pw, " "); mTaskSnapshotController.dump(pw, " "); - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.dump(pw, " "); } @@ -7443,7 +7444,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void setMagnificationSpec(int displayId, MagnificationSpec spec) { synchronized (mGlobalLock) { - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.setMagnificationSpec(displayId, spec); } else { throw new IllegalStateException("Magnification callbacks not set!"); @@ -7454,7 +7455,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void setForceShowMagnifiableBounds(int displayId, boolean show) { synchronized (mGlobalLock) { - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.setForceShowMagnifiableBounds(displayId, show); } else { throw new IllegalStateException("Magnification callbacks not set!"); @@ -7465,7 +7466,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void getMagnificationRegion(int displayId, @NonNull Region magnificationRegion) { synchronized (mGlobalLock) { - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.getMagnificationRegion(displayId, magnificationRegion); } else { throw new IllegalStateException("Magnification callbacks not set!"); @@ -7481,7 +7482,7 @@ public class WindowManagerService extends IWindowManager.Stub return null; } MagnificationSpec spec = null; - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { spec = mAccessibilityController.getMagnificationSpecForWindow(windowState); } if ((spec == null || spec.isNop()) && windowState.mGlobalScale == 1.0f) { @@ -7500,16 +7501,7 @@ public class WindowManagerService extends IWindowManager.Stub public boolean setMagnificationCallbacks(int displayId, @Nullable MagnificationCallbacks callbacks) { synchronized (mGlobalLock) { - if (mAccessibilityController == null) { - mAccessibilityController = new AccessibilityController( - WindowManagerService.this); - } - boolean result = mAccessibilityController.setMagnificationCallbacks( - displayId, callbacks); - if (!mAccessibilityController.hasCallbacks()) { - mAccessibilityController = null; - } - return result; + return mAccessibilityController.setMagnificationCallbacks(displayId, callbacks); } } @@ -7517,17 +7509,8 @@ public class WindowManagerService extends IWindowManager.Stub public boolean setWindowsForAccessibilityCallback(int displayId, WindowsForAccessibilityCallback callback) { synchronized (mGlobalLock) { - if (mAccessibilityController == null) { - mAccessibilityController = new AccessibilityController( - WindowManagerService.this); - } - final boolean result = - mAccessibilityController.setWindowsForAccessibilityCallback( - displayId, callback); - if (!mAccessibilityController.hasCallbacks()) { - mAccessibilityController = null; - } - return result; + return mAccessibilityController + .setWindowsForAccessibilityCallback(displayId, callback); } } @@ -7700,13 +7683,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void computeWindowsForAccessibility(int displayId) { - final AccessibilityController accessibilityController; - synchronized (mGlobalLock) { - accessibilityController = mAccessibilityController; - } - if (accessibilityController != null) { - accessibilityController.performComputeChangedWindowsNot(displayId, true); - } + mAccessibilityController.performComputeChangedWindowsNot(displayId, true); } @Override diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 5f9d4f5182bc4..6afa2e0f690dd 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2216,7 +2216,7 @@ class WindowState extends WindowContainer implements WindowManagerP mWmService.mAccessibilityController; final int winTransit = TRANSIT_EXIT; mWinAnimator.applyAnimationLocked(winTransit, false /* isEntrance */); - if (accessibilityController != null) { + if (accessibilityController.hasCallbacks()) { accessibilityController.onWindowTransition(this, winTransit); } } @@ -2237,7 +2237,7 @@ class WindowState extends WindowContainer implements WindowManagerP } if (isVisibleNow() && animateExit) { mWinAnimator.applyAnimationLocked(TRANSIT_EXIT, false); - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onWindowTransition(this, TRANSIT_EXIT); } changed = true; @@ -2287,7 +2287,7 @@ class WindowState extends WindowContainer implements WindowManagerP startMoveAnimation(left, top); } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(getDisplayId()); } updateLocationInParentDisplayIfNeeded(); @@ -2573,7 +2573,7 @@ class WindowState extends WindowContainer implements WindowManagerP setDisplayLayoutNeeded(); mWmService.requestTraversal(); } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onWindowTransition(this, transit); } } @@ -3598,7 +3598,7 @@ class WindowState extends WindowContainer implements WindowManagerP if (mAttrs.type >= FIRST_SYSTEM_WINDOW && mAttrs.type != TYPE_TOAST) { mWmService.mAtmService.mActiveUids.onNonAppSurfaceVisibilityChanged(mOwnerUid, shown); } - if (mIsImWindow && mWmService.mAccessibilityController != null) { + if (mIsImWindow && mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onImeSurfaceShownChanged(this, shown); } } @@ -3942,7 +3942,7 @@ class WindowState extends WindowContainer implements WindowManagerP "Requested redraw for orientation change: %s", this); } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(displayId); } updateLocationInParentDisplayIfNeeded(); @@ -5068,7 +5068,7 @@ class WindowState extends WindowContainer implements WindowManagerP if (isAnimating()) { return; } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(getDisplayId()); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index d4d897177cb4e..423b3a05565ed 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -677,7 +677,7 @@ class WindowStateAnimator { applyAnimationLocked(transit, true); } - if (mService.mAccessibilityController != null) { + if (mService.mAccessibilityController.hasCallbacks()) { mService.mAccessibilityController.onWindowTransition(mWin, transit); } }