Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47b9c152 authored by Svetoslav's avatar Svetoslav
Browse files

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
parent 900e3b5f
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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;
            }
+28 −67
Original line number Diff line number Diff line
@@ -1151,43 +1151,13 @@ 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.
            Point clickLocation = mTempPoint;
            if (!computeClickLocation(clickLocation)) {
                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.
            PointerProperties[] properties = new PointerProperties[1];
@@ -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.
            Point clickLocation = mTempPoint;
            if (!computeClickLocation(clickLocation)) {
                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;
            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);