diff options
author | Svetoslav <svetoslavganov@google.com> | 2014-10-03 15:40:05 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2014-10-03 16:17:26 -0700 |
commit | 47b9c1524fe20b9ae2b210acdcad64f764df68e0 (patch) | |
tree | 10dc7643a7730a87af1445ff149fd3d1371e73fe /services/accessibility | |
parent | 900e3b5fc5bb4bf4947f63c0fed0757dfb7effa6 (diff) | |
download | frameworks_base-47b9c1524fe20b9ae2b210acdcad64f764df68e0.zip frameworks_base-47b9c1524fe20b9ae2b210acdcad64f764df68e0.tar.gz frameworks_base-47b9c1524fe20b9ae2b210acdcad64f764df68e0.tar.bz2 |
TouchExploer computes incorrectly the click location.
If there is accessibilty focus and the user touch explores
location that does not change accessibility focus that is
not in the app window, e.g. system bar, double tap does not
click on the system UI affordance.
bug:17588024
Change-Id: I6c8c0f65b208ae1d3f31d7f06b0721dc223ec19f
Diffstat (limited to 'services/accessibility')
-rw-r--r-- | services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java | 13 | ||||
-rw-r--r-- | services/accessibility/java/com/android/server/accessibility/TouchExplorer.java | 95 |
2 files changed, 41 insertions, 67 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 8ab3588..7438033 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -787,6 +787,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } + boolean accessibilityFocusOnlyInActiveWindow() { + synchronized (mLock) { + return mWindowsForAccessibilityCallback == null; + } + } + int getActiveWindowId() { return mSecurityPolicy.getActiveWindowId(); } @@ -3596,6 +3602,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } private void notifyWindowsChanged() { + if (mWindowsForAccessibilityCallback == null) { + return; + } final long identity = Binder.clearCallingIdentity(); try { // Let the client know the windows changed. @@ -3680,6 +3689,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } private boolean isRetrievalAllowingWindow(int windowId) { + // The system gets to interact with any window it wants. + if (Binder.getCallingUid() == Process.SYSTEM_UID) { + return true; + } if (windowId == mActiveWindowId) { return true; } diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java index 9e63433..b9ed89b 100644 --- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java @@ -1151,42 +1151,12 @@ class TouchExplorer implements EventStreamTransformation { mSendTouchInteractionEndDelayed.forceSendAndRemove(); } - int clickLocationX; - int clickLocationY; - final int pointerId = secondTapUp.getPointerId(secondTapUp.getActionIndex()); final int pointerIndex = secondTapUp.findPointerIndex(pointerId); - MotionEvent lastExploreEvent = - mInjectedPointerTracker.getLastInjectedHoverEventForClick(); - if (lastExploreEvent == null) { - // No last touch explored event but there is accessibility focus in - // the active window. We click in the focus bounds. - Point point = mTempPoint; - if (mAms.getAccessibilityFocusClickPointInScreen(point)) { - clickLocationX = point.x; - clickLocationY = point.y; - } else { - // Out of luck - do nothing. - return; - } - } else { - // If the click is within the active window but not within the - // accessibility focus bounds we click in the focus bounds. - final int lastExplorePointerIndex = lastExploreEvent.getActionIndex(); - clickLocationX = (int) lastExploreEvent.getX(lastExplorePointerIndex); - clickLocationY = (int) lastExploreEvent.getY(lastExplorePointerIndex); - Rect activeWindowBounds = mTempRect; - if (mLastTouchedWindowId == mAms.getActiveWindowId()) { - mAms.getActiveWindowBounds(activeWindowBounds); - if (activeWindowBounds.contains(clickLocationX, clickLocationY)) { - Point point = mTempPoint; - if (mAms.getAccessibilityFocusClickPointInScreen(point)) { - clickLocationX = point.x; - clickLocationY = point.y; - } - } - } + Point clickLocation = mTempPoint; + if (!computeClickLocation(clickLocation)) { + return; } // Do the click. @@ -1195,8 +1165,8 @@ class TouchExplorer implements EventStreamTransformation { secondTapUp.getPointerProperties(pointerIndex, properties[0]); PointerCoords[] coords = new PointerCoords[1]; coords[0] = new PointerCoords(); - coords[0].x = clickLocationX; - coords[0].y = clickLocationY; + coords[0].x = clickLocation.x; + coords[0].y = clickLocation.y; MotionEvent event = MotionEvent.obtain(secondTapUp.getDownTime(), secondTapUp.getEventTime(), MotionEvent.ACTION_DOWN, 1, properties, coords, 0, 0, 1.0f, 1.0f, secondTapUp.getDeviceId(), 0, @@ -1246,6 +1216,24 @@ class TouchExplorer implements EventStreamTransformation { MAX_DRAGGING_ANGLE_COS); } + private boolean computeClickLocation(Point outLocation) { + MotionEvent lastExploreEvent = mInjectedPointerTracker.getLastInjectedHoverEventForClick(); + if (lastExploreEvent != null) { + final int lastExplorePointerIndex = lastExploreEvent.getActionIndex(); + outLocation.x = (int) lastExploreEvent.getX(lastExplorePointerIndex); + outLocation.y = (int) lastExploreEvent.getY(lastExplorePointerIndex); + if (!mAms.accessibilityFocusOnlyInActiveWindow() + || mLastTouchedWindowId == mAms.getActiveWindowId()) { + mAms.getAccessibilityFocusClickPointInScreen(outLocation); + } + return true; + } + if (mAms.getAccessibilityFocusClickPointInScreen(outLocation)) { + return true; + } + return false; + } + /** * Gets the symbolic name of a state. * @@ -1328,41 +1316,14 @@ class TouchExplorer implements EventStreamTransformation { final int pointerId = mEvent.getPointerId(mEvent.getActionIndex()); final int pointerIndex = mEvent.findPointerIndex(pointerId); - MotionEvent lastExploreEvent = - mInjectedPointerTracker.getLastInjectedHoverEventForClick(); - if (lastExploreEvent == null) { - // No last touch explored event but there is accessibility focus in - // the active window. We click in the focus bounds. - Point point = mTempPoint; - if (mAms.getAccessibilityFocusClickPointInScreen(point)) { - clickLocationX = point.x; - clickLocationY = point.y; - } else { - // Out of luck - do nothing. - return; - } - } else { - // If the click is within the active window but not within the - // accessibility focus bounds we click in the focus bounds. - final int lastExplorePointerIndex = lastExploreEvent.getActionIndex(); - clickLocationX = (int) lastExploreEvent.getX(lastExplorePointerIndex); - clickLocationY = (int) lastExploreEvent.getY(lastExplorePointerIndex); - Rect activeWindowBounds = mTempRect; - if (mLastTouchedWindowId == mAms.getActiveWindowId()) { - mAms.getActiveWindowBounds(activeWindowBounds); - if (activeWindowBounds.contains(clickLocationX, clickLocationY)) { - Point point = mTempPoint; - if (mAms.getAccessibilityFocusClickPointInScreen(point)) { - clickLocationX = point.x; - clickLocationY = point.y; - } - } - } + Point clickLocation = mTempPoint; + if (!computeClickLocation(clickLocation)) { + return; } mLongPressingPointerId = pointerId; - mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocationX; - mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocationY; + mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocation.x; + mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocation.y; sendHoverExitAndTouchExplorationGestureEndIfNeeded(mPolicyFlags); |