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

Commit 9817dd09 authored by Chong Zhang's avatar Chong Zhang
Browse files

Transfer focus on any touch down action

Currently we are deliberately not transfering focus if the ACTION_UP
and ACTION_DOWN points are different. Removing this logic so that we
transfer the focus if user touched within a non-focused task.

If user is scrolling using a pointer device without touch action, it
will not result in focus transfer.

bug: 26040818

Change-Id: If1fd6b8405e1507f60be44f12b6fc599555b8ba7
parent ca8bce51
Loading
Loading
Loading
Loading
+4 −42
Original line number Diff line number Diff line
@@ -34,13 +34,7 @@ import static android.view.PointerIcon.STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;

public class TaskTapPointerEventListener implements PointerEventListener {
    private static final int TAP_TIMEOUT_MSEC = 300;
    private static final float TAP_MOTION_SLOP_INCHES = 0.125f;

    private final int mMotionSlop;
    private float mDownX;
    private float mDownY;
    private int mPointerId;
    final private Region mTouchExcludeRegion = new Region();
    private final WindowManagerService mService;
    private final DisplayContent mDisplayContent;
@@ -55,8 +49,6 @@ public class TaskTapPointerEventListener implements PointerEventListener {
            DisplayContent displayContent) {
        mService = service;
        mDisplayContent = displayContent;
        DisplayInfo info = displayContent.getDisplayInfo();
        mMotionSlop = (int)(info.logicalDensityDpi * TAP_MOTION_SLOP_INCHES);
    }

    // initialize the object, note this must be done outside WindowManagerService
@@ -74,31 +66,19 @@ public class TaskTapPointerEventListener implements PointerEventListener {
        final int action = motionEvent.getAction();
        switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN: {
                mPointerId = motionEvent.getPointerId(0);
                mDownX = motionEvent.getX();
                mDownY = motionEvent.getY();
                final int x = (int) motionEvent.getX();
                final int y = (int) motionEvent.getY();

                final int x = (int) mDownX;
                final int y = (int) mDownY;
                synchronized (this) {
                    if (!mTouchExcludeRegion.contains(x, y)) {
                        mService.mH.obtainMessage(H.TAP_DOWN_OUTSIDE_TASK, x, y,
                                mDisplayContent).sendToTarget();
                        mService.mH.obtainMessage(H.TAP_OUTSIDE_TASK,
                                x, y, mDisplayContent).sendToTarget();
                    }
                }
                break;
            }

            case MotionEvent.ACTION_MOVE: {
                if (mPointerId >= 0) {
                    int index = motionEvent.findPointerIndex(mPointerId);
                    if ((motionEvent.getEventTime() - motionEvent.getDownTime()) > TAP_TIMEOUT_MSEC
                            || index < 0
                            || Math.abs(motionEvent.getX(index) - mDownX) > mMotionSlop
                            || Math.abs(motionEvent.getY(index) - mDownY) > mMotionSlop) {
                        mPointerId = -1;
                    }
                }
                if (motionEvent.getPointerCount() != 2) {
                    stopTwoFingerScroll();
                }
@@ -149,24 +129,6 @@ public class TaskTapPointerEventListener implements PointerEventListener {

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP: {
                int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
                        >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
                // Extract the index of the pointer that left the touch sensor
                if (mPointerId == motionEvent.getPointerId(index)) {
                    final int x = (int)motionEvent.getX(index);
                    final int y = (int)motionEvent.getY(index);
                    synchronized(this) {
                        if ((motionEvent.getEventTime() - motionEvent.getDownTime())
                                < TAP_TIMEOUT_MSEC
                                && Math.abs(x - mDownX) < mMotionSlop
                                && Math.abs(y - mDownY) < mMotionSlop
                                && !mTouchExcludeRegion.contains(x, y)) {
                            mService.mH.obtainMessage(H.TAP_OUTSIDE_TASK, x, y,
                                    mDisplayContent).sendToTarget();
                        }
                    }
                    mPointerId = -1;
                }
                stopTwoFingerScroll();
                break;
            }
+25 −33
Original line number Diff line number Diff line
@@ -7163,19 +7163,26 @@ public class WindowManagerService extends IWindowManager.Stub
        } catch(RemoteException e) {}
    }

    private void startResizingTask(DisplayContent displayContent, int startX, int startY) {
        Task task = null;
    private void handleTapOutsideTask(DisplayContent displayContent, int x, int y) {
        int taskId = -1;
        synchronized (mWindowMap) {
            task = displayContent.findTaskForControlPoint(startX, startY);
            if (task == null || !startPositioningLocked(
                    task.getTopVisibleAppMainWindow(), true /*resize*/, startX, startY)) {
            final Task task = displayContent.findTaskForControlPoint(x, y);
            if (task != null) {
                if (!startPositioningLocked(
                        task.getTopVisibleAppMainWindow(), true /*resize*/, x, y)) {
                    return;
                }
                taskId = task.mTaskId;
            } else {
                taskId = displayContent.taskIdFromPoint(x, y);
            }
        }
        if (taskId >= 0) {
            try {
            mActivityManager.setFocusedTask(task.mTaskId);
                mActivityManager.setFocusedTask(taskId);
            } catch(RemoteException e) {}
        }
    }

    private boolean startPositioningLocked(
            WindowState win, boolean resize, float startX, float startY) {
@@ -7489,18 +7496,17 @@ public class WindowManagerService extends IWindowManager.Stub
        public static final int RESET_ANR_MESSAGE = 38;
        public static final int WALLPAPER_DRAW_PENDING_TIMEOUT = 39;

        public static final int TAP_DOWN_OUTSIDE_TASK = 40;
        public static final int FINISH_TASK_POSITIONING = 41;
        public static final int FINISH_TASK_POSITIONING = 40;

        public static final int UPDATE_DOCKED_STACK_DIVIDER = 42;
        public static final int UPDATE_DOCKED_STACK_DIVIDER = 41;

        public static final int RESIZE_STACK = 43;
        public static final int RESIZE_TASK = 44;
        public static final int RESIZE_STACK = 42;
        public static final int RESIZE_TASK = 43;

        public static final int TWO_FINGER_SCROLL_START = 45;
        public static final int SHOW_NON_RESIZEABLE_DOCK_TOAST = 46;
        public static final int TWO_FINGER_SCROLL_START = 44;
        public static final int SHOW_NON_RESIZEABLE_DOCK_TOAST = 45;

        public static final int WINDOW_REPLACEMENT_TIMEOUT = 47;
        public static final int WINDOW_REPLACEMENT_TIMEOUT = 46;

        /**
         * Used to denote that an integer field in a message will not be used.
@@ -7954,27 +7960,13 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                    break;

                case TAP_OUTSIDE_TASK: {
                    int taskId;
                    synchronized (mWindowMap) {
                        taskId = ((DisplayContent)msg.obj).taskIdFromPoint(msg.arg1, msg.arg2);
                    }
                    if (taskId >= 0) {
                        try {
                            mActivityManager.setFocusedTask(taskId);
                        } catch (RemoteException e) {
                        }
                    }
                }
                break;

                case TWO_FINGER_SCROLL_START: {
                    startScrollingTask((DisplayContent)msg.obj, msg.arg1, msg.arg2);
                }
                break;

                case TAP_DOWN_OUTSIDE_TASK: {
                    startResizingTask((DisplayContent)msg.obj, msg.arg1, msg.arg2);
                case TAP_OUTSIDE_TASK: {
                    handleTapOutsideTask((DisplayContent)msg.obj, msg.arg1, msg.arg2);
                }
                break;