diff options
5 files changed, 53 insertions, 17 deletions
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 3bf3067f8410..8ee23aa8e67b 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -444,6 +444,7 @@ public class TaskInfo { && Objects.equals(shouldDockBigOverlays, that.shouldDockBigOverlays) && Objects.equals(displayCutoutInsets, that.displayCutoutInsets) && getWindowingMode() == that.getWindowingMode() + && configuration.uiMode == that.configuration.uiMode && Objects.equals(taskDescription, that.taskDescription) && isFocused == that.isFocused && isVisible == that.isVisible @@ -472,6 +473,7 @@ public class TaskInfo { .equals(that.configuration.windowConfiguration.getBounds())) && (!hasCompatUI() || configuration.getLayoutDirection() == that.configuration.getLayoutDirection()) + && (!hasCompatUI() || configuration.uiMode == that.configuration.uiMode) && (!hasCompatUI() || isVisible == that.isVisible); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java index 3b2db5127316..76d9152fdfbc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java @@ -126,14 +126,12 @@ public class CompatUIController implements OnDisplaysChangedListener, private final Lazy<Transitions> mTransitionsLazy; private final DockStateReader mDockStateReader; private final CompatUIConfiguration mCompatUIConfiguration; - - private CompatUICallback mCallback; - // Only show each hint once automatically in the process life. private final CompatUIHintsState mCompatUIHintsState; - private final CompatUIShellCommandHandler mCompatUIShellCommandHandler; + private CompatUICallback mCallback; + // Indicates if the keyguard is currently showing, in which case compat UIs shouldn't // be shown. private boolean mKeyguardShowing; @@ -372,19 +370,20 @@ public class CompatUIController implements OnDisplaysChangedListener, RestartDialogWindowManager layout = mTaskIdToRestartDialogWindowManagerMap.get(taskInfo.taskId); if (layout != null) { - // TODO(b/266262111) Handle theme change when taskListener changes - if (layout.getTaskListener() != taskListener) { - mSetOfTaskIdsShowingRestartDialog.remove(taskInfo.taskId); - } - layout.setRequestRestartDialog( - mSetOfTaskIdsShowingRestartDialog.contains(taskInfo.taskId)); - // UI already exists, update the UI layout. - if (!layout.updateCompatInfo(taskInfo, taskListener, - showOnDisplay(layout.getDisplayId()))) { - // The layout is no longer eligible to be shown, remove from active layouts. + if (layout.needsToBeRecreated(taskInfo, taskListener)) { mTaskIdToRestartDialogWindowManagerMap.remove(taskInfo.taskId); + layout.release(); + } else { + layout.setRequestRestartDialog( + mSetOfTaskIdsShowingRestartDialog.contains(taskInfo.taskId)); + // UI already exists, update the UI layout. + if (!layout.updateCompatInfo(taskInfo, taskListener, + showOnDisplay(layout.getDisplayId()))) { + // The layout is no longer eligible to be shown, remove from active layouts. + mTaskIdToRestartDialogWindowManagerMap.remove(taskInfo.taskId); + } + return; } - return; } // Create a new UI layout. final Context context = getOrCreateDisplayContext(taskInfo.displayId); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java index db87f657c1b2..cfb2accbcecd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManagerAbstract.java @@ -151,7 +151,6 @@ public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowMana @Override public void setConfiguration(Configuration configuration) { super.setConfiguration(configuration); - // TODO(b/266262111): Investigate loss of theme configuration when switching TaskListener mContext = mContext.createConfigurationContext(configuration); } @@ -211,7 +210,8 @@ public abstract class CompatUIWindowManagerAbstract extends WindowlessWindowMana } View layout = getLayout(); - if (layout == null || prevTaskListener != taskListener) { + if (layout == null || prevTaskListener != taskListener + || mTaskConfig.uiMode != prevTaskConfig.uiMode) { // Layout wasn't created yet or TaskListener changed, recreate the layout for new // surface parent. release(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java index 10f25d0eef11..2440838844c4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogWindowManager.java @@ -155,6 +155,11 @@ class RestartDialogWindowManager extends CompatUIWindowManagerAbstract { return super.updateCompatInfo(taskInfo, taskListener, canShow); } + boolean needsToBeRecreated(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener) { + return taskInfo.configuration.uiMode != mTaskInfo.configuration.uiMode + || !getTaskListener().equals(taskListener); + } + private void updateDialogMargins() { if (mLayout == null) { return; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java index 875e6105b7bc..98de58404e80 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java @@ -474,6 +474,36 @@ public class CompatUIControllerTest extends ShellTestCase { verify(mMockRestartDialogLayout).updateVisibility(true); } + @Test + public void testRestartLayoutRecreatedIfNeeded() { + final TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, + /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN); + doReturn(true).when(mMockRestartDialogLayout) + .needsToBeRecreated(any(TaskInfo.class), + any(ShellTaskOrganizer.TaskListener.class)); + + mController.onCompatInfoChanged(taskInfo, mMockTaskListener); + mController.onCompatInfoChanged(taskInfo, mMockTaskListener); + + verify(mMockRestartDialogLayout, times(2)) + .createLayout(anyBoolean()); + } + + @Test + public void testRestartLayoutNotRecreatedIfNotNeeded() { + final TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, + /* hasSizeCompat= */ true, CAMERA_COMPAT_CONTROL_HIDDEN); + doReturn(false).when(mMockRestartDialogLayout) + .needsToBeRecreated(any(TaskInfo.class), + any(ShellTaskOrganizer.TaskListener.class)); + + mController.onCompatInfoChanged(taskInfo, mMockTaskListener); + mController.onCompatInfoChanged(taskInfo, mMockTaskListener); + + verify(mMockRestartDialogLayout, times(1)) + .createLayout(anyBoolean()); + } + private static TaskInfo createTaskInfo(int displayId, int taskId, boolean hasSizeCompat, @CameraCompatControlState int cameraCompatControlState) { RunningTaskInfo taskInfo = new RunningTaskInfo(); |