diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-06-01 13:52:54 -0700 |
|---|---|---|
| committer | Svetoslav Ganov <svetoslavganov@google.com> | 2012-06-01 13:59:28 -0700 |
| commit | 238099c0dbbdc66b8443552126680ad1c7cab17d (patch) | |
| tree | 69adc872d92664fed388b0c9b40fc415d35e2136 /services | |
| parent | 5ab6e12b450d13c8eb501001c7a8669826b86ea4 (diff) | |
| download | frameworks_base-238099c0dbbdc66b8443552126680ad1c7cab17d.zip frameworks_base-238099c0dbbdc66b8443552126680ad1c7cab17d.tar.gz frameworks_base-238099c0dbbdc66b8443552126680ad1c7cab17d.tar.bz2 | |
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
Diffstat (limited to 'services')
| -rw-r--r-- | services/java/com/android/server/accessibility/TouchExplorer.java | 46 |
1 files changed, 33 insertions, 13 deletions
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; |
