Merge "Lockscreen: Restrict double taps to prevent falsing" into nyc-mr2-dev

This commit is contained in:
Adrian Roos
2016-12-05 23:37:46 +00:00
committed by Android (Google) Code Review
3 changed files with 37 additions and 4 deletions

View File

@@ -450,6 +450,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>

View File

@@ -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();
} }

View File

@@ -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;