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

Commit 0ef7caa3 authored by chaviw's avatar chaviw
Browse files

Convert IScreenCaptureListener to AIDL

Test: Screen capture works
Fixes: 166271443
Change-Id: Iecb991a0c8e0885adb87141ed85caa6dcc7c543f
parent 4d25380c
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -232,7 +232,6 @@ constexpr const char* const kManualInterfaces[] = {
  "android.gui.IGraphicBufferConsumer",
  "android.gui.IRegionSamplingListener",
  "android.gui.ITransactionComposerListener",
  "android.gui.IScreenCaptureListener",
  "android.gui.SensorEventConnection",
  "android.gui.SensorServer",
  "android.hardware.ICamera",
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,6 @@ cc_library_shared {
        "IGraphicBufferProducer.cpp",
        "IProducerListener.cpp",
        "IRegionSamplingListener.cpp",
        "IScreenCaptureListener.cpp",
        "ISurfaceComposer.cpp",
        "ISurfaceComposerClient.cpp",
        "ITransactionCompletedListener.cpp",
@@ -78,6 +77,7 @@ cc_library_shared {
        "LayerState.cpp",
        "OccupancyTracker.cpp",
        "StreamSplitter.cpp",
        "ScreenCaptureResults.cpp",
        "Surface.cpp",
        "SurfaceControl.cpp",
        "SurfaceComposerClient.cpp",
+0 −70
Original line number Diff line number Diff line
/*
 * Copyright (C) 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.
 */

#include <gui/IScreenCaptureListener.h>
#include <gui/LayerState.h>

namespace android {

namespace { // Anonymous

enum class Tag : uint32_t {
    ON_SCREEN_CAPTURE_COMPLETE = IBinder::FIRST_CALL_TRANSACTION,
    LAST = ON_SCREEN_CAPTURE_COMPLETE,
};

} // Anonymous namespace

class BpScreenCaptureListener : public SafeBpInterface<IScreenCaptureListener> {
public:
    explicit BpScreenCaptureListener(const sp<IBinder>& impl)
          : SafeBpInterface<IScreenCaptureListener>(impl, "BpScreenCaptureListener") {}

    ~BpScreenCaptureListener() override;

    status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override {
        Parcel data, reply;
        data.writeInterfaceToken(IScreenCaptureListener::getInterfaceDescriptor());

        SAFE_PARCEL(captureResults.write, data);
        return remote()->transact(static_cast<uint32_t>(Tag::ON_SCREEN_CAPTURE_COMPLETE), data,
                                  &reply, IBinder::FLAG_ONEWAY);
    }
};

// Out-of-line virtual method definitions to trigger vtable emission in this translation unit (see
// clang warning -Wweak-vtables)
BpScreenCaptureListener::~BpScreenCaptureListener() = default;

IMPLEMENT_META_INTERFACE(ScreenCaptureListener, "android.gui.IScreenCaptureListener");

status_t BnScreenCaptureListener::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
                                             uint32_t flags) {
    auto tag = static_cast<Tag>(code);
    switch (tag) {
        case Tag::ON_SCREEN_CAPTURE_COMPLETE: {
            CHECK_INTERFACE(IScreenCaptureListener, data, reply);
            ScreenCaptureResults captureResults;
            SAFE_PARCEL(captureResults.read, data);
            return onScreenCaptureComplete(captureResults);
        }
        default: {
            return BBinder::onTransact(code, data, reply, flags);
        }
    }
}

} // namespace android
 No newline at end of file
+0 −29
Original line number Diff line number Diff line
@@ -714,33 +714,4 @@ status_t LayerCaptureArgs::read(const Parcel& input) {
    return NO_ERROR;
}

status_t ScreenCaptureResults::write(Parcel& output) const {
    if (buffer != nullptr) {
        SAFE_PARCEL(output.writeBool, true);
        SAFE_PARCEL(output.write, *buffer);
    } else {
        SAFE_PARCEL(output.writeBool, false);
    }
    SAFE_PARCEL(output.writeBool, capturedSecureLayers);
    SAFE_PARCEL(output.writeUint32, static_cast<uint32_t>(capturedDataspace));
    SAFE_PARCEL(output.writeInt32, result);
    return NO_ERROR;
}

status_t ScreenCaptureResults::read(const Parcel& input) {
    bool hasGraphicBuffer;
    SAFE_PARCEL(input.readBool, &hasGraphicBuffer);
    if (hasGraphicBuffer) {
        buffer = new GraphicBuffer();
        SAFE_PARCEL(input.read, *buffer);
    }

    SAFE_PARCEL(input.readBool, &capturedSecureLayers);
    uint32_t dataspace = 0;
    SAFE_PARCEL(input.readUint32, &dataspace);
    capturedDataspace = static_cast<ui::Dataspace>(dataspace);
    SAFE_PARCEL(input.readInt32, &result);
    return NO_ERROR;
}

}; // namespace android
+50 −0
Original line number Diff line number Diff line
/*
 * Copyright 2021 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.
 */

#include <gui/ScreenCaptureResults.h>

namespace android::gui {

status_t ScreenCaptureResults::writeToParcel(android::Parcel* parcel) const {
    if (buffer != nullptr) {
        SAFE_PARCEL(parcel->writeBool, true);
        SAFE_PARCEL(parcel->write, *buffer);
    } 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);
    return NO_ERROR;
}

status_t ScreenCaptureResults::readFromParcel(const android::Parcel* parcel) {
    bool hasGraphicBuffer;
    SAFE_PARCEL(parcel->readBool, &hasGraphicBuffer);
    if (hasGraphicBuffer) {
        buffer = new GraphicBuffer();
        SAFE_PARCEL(parcel->read, *buffer);
    }

    SAFE_PARCEL(parcel->readBool, &capturedSecureLayers);
    uint32_t dataspace = 0;
    SAFE_PARCEL(parcel->readUint32, &dataspace);
    capturedDataspace = static_cast<ui::Dataspace>(dataspace);
    SAFE_PARCEL(parcel->readInt32, &result);
    return NO_ERROR;
}

} // namespace android::gui
Loading