From d328adae9a31be212f0f8f6848525795c6d58cf9 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Mon, 6 Jun 2022 17:30:35 -0400 Subject: [PATCH] Making bouncer switch sides on double tap only Currently this works only when multiuser switcher is not visible, i.e. when flag BOUNCER_USER_SWITCHER is false. Fixes: 231351708 Test: in one handed bouncer mode, try double tapping on the other side and see if bouncer shifts only for double taps. Change-Id: I272e765b5c7ed316ad791b335e082063232e987b --- .../keyguard/KeyguardSecurityContainer.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index cce516d981a51..65c415b5272b9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -50,6 +50,7 @@ import android.util.AttributeSet; import android.util.Log; import android.util.MathUtils; import android.util.TypedValue; +import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -146,6 +147,7 @@ public class KeyguardSecurityContainer extends FrameLayout { private final SpringAnimation mSpringAnimation; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private final List mMotionEventListeners = new ArrayList<>(); + private final GestureDetector mDoubleTapDetector; private float mLastTouchY = -1; private int mActivePointerId = -1; @@ -305,6 +307,7 @@ public class KeyguardSecurityContainer extends FrameLayout { super(context, attrs, defStyle); mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y); mViewConfiguration = ViewConfiguration.get(context); + mDoubleTapDetector = new GestureDetector(context, new DoubleTapListener()); } void onResume(SecurityMode securityMode, boolean faceAuthEnabled) { @@ -434,6 +437,7 @@ public class KeyguardSecurityContainer extends FrameLayout { @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); + mDoubleTapDetector.onTouchEvent(event); boolean result = mMotionEventListeners.stream() .anyMatch(listener -> listener.onTouchEvent(event)) @@ -475,15 +479,21 @@ public class KeyguardSecurityContainer extends FrameLayout { if (mSwipeListener != null) { mSwipeListener.onSwipeUp(); } - } else { - if (!mIsDragging) { - mViewMode.handleTap(event); - } } } return true; } + private class DoubleTapListener extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onDoubleTap(MotionEvent e) { + if (!mIsDragging) { + mViewMode.handleDoubleTap(e); + } + return true; + } + } + void addMotionEventListener(Gefingerpoken listener) { mMotionEventListeners.add(listener); } @@ -736,8 +746,8 @@ public class KeyguardSecurityContainer extends FrameLayout { /** Alter the ViewFlipper position, based upon a touch outside of it */ default void updatePositionByTouchX(float x) {}; - /** A tap on the container, outside of the ViewFlipper */ - default void handleTap(MotionEvent event) {}; + /** A double tap on the container, outside of the ViewFlipper */ + default void handleDoubleTap(MotionEvent event) {}; /** Called when the view needs to reset or hides */ default void reset() {}; @@ -1111,11 +1121,11 @@ public class KeyguardSecurityContainer extends FrameLayout { } /** - * Determine if a tap on this view is on the other side. If so, will animate positions - * and record the preference to always show on this side. + * Determine if a double tap on this view is on the other side. If so, will animate + * positions and record the preference to always show on this side. */ @Override - public void handleTap(MotionEvent event) { + public void handleDoubleTap(MotionEvent event) { float x = event.getX(); boolean currentlyLeftAligned = isLeftAligned(); // Did the tap hit the "other" side of the bouncer?