From 43ee58e49dc5558f8b5bc251240cdb86e75a54b6 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 1 May 2019 16:25:18 -0400 Subject: [PATCH] Limit touch sampling rate for falsing. Our falsing manager has a hard time with high sample rates. It's tuned for a predefined rate of 60hz. In this CL, we simply drop extra samples since they can cause false positives in our falsing. Bug: 130256776 Test: Manual Change-Id: I5d4dc239e4185f984f108b92e352e5184c52821a --- .../systemui/classifier/ClassifierData.java | 18 +++++++++++++++++- .../classifier/HumanInteractionClassifier.java | 4 +++- .../android/systemui/classifier/Stroke.java | 8 ++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/ClassifierData.java b/packages/SystemUI/src/com/android/systemui/classifier/ClassifierData.java index c83c74f69f908..95e497e6574cd 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/ClassifierData.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/ClassifierData.java @@ -26,6 +26,9 @@ import java.util.ArrayList; * example, provide information on the current touch state. */ public class ClassifierData { + private static final long MINIMUM_DT_NANOS = 16666666; // 60Hz + private static final long MINIMUM_DT_SMEAR_NANOS = 2500000; // 2.5ms + private SparseArray mCurrentStrokes = new SparseArray<>(); private ArrayList mEndingStrokes = new ArrayList<>(); private final float mDpi; @@ -34,7 +37,18 @@ public class ClassifierData { mDpi = dpi; } - public void update(MotionEvent event) { + /** Returns true if the event should be considered, false otherwise. */ + public boolean update(MotionEvent event) { + // We limit to 60hz sampling. Drop anything happening faster than that. + // Legacy code was created with an assumed sampling rate. As devices increase their + // sampling rate, this creates potentialy false positives. + if (event.getActionMasked() == MotionEvent.ACTION_MOVE + && mCurrentStrokes.size() != 0 + && event.getEventTimeNano() - mCurrentStrokes.get(0).getLastEventTimeNano() + < MINIMUM_DT_NANOS - MINIMUM_DT_SMEAR_NANOS) { + return false; + } + mEndingStrokes.clear(); int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { @@ -54,6 +68,8 @@ public class ClassifierData { mEndingStrokes.add(getStroke(id)); } } + + return true; } public void cleanUp(MotionEvent event) { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java index 0cc50cddbfc6c..86dccb2228753 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java @@ -151,7 +151,9 @@ public class HumanInteractionClassifier extends Classifier { } private void addTouchEvent(MotionEvent event) { - mClassifierData.update(event); + if (!mClassifierData.update(event)) { + return; + } for (StrokeClassifier c : mStrokeClassifiers) { c.onTouchEvent(event); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/Stroke.java b/packages/SystemUI/src/com/android/systemui/classifier/Stroke.java index fb04d3e73a2d9..977a2d0b528a6 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/Stroke.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/Stroke.java @@ -68,4 +68,12 @@ public class Stroke { public ArrayList getPoints() { return mPoints; } + + public long getLastEventTimeNano() { + if (mPoints.isEmpty()) { + return mStartTimeNano; + } + + return mPoints.get(mPoints.size() - 1).timeOffsetNano; + } }