From 7e21e56840e2efd222820edb279db1eaf2139976 Mon Sep 17 00:00:00 2001 From: Gaurav Bhola Date: Fri, 10 Mar 2023 15:40:05 -0800 Subject: [PATCH] Handle task visibility change to show the surface - When a new task organizer is registered, while a task is invisible, onTaskAppeared() may get called with isVisible=false. - Later on when visibility becomes true, onTaskAppeared() is not called and hence that surface would still remain hidden. - Handle this scenario in onTaskInfoChanged to make sure surface is shown correctly. Fix: 272296051 Test: Tested manually by triggering this case on gcar_ui_portrait Change-Id: Ie61be170ae92dac1c4eab102e76629f989afa64c --- .../wm/shell/fullscreen/FullscreenTaskListener.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java index d094c229e0f86..998728d65e6af 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/fullscreen/FullscreenTaskListener.java @@ -129,6 +129,7 @@ public class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { public void onTaskInfoChanged(RunningTaskInfo taskInfo) { final State state = mTasks.get(taskInfo.taskId); final Point oldPositionInParent = state.mTaskInfo.positionInParent; + boolean oldVisible = state.mTaskInfo.isVisible; if (mWindowDecorViewModelOptional.isPresent()) { mWindowDecorViewModelOptional.get().onTaskInfoChanged(taskInfo); @@ -138,12 +139,18 @@ public class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { updateRecentsForVisibleFullscreenTask(taskInfo); final Point positionInParent = state.mTaskInfo.positionInParent; - if (!oldPositionInParent.equals(state.mTaskInfo.positionInParent)) { + boolean positionInParentChanged = !oldPositionInParent.equals(positionInParent); + boolean becameVisible = !oldVisible && state.mTaskInfo.isVisible; + + if (becameVisible || positionInParentChanged) { mSyncQueue.runInSync(t -> { if (!state.mLeash.isValid()) { // Task vanished before sync completion return; } + if (becameVisible) { + t.show(state.mLeash); + } t.setPosition(state.mLeash, positionInParent.x, positionInParent.y); }); }