Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7c9e80d authored by Tony Wickham's avatar Tony Wickham Committed by android-build-team Robot
Browse files

Store mHistoricTimes as longs intead of floats

The loss of precision was causing us to miscalculate the age of
events, and thus not detecting any pause due to denominator = 0.

Test: have a device that hasn't been rebooted for a certain
amount of time such that SystemClock#uptimeMillis can't be
accurately converted to a float, then try to swipe up and hold

Fixes: 160568387
Change-Id: Idef112187f34a18feea7e6a0b77258626f9d0ed4
(cherry picked from commit a1456709)
(cherry picked from commit 31ef24c9)
parent 15bcf24a
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -276,7 +276,7 @@ public class MotionPauseDetector {
        private static final int HISTORY_SIZE = 20;

        // Position history are stored in a circular array
        private final float[] mHistoricTimes = new float[HISTORY_SIZE];
        private final long[] mHistoricTimes = new long[HISTORY_SIZE];
        private final float[] mHistoricPos = new float[HISTORY_SIZE];
        private int mHistoryCount = 0;
        private int mHistoryStart = 0;
@@ -292,7 +292,7 @@ public class MotionPauseDetector {
            mHistoryCount = mHistoryStart = 0;
        }

        private void addPositionAndTime(float eventTime, float eventPosition) {
        private void addPositionAndTime(long eventTime, float eventPosition) {
            mHistoricTimes[mHistoryStart] = eventTime;
            mHistoricPos[mHistoryStart] = eventPosition;
            mHistoryStart++;
@@ -322,7 +322,7 @@ public class MotionPauseDetector {
         * Based on solveUnweightedLeastSquaresDeg2 in VelocityTracker.cpp
         */
        private Float solveUnweightedLeastSquaresDeg2(final int pointPos) {
            final float eventTime = mHistoricTimes[pointPos];
            final long eventTime = mHistoricTimes[pointPos];

            float sxi = 0, sxiyi = 0, syi = 0, sxi2 = 0, sxi3 = 0, sxi2yi = 0, sxi4 = 0;
            int count = 0;
@@ -332,8 +332,8 @@ public class MotionPauseDetector {
                    index += HISTORY_SIZE;
                }

                float time = mHistoricTimes[index];
                float age = eventTime - time;
                long time = mHistoricTimes[index];
                long age = eventTime - time;
                if (age > HORIZON_MS) {
                    break;
                }
@@ -364,7 +364,7 @@ public class MotionPauseDetector {
                        if (endPos < 0) {
                            endPos += HISTORY_SIZE;
                        }
                        float denominator = eventTime - mHistoricTimes[endPos];
                        long denominator = eventTime - mHistoricTimes[endPos];
                        if (denominator != 0) {
                            return (mHistoricPos[pointPos] - mHistoricPos[endPos]) / denominator;
                        }