From 652b54afc24c206b63c4e25fd46bca0aa14e8470 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 --- .../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 | 50 ++++++------------- .../com/android/server/wm/WindowState.java | 14 +++--- .../server/wm/WindowStateAnimator.java | 2 +- 8 files changed, 30 insertions(+), 52 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 7a42351c33c1d..1e3b1944797cd 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -844,7 +844,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 dacae173ac5c2..21fe96ba9a16f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1276,7 +1276,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()); @@ -3539,7 +3539,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)); @@ -5174,7 +5174,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(); @@ -5704,7 +5704,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 73e10069fdd31..8ac32ab693024 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; @@ -1382,6 +1382,7 @@ public class WindowManagerService extends IWindowManager.Stub mStartingSurfaceController = new StartingSurfaceController(this); mBlurController = new BlurController(mContext, mPowerManager); + mAccessibilityController = new AccessibilityController(this); } DisplayAreaPolicy.Provider getDisplayAreaPolicyProvider() { @@ -2161,7 +2162,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()); } @@ -2174,7 +2175,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( @@ -2264,7 +2265,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()); @@ -2586,7 +2587,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mDestroying = true; win.destroySurface(false, stopped); } - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.onWindowTransition(win, transit); } @@ -6376,7 +6377,7 @@ public class WindowManagerService extends IWindowManager.Stub mInputManagerCallback.dump(pw, " "); mTaskSnapshotController.dump(pw, " "); - if (mAccessibilityController != null) { + if (mAccessibilityController.hasCallbacks()) { mAccessibilityController.dump(pw, " "); } @@ -7396,7 +7397,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!"); @@ -7407,7 +7408,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!"); @@ -7418,7 +7419,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!"); @@ -7434,7 +7435,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) { @@ -7453,16 +7454,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); } } @@ -7470,15 +7462,7 @@ public class WindowManagerService extends IWindowManager.Stub public void setWindowsForAccessibilityCallback(int displayId, WindowsForAccessibilityCallback callback) { synchronized (mGlobalLock) { - if (mAccessibilityController == null) { - mAccessibilityController = new AccessibilityController( - WindowManagerService.this); - } - mAccessibilityController.setWindowsForAccessibilityCallback( - displayId, callback); - if (!mAccessibilityController.hasCallbacks()) { - mAccessibilityController = null; - } + mAccessibilityController.setWindowsForAccessibilityCallback(displayId, callback); } } @@ -7651,13 +7635,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 22db2975ef41a..f848c2286e57d 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2212,7 +2212,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); } } @@ -2233,7 +2233,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; @@ -2283,7 +2283,7 @@ class WindowState extends WindowContainer implements WindowManagerP startMoveAnimation(left, top); } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(getDisplayId()); } updateLocationInParentDisplayIfNeeded(); @@ -2569,7 +2569,7 @@ class WindowState extends WindowContainer implements WindowManagerP setDisplayLayoutNeeded(); mWmService.requestTraversal(); } - if (mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController.hasCallbacks()) { mWmService.mAccessibilityController.onWindowTransition(this, transit); } } @@ -3589,7 +3589,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); } } @@ -3933,7 +3933,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(); @@ -5059,7 +5059,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 f25706a97fb63..81f06d9cbaca0 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -682,7 +682,7 @@ class WindowStateAnimator { applyAnimationLocked(transit, true); } - if (mService.mAccessibilityController != null) { + if (mService.mAccessibilityController.hasCallbacks()) { mService.mAccessibilityController.onWindowTransition(mWin, transit); } }