Merge "TouchExploer computes incorrectly the click location." into lmp-dev

This commit is contained in:
Svetoslav
2014-10-03 23:33:11 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 67 deletions

View File

@@ -787,6 +787,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return false; return false;
} }
boolean accessibilityFocusOnlyInActiveWindow() {
synchronized (mLock) {
return mWindowsForAccessibilityCallback == null;
}
}
int getActiveWindowId() { int getActiveWindowId() {
return mSecurityPolicy.getActiveWindowId(); return mSecurityPolicy.getActiveWindowId();
} }
@@ -3596,6 +3602,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
} }
private void notifyWindowsChanged() { private void notifyWindowsChanged() {
if (mWindowsForAccessibilityCallback == null) {
return;
}
final long identity = Binder.clearCallingIdentity(); final long identity = Binder.clearCallingIdentity();
try { try {
// Let the client know the windows changed. // Let the client know the windows changed.
@@ -3680,6 +3689,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
} }
private boolean isRetrievalAllowingWindow(int windowId) { 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) { if (windowId == mActiveWindowId) {
return true; return true;
} }

View File

@@ -1151,42 +1151,12 @@ class TouchExplorer implements EventStreamTransformation {
mSendTouchInteractionEndDelayed.forceSendAndRemove(); mSendTouchInteractionEndDelayed.forceSendAndRemove();
} }
int clickLocationX;
int clickLocationY;
final int pointerId = secondTapUp.getPointerId(secondTapUp.getActionIndex()); final int pointerId = secondTapUp.getPointerId(secondTapUp.getActionIndex());
final int pointerIndex = secondTapUp.findPointerIndex(pointerId); final int pointerIndex = secondTapUp.findPointerIndex(pointerId);
MotionEvent lastExploreEvent = Point clickLocation = mTempPoint;
mInjectedPointerTracker.getLastInjectedHoverEventForClick(); if (!computeClickLocation(clickLocation)) {
if (lastExploreEvent == null) { return;
// 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;
}
}
}
} }
// Do the click. // Do the click.
@@ -1195,8 +1165,8 @@ class TouchExplorer implements EventStreamTransformation {
secondTapUp.getPointerProperties(pointerIndex, properties[0]); secondTapUp.getPointerProperties(pointerIndex, properties[0]);
PointerCoords[] coords = new PointerCoords[1]; PointerCoords[] coords = new PointerCoords[1];
coords[0] = new PointerCoords(); coords[0] = new PointerCoords();
coords[0].x = clickLocationX; coords[0].x = clickLocation.x;
coords[0].y = clickLocationY; coords[0].y = clickLocation.y;
MotionEvent event = MotionEvent.obtain(secondTapUp.getDownTime(), MotionEvent event = MotionEvent.obtain(secondTapUp.getDownTime(),
secondTapUp.getEventTime(), MotionEvent.ACTION_DOWN, 1, properties, secondTapUp.getEventTime(), MotionEvent.ACTION_DOWN, 1, properties,
coords, 0, 0, 1.0f, 1.0f, secondTapUp.getDeviceId(), 0, coords, 0, 0, 1.0f, 1.0f, secondTapUp.getDeviceId(), 0,
@@ -1246,6 +1216,24 @@ class TouchExplorer implements EventStreamTransformation {
MAX_DRAGGING_ANGLE_COS); 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. * Gets the symbolic name of a state.
* *
@@ -1328,41 +1316,14 @@ class TouchExplorer implements EventStreamTransformation {
final int pointerId = mEvent.getPointerId(mEvent.getActionIndex()); final int pointerId = mEvent.getPointerId(mEvent.getActionIndex());
final int pointerIndex = mEvent.findPointerIndex(pointerId); final int pointerIndex = mEvent.findPointerIndex(pointerId);
MotionEvent lastExploreEvent = Point clickLocation = mTempPoint;
mInjectedPointerTracker.getLastInjectedHoverEventForClick(); if (!computeClickLocation(clickLocation)) {
if (lastExploreEvent == null) { return;
// 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;
}
}
}
} }
mLongPressingPointerId = pointerId; mLongPressingPointerId = pointerId;
mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocationX; mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocation.x;
mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocationY; mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocation.y;
sendHoverExitAndTouchExplorationGestureEndIfNeeded(mPolicyFlags); sendHoverExitAndTouchExplorationGestureEndIfNeeded(mPolicyFlags);