diff options
| author | 2019-05-07 14:08:29 +0000 | |
|---|---|---|
| committer | 2019-05-07 14:08:29 +0000 | |
| commit | a7f63a1cccaee2156b97f9d269a6e116b091246b (patch) | |
| tree | 1ef00692eb8902b3cb6caa0f235202004d23f780 | |
| parent | acb1bf8387ebb87168fb5640bbb8a224f3ad5031 (diff) | |
| parent | 43ee58e49dc5558f8b5bc251240cdb86e75a54b6 (diff) | |
Merge "Limit touch sampling rate for falsing." into qt-dev
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; + } } |