summaryrefslogtreecommitdiffstats
path: root/services/accessibility
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2014-10-04 15:45:40 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-10-04 15:45:40 +0000
commitbd998385f0f0379ffab30d0bc70c3007f5664f24 (patch)
tree1596bac11a186c4154e3c09bbced0c84da4cefa0 /services/accessibility
parent542cc240b5bd68a728067f65cd8bc4d8f6473b83 (diff)
parenta12d48567478265bc360f2c29cc194d8830c099f (diff)
downloadframeworks_base-bd998385f0f0379ffab30d0bc70c3007f5664f24.zip
frameworks_base-bd998385f0f0379ffab30d0bc70c3007f5664f24.tar.gz
frameworks_base-bd998385f0f0379ffab30d0bc70c3007f5664f24.tar.bz2
am a12d4856: am 3eddddb5: am c3493f94: am 88676e0b: Merge "TouchExploer computes incorrectly the click location." into lmp-dev
* commit 'a12d48567478265bc360f2c29cc194d8830c099f': TouchExploer computes incorrectly the click location.
Diffstat (limited to 'services/accessibility')
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java13
-rw-r--r--services/accessibility/java/com/android/server/accessibility/TouchExplorer.java95
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);