Merge changes I3bedc2c2,Ic56a6f2c into main

* changes:
  InputDispatcher: Ensure pointer down is generated for touched window
  InputTracer: Use explicit thread wake conditions
diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp
index aeab1f8..3e999c7 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -4192,7 +4192,12 @@
               connection->getInputChannelName().c_str(), downEvents.size());
     }
 
-    sp<WindowInfoHandle> windowHandle = getWindowHandleLocked(connection->getToken());
+    const auto [_, touchedWindowState, displayId] =
+            findTouchStateWindowAndDisplayLocked(connection->getToken());
+    if (touchedWindowState == nullptr) {
+        LOG(FATAL) << __func__ << ": Touch state is out of sync: No touched window for token";
+    }
+    const auto& windowHandle = touchedWindowState->windowHandle;
 
     const bool wasEmpty = connection->outboundQueue.empty();
     for (std::unique_ptr<EventEntry>& downEventEntry : downEvents) {
diff --git a/services/inputflinger/dispatcher/trace/InputTracer.cpp b/services/inputflinger/dispatcher/trace/InputTracer.cpp
index b065729..8a855c2 100644
--- a/services/inputflinger/dispatcher/trace/InputTracer.cpp
+++ b/services/inputflinger/dispatcher/trace/InputTracer.cpp
@@ -154,19 +154,21 @@
 void InputTracer::threadLoop() {
     androidSetThreadName("InputTracer");
 
+    std::vector<const EventState> eventsToTrace;
+    std::vector<const WindowDispatchArgs> dispatchEventsToTrace;
+
     while (true) {
-        std::vector<const EventState> eventsToTrace;
-        std::vector<const WindowDispatchArgs> dispatchEventsToTrace;
-        {
+        { // acquire lock
             std::unique_lock lock(mLock);
             base::ScopedLockAssertion assumeLocked(mLock);
+
+            // Wait until we need to process more events or exit.
+            mThreadWakeCondition.wait(lock, [&]() REQUIRES(mLock) {
+                return mThreadExit || !mTraceQueue.empty() || !mDispatchTraceQueue.empty();
+            });
             if (mThreadExit) {
                 return;
             }
-            if (mTraceQueue.empty() && mDispatchTraceQueue.empty()) {
-                // Wait indefinitely until the thread is awoken.
-                mThreadWakeCondition.wait(lock);
-            }
 
             mTraceQueue.swap(eventsToTrace);
             mDispatchTraceQueue.swap(dispatchEventsToTrace);