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

Commit 923e7065 authored by Adrian Roos's avatar Adrian Roos Committed by android-build-merger
Browse files

Lockscreen: Restrict double taps to prevent falsing

am: ac75cddc

Change-Id: I25fe91c23f79d8f54cfa106966dbf4a820dd4c6b
parents cfe76053 ac75cddc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -450,6 +450,9 @@
    <!-- TrustDrawable: Thickness of the circle -->
    <dimen name="trust_circle_thickness">2dp</dimen>

    <!-- How much two taps can be apart to still be recognized as a double tap on the lockscreen -->
    <dimen name="double_tap_slop">32dp</dimen>

    <!-- Margin on the right side of the system icon group on Keyguard. -->
    <fraction name="battery_button_height_fraction">10.5%</fraction>

+5 −1
Original line number Diff line number Diff line
@@ -313,7 +313,11 @@ public class FalsingManager implements SensorEventListener {
        mDataCollector.onNotificationActive();
    }

    public void onNotificationDoubleTap() {
    public void onNotificationDoubleTap(boolean accepted, float dx, float dy) {
        if (FalsingLog.ENABLED) {
            FalsingLog.i("onNotificationDoubleTap", "accepted=" + accepted
                    + " dx=" + dx + " dy=" + dy + " (px)");
        }
        mDataCollector.onNotificationDoubleTap();
    }

+29 −3
Original line number Diff line number Diff line
@@ -110,6 +110,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
    private float mDownY;
    private final float mTouchSlop;

    private float mActivationX;
    private float mActivationY;
    private final float mDoubleTapSlop;

    private OnActivatedListener mOnActivatedListener;

    private final Interpolator mSlowOutFastInInterpolator;
@@ -171,6 +175,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
    public ActivatableNotificationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        mDoubleTapSlop = context.getResources().getDimension(R.dimen.double_tap_slop);
        mSlowOutFastInInterpolator = new PathInterpolator(0.8f, 0.0f, 0.6f, 1.0f);
        mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f);
        setClipChildren(false);
@@ -232,7 +237,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
            boolean wasActivated = mActivated;
            result = handleTouchEventDimmed(event);
            if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) {
                mFalsingManager.onNotificationDoubleTap();
                removeCallbacks(mTapTimeoutRunnable);
            }
        } else {
@@ -283,10 +287,22 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
                    if (!mActivated) {
                        makeActive();
                        postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
                        mActivationX = event.getX();
                        mActivationY = event.getY();
                    } else {
                        boolean withinDoubleTapSlop = isWithinDoubleTapSlop(event);
                        mFalsingManager.onNotificationDoubleTap(
                                withinDoubleTapSlop,
                                event.getX() - mActivationX,
                                event.getY() - mActivationY);
                        if (withinDoubleTapSlop) {
                            if (!performClick()) {
                                return false;
                            }
                        } else {
                            makeInactive(true /* animate */);
                            mTrackTouch = false;
                        }
                    }
                } else {
                    makeInactive(true /* animate */);
@@ -393,6 +409,16 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
                && Math.abs(event.getY() - mDownY) < mTouchSlop;
    }

    private boolean isWithinDoubleTapSlop(MotionEvent event) {
        if (!mActivated) {
            // If we're not activated there's no double tap slop to satisfy.
            return true;
        }

        return Math.abs(event.getX() - mActivationX) < mDoubleTapSlop
                && Math.abs(event.getY() - mActivationY) < mDoubleTapSlop;
    }

    public void setDimmed(boolean dimmed, boolean fade) {
        if (mDimmed != dimmed) {
            mDimmed = dimmed;