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

Commit ba9b9b7c authored by Evan Rosky's avatar Evan Rosky
Browse files

Restore direct display children to windowing layer

On virtual displays, there is no magnification DA, so TDA
is a direct child of DisplayContent. However, DC *still* makes
a root-wrapper surface in this case, so we have to restore to
DC.getWindowingLayer() instead of DC.getSurfaceControl() since
mSurfaceControl gets replaced after construction.

Added a comment in makeChildSurface to explain that the
mSurfaceControl used there is not the same after construction so
that others will hopefully be less confused by this.

Bug: 266243524
Test: AccessibilityOverlayTest#testA11yServiceShowsOverlayOnVirtualDisplay_shouldAppear
Change-Id: I78d4832b0ff7623684fc22fe1f464a02a1d91477
parent 79dbc1af
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -5264,6 +5264,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            return b;
        }

        // WARNING: it says `mSurfaceControl` below, but this CHANGES meaning after construction!
        // DisplayAreas are added in `configureSurface()` *before* `mSurfaceControl` gets replaced
        // with a wrapper or magnification surface so they end up in the right place; however,
        // anything added or reparented to "the display" *afterwards* needs to be reparented to
        // `getWindowinglayer()` (unless it's an overlay DisplayArea).
        return b.setName(child.getName())
                .setParent(mSurfaceControl);
    }
+6 −0
Original line number Diff line number Diff line
@@ -1650,6 +1650,12 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
            // DisplayContent is the "root", so we reinterpret it's wc as the window layer
            // making the parent surface the displaycontent's surface.
            return wc.getSurfaceControl();
        } else if (wc.getParent().asDisplayContent() != null) {
            // DisplayContent is kinda split into 2 pieces, the "real root" and the
            // "windowing layer". So if the parent of the window is DC, then it really belongs on
            // the windowing layer (unless it's an overlay display area, but those can't be in
            // transitions anyways).
            return wc.getParent().asDisplayContent().getWindowingLayer();
        }
        return wc.getParent().getSurfaceControl();
    }