Fix early firing when adding event listeners

Prior to this, if e.g. SF was not registered at time T, and is registered at
time T+8, with 16ms vsyncs and 0ms phase offsets, then it will wakeup
immediately and skip the event at T+16 to prevent a double-rate event.
With this change, the event will now correctly fire at T+16 instead of
at T+8.

Bug: 130251791
Test: atest
google/perf/jank/UIBench/UIBench:com.android.uibench.janktests.UiBenchJankTests#testSlowNestedRecyclerViewInitialFling
Change-Id: Icd72e87c43a54ef712622303ee0be4deabf6e176
diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp
index f72aef1..5aab616 100644
--- a/services/surfaceflinger/Scheduler/DispSync.cpp
+++ b/services/surfaceflinger/Scheduler/DispSync.cpp
@@ -213,11 +213,14 @@
             const nsecs_t phaseCorrection = mPhase + listener.mPhase;
             listener.mLastEventTime = predictedReference + phaseCorrection;
             // If we're very close in time to the predicted last event time,
+            // and we're not very close to the next predicted last event time
             // then we need to back up the last event time so that we can
             // attempt to fire an event immediately.
             //
-            // Otherwise, keep the last event time that we predicted.
-            if (isShorterThanPeriod(now - listener.mLastEventTime)) {
+            // Otherwise, keep the last event time that we predicted so that
+            // we don't wake up early.
+            if (isShorterThanPeriod(now - listener.mLastEventTime) &&
+                !isShorterThanPeriod(listener.mLastEventTime + mPeriod - now)) {
                 listener.mLastEventTime -= mPeriod;
             }
         } else {