diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index 16dbc92..d365851 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -636,8 +636,7 @@
         mDesiredPresentTime(other.mDesiredPresentTime),
         mIsAutoTimestamp(other.mIsAutoTimestamp),
         mFrameTimelineInfo(other.mFrameTimelineInfo),
-        mApplyToken(other.mApplyToken),
-        mWindowInfosReportedEvent(other.mWindowInfosReportedEvent) {
+        mApplyToken(other.mApplyToken) {
     mDisplayStates = other.mDisplayStates;
     mComposerStates = other.mComposerStates;
     mInputWindowCommands = other.mInputWindowCommands;
@@ -881,9 +880,6 @@
     mEarlyWakeupStart = mEarlyWakeupStart || other.mEarlyWakeupStart;
     mEarlyWakeupEnd = mEarlyWakeupEnd || other.mEarlyWakeupEnd;
     mApplyToken = other.mApplyToken;
-    if (other.mWindowInfosReportedEvent) {
-        mWindowInfosReportedEvent = std::move(other.mWindowInfosReportedEvent);
-    }
 
     mergeFrameTimelineInfo(mFrameTimelineInfo, other.mFrameTimelineInfo);
 
@@ -906,7 +902,6 @@
     mIsAutoTimestamp = true;
     clearFrameTimelineInfo(mFrameTimelineInfo);
     mApplyToken = nullptr;
-    mWindowInfosReportedEvent = nullptr;
 }
 
 uint64_t SurfaceComposerClient::Transaction::getId() {
@@ -1053,10 +1048,6 @@
                             hasListenerCallbacks, listenerCallbacks, mId);
     mId = generateId();
 
-    if (mWindowInfosReportedEvent && !mWindowInfosReportedEvent->wait()) {
-        ALOGE("Timed out waiting for window infos to be reported.");
-    }
-
     // Clear the current states and flags
     clear();
 
@@ -1743,25 +1734,10 @@
     return *this;
 }
 
-class NotifyWindowInfosReported : public gui::BnWindowInfosReportedListener {
-public:
-    NotifyWindowInfosReported(
-            std::shared_ptr<SurfaceComposerClient::Event> windowInfosReportedEvent)
-          : mWindowInfosReportedEvent(windowInfosReportedEvent) {}
-
-    binder::Status onWindowInfosReported() {
-        mWindowInfosReportedEvent->set();
-        return binder::Status::ok();
-    }
-
-private:
-    std::shared_ptr<SurfaceComposerClient::Event> mWindowInfosReportedEvent;
-};
-
-SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::syncInputWindows() {
-    mWindowInfosReportedEvent = std::make_shared<Event>();
-    mInputWindowCommands.windowInfosReportedListeners.insert(
-            sp<NotifyWindowInfosReported>::make(mWindowInfosReportedEvent));
+SurfaceComposerClient::Transaction&
+SurfaceComposerClient::Transaction::addWindowInfosReportedListener(
+        sp<gui::IWindowInfosReportedListener> windowInfosReportedListener) {
+    mInputWindowCommands.windowInfosReportedListeners.insert(windowInfosReportedListener);
     return *this;
 }
 
@@ -2849,17 +2825,4 @@
     }
 }
 
-// ---------------------------------------------------------------------------------
-
-void SurfaceComposerClient::Event::set() {
-    std::lock_guard<std::mutex> lock(mMutex);
-    mComplete = true;
-    mConditionVariable.notify_all();
-}
-
-bool SurfaceComposerClient::Event::wait() {
-    std::unique_lock<std::mutex> lock(mMutex);
-    return mConditionVariable.wait_for(lock, sTimeout, [this] { return mComplete; });
-}
-
 } // namespace android
