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

Commit 238099c0 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

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
parent 5ab6e12b
Loading
Loading
Loading
Loading
+33 −13
Original line number Diff line number Diff line
@@ -1247,25 +1247,45 @@ public class TouchExplorer {

        @Override
        public void run() {
            final int pointerIndex = mEvent.getActionIndex();
            final int eventX = (int) mEvent.getX(pointerIndex);
            final int eventY = (int) mEvent.getY(pointerIndex);
            // 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;
            if (mAms.getAccessibilityFocusBounds(eventX, eventY, bounds)
                    && !bounds.contains(eventX, eventY)) {
            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);
            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;