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

Commit abdc3384 authored by Tracy Zhou's avatar Tracy Zhou
Browse files

Fix 3-finger swipe unlock not working

FalsingManager is currently rejecting trackpad 3-finger events. The x and y movements in 3-finger motion events are generated from the gesture library according to the movement on the trackpad. The movement scale is bigger than events on the screen, hence considered "fake" by the falsing manager. We should skip all trackpad events in gesture falsing logic (since falsing is an on screen thing to begin with).

Fixes: 277273475
Test: 3-finger swipe to bring up bouncer
Change-Id: I1223129ec40c0ed0e81e5f740564172665284585
parent 39b4f6bf
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -396,6 +396,7 @@ public class BrightLineFalsingManager implements FalsingManager {
                || mDataProvider.isDocked()
                || mAccessibilityManager.isTouchExplorationEnabled()
                || mDataProvider.isA11yAction()
                || mDataProvider.isFromTrackpad()
                || (mFeatureFlags.isEnabled(Flags.FALSING_OFF_FOR_UNFOLDED)
                    && mDataProvider.isUnfolded());
    }
+13 −1
Original line number Diff line number Diff line
@@ -261,6 +261,16 @@ public class FalsingDataProvider {
        return mLastMotionEvent.getY() < mFirstRecentMotionEvent.getY();
    }

    public boolean isFromTrackpad() {
        if (mRecentMotionEvents.isEmpty()) {
            return false;
        }

        int classification = mRecentMotionEvents.get(0).getClassification();
        return classification == MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE
                || classification == MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE;
    }

    private void recalculateData() {
        if (!mDirty) {
            return;
@@ -343,7 +353,9 @@ public class FalsingDataProvider {
                    motionEvent.getDeviceId(),
                    motionEvent.getEdgeFlags(),
                    motionEvent.getSource(),
                    motionEvent.getFlags()
                    motionEvent.getDisplayId(),
                    motionEvent.getFlags(),
                    motionEvent.getClassification()
            ));
        }

+7 −0
Original line number Diff line number Diff line
@@ -187,4 +187,11 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase {
        when(mFalsingDataProvider.isUnfolded()).thenReturn(true);
        assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isFalse();
    }

    @Test
    public void testTrackpadGesture() {
        assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
        when(mFalsingDataProvider.isFromTrackpad()).thenReturn(true);
        assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isFalse();
    }
}
+58 −0
Original line number Diff line number Diff line
@@ -18,8 +18,11 @@ package com.android.systemui.classifier;

import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
import android.util.DisplayMetrics;
import android.view.InputDevice;
import android.view.MotionEvent;

import androidx.test.uiautomator.Configurator;

import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManagerFake;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -80,6 +83,10 @@ public class ClassifierTest extends SysuiTestCase {
        mDataProvider.onSessionEnd();
    }

    protected static int getPointerAction(int actionType, int index) {
        return actionType + (index << MotionEvent.ACTION_POINTER_INDEX_SHIFT);
    }

    protected MotionEvent appendDownEvent(float x, float y) {
        return appendMotionEvent(MotionEvent.ACTION_DOWN, x, y);
    }
@@ -124,4 +131,55 @@ public class ClassifierTest extends SysuiTestCase {

        return motionEvent;
    }

    protected MotionEvent appendTrackpadDownEvent(float x, float y) {
        return appendTrackpadMotionEvent(MotionEvent.ACTION_DOWN, x, y, 1);
    }

    protected MotionEvent appendTrackpadMoveEvent(float x, float y, int pointerCount) {
        return appendTrackpadMotionEvent(MotionEvent.ACTION_MOVE, x, y, pointerCount);
    }

    protected MotionEvent appendTrackpadPointerDownEvent(int actionType, float x, float y,
            int pointerCount) {
        return appendTrackpadMotionEvent(actionType, x, y, pointerCount);
    }

    private MotionEvent appendTrackpadMotionEvent(int actionType, float x, float y,
            int pointerCount) {
        long eventTime = mMotionEvents.isEmpty() ? 1 : mMotionEvents.get(
                mMotionEvents.size() - 1).getEventTime() + 1;
        return appendTrackpadMotionEvent(actionType, x, y, pointerCount, eventTime);
    }

    private MotionEvent appendTrackpadMotionEvent(int actionType, float x, float y,
            int pointerCount, long eventTime) {
        MotionEvent.PointerProperties[] pointerProperties =
                new MotionEvent.PointerProperties[pointerCount];
        MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[pointerCount];
        for (int i = 0; i < pointerCount; i++) {
            pointerProperties[i] = getPointerProperties(i);
            pointerCoords[i] = getPointerCoords(x, y);
        }
        return MotionEvent.obtain(1, eventTime, actionType, pointerCount, pointerProperties,
                pointerCoords, 0, 0, 1.0f, 1.0f, 0, 0,
                InputDevice.SOURCE_TOUCHPAD | InputDevice.SOURCE_MOUSE, 0, 0,
                MotionEvent.CLASSIFICATION_MULTI_FINGER_SWIPE);
    }

    private static MotionEvent.PointerProperties getPointerProperties(int pointerId) {
        MotionEvent.PointerProperties properties = new MotionEvent.PointerProperties();
        properties.id = pointerId;
        properties.toolType = Configurator.getInstance().getToolType();
        return properties;
    }

    private static MotionEvent.PointerCoords getPointerCoords(float x, float y) {
        MotionEvent.PointerCoords coords = new MotionEvent.PointerCoords();
        coords.pressure = 1;
        coords.size = 1;
        coords.x = x;
        coords.y = y;
        return coords;
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -281,6 +281,22 @@ public class FalsingDataProviderTest extends ClassifierTest {
        mDataProvider.onSessionEnd();
    }

    @Test
    public void test_IsFromTrackpad() {
        MotionEvent motionEventOrigin = appendTrackpadDownEvent(0, 0);

        mDataProvider.onMotionEvent(motionEventOrigin);
        mDataProvider.onMotionEvent(
                appendTrackpadPointerDownEvent(getPointerAction(MotionEvent.ACTION_POINTER_DOWN, 1),
                        0, 0, 2));
        mDataProvider.onMotionEvent(
                appendTrackpadPointerDownEvent(getPointerAction(MotionEvent.ACTION_POINTER_DOWN, 2),
                        0, 0, 3));
        mDataProvider.onMotionEvent(appendTrackpadMoveEvent(1, -1, 3));
        assertThat(mDataProvider.isFromTrackpad()).isTrue();
        mDataProvider.onSessionEnd();
    }

    @Test
    public void test_isWirelessCharging() {
        assertThat(mDataProvider.isDocked()).isFalse();