diff options
author | 2016-12-21 12:58:51 -0800 | |
---|---|---|
committer | 2017-01-27 13:59:42 -0800 | |
commit | 1db73f66624e7d151710483dd58e03eed672f064 (patch) | |
tree | 40d09da72f244ae593284ac3bd895d078e9c4220 /services/surfaceflinger/Layer.cpp | |
parent | bf89eb7b24f930e77be57bc7b6393e39691a4d35 (diff) |
SurfaceFlinger: Add support for non-privileged clients.
Allow clients without privilege to create child layers through scoped
connections. We enable this in preparation for allowing SurfaceView
to bypass the WindowManager. We include support for reparenting of
all of a layer's children for the WindowManager to use in cases where
one surface is replacing another (while keeping its children around).
Test: Tested with corresponding SurfaceView modifications.
Change-Id: I9920e6730d719113522a68788e63fb59f70d3406
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 226e70a821..e57c19ad2b 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -162,7 +162,7 @@ void Layer::onFirstRef() { sp<IGraphicBufferProducer> producer; sp<IGraphicBufferConsumer> consumer; BufferQueue::createBufferQueue(&producer, &consumer, nullptr, true); - mProducer = new MonitoredProducer(producer, mFlinger); + mProducer = new MonitoredProducer(producer, mFlinger, this); mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName, this); mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mSurfaceFlingerConsumer->setContentsChangedListener(this); @@ -2380,6 +2380,32 @@ ssize_t Layer::removeChild(const sp<Layer>& layer) { return mCurrentChildren.remove(layer); } +bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { + sp<Handle> handle = nullptr; + sp<Layer> newParent = nullptr; + if (newParentHandle == nullptr) { + return false; + } + handle = static_cast<Handle*>(newParentHandle.get()); + newParent = handle->owner.promote(); + if (newParent == nullptr) { + ALOGE("Unable to promote Layer handle"); + return false; + } + + for (const sp<Layer>& child : mCurrentChildren) { + newParent->addChild(child); + + sp<Client> client(child->mClientRef.promote()); + if (client != nullptr) { + client->setParentLayer(newParent); + } + } + mCurrentChildren.clear(); + + return true; +} + void Layer::setParent(const sp<Layer>& layer) { mParent = layer; } |