Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c2de368 authored by Rob Carr's avatar Rob Carr Committed by Android (Google) Code Review
Browse files

Merge "SurfaceFlinger: Fix reparenting following ReparentForDrawing" into pi-dev

parents ccd34846 15eae09e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1596,7 +1596,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;
    }
+1 −1
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ public:
    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();

+2 −2
Original line number Diff line number Diff line
@@ -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 {
+11 −0
Original line number Diff line number Diff line
@@ -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();