Lockscreen: Restrict double taps to prevent falsing
Further restricts the second tap on ActivateableNotificationView such that it must occur no further than 0.2in from the first tap. Bug: 32766052 Change-Id: I033c1abc64c815d519153ced23ac9751471b1d05 Test: Tap notification on lockscreen. Verify that second touch is only accepted near the first tap
This commit is contained in:
@@ -453,6 +453,9 @@
|
|||||||
<!-- TrustDrawable: Thickness of the circle -->
|
<!-- TrustDrawable: Thickness of the circle -->
|
||||||
<dimen name="trust_circle_thickness">2dp</dimen>
|
<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. -->
|
<!-- Margin on the right side of the system icon group on Keyguard. -->
|
||||||
<fraction name="battery_button_height_fraction">10.5%</fraction>
|
<fraction name="battery_button_height_fraction">10.5%</fraction>
|
||||||
|
|
||||||
|
|||||||
@@ -313,7 +313,11 @@ public class FalsingManager implements SensorEventListener {
|
|||||||
mDataCollector.onNotificationActive();
|
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();
|
mDataCollector.onNotificationDoubleTap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
private float mDownY;
|
private float mDownY;
|
||||||
private final float mTouchSlop;
|
private final float mTouchSlop;
|
||||||
|
|
||||||
|
private float mActivationX;
|
||||||
|
private float mActivationY;
|
||||||
|
private final float mDoubleTapSlop;
|
||||||
|
|
||||||
private OnActivatedListener mOnActivatedListener;
|
private OnActivatedListener mOnActivatedListener;
|
||||||
|
|
||||||
private final Interpolator mSlowOutFastInInterpolator;
|
private final Interpolator mSlowOutFastInInterpolator;
|
||||||
@@ -171,6 +175,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
public ActivatableNotificationView(Context context, AttributeSet attrs) {
|
public ActivatableNotificationView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
|
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);
|
mSlowOutFastInInterpolator = new PathInterpolator(0.8f, 0.0f, 0.6f, 1.0f);
|
||||||
mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f);
|
mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f);
|
||||||
setClipChildren(false);
|
setClipChildren(false);
|
||||||
@@ -232,7 +237,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
boolean wasActivated = mActivated;
|
boolean wasActivated = mActivated;
|
||||||
result = handleTouchEventDimmed(event);
|
result = handleTouchEventDimmed(event);
|
||||||
if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) {
|
if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
mFalsingManager.onNotificationDoubleTap();
|
|
||||||
removeCallbacks(mTapTimeoutRunnable);
|
removeCallbacks(mTapTimeoutRunnable);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -283,10 +287,22 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
if (!mActivated) {
|
if (!mActivated) {
|
||||||
makeActive();
|
makeActive();
|
||||||
postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
|
postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS);
|
||||||
|
mActivationX = event.getX();
|
||||||
|
mActivationY = event.getY();
|
||||||
} else {
|
} else {
|
||||||
|
boolean withinDoubleTapSlop = isWithinDoubleTapSlop(event);
|
||||||
|
mFalsingManager.onNotificationDoubleTap(
|
||||||
|
withinDoubleTapSlop,
|
||||||
|
event.getX() - mActivationX,
|
||||||
|
event.getY() - mActivationY);
|
||||||
|
if (withinDoubleTapSlop) {
|
||||||
if (!performClick()) {
|
if (!performClick()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
makeInactive(true /* animate */);
|
||||||
|
mTrackTouch = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
makeInactive(true /* animate */);
|
makeInactive(true /* animate */);
|
||||||
@@ -393,6 +409,16 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
&& Math.abs(event.getY() - mDownY) < mTouchSlop;
|
&& 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) {
|
public void setDimmed(boolean dimmed, boolean fade) {
|
||||||
if (mDimmed != dimmed) {
|
if (mDimmed != dimmed) {
|
||||||
mDimmed = dimmed;
|
mDimmed = dimmed;
|
||||||
|
|||||||
Reference in New Issue
Block a user