Merge "SurfaceFlinger: Fix reparenting following ReparentForDrawing" into pi-dev am: 0c2de3681d
am: 241ed8212a
Change-Id: Idf9eeddd899813f125b985e0075d9acb751722ab
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 615270f..3dc8cae 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -1593,7 +1593,7 @@
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 c1a4dcf..5c00833 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -230,7 +230,7 @@
bool setOverrideScalingMode(int32_t overrideScalingMode);
void setInfo(int32_t type, int32_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 f709534..b7931bc 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4593,9 +4593,9 @@
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 fd21991..4e9db72 100644
--- a/services/surfaceflinger/tests/Transaction_test.cpp
+++ b/services/surfaceflinger/tests/Transaction_test.cpp
@@ -2384,6 +2384,17 @@
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();