SpriteController: Reparent pointer surfaces under DisplayContent
When using MediaProjection to mirror a display, only surfaces that are
inside the mirrored DisplayContent's hierarcy show up in the mirror
surface. Previously, since pointer icons created by SpriteController
were not part of SF's hierarcy under the DisplayContent's
SurfaceControl, they did not show up in the mirror surface.
In this CL, we reparent pointer sprite surfaces to the the
DisplayContent's SurfaceControl whenever there are surface changes,
ensuring that they show up in screen recordings.
Bug: 202258016
Test: manual: Start screen recording from quick settings tile
Change-Id: Ib404ed36bd13b0fc8cc4a6fb593dc54b3e35dd1a
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index 0c6dac0..da21438 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -27,10 +27,12 @@
// --- SpriteController ---
-SpriteController::SpriteController(const sp<Looper>& looper, int32_t overlayLayer) :
- mLooper(looper), mOverlayLayer(overlayLayer) {
+SpriteController::SpriteController(const sp<Looper>& looper, int32_t overlayLayer,
+ ParentSurfaceProvider parentSurfaceProvider)
+ : mLooper(looper),
+ mOverlayLayer(overlayLayer),
+ mParentSurfaceProvider(std::move(parentSurfaceProvider)) {
mHandler = new WeakMessageHandler(this);
-
mLocked.transactionNestingCount = 0;
mLocked.deferredSpriteUpdate = false;
}
@@ -168,8 +170,7 @@
// If surface is a new one, we have to set right layer stack.
if (update.surfaceChanged || update.state.dirty & DIRTY_DISPLAY_ID) {
- t.setLayerStack(update.state.surfaceControl,
- ui::LayerStack::fromValue(update.state.displayId));
+ t.reparent(update.state.surfaceControl, mParentSurfaceProvider(update.state.displayId));
needApplyTransaction = true;
}
}