From 238099c0dbbdc66b8443552126680ad1c7cab17d Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 1 Jun 2012 13:52:54 -0700 Subject: Cannot double tap and hold outside of the input focused window. 1. The long press routine was using the coordintates of the accessibility focused item in the input focused window. As a result double tap and hold did not work in a window that does not take input focus such as the system bar. Now the routine is using the last touch explored location if it cannot find accessibility focus in the last touched window. bug:6584438 Change-Id: Ifd43adb20a066f389a9d4bd5716dd7ad834dd574 --- .../server/accessibility/TouchExplorer.java | 46 ++++++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) (limited to 'services') diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java index b0b2b8d..bcf893e 100644 --- a/services/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/java/com/android/server/accessibility/TouchExplorer.java @@ -1247,25 +1247,45 @@ public class TouchExplorer { @Override public void run() { - final int pointerIndex = mEvent.getActionIndex(); + // If the last touched explored location is not within the focused + // window we will long press at that exact spot, otherwise we find the + // accessibility focus and if the tap is within its bounds we long press + // there, otherwise we pick the middle of the focus rectangle. + MotionEvent lastEvent = mInjectedPointerTracker.getLastInjectedHoverEvent(); + if (lastEvent == null) { + return; + } + + final int exploreLocationX = (int) lastEvent.getX(lastEvent.getActionIndex()); + final int exploreLocationY = (int) lastEvent.getY(lastEvent.getActionIndex()); + + Rect bounds = mTempRect; + boolean useFocusedBounds = false; + + final int pointerId = mEvent.getPointerId(mEvent.getActionIndex()); + final int pointerIndex = mEvent.findPointerIndex(pointerId); + if (mAms.getAccessibilityFocusBounds(exploreLocationX, exploreLocationY, bounds)) { + // If the user's last touch explored location is not + // within the accessibility focus bounds we use the center + // of the accessibility focused rectangle. + if (!bounds.contains((int) mEvent.getX(pointerIndex), + (int) mEvent.getY(pointerIndex))) { + useFocusedBounds = true; + } + } + + mLongPressingPointerId = mEvent.getPointerId(pointerIndex); + final int eventX = (int) mEvent.getX(pointerIndex); final int eventY = (int) mEvent.getY(pointerIndex); - Rect bounds = mTempRect; - if (mAms.getAccessibilityFocusBounds(eventX, eventY, bounds) - && !bounds.contains(eventX, eventY)) { - mLongPressingPointerId = mEvent.getPointerId(pointerIndex); + if (useFocusedBounds) { mLongPressingPointerDeltaX = eventX - bounds.centerX(); mLongPressingPointerDeltaY = eventY - bounds.centerY(); } else { - mLongPressingPointerId = -1; - mLongPressingPointerDeltaX = 0; - mLongPressingPointerDeltaY = 0; + mLongPressingPointerDeltaX = eventX - exploreLocationX; + mLongPressingPointerDeltaY = eventY - exploreLocationY; } - // We are sending events so send exit and gesture - // end since we transition to another state. - final int pointerId = mReceivedPointerTracker.getPrimaryActivePointerId(); - final int pointerIdBits = (1 << pointerId); - mAms.touchExplorationGestureEnded(); + sendExitEventsIfNeeded(mPolicyFlags); mCurrentState = STATE_DELEGATING; -- cgit v1.1