diff options
Diffstat (limited to 'libs/gui/SurfaceComposerClient.cpp')
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 6d1f399460..ce2e5ed195 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -1923,29 +1923,57 @@ status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColo } // ---------------------------------------------------------------------------- +status_t SyncScreenCaptureListener::onScreenCaptureComplete( + const ScreenCaptureResults& captureResults) { + resultsPromise.set_value(captureResults); + return NO_ERROR; +} + +ScreenCaptureResults SyncScreenCaptureListener::waitForResults() { + std::future<ScreenCaptureResults> resultsFuture = resultsPromise.get_future(); + return resultsFuture.get(); +} status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureDisplay(captureArgs, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureDisplay(captureArgs, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureDisplay(displayOrLayerStack, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureDisplay(displayOrLayerStack, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureLayers(captureArgs, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureLayers(captureArgs, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } } // namespace android |