Loading include/input/MotionPredictor.h +1 −5 Original line number Original line Diff line number Diff line Loading @@ -63,14 +63,10 @@ public: MotionPredictor(nsecs_t predictionTimestampOffsetNanos, MotionPredictor(nsecs_t predictionTimestampOffsetNanos, std::function<bool()> checkEnableMotionPrediction = isMotionPredictionEnabled); std::function<bool()> checkEnableMotionPrediction = isMotionPredictionEnabled); void record(const MotionEvent& event); void record(const MotionEvent& event); std::vector<std::unique_ptr<MotionEvent>> predict(); std::vector<std::unique_ptr<MotionEvent>> predict(nsecs_t timestamp); bool isPredictionAvailable(int32_t deviceId, int32_t source); bool isPredictionAvailable(int32_t deviceId, int32_t source); void setExpectedPresentationTimeNanos(int64_t expectedPresentationTimeNanos); private: private: std::mutex mLock; int64_t mExpectedPresentationTimeNanos GUARDED_BY(mLock) = 0; int64_t getExpectedPresentationTimeNanos(); std::vector<MotionEvent> mEvents; std::vector<MotionEvent> mEvents; const nsecs_t mPredictionTimestampOffsetNanos; const nsecs_t mPredictionTimestampOffsetNanos; const std::function<bool()> mCheckMotionPredictionEnabled; const std::function<bool()> mCheckMotionPredictionEnabled; Loading libs/input/MotionPredictor.cpp +2 −12 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ void MotionPredictor::record(const MotionEvent& event) { * The returned event should not contain any of the real, existing data. It should only * The returned event should not contain any of the real, existing data. It should only * contain the predicted samples. * contain the predicted samples. */ */ std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict() { std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict(nsecs_t timestamp) { if (mEvents.size() < 2) { if (mEvents.size() < 2) { return {}; return {}; } } Loading @@ -67,7 +67,7 @@ std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict() { std::unique_ptr<MotionEvent> prediction = std::make_unique<MotionEvent>(); std::unique_ptr<MotionEvent> prediction = std::make_unique<MotionEvent>(); std::vector<PointerCoords> futureCoords; std::vector<PointerCoords> futureCoords; const int64_t futureTime = getExpectedPresentationTimeNanos() + mPredictionTimestampOffsetNanos; const nsecs_t futureTime = timestamp + mPredictionTimestampOffsetNanos; const nsecs_t currentTime = event.getEventTime(); const nsecs_t currentTime = event.getEventTime(); const MotionEvent& previous = mEvents.rbegin()[1]; const MotionEvent& previous = mEvents.rbegin()[1]; const nsecs_t oldTime = previous.getEventTime(); const nsecs_t oldTime = previous.getEventTime(); Loading Loading @@ -143,14 +143,4 @@ bool MotionPredictor::isPredictionAvailable(int32_t /*deviceId*/, int32_t source return true; return true; } } int64_t MotionPredictor::getExpectedPresentationTimeNanos() { std::scoped_lock lock(mLock); return mExpectedPresentationTimeNanos; } void MotionPredictor::setExpectedPresentationTimeNanos(int64_t expectedPresentationTimeNanos) { std::scoped_lock lock(mLock); mExpectedPresentationTimeNanos = expectedPresentationTimeNanos; } } // namespace android } // namespace android libs/input/tests/MotionPredictor_test.cpp +5 −9 Original line number Original line Diff line number Diff line Loading @@ -63,8 +63,7 @@ TEST(MotionPredictorTest, LinearPrediction) { predictor.record(getMotionEvent(MOVE, 1, 3, 10)); predictor.record(getMotionEvent(MOVE, 1, 3, 10)); predictor.record(getMotionEvent(MOVE, 2, 5, 20)); predictor.record(getMotionEvent(MOVE, 2, 5, 20)); predictor.record(getMotionEvent(MOVE, 3, 7, 30)); predictor.record(getMotionEvent(MOVE, 3, 7, 30)); predictor.setExpectedPresentationTimeNanos(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(predicted[0]->getX(0), 4); ASSERT_EQ(predicted[0]->getX(0), 4); ASSERT_EQ(predicted[0]->getY(0), 9); ASSERT_EQ(predicted[0]->getY(0), 9); Loading @@ -81,8 +80,7 @@ TEST(MotionPredictorTest, StationaryPrediction) { predictor.record(getMotionEvent(MOVE, 0, 1, 10)); predictor.record(getMotionEvent(MOVE, 0, 1, 10)); predictor.record(getMotionEvent(MOVE, 0, 1, 20)); predictor.record(getMotionEvent(MOVE, 0, 1, 20)); predictor.record(getMotionEvent(MOVE, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 30)); predictor.setExpectedPresentationTimeNanos(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(predicted[0]->getX(0), 0); ASSERT_EQ(predicted[0]->getX(0), 0); ASSERT_EQ(predicted[0]->getY(0), 1); ASSERT_EQ(predicted[0]->getY(0), 1); Loading @@ -98,21 +96,19 @@ TEST(MotionPredictorTest, IsPredictionAvailable) { TEST(MotionPredictorTest, Offset) { TEST(MotionPredictorTest, Offset) { MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/1, MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/1, []() { return true /*enable prediction*/; }); []() { return true /*enable prediction*/; }); predictor.setExpectedPresentationTimeNanos(40); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_GE(predicted[0]->getEventTime(), 41); ASSERT_GE(predicted[0]->getEventTime(), 41); } } TEST(MotionPredictionTest, FlagDisablesPrediction) { TEST(MotionPredictorTest, FlagDisablesPrediction) { MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/0, MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/0, []() { return false /*disable prediction*/; }); []() { return false /*disable prediction*/; }); predictor.setExpectedPresentationTimeNanos(40); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); ASSERT_EQ(0u, predicted.size()); ASSERT_EQ(0u, predicted.size()); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_STYLUS)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_STYLUS)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_TOUCHSCREEN)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_TOUCHSCREEN)); Loading Loading
include/input/MotionPredictor.h +1 −5 Original line number Original line Diff line number Diff line Loading @@ -63,14 +63,10 @@ public: MotionPredictor(nsecs_t predictionTimestampOffsetNanos, MotionPredictor(nsecs_t predictionTimestampOffsetNanos, std::function<bool()> checkEnableMotionPrediction = isMotionPredictionEnabled); std::function<bool()> checkEnableMotionPrediction = isMotionPredictionEnabled); void record(const MotionEvent& event); void record(const MotionEvent& event); std::vector<std::unique_ptr<MotionEvent>> predict(); std::vector<std::unique_ptr<MotionEvent>> predict(nsecs_t timestamp); bool isPredictionAvailable(int32_t deviceId, int32_t source); bool isPredictionAvailable(int32_t deviceId, int32_t source); void setExpectedPresentationTimeNanos(int64_t expectedPresentationTimeNanos); private: private: std::mutex mLock; int64_t mExpectedPresentationTimeNanos GUARDED_BY(mLock) = 0; int64_t getExpectedPresentationTimeNanos(); std::vector<MotionEvent> mEvents; std::vector<MotionEvent> mEvents; const nsecs_t mPredictionTimestampOffsetNanos; const nsecs_t mPredictionTimestampOffsetNanos; const std::function<bool()> mCheckMotionPredictionEnabled; const std::function<bool()> mCheckMotionPredictionEnabled; Loading
libs/input/MotionPredictor.cpp +2 −12 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ void MotionPredictor::record(const MotionEvent& event) { * The returned event should not contain any of the real, existing data. It should only * The returned event should not contain any of the real, existing data. It should only * contain the predicted samples. * contain the predicted samples. */ */ std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict() { std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict(nsecs_t timestamp) { if (mEvents.size() < 2) { if (mEvents.size() < 2) { return {}; return {}; } } Loading @@ -67,7 +67,7 @@ std::vector<std::unique_ptr<MotionEvent>> MotionPredictor::predict() { std::unique_ptr<MotionEvent> prediction = std::make_unique<MotionEvent>(); std::unique_ptr<MotionEvent> prediction = std::make_unique<MotionEvent>(); std::vector<PointerCoords> futureCoords; std::vector<PointerCoords> futureCoords; const int64_t futureTime = getExpectedPresentationTimeNanos() + mPredictionTimestampOffsetNanos; const nsecs_t futureTime = timestamp + mPredictionTimestampOffsetNanos; const nsecs_t currentTime = event.getEventTime(); const nsecs_t currentTime = event.getEventTime(); const MotionEvent& previous = mEvents.rbegin()[1]; const MotionEvent& previous = mEvents.rbegin()[1]; const nsecs_t oldTime = previous.getEventTime(); const nsecs_t oldTime = previous.getEventTime(); Loading Loading @@ -143,14 +143,4 @@ bool MotionPredictor::isPredictionAvailable(int32_t /*deviceId*/, int32_t source return true; return true; } } int64_t MotionPredictor::getExpectedPresentationTimeNanos() { std::scoped_lock lock(mLock); return mExpectedPresentationTimeNanos; } void MotionPredictor::setExpectedPresentationTimeNanos(int64_t expectedPresentationTimeNanos) { std::scoped_lock lock(mLock); mExpectedPresentationTimeNanos = expectedPresentationTimeNanos; } } // namespace android } // namespace android
libs/input/tests/MotionPredictor_test.cpp +5 −9 Original line number Original line Diff line number Diff line Loading @@ -63,8 +63,7 @@ TEST(MotionPredictorTest, LinearPrediction) { predictor.record(getMotionEvent(MOVE, 1, 3, 10)); predictor.record(getMotionEvent(MOVE, 1, 3, 10)); predictor.record(getMotionEvent(MOVE, 2, 5, 20)); predictor.record(getMotionEvent(MOVE, 2, 5, 20)); predictor.record(getMotionEvent(MOVE, 3, 7, 30)); predictor.record(getMotionEvent(MOVE, 3, 7, 30)); predictor.setExpectedPresentationTimeNanos(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(predicted[0]->getX(0), 4); ASSERT_EQ(predicted[0]->getX(0), 4); ASSERT_EQ(predicted[0]->getY(0), 9); ASSERT_EQ(predicted[0]->getY(0), 9); Loading @@ -81,8 +80,7 @@ TEST(MotionPredictorTest, StationaryPrediction) { predictor.record(getMotionEvent(MOVE, 0, 1, 10)); predictor.record(getMotionEvent(MOVE, 0, 1, 10)); predictor.record(getMotionEvent(MOVE, 0, 1, 20)); predictor.record(getMotionEvent(MOVE, 0, 1, 20)); predictor.record(getMotionEvent(MOVE, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 30)); predictor.setExpectedPresentationTimeNanos(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(predicted[0]->getX(0), 0); ASSERT_EQ(predicted[0]->getX(0), 0); ASSERT_EQ(predicted[0]->getY(0), 1); ASSERT_EQ(predicted[0]->getY(0), 1); Loading @@ -98,21 +96,19 @@ TEST(MotionPredictorTest, IsPredictionAvailable) { TEST(MotionPredictorTest, Offset) { TEST(MotionPredictorTest, Offset) { MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/1, MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/1, []() { return true /*enable prediction*/; }); []() { return true /*enable prediction*/; }); predictor.setExpectedPresentationTimeNanos(40); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); ASSERT_EQ(1u, predicted.size()); ASSERT_EQ(1u, predicted.size()); ASSERT_GE(predicted[0]->getEventTime(), 41); ASSERT_GE(predicted[0]->getEventTime(), 41); } } TEST(MotionPredictionTest, FlagDisablesPrediction) { TEST(MotionPredictorTest, FlagDisablesPrediction) { MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/0, MotionPredictor predictor(/*predictionTimestampOffsetNanos=*/0, []() { return false /*disable prediction*/; }); []() { return false /*disable prediction*/; }); predictor.setExpectedPresentationTimeNanos(40); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(DOWN, 0, 1, 30)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); predictor.record(getMotionEvent(MOVE, 0, 1, 35)); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(); std::vector<std::unique_ptr<MotionEvent>> predicted = predictor.predict(40); ASSERT_EQ(0u, predicted.size()); ASSERT_EQ(0u, predicted.size()); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_STYLUS)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_STYLUS)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_TOUCHSCREEN)); ASSERT_FALSE(predictor.isPredictionAvailable(/*deviceId=*/1, AINPUT_SOURCE_TOUCHSCREEN)); Loading