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

Commit 97e60ba3 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Provide prediction time from the application"

parents 1556f84a 0839bd63
Loading
Loading
Loading
Loading
+1 −5
Original line number Original line Diff line number Diff line
@@ -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;
+2 −12
Original line number Original line Diff line number Diff line
@@ -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 {};
    }
    }
@@ -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();
@@ -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
+5 −9
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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);
@@ -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));