summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2012-06-01 13:52:54 -0700
committerSvetoslav Ganov <svetoslavganov@google.com>2012-06-01 13:59:28 -0700
commit238099c0dbbdc66b8443552126680ad1c7cab17d (patch)
tree69adc872d92664fed388b0c9b40fc415d35e2136 /services
parent5ab6e12b450d13c8eb501001c7a8669826b86ea4 (diff)
downloadframeworks_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.java46
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;