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

Commit 6432a403 authored by Tracy Zhou's avatar Tracy Zhou
Browse files

Fix wrong pointer count logic for trackpad back events

ACTION_DOWN reports pointer count of 1, and then subsequent ACTION_POINTER_DOWN reports increasing pointer counts. ACTION_MOVE events have the correct pointer count, hence the logic to check pointer counts need to be updated

Fixes: 275471396
Test: able to trigger 3-finger back
Change-Id: Icecda6bc59842598e4390514a9491cc6df078ce1
parent 72a1258b
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@ package com.android.systemui.navigationbar.gestural;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION;

import static com.android.systemui.classifier.Classifier.BACK_GESTURE;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadThreeFingerSwipe;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadFourFingerSwipe;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadMultiFingerSwipe;

import android.annotation.NonNull;
import android.app.ActivityManager;
@@ -888,8 +889,9 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
    }

    private void onMotionEvent(MotionEvent ev) {
        boolean isTrackpadEvent = isTrackpadThreeFingerSwipe(mIsTrackpadGestureFeaturesEnabled, ev);
        int action = ev.getActionMasked();
        boolean isTrackpadMultiFingerSwipe = isTrackpadMultiFingerSwipe(
                mIsTrackpadGestureFeaturesEnabled, ev);
        if (action == MotionEvent.ACTION_DOWN) {
            if (DEBUG_MISSING_GESTURE) {
                Log.d(DEBUG_MISSING_GESTURE_TAG, "Start gesture: " + ev);
@@ -898,7 +900,7 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
            // Verify if this is in within the touch region and we aren't in immersive mode, and
            // either the bouncer is showing or the notification panel is hidden
            mInputEventReceiver.setBatchingEnabled(false);
            if (isTrackpadEvent) {
            if (isTrackpadMultiFingerSwipe) {
                // Since trackpad gestures don't have zones, this will be determined later by the
                // direction of the gesture. {@code mIsOnLeftEdge} is set to false to begin with.
                mDeferSetIsOnLeftEdge = true;
@@ -913,17 +915,17 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
            // Trackpad back gestures don't have zones, so we don't need to check if the down event
            // is within insets.
            mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed
                    && (isTrackpadEvent || isWithinInsets)
                    && (isTrackpadMultiFingerSwipe || isWithinInsets)
                    && !mGestureBlockingActivityRunning
                    && !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
                    && (isValidTrackpadBackGesture(isTrackpadEvent) || isWithinTouchRegion(
                    (int) ev.getX(), (int) ev.getY()));
                    && (isValidTrackpadBackGesture(isTrackpadMultiFingerSwipe)
                        || isWithinTouchRegion((int) ev.getX(), (int) ev.getY()));
            if (mAllowGesture) {
                mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge);
                mEdgeBackPlugin.onMotionEvent(ev);
                dispatchToBackAnimation(ev);
            }
            if (mLogGesture || isTrackpadEvent) {
            if (mLogGesture || isTrackpadMultiFingerSwipe) {
                mDownPoint.set(ev.getX(), ev.getY());
                mEndPoint.set(-1, -1);
                mThresholdCrossed = false;
@@ -932,15 +934,16 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
            // For debugging purposes, only log edge points
            (isWithinInsets ? mGestureLogInsideInsets : mGestureLogOutsideInsets).log(String.format(
                    "Gesture [%d,alw=%B,%B,%B,%B,%B,%B,disp=%s,wl=%d,il=%d,wr=%d,ir=%d,excl=%s]",
                    System.currentTimeMillis(), isTrackpadEvent, mAllowGesture, mIsOnLeftEdge,
                    mDeferSetIsOnLeftEdge, mIsBackGestureAllowed,
                    System.currentTimeMillis(), isTrackpadMultiFingerSwipe, mAllowGesture,
                    mIsOnLeftEdge, mDeferSetIsOnLeftEdge, mIsBackGestureAllowed,
                    QuickStepContract.isBackGestureDisabled(mSysUiFlags), mDisplaySize,
                    mEdgeWidthLeft, mLeftInset, mEdgeWidthRight, mRightInset, mExcludeRegion));
        } else if (mAllowGesture || mLogGesture) {
            if (!mThresholdCrossed) {
                mEndPoint.x = (int) ev.getX();
                mEndPoint.y = (int) ev.getY();
                if (action == MotionEvent.ACTION_POINTER_DOWN && !isTrackpadEvent) {
                if (action == MotionEvent.ACTION_POINTER_DOWN && (!isTrackpadMultiFingerSwipe
                        || isTrackpadFourFingerSwipe(mIsTrackpadGestureFeaturesEnabled, ev))) {
                    if (mAllowGesture) {
                        logGesture(SysUiStatsLog.BACK_GESTURE__TYPE__INCOMPLETE_MULTI_TOUCH);
                        if (DEBUG_MISSING_GESTURE) {
@@ -952,7 +955,11 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
                    mLogGesture = false;
                    return;
                } else if (action == MotionEvent.ACTION_MOVE) {
                    if (isTrackpadEvent && mDeferSetIsOnLeftEdge) {
                    if (isTrackpadFourFingerSwipe(isTrackpadMultiFingerSwipe, ev)) {
                        cancelGesture(ev);
                        return;
                    }
                    if (isTrackpadMultiFingerSwipe && mDeferSetIsOnLeftEdge) {
                        // mIsOnLeftEdge is determined by the relative position between the down
                        // and the current motion event for trackpad gestures instead of zoning.
                        mIsOnLeftEdge = mEndPoint.x > mDownPoint.x;
+13 −2
Original line number Diff line number Diff line
@@ -22,10 +22,21 @@ import android.view.MotionEvent;

public final class Utilities {

    public static boolean isTrackpadThreeFingerSwipe(boolean isTrackpadGestureFeaturesEnabled,
    public static boolean isTrackpadMultiFingerSwipe(boolean isTrackpadGestureFeaturesEnabled,
            MotionEvent event) {
        return isTrackpadGestureFeaturesEnabled
                && event.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE
                && event.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE;
    }

    public static boolean isTrackpadThreeFingerSwipe(boolean isTrackpadGestureFeaturesEnabled,
            MotionEvent event) {
        return isTrackpadMultiFingerSwipe(isTrackpadGestureFeaturesEnabled, event)
                && event.getPointerCount() == 3;
    }

    public static boolean isTrackpadFourFingerSwipe(boolean isTrackpadGestureFeaturesEnabled,
            MotionEvent event) {
        return isTrackpadMultiFingerSwipe(isTrackpadGestureFeaturesEnabled, event)
                && event.getPointerCount() == 4;
    }
}