summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Mankoff <mankoff@google.com> 2019-05-07 14:08:29 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-05-07 14:08:29 +0000
commita7f63a1cccaee2156b97f9d269a6e116b091246b (patch)
tree1ef00692eb8902b3cb6caa0f235202004d23f780
parentacb1bf8387ebb87168fb5640bbb8a224f3ad5031 (diff)
parent43ee58e49dc5558f8b5bc251240cdb86e75a54b6 (diff)
Merge "Limit touch sampling rate for falsing." into qt-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/ClassifierData.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/HumanInteractionClassifier.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/Stroke.java8
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 c83c74f69f90..95e497e6574c 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<Stroke> mCurrentStrokes = new SparseArray<>();
private ArrayList<Stroke> 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 0cc50cddbfc6..86dccb222875 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 fb04d3e73a2d..977a2d0b528a 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<Point> getPoints() {
return mPoints;
}
+
+ public long getLastEventTimeNano() {
+ if (mPoints.isEmpty()) {
+ return mStartTimeNano;
+ }
+
+ return mPoints.get(mPoints.size() - 1).timeOffsetNano;
+ }
}