diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 7b2b8e4e50e0e..fd05c231fa49b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1322,7 +1322,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ public boolean accessibilityFocusOnlyInActiveWindow() { synchronized (mLock) { - return mA11yWindowManager.isTrackingWindowsLocked(); + return mA11yWindowManager.accessibilityFocusOnlyInActiveWindowLocked(); } } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java index 0a68d71ece493..09485d179e602 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java @@ -1383,20 +1383,9 @@ public class AccessibilityWindowManager { // the touched window are delivered is fine. final int oldActiveWindow = mActiveWindowId; setActiveWindowLocked(mTopFocusedWindowId); - - // If there is no service that can operate with interactive windows - // then we keep the old behavior where a window loses accessibility - // focus if it is no longer active. This still changes the behavior - // for services that do not operate with interactive windows and run - // at the same time as the one(s) which does. In practice however, - // there is only one service that uses accessibility focus and it - // is typically the one that operates with interactive windows, So, - // this is fine. Note that to allow a service to work across windows - // we have to allow accessibility focus stay in any of them. Sigh... - final boolean accessibilityFocusOnlyInActiveWindow = !isTrackingWindowsLocked(); if (oldActiveWindow != mActiveWindowId && mAccessibilityFocusedWindowId == oldActiveWindow - && accessibilityFocusOnlyInActiveWindow) { + && accessibilityFocusOnlyInActiveWindowLocked()) { clearAccessibilityFocusLocked(oldActiveWindow); } } @@ -1617,6 +1606,15 @@ public class AccessibilityWindowManager { return displayList; } + // If there is no service that can operate with interactive windows + // then a window loses accessibility focus if it is no longer active. + // This inspection happens when the user interaction is ended. + // Note that to allow a service to work across windows, + // we have to allow accessibility focus stay in any of them. + boolean accessibilityFocusOnlyInActiveWindowLocked() { + return !isTrackingWindowsLocked(); + } + /** * Gets current input focused window token from window manager, and returns its windowId. * diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java index 6dabe76c7dc9d..6ff082673a153 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java @@ -98,7 +98,6 @@ public class TouchState { mLastReceivedEvent.recycle(); mLastReceivedEvent = null; } - mLastTouchedWindowId = -1; mReceivedPointerTracker.clear(); mInjectedPointersDown = 0; }