From f772cba59760d1ad9eb5cb9205b2e2e9126e488d Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 5 Oct 2012 18:49:17 -0700 Subject: [PATCH] Accessibility active window not updated on time. 1. The active window is the one the user is touching or the one that has input focus. It has to be made current immediately after the user has stopped touching the screen because if the user types with the IME he should get a feedback for the letter typed in the text view which is in the input focused window. Note that we always deliver hover accessibility events (they are a result of user touching the screen) so change of the active window before all hover accessibility events from the touched window are delivered is fine. bug:7296890 Change-Id: I1ae87c8419e2f19bd8eb68de084c7117c66894bc --- .../AccessibilityManagerService.java | 22 ++++++++++++++----- .../server/accessibility/TouchExplorer.java | 5 +++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 5e9e223dacb87..6782f5ee18c17 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -643,6 +643,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return mSecurityPolicy.mActiveWindowId; } + void onTouchInteractionEnd() { + mSecurityPolicy.onTouchInteractionEnd(); + } + private void switchUser(int userId) { synchronized (mLock) { // The user switched so we do not need to restore the current user @@ -2178,16 +2182,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mActiveWindowId = windowId; } } break; - case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: - case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: { + case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: { mActiveWindowId = windowId; } break; - case AccessibilityEvent.TYPE_TOUCH_INTERACTION_END: { - mActiveWindowId = getFocusedWindowId(); - } break; } } + public void onTouchInteractionEnd() { + // We want to set the active window to be current immediately + // after the user has stopped touching the screen since if the + // user types with the IME he should get a feedback for the + // letter typed in the text view which is in the input focused + // window. Note that we always deliver hover accessibility events + // (they are a result of user touching the screen) so change of + // the active window before all hover accessibility events from + // the touched window are delivered is fine. + mActiveWindowId = getFocusedWindowId(); + } + public int getRetrievalAllowingWindowLocked() { return mActiveWindowId; } diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java index b3bf6fee9c3c5..26887767028a1 100644 --- a/services/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/java/com/android/server/accessibility/TouchExplorer.java @@ -304,6 +304,7 @@ class TouchExplorer implements EventStreamTransformation { mNext.clear(); } mTouchExplorationInProgress = false; + mAms.onTouchInteractionEnd(); } @Override @@ -615,6 +616,7 @@ class TouchExplorer implements EventStreamTransformation { } } break; case MotionEvent.ACTION_UP: + mAms.onTouchInteractionEnd(); // We know that we do not need the pre-fed gesture points are not // needed anymore since the last pointer just went up. mStrokeBuffer.clear(); @@ -737,6 +739,7 @@ class TouchExplorer implements EventStreamTransformation { } } break; case MotionEvent.ACTION_UP: { + mAms.onTouchInteractionEnd(); // Announce the end of a new touch interaction. sendAccessibilityEvent( AccessibilityEvent.TYPE_TOUCH_INTERACTION_END); @@ -782,6 +785,7 @@ class TouchExplorer implements EventStreamTransformation { AccessibilityEvent.TYPE_TOUCH_INTERACTION_END); //$FALL-THROUGH$ case MotionEvent.ACTION_POINTER_UP: { + mAms.onTouchInteractionEnd(); mLongPressingPointerId = -1; mLongPressingPointerDeltaX = 0; mLongPressingPointerDeltaY = 0; @@ -819,6 +823,7 @@ class TouchExplorer implements EventStreamTransformation { } } break; case MotionEvent.ACTION_UP: { + mAms.onTouchInteractionEnd(); // Announce the end of gesture recognition. sendAccessibilityEvent( AccessibilityEvent.TYPE_GESTURE_DETECTION_END);