Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7b9f278 authored by chaviw's avatar chaviw
Browse files

Update screen capture functions to accept a ScreenCaptureListener

Move all screen capture functions to be asynchronous. The screen capture
functions will no longer wait for screenshot results and will return
immediately.

Test: adb shell screencap
Test: power + volume down
Bug: 162367424
Change-Id: I0fd32ede58d3d0a858fc0ce4aae058b9a9234c00
parent 7749ff50
Loading
Loading
Loading
Loading
+6 −34
Original line number Diff line number Diff line
@@ -1923,57 +1923,29 @@ 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,
                                          ScreenCaptureResults& captureResults) {
                                          const sp<IScreenCaptureListener>& captureListener) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;

    sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener();
    status_t status = s->captureDisplay(captureArgs, captureListener);
    if (status != NO_ERROR) {
        return status;
    }
    captureResults = captureListener->waitForResults();
    return captureResults.result;
    return s->captureDisplay(captureArgs, captureListener);
}

status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack,
                                          ScreenCaptureResults& captureResults) {
                                          const sp<IScreenCaptureListener>& captureListener) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;

    sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener();
    status_t status = s->captureDisplay(displayOrLayerStack, captureListener);
    if (status != NO_ERROR) {
        return status;
    }
    captureResults = captureListener->waitForResults();
    return captureResults.result;
    return s->captureDisplay(displayOrLayerStack, captureListener);
}

status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs,
                                         ScreenCaptureResults& captureResults) {
                                         const sp<IScreenCaptureListener>& captureListener) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;

    sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener();
    status_t status = s->captureLayers(captureArgs, captureListener);
    if (status != NO_ERROR) {
        return status;
    }
    captureResults = captureListener->waitForResults();
    return captureResults.result;
    return s->captureLayers(captureArgs, captureListener);
}

} // namespace android
+3 −13
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@

#include <stdint.h>
#include <sys/types.h>
#include <future>
#include <set>
#include <unordered_map>
#include <unordered_set>
@@ -594,23 +593,14 @@ private:

// ---------------------------------------------------------------------------

class SyncScreenCaptureListener : public BnScreenCaptureListener {
public:
    status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override;
    ScreenCaptureResults waitForResults();

private:
    std::promise<ScreenCaptureResults> resultsPromise;
};

class ScreenshotClient {
public:
    static status_t captureDisplay(const DisplayCaptureArgs& captureArgs,
                                   ScreenCaptureResults& captureResults);
                                   const sp<IScreenCaptureListener>& captureListener);
    static status_t captureDisplay(uint64_t displayOrLayerStack,
                                   ScreenCaptureResults& captureResults);
                                   const sp<IScreenCaptureListener>& captureListener);
    static status_t captureLayers(const LayerCaptureArgs& captureArgs,
                                  ScreenCaptureResults& captureResults);
                                  const sp<IScreenCaptureListener>& captureListener);
};

// ---------------------------------------------------------------------------
+40 −0
Original line number Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <gui/SurfaceComposerClient.h>
#include <future>

namespace android {

class SyncScreenCaptureListener : public BnScreenCaptureListener {
public:
    status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override {
        resultsPromise.set_value(captureResults);
        return NO_ERROR;
    }

    ScreenCaptureResults waitForResults() {
        std::future<ScreenCaptureResults> resultsFuture = resultsPromise.get_future();
        return resultsFuture.get();
    }

private:
    std::promise<ScreenCaptureResults> resultsPromise;
};

} // namespace android
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <gui/IGraphicBufferProducer.h>
#include <gui/IProducerListener.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SyncScreenCaptureListener.h>
#include <private/gui/ComposerService.h>
#include <ui/DisplayConfig.h>
#include <ui/GraphicBuffer.h>
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SyncScreenCaptureListener.h>
#include <inttypes.h>
#include <private/gui/ComposerService.h>
#include <ui/BufferQueueDefs.h>
Loading