diff options
3 files changed, 37 insertions, 4 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 12f7881c11d9..0b57318159e4 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -474,6 +474,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> diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java index 664e88676d9a..8fc555f14c8a 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java @@ -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(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index bc4654823f77..6b30c0cf25df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -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,9 +287,21 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView if (!mActivated) { makeActive(); postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS); + mActivationX = event.getX(); + mActivationY = event.getY(); } else { - if (!performClick()) { - return false; + 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 { @@ -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; |