diff options
| author | 2018-03-23 13:43:53 -0700 | |
|---|---|---|
| committer | 2018-03-23 13:43:53 -0700 | |
| commit | 15eae09ebb293135dedce203bcb542a2e6e8d43a (patch) | |
| tree | 599b6c6cdb9d1f22ddd4fcb44e3f3be96c78f9fc | |
| parent | 14c461a47806524f7bb51273df7d45fb8648b4b7 (diff) | |
SurfaceFlinger: Fix reparenting following ReparentForDrawing
Counterintuitively, the new-parent doesn't have the children in
it's child list so even when cleaning up we need to call
reparentChildrenForDrawing on the old parent instead of the new parent.
Also clarify name to make this more obvious and add test.
Test: Transaction_test.cpp
Bug: 76099859
Change-Id: I935eec303dba320b5a2731606ec862311c5ca43e
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Transaction_test.cpp | 11 |
4 files changed, 15 insertions, 4 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 44e60edb37..699c85caf9 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1594,7 +1594,7 @@ bool Layer::reparentChildren(const sp<IBinder>& newParentHandle) { return true; } -void Layer::reparentChildrenForDrawing(const sp<Layer>& newParent) { +void Layer::setChildrenDrawingParent(const sp<Layer>& newParent) { for (const sp<Layer>& child : mDrawingChildren) { child->mDrawingParent = newParent; } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 996d686371..15f4330e27 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -287,7 +287,7 @@ public: bool setOverrideScalingMode(int32_t overrideScalingMode); void setInfo(uint32_t type, uint32_t appId); bool reparentChildren(const sp<IBinder>& layer); - void reparentChildrenForDrawing(const sp<Layer>& layer); + void setChildrenDrawingParent(const sp<Layer>& layer); bool reparent(const sp<IBinder>& newParentHandle); bool detachChildren(); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 11658e8b49..ba611c6b26 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4460,9 +4460,9 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, ReparentForDrawing(const sp<Layer>& oldParent, const sp<Layer>& newParent) : oldParent(oldParent), newParent(newParent) { - oldParent->reparentChildrenForDrawing(newParent); + oldParent->setChildrenDrawingParent(newParent); } - ~ReparentForDrawing() { newParent->reparentChildrenForDrawing(oldParent); } + ~ReparentForDrawing() { oldParent->setChildrenDrawingParent(oldParent); } }; void render(std::function<void()> drawLayers) override { diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index fd219913df..4e9db72268 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -2384,6 +2384,17 @@ TEST_F(ScreenCaptureChildOnlyTest, CaptureLayerIgnoresTransform) { verify(); } +TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) { + SurfaceComposerClient::Transaction().hide(mFGSurfaceControl).apply(true); + + // Even though the parent is hidden we should still capture the child. + verify(); + + // Verify everything was properly hidden when rendering the full-screen. + screenshot()->expectBGColor(0,0); +} + + TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) { auto fgHandle = mFGSurfaceControl->getHandle(); |