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

Commit 24cff7df authored by Harry Cutts's avatar Harry Cutts
Browse files

uinput: fix timestamps for JSON-style recordings

The previous changes to support specifying timestamps for evemu
recordings inadvertently made injections from JSON-style recordings have
the timestamps at which the injection was scheduled, not when it
happened, causing many events to be injected with very close-together
timestamps. This broke drawing in the tests for some inking libraries,
such as Keep's.

Bug: 330844071
Test: $ atest 'PlatformScenarioTests:android.platform.test.scenario.sysui.stylus.StylusInkingTest#writeText_appearsInShowcaseApp'
      (with the @Ignore in StylusInkingTest.kt removed)
Test: replay the recording from b/330844071#comment30, check the curve
      is drawn correctly
Test: replay an evemu recording and check that the timestamps shown by
      `getevent -lt` are still correct
Change-Id: I5342a79d4f9b53875b9918443bf1f5fd16cd205e
parent bf44397d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -216,7 +216,7 @@ public class Device {
                        break;
                    }
                    long offsetMicros = args.argl1;
                    if (mLastInjectTimestampMicros == -1 || offsetMicros == -1) {
                    if (mLastInjectTimestampMicros == -1) {
                        // There's often a delay of a few milliseconds between the time specified to
                        // Handler.sendMessageAtTime and the handler actually being called, due to
                        // the way threads are scheduled. We don't take this into account when
@@ -232,6 +232,9 @@ public class Device {
                        // To prevent this, we need to use the time at which we scheduled this first
                        // batch, rather than the actual current time.
                        mLastInjectTimestampMicros = args.argl2 / 1000;
                    } else if (offsetMicros == -1) {
                        // No timestamp offset is specified for this event, so use the current time.
                        mLastInjectTimestampMicros = SystemClock.uptimeNanos() / 1000;
                    } else {
                        mLastInjectTimestampMicros += offsetMicros;
                    }