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

Commit 1e27f01a authored by Justin Weir's avatar Justin Weir
Browse files

Disable 2 finger trackpad swiping on the status bar for shade

Based on ag/28744615. Added additional logic for discarding trackpad
motion events with 2 fingers, since the shade was treating them the same
as any motion event over the status bar.

Test: Verified with trackpad on tangorpro
Bug: 356804470
Flag: com.android.systemui.disable_shade_expands_on_trackpad_two_finger_swipe
Change-Id: Ie0658123ba19e03c6fe92decab922767e440026e
parent 45e7f9b5
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_

import static com.android.systemui.Flags.edgebackGestureHandlerGetRunningTasksBackground;
import static com.android.systemui.classifier.Classifier.BACK_GESTURE;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadScroll;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadThreeFingerSwipe;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TOUCHPAD_GESTURES_DISABLED;

@@ -1087,8 +1086,7 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack
            boolean isBackAllowedCommon = !mDisabledForQuickstep && mIsBackGestureAllowed
                    && !mGestureBlockingActivityRunning.get()
                    && !QuickStepContract.isBackGestureDisabled(mSysUiFlags,
                            mIsTrackpadThreeFingerSwipe)
                    && !isTrackpadScroll(ev);
                            mIsTrackpadThreeFingerSwipe);
            if (mIsTrackpadThreeFingerSwipe) {
                // Trackpad back gestures don't have zones, so we don't need to check if the down
                // event is within insets.
+0 −5
Original line number Diff line number Diff line
@@ -18,16 +18,11 @@ package com.android.systemui.navigationbar.gestural;

import static android.view.MotionEvent.AXIS_GESTURE_SWIPE_FINGER_COUNT;
import static android.view.MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE;
import static android.view.MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE;

import android.view.MotionEvent;

public final class Utilities {

    public static boolean isTrackpadScroll(MotionEvent event) {
        return event.getClassification() == CLASSIFICATION_TWO_FINGER_SWIPE;
    }

    public static boolean isTrackpadThreeFingerSwipe(MotionEvent event) {
        return event.getClassification() == CLASSIFICATION_MULTI_FINGER_SWIPE
                && event.getAxisValue(AXIS_GESTURE_SWIPE_FINGER_COUNT) == 3;
+34 −23
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ import static com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING;
import static com.android.systemui.keyguard.shared.model.KeyguardState.GONE;
import static com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN;
import static com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadScroll;
import static com.android.systemui.navigationbar.gestural.Utilities.isTrackpadThreeFingerSwipe;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN;
@@ -73,6 +72,7 @@ import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.MathUtils;
import android.view.HapticFeedbackConstants;
import android.view.InputDevice;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -186,7 +186,6 @@ import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.ConversationNotificationManager;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.headsup.HeadsUpTouchHelper;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.ViewGroupFadeHelper;
@@ -194,6 +193,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
import com.android.systemui.statusbar.notification.headsup.HeadsUpTouchHelper;
import com.android.systemui.statusbar.notification.headsup.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -414,7 +414,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
    private float mOverStretchAmount;
    private float mDownX;
    private float mDownY;
    private boolean mIsTrackpadReverseScroll;
    private int mDisplayTopInset = 0; // in pixels
    private int mDisplayRightInset = 0; // in pixels
    private int mDisplayLeftInset = 0; // in pixels
@@ -3759,7 +3758,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
     */
    private boolean isDirectionUpwards(float x, float y) {
        float xDiff = x - mInitialExpandX;
        float yDiff = (mIsTrackpadReverseScroll ? -1 : 1) * (y - mInitialExpandY);
        float yDiff = y - mInitialExpandY;
        if (yDiff >= 0) {
            return false;
        }
@@ -3797,7 +3796,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                || (!isFullyExpanded() && !isFullyCollapsed())
                || event.getActionMasked() == MotionEvent.ACTION_CANCEL || forceCancel) {
            mVelocityTracker.computeCurrentVelocity(1000);
            float vel = (mIsTrackpadReverseScroll ? -1 : 1) * mVelocityTracker.getYVelocity();
            float vel = mVelocityTracker.getYVelocity();
            float vectorVel = (float) Math.hypot(
                    mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());

@@ -3836,7 +3835,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_UNLOCK, heightDp, velocityDp);
                mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_UNLOCK);
            }
            float dy = (mIsTrackpadReverseScroll ? -1 : 1) * (y - mInitialExpandY);
            float dy = y - mInitialExpandY;
            @Classifier.InteractionType int interactionType = vel == 0 ? GENERIC
                    : dy > 0 ? QUICK_SETTINGS
                            : (mKeyguardStateController.canDismissLockScreen()
@@ -3865,7 +3864,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump

    private float getCurrentExpandVelocity() {
        mVelocityTracker.computeCurrentVelocity(1000);
        return (mIsTrackpadReverseScroll ? -1 : 1) * mVelocityTracker.getYVelocity();
        return mVelocityTracker.getYVelocity();
    }

    private void endClosing() {
@@ -4924,8 +4923,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
            final float x = event.getX(pointerIndex);
            final float y = event.getY(pointerIndex);
            boolean canCollapsePanel = canCollapsePanelOnTouch();
            final boolean isTrackpadTwoOrThreeFingerSwipe = isTrackpadScroll(event)
                    || isTrackpadThreeFingerSwipe(event);
            final boolean isTrackpadThreeFingerSwipe = isTrackpadThreeFingerSwipe(event);

            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
@@ -4943,9 +4941,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                        return true;
                    }

                    mIsTrackpadReverseScroll =
                            !mNaturalScrollingSettingObserver.isNaturalScrollingEnabled()
                                    && isTrackpadScroll(event);
                    if (!isTracking() || isFullyCollapsed()) {
                        mInitialExpandY = y;
                        mInitialExpandX = x;
@@ -4965,7 +4960,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                    addMovement(event);
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    if (isTrackpadTwoOrThreeFingerSwipe) {
                    if (isTrackpadThreeFingerSwipe) {
                        break;
                    }
                    final int upPointer = event.getPointerId(event.getActionIndex());
@@ -4981,14 +4976,14 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                    mShadeLog.logMotionEventStatusBarState(event,
                            mStatusBarStateController.getState(),
                            "onInterceptTouchEvent: pointer down action");
                    if (!isTrackpadTwoOrThreeFingerSwipe
                    if (!isTrackpadThreeFingerSwipe
                            && mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
                        mMotionAborted = true;
                        mVelocityTracker.clear();
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    final float h = (mIsTrackpadReverseScroll ? -1 : 1) * (y - mInitialExpandY);
                    final float h = y - mInitialExpandY;
                    addMovement(event);
                    final boolean openShadeWithoutHun =
                            mPanelClosedOnDown && !mCollapsedAndHeadsUpOnDown;
@@ -5168,14 +5163,22 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
            final float x = event.getX(pointerIndex);
            final float y = event.getY(pointerIndex);

            if (event.getActionMasked() == MotionEvent.ACTION_DOWN
            boolean isDown = event.getActionMasked() == MotionEvent.ACTION_DOWN;
            if (isDown
                    || event.getActionMasked() == MotionEvent.ACTION_MOVE) {
                mGestureWaitForTouchSlop = shouldGestureWaitForTouchSlop();
                mIgnoreXTouchSlop = true;
            }

            final boolean isTrackpadTwoOrThreeFingerSwipe = isTrackpadScroll(event)
                    || isTrackpadThreeFingerSwipe(event);
            final boolean isTrackpadThreeFingerSwipe = isTrackpadThreeFingerSwipe(event);
            if (com.android.systemui.Flags.disableShadeExpandsOnTrackpadTwoFingerSwipe()
                    && !isTrackpadThreeFingerSwipe && isTwoFingerSwipeTrackpadEvent(event)
                    && !isPanelExpanded()) {
                if (isDown) {
                    mShadeLog.d("ignoring down event for two finger trackpad swipe");
                }
                return false;
            }

            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
@@ -5213,7 +5216,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    if (isTrackpadTwoOrThreeFingerSwipe) {
                    if (isTrackpadThreeFingerSwipe) {
                        break;
                    }
                    final int upPointer = event.getPointerId(event.getActionIndex());
@@ -5232,7 +5235,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                    mShadeLog.logMotionEventStatusBarState(event,
                            mStatusBarStateController.getState(),
                            "handleTouch: pointer down action");
                    if (!isTrackpadTwoOrThreeFingerSwipe
                    if (!isTrackpadThreeFingerSwipe
                            && mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
                        mMotionAborted = true;
                        endMotionEvent(event, x, y, true /* forceCancel */);
@@ -5255,7 +5258,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                    if (!isFullyCollapsed()) {
                        maybeVibrateOnOpening(true /* openingWithTouch */);
                    }
                    float h = (mIsTrackpadReverseScroll ? -1 : 1) * (y - mInitialExpandY);
                    float h = y - mInitialExpandY;

                    // If the panel was collapsed when touching, we only need to check for the
                    // y-component of the gesture, as we have no conflicting horizontal gesture.
@@ -5265,7 +5268,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                        mTouchSlopExceeded = true;
                        if (mGestureWaitForTouchSlop
                                && !isTracking()
                                && !mCollapsedAndHeadsUpOnDown) {
                                && !mCollapsedAndHeadsUpOnDown
                                && !isTwoFingerSwipeTrackpadEvent(event)
                        ) {
                            if (mInitialOffsetOnTouch != 0f) {
                                startExpandMotion(x, y, false /* startTracking */, mExpandedHeight);
                                h = 0;
@@ -5304,13 +5309,19 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
                            mQsController.cancelJankMonitoring();
                        }
                    }
                    mIsTrackpadReverseScroll = false;
                    break;
            }
            return !mGestureWaitForTouchSlop || isTracking();
        }
    }

    private static boolean isTwoFingerSwipeTrackpadEvent(MotionEvent event) {
        //SOURCE_MOUSE because SOURCE_TOUCHPAD is reserved for "captured" touchpads
        return event.getSource() == InputDevice.SOURCE_MOUSE
                && event.getToolType(0) == MotionEvent.TOOL_TYPE_FINGER
                && event.getClassification() == MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE;
    }

    private final class HeadsUpNotificationViewControllerImpl implements
            HeadsUpTouchHelper.HeadsUpNotificationViewController {
        @Override
+3 −10
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.domain.interactor.NaturalScrollingSettingObserver
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.navigationbar.gestural.Utilities.isTrackpadScroll
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.plugins.FalsingManager
@@ -760,7 +759,6 @@ class DragDownHelper(
    private var draggedFarEnough = false
    private var startingChild: ExpandableView? = null
    private var lastHeight = 0f
    private var isTrackpadReverseScroll = false
    var isDraggingDown = false
        private set

@@ -798,12 +796,9 @@ class DragDownHelper(
                startingChild = null
                initialTouchY = y
                initialTouchX = x
                isTrackpadReverseScroll =
                    !naturalScrollingSettingObserver.isNaturalScrollingEnabled &&
                        isTrackpadScroll(event)
            }
            MotionEvent.ACTION_MOVE -> {
                val h = (if (isTrackpadReverseScroll) -1 else 1) * (y - initialTouchY)
                val h = y - initialTouchY
                // Adjust the touch slop if another gesture may be being performed.
                val touchSlop =
                    if (event.classification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE) {
@@ -837,7 +832,7 @@ class DragDownHelper(
        val y = event.y
        when (event.actionMasked) {
            MotionEvent.ACTION_MOVE -> {
                lastHeight = (if (isTrackpadReverseScroll) -1 else 1) * (y - initialTouchY)
                lastHeight = y - initialTouchY
                captureStartingChild(initialTouchX, initialTouchY)
                dragDownCallback.dragDownAmount = lastHeight + dragDownAmountOnStart
                if (startingChild != null) {
@@ -862,14 +857,13 @@ class DragDownHelper(
                        !isFalseTouch &&
                        dragDownCallback.canDragDown()
                ) {
                    val dragDown = (if (isTrackpadReverseScroll) -1 else 1) * (y - initialTouchY)
                    val dragDown = y - initialTouchY
                    dragDownCallback.onDraggedDown(startingChild, dragDown.toInt())
                    if (startingChild != null) {
                        expandCallback.setUserLockedChild(startingChild, false)
                        startingChild = null
                    }
                    isDraggingDown = false
                    isTrackpadReverseScroll = false
                    shadeRepository.setLegacyLockscreenShadeTracking(false)
                    return true
                } else {
@@ -950,7 +944,6 @@ class DragDownHelper(
            startingChild = null
        }
        isDraggingDown = false
        isTrackpadReverseScroll = false
        shadeRepository.setLegacyLockscreenShadeTracking(false)
        dragDownCallback.onDragDownReset()
    }