diff options
author | 2017-11-30 14:19:23 +0100 | |
---|---|---|
committer | 2017-12-05 14:50:42 +0100 | |
commit | f3cf4bcfa2c558f03e178f7044d3cb12fa0e73ed (patch) | |
tree | 7acae449c6f8d846088e0d5bbeee27c45d7776c4 | |
parent | a391ebe98e953a1209e1ba75baca4c8e46b69ae9 (diff) |
Make SurfaceControl parcelable (2/2)
Bug: 69145041
Test: Send SurfaceControl over binder
Change-Id: I47aa4a4bb39fab3ed4d1d30d4e472de7cbc5ca38
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 7 | ||||
-rw-r--r-- | libs/gui/SurfaceControl.cpp | 23 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 1 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceControl.h | 3 |
4 files changed, 33 insertions, 1 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 2466d2555a..4c8cab24b6 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -543,9 +543,14 @@ SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& r { } +SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client) + : mStatus(NO_ERROR), mClient(client) +{ +} + void SurfaceComposerClient::onFirstRef() { sp<ISurfaceComposer> sf(ComposerService::getComposerService()); - if (sf != 0) { + if (sf != 0 && mStatus == NO_INIT) { auto rootProducer = mParent.promote(); sp<ISurfaceComposerClient> conn; conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) : diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp index f6a2b8fed6..f5fb8acf44 100644 --- a/libs/gui/SurfaceControl.cpp +++ b/libs/gui/SurfaceControl.cpp @@ -166,5 +166,28 @@ sp<SurfaceComposerClient> SurfaceControl::getClient() const return mClient; } +void SurfaceControl::writeToParcel(Parcel* parcel) +{ + parcel->writeStrongBinder(ISurfaceComposerClient::asBinder(mClient->getClient())); + parcel->writeStrongBinder(mHandle); + parcel->writeStrongBinder(IGraphicBufferProducer::asBinder(mGraphicBufferProducer)); +} + +sp<SurfaceControl> SurfaceControl::readFromParcel(Parcel* parcel) +{ + sp<IBinder> client = parcel->readStrongBinder(); + sp<IBinder> handle = parcel->readStrongBinder(); + if (client == nullptr || handle == nullptr) + { + ALOGE("Invalid parcel"); + return nullptr; + } + sp<IBinder> gbp; + parcel->readNullableStrongBinder(&gbp); + return new SurfaceControl(new SurfaceComposerClient( + interface_cast<ISurfaceComposerClient>(client)), + handle.get(), interface_cast<IGraphicBufferProducer>(gbp)); +} + // ---------------------------------------------------------------------------- }; // namespace android diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index b0fa922cd9..37c4dcf2e0 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -52,6 +52,7 @@ class SurfaceComposerClient : public RefBase friend class Composer; public: SurfaceComposerClient(); + SurfaceComposerClient(const sp<ISurfaceComposerClient>& client); SurfaceComposerClient(const sp<IGraphicBufferProducer>& parent); virtual ~SurfaceComposerClient(); diff --git a/libs/gui/include/gui/SurfaceControl.h b/libs/gui/include/gui/SurfaceControl.h index 384815dad8..1416d87110 100644 --- a/libs/gui/include/gui/SurfaceControl.h +++ b/libs/gui/include/gui/SurfaceControl.h @@ -44,6 +44,9 @@ class SurfaceComposerClient; class SurfaceControl : public RefBase { public: + static sp<SurfaceControl> readFromParcel(Parcel* parcel); + void writeToParcel(Parcel* parcel); + static bool isValid(const sp<SurfaceControl>& surface) { return (surface != 0) && surface->isValid(); } |