SurfaceFlinger: move sync_wait for screen capture to client

Free up time from the SF's main thread by moving the fence waiting
to the client.

Test: Observe systrace of region sample thread
Test: adb shell screencap
Test: Recents takes the screenshot
Test: Rotate device
Test: Volume + power down for screenshot
Bug: 178649983
Change-Id: I0a4991c013375b1f354e0728a06ca30a835b0422
diff --git a/libs/gui/ScreenCaptureResults.cpp b/libs/gui/ScreenCaptureResults.cpp
index 2b29487..f3849bc 100644
--- a/libs/gui/ScreenCaptureResults.cpp
+++ b/libs/gui/ScreenCaptureResults.cpp
@@ -25,6 +25,14 @@
     } else {
         SAFE_PARCEL(parcel->writeBool, false);
     }
+
+    if (fence != Fence::NO_FENCE) {
+        SAFE_PARCEL(parcel->writeBool, true);
+        SAFE_PARCEL(parcel->write, *fence);
+    } else {
+        SAFE_PARCEL(parcel->writeBool, false);
+    }
+
     SAFE_PARCEL(parcel->writeBool, capturedSecureLayers);
     SAFE_PARCEL(parcel->writeUint32, static_cast<uint32_t>(capturedDataspace));
     SAFE_PARCEL(parcel->writeInt32, result);
@@ -39,6 +47,13 @@
         SAFE_PARCEL(parcel->read, *buffer);
     }
 
+    bool hasFence;
+    SAFE_PARCEL(parcel->readBool, &hasFence);
+    if (hasFence) {
+        fence = new Fence();
+        SAFE_PARCEL(parcel->read, *fence);
+    }
+
     SAFE_PARCEL(parcel->readBool, &capturedSecureLayers);
     uint32_t dataspace = 0;
     SAFE_PARCEL(parcel->readUint32, &dataspace);
diff --git a/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl
index f490118..e0f66cd 100644
--- a/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl
+++ b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl
@@ -20,5 +20,5 @@
 
 /** @hide */
 oneway interface IScreenCaptureListener {
-    void onScreenCaptureComplete(in ScreenCaptureResults captureResults);
+    void onScreenCaptureCompleted(in ScreenCaptureResults captureResults);
 }
\ No newline at end of file
diff --git a/libs/gui/include/gui/ScreenCaptureResults.h b/libs/gui/include/gui/ScreenCaptureResults.h
index fdb4b69..0ccc6e8 100644
--- a/libs/gui/include/gui/ScreenCaptureResults.h
+++ b/libs/gui/include/gui/ScreenCaptureResults.h
@@ -27,6 +27,7 @@
 
 #include <binder/Parcel.h>
 #include <binder/Parcelable.h>
+#include <ui/Fence.h>
 #include <ui/GraphicBuffer.h>
 
 namespace android::gui {
@@ -39,6 +40,7 @@
     status_t readFromParcel(const android::Parcel* parcel) override;
 
     sp<GraphicBuffer> buffer;
+    sp<Fence> fence = Fence::NO_FENCE;
     bool capturedSecureLayers{false};
     ui::Dataspace capturedDataspace{ui::Dataspace::V0_SRGB};
     status_t result = OK;
diff --git a/libs/gui/include/gui/SyncScreenCaptureListener.h b/libs/gui/include/gui/SyncScreenCaptureListener.h
index 8620b77..0784fbc 100644
--- a/libs/gui/include/gui/SyncScreenCaptureListener.h
+++ b/libs/gui/include/gui/SyncScreenCaptureListener.h
@@ -26,14 +26,16 @@
 
 struct SyncScreenCaptureListener : gui::BnScreenCaptureListener {
 public:
-    binder::Status onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override {
+    binder::Status onScreenCaptureCompleted(const ScreenCaptureResults& captureResults) override {
         resultsPromise.set_value(captureResults);
         return binder::Status::ok();
     }
 
     ScreenCaptureResults waitForResults() {
         std::future<ScreenCaptureResults> resultsFuture = resultsPromise.get_future();
-        return resultsFuture.get();
+        const auto screenCaptureResults = resultsFuture.get();
+        screenCaptureResults.fence->waitForever("");
+        return screenCaptureResults;
     }
 
 private: