diff options
author | 2021-01-05 11:04:50 -0800 | |
---|---|---|
committer | 2021-01-07 17:38:55 -0800 | |
commit | 0ef7caa3ee99f1043e1d922d59e6d56341e501af (patch) | |
tree | c6b519f83ec2e021f93cb16621bddee3a904b703 | |
parent | 4d25380ce2b3fb5ffbe422e23c19ad387ec87ce9 (diff) |
Convert IScreenCaptureListener to AIDL
Test: Screen capture works
Fixes: 166271443
Change-Id: Iecb991a0c8e0885adb87141ed85caa6dcc7c543f
-rw-r--r-- | libs/binder/include/binder/IInterface.h | 1 | ||||
-rw-r--r-- | libs/gui/Android.bp | 2 | ||||
-rw-r--r-- | libs/gui/IScreenCaptureListener.cpp | 70 | ||||
-rw-r--r-- | libs/gui/LayerState.cpp | 29 | ||||
-rw-r--r-- | libs/gui/ScreenCaptureResults.cpp | 50 | ||||
-rw-r--r-- | libs/gui/aidl/android/gui/IScreenCaptureListener.aidl | 24 | ||||
-rw-r--r-- | libs/gui/aidl/android/gui/ScreenCaptureResults.aidl | 19 | ||||
-rw-r--r-- | libs/gui/include/gui/IScreenCaptureListener.h | 45 | ||||
-rw-r--r-- | libs/gui/include/gui/ISurfaceComposer.h | 5 | ||||
-rw-r--r-- | libs/gui/include/gui/LayerState.h | 10 | ||||
-rw-r--r-- | libs/gui/include/gui/ScreenCaptureResults.h | 47 | ||||
-rw-r--r-- | libs/gui/include/gui/SyncScreenCaptureListener.h | 9 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/tests/LayerState_test.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h | 1 |
15 files changed, 157 insertions, 163 deletions
diff --git a/libs/binder/include/binder/IInterface.h b/libs/binder/include/binder/IInterface.h index 988508eaba..e2a0f874ff 100644 --- a/libs/binder/include/binder/IInterface.h +++ b/libs/binder/include/binder/IInterface.h @@ -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", diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp index 7dd584d552..0b8d216189 100644 --- a/libs/gui/Android.bp +++ b/libs/gui/Android.bp @@ -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", diff --git a/libs/gui/IScreenCaptureListener.cpp b/libs/gui/IScreenCaptureListener.cpp deleted file mode 100644 index 0635e9cf34..0000000000 --- a/libs/gui/IScreenCaptureListener.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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 diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 7d2c7b88df..63be3edf94 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -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 diff --git a/libs/gui/ScreenCaptureResults.cpp b/libs/gui/ScreenCaptureResults.cpp new file mode 100644 index 0000000000..2b29487268 --- /dev/null +++ b/libs/gui/ScreenCaptureResults.cpp @@ -0,0 +1,50 @@ +/* + * 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 diff --git a/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl new file mode 100644 index 0000000000..f490118b8f --- /dev/null +++ b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl @@ -0,0 +1,24 @@ +/* + * 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. + */ + +package android.gui; + +import android.gui.ScreenCaptureResults; + +/** @hide */ +oneway interface IScreenCaptureListener { + void onScreenCaptureComplete(in ScreenCaptureResults captureResults); +}
\ No newline at end of file diff --git a/libs/gui/aidl/android/gui/ScreenCaptureResults.aidl b/libs/gui/aidl/android/gui/ScreenCaptureResults.aidl new file mode 100644 index 0000000000..9908edd2ef --- /dev/null +++ b/libs/gui/aidl/android/gui/ScreenCaptureResults.aidl @@ -0,0 +1,19 @@ +/* + * 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. + */ + +package android.gui; + +parcelable ScreenCaptureResults cpp_header "gui/ScreenCaptureResults.h";
\ No newline at end of file diff --git a/libs/gui/include/gui/IScreenCaptureListener.h b/libs/gui/include/gui/IScreenCaptureListener.h deleted file mode 100644 index a2ddc9ffff..0000000000 --- a/libs/gui/include/gui/IScreenCaptureListener.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 <binder/Binder.h> -#include <binder/IInterface.h> -#include <binder/Parcel.h> -#include <binder/SafeInterface.h> - -namespace android { - -struct ScreenCaptureResults; - -// TODO(b/166271443): Convert to AIDL -class IScreenCaptureListener : public IInterface { -public: - DECLARE_META_INTERFACE(ScreenCaptureListener) - - virtual status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) = 0; -}; - -class BnScreenCaptureListener : public SafeBnInterface<IScreenCaptureListener> { -public: - BnScreenCaptureListener() - : SafeBnInterface<IScreenCaptureListener>("BnScreenCaptureListener") {} - - status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, - uint32_t flags = 0) override; -}; - -} // namespace android diff --git a/libs/gui/include/gui/ISurfaceComposer.h b/libs/gui/include/gui/ISurfaceComposer.h index 40316dbeea..86f3c605ab 100644 --- a/libs/gui/include/gui/ISurfaceComposer.h +++ b/libs/gui/include/gui/ISurfaceComposer.h @@ -22,8 +22,8 @@ #include <binder/IBinder.h> #include <binder/IInterface.h> +#include <android/gui/IScreenCaptureListener.h> #include <android/gui/ITransactionTraceListener.h> -#include <gui/IScreenCaptureListener.h> #include <gui/ITransactionCompletedListener.h> #include <input/Flags.h> @@ -59,7 +59,6 @@ struct DisplayStatInfo; struct DisplayState; struct InputWindowCommands; struct LayerCaptureArgs; -struct ScreenCaptureResults; class LayerDebugInfo; class HdrCapabilities; class IDisplayEventConnection; @@ -69,6 +68,8 @@ class IRegionSamplingListener; class Rect; enum class FrameEvent; +using gui::IScreenCaptureListener; + namespace ui { struct DisplayState; diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h index f1c5d6712d..4a291aeb02 100644 --- a/libs/gui/include/gui/LayerState.h +++ b/libs/gui/include/gui/LayerState.h @@ -362,16 +362,6 @@ struct LayerCaptureArgs : CaptureArgs { status_t read(const Parcel& input) override; }; -struct ScreenCaptureResults { - sp<GraphicBuffer> buffer; - bool capturedSecureLayers{false}; - ui::Dataspace capturedDataspace{ui::Dataspace::V0_SRGB}; - status_t result = OK; - - status_t write(Parcel& output) const; - status_t read(const Parcel& input); -}; - }; // namespace android #endif // ANDROID_SF_LAYER_STATE_H diff --git a/libs/gui/include/gui/ScreenCaptureResults.h b/libs/gui/include/gui/ScreenCaptureResults.h new file mode 100644 index 0000000000..fdb4b6985e --- /dev/null +++ b/libs/gui/include/gui/ScreenCaptureResults.h @@ -0,0 +1,47 @@ +/* + * 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. + */ + +#pragma once + +#define SAFE_PARCEL(FUNC, ...) \ + { \ + status_t error = FUNC(__VA_ARGS__); \ + if (error) { \ + ALOGE("ERROR(%d). Failed to call parcel %s(%s)", error, #FUNC, #__VA_ARGS__); \ + return error; \ + } \ + } + +#include <binder/Parcel.h> +#include <binder/Parcelable.h> +#include <ui/GraphicBuffer.h> + +namespace android::gui { + +struct ScreenCaptureResults : public Parcelable { +public: + ScreenCaptureResults() = default; + virtual ~ScreenCaptureResults() = default; + status_t writeToParcel(android::Parcel* parcel) const override; + status_t readFromParcel(const android::Parcel* parcel) override; + + sp<GraphicBuffer> buffer; + bool capturedSecureLayers{false}; + ui::Dataspace capturedDataspace{ui::Dataspace::V0_SRGB}; + status_t result = OK; +}; + +} // namespace android::gui diff --git a/libs/gui/include/gui/SyncScreenCaptureListener.h b/libs/gui/include/gui/SyncScreenCaptureListener.h index 2857996c23..8620b77c18 100644 --- a/libs/gui/include/gui/SyncScreenCaptureListener.h +++ b/libs/gui/include/gui/SyncScreenCaptureListener.h @@ -16,16 +16,19 @@ #pragma once +#include <android/gui/BnScreenCaptureListener.h> #include <gui/SurfaceComposerClient.h> #include <future> namespace android { -class SyncScreenCaptureListener : public BnScreenCaptureListener { +using gui::ScreenCaptureResults; + +struct SyncScreenCaptureListener : gui::BnScreenCaptureListener { public: - status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override { + binder::Status onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override { resultsPromise.set_value(captureResults); - return NO_ERROR; + return binder::Status::ok(); } ScreenCaptureResults waitForResults() { diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 9f0f2eaf5d..7253593dfa 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -99,6 +99,8 @@ class RenderArea; class TimeStats; class FrameTracer; +using gui::ScreenCaptureResults; + namespace frametimeline { class FrameTimeline; } diff --git a/services/surfaceflinger/tests/LayerState_test.cpp b/services/surfaceflinger/tests/LayerState_test.cpp index e66df4a2b9..ecfed13adb 100644 --- a/services/surfaceflinger/tests/LayerState_test.cpp +++ b/services/surfaceflinger/tests/LayerState_test.cpp @@ -22,6 +22,8 @@ #include <gui/LayerState.h> namespace android { +using gui::ScreenCaptureResults; + namespace test { TEST(LayerStateTest, ParcellingDisplayCaptureArgs) { @@ -86,11 +88,11 @@ TEST(LayerStateTest, ParcellingScreenCaptureResults) { results.result = BAD_VALUE; Parcel p; - results.write(p); + results.writeToParcel(&p); p.setDataPosition(0); ScreenCaptureResults results2; - results2.read(p); + results2.readFromParcel(&p); // GraphicBuffer object is reallocated so compare the data in the graphic buffer // rather than the object itself diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index b57d4733d2..b558581e65 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -23,6 +23,7 @@ #include <compositionengine/impl/Display.h> #include <compositionengine/impl/OutputLayerCompositionState.h> #include <compositionengine/mock/DisplaySurface.h> +#include <gui/ScreenCaptureResults.h> #include "BufferQueueLayer.h" #include "BufferStateLayer.h" |