summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java19
1 files changed, 19 insertions, 0 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index bd186ba22588..a9013b9c4fd6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -96,6 +96,7 @@ import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.transition.Transitions;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
@@ -522,9 +523,27 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
mTaskOrganizer.reparentChildSurfaceToTask(taskId, overlay, t);
t.setLayer(overlay, Integer.MAX_VALUE);
t.apply();
+ // This serves as a last resort in case the Shell Transition is not handled properly.
+ // We want to make sure the overlay passed from Launcher gets removed eventually.
+ mayRemoveContentOverlay(overlay);
}
}
+ private void mayRemoveContentOverlay(SurfaceControl overlay) {
+ final WeakReference<SurfaceControl> overlayRef = new WeakReference<>(overlay);
+ final long timeoutDuration = (mEnterAnimationDuration
+ + CONTENT_OVERLAY_FADE_OUT_DELAY_MS
+ + EXTRA_CONTENT_OVERLAY_FADE_OUT_DELAY_MS) * 2L;
+ mMainExecutor.executeDelayed(() -> {
+ final SurfaceControl overlayLeash = overlayRef.get();
+ if (overlayLeash != null && overlayLeash.isValid() && overlayLeash == mPipOverlay) {
+ ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+ "Cleanup the overlay(%s) as a last resort.", overlayLeash);
+ removeContentOverlay(overlayLeash, null /* callback */);
+ }
+ }, timeoutDuration);
+ }
+
/**
* Callback when launcher aborts swipe-pip-to-home operation.
*/