From 6a2e636f341c2550b07bf52b8a7ce365e7a3c953 Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Mon, 1 Aug 2022 18:20:12 -0700 Subject: [PATCH] Fix some issues that make caption insets remain This CL does the following: * Remove caption insets when releasing the window decor * Update caption insets in InsetsController when the caption is in WM shell * Dump LocalInsetsSourceProviders to help debug related issues Bug: 241029178 Test: The caption type of insets provider is removed when window decor is released. Test: atest WindowDecorationTests Change-Id: Ia20e1958588de3a7d965b3ac3d3e4333c67dff36 --- core/java/android/view/InsetsController.java | 2 +- .../shell/windowdecor/WindowDecoration.java | 10 +++- .../windowdecor/WindowDecorationTests.java | 57 ++++++++++++++++++- .../android/server/wm/WindowContainer.java | 7 +++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index cce3e8c84451d..a2cb1d5c6bd2a 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -733,7 +733,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } for (@InternalInsetsType int type = 0; type < InsetsState.SIZE; type++) { // Only update the server side insets here. - if (type == ITYPE_CAPTION_BAR) continue; + if (!CAPTION_ON_SHELL && type == ITYPE_CAPTION_BAR) continue; InsetsSource source = mState.peekSource(type); if (source == null) continue; if (newState.peekSource(type) == null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index 4380bdc364174..087304b0d00b2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -66,6 +66,7 @@ public abstract class WindowDecoration final DisplayController mDisplayController; final ShellTaskOrganizer mTaskOrganizer; final Supplier mSurfaceControlBuilderSupplier; + final Supplier mWindowContainerTransactionSupplier; final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory; private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener = new DisplayController.OnDisplaysChangedListener() { @@ -102,7 +103,8 @@ public abstract class WindowDecoration RunningTaskInfo taskInfo, SurfaceControl taskSurface) { this(context, displayController, taskOrganizer, taskInfo, taskSurface, - SurfaceControl.Builder::new, new SurfaceControlViewHostFactory() {}); + SurfaceControl.Builder::new, WindowContainerTransaction::new, + new SurfaceControlViewHostFactory() {}); } WindowDecoration( @@ -112,6 +114,7 @@ public abstract class WindowDecoration RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier surfaceControlBuilderSupplier, + Supplier windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { mContext = context; mDisplayController = displayController; @@ -119,6 +122,7 @@ public abstract class WindowDecoration mTaskInfo = taskInfo; mTaskSurface = taskSurface; mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier; + mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); @@ -301,6 +305,10 @@ public abstract class WindowDecoration mTaskBackgroundSurface.release(); mTaskBackgroundSurface = null; } + + final WindowContainerTransaction wct = mWindowContainerTransactionSupplier.get(); + wct.removeInsetsProvider(mTaskInfo.token, CAPTION_INSETS_TYPES); + mTaskOrganizer.applyTransaction(wct); } @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java index b318bb26a51d8..1e7d5fe95229f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java @@ -232,6 +232,57 @@ public class WindowDecorationTests extends ShellTestCase { assertEquals(2, mRelayoutResult.mDensity, 0.f); } + @Test + public void testLayoutResultCalculation_visibleFocusedTaskToInvisible() { + final Display defaultDisplay = mock(Display.class); + doReturn(defaultDisplay).when(mMockDisplayController) + .getDisplay(Display.DEFAULT_DISPLAY); + + final SurfaceControl decorContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder decorContainerSurfaceBuilder = + createMockSurfaceControlBuilder(decorContainerSurface); + mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl taskBackgroundSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder taskBackgroundSurfaceBuilder = + createMockSurfaceControlBuilder(taskBackgroundSurface); + mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder); + + final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = + new ActivityManager.TaskDescription.Builder() + .setBackgroundColor(Color.YELLOW); + final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder() + .setDisplayId(Display.DEFAULT_DISPLAY) + .setTaskDescriptionBuilder(taskDescriptionBuilder) + .setBounds(TASK_BOUNDS) + .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) + .setVisible(true) + .build(); + taskInfo.isFocused = true; + // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is + // 64px. + taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; + mOutsetsDp.set(10, 20, 30, 40); + + final SurfaceControl taskSurface = mock(SurfaceControl.class); + final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface); + + windowDecor.relayout(taskInfo); + + verify(mMockSurfaceControlViewHost, never()).release(); + verify(decorContainerSurface, never()).release(); + verify(taskBackgroundSurface, never()).release(); + verify(mMockWindowContainerTransaction, never()) + .removeInsetsProvider(eq(taskInfo.token), any()); + + taskInfo.isVisible = false; + windowDecor.relayout(taskInfo); + + verify(mMockSurfaceControlViewHost).release(); + verify(decorContainerSurface).release(); + verify(taskBackgroundSurface).release(); + verify(mMockWindowContainerTransaction).removeInsetsProvider(eq(taskInfo.token), any()); + } + @Test public void testNotCrashWhenDisplayAppearsAfterTask() { doReturn(mock(Display.class)).when(mMockDisplayController) @@ -282,7 +333,7 @@ public class WindowDecorationTests extends ShellTestCase { ActivityManager.RunningTaskInfo taskInfo, SurfaceControl testSurface) { return new TestWindowDecoration(mContext, mMockDisplayController, mMockShellTaskOrganizer, taskInfo, testSurface, new MockSurfaceControlBuilderSupplier(), - mMockSurfaceControlViewHostFactory); + () -> mMockWindowContainerTransaction, mMockSurfaceControlViewHostFactory); } private class MockSurfaceControlBuilderSupplier implements Supplier { @@ -313,9 +364,11 @@ public class WindowDecorationTests extends ShellTestCase { ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier surfaceControlBuilderSupplier, + Supplier windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { super(context, displayController, taskOrganizer, taskInfo, taskSurface, - surfaceControlBuilderSupplier, surfaceControlViewHostFactory); + surfaceControlBuilderSupplier, windowContainerTransactionSupplier, + surfaceControlViewHostFactory); } @Override diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index d9b25adb8c4cb..15fbdb9c51dd2 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -3393,6 +3393,13 @@ class WindowContainer extends ConfigurationContainer< pw.println(prefix + "mLastOrientationSource=" + mLastOrientationSource); pw.println(prefix + "deepestLastOrientationSource=" + getLastOrientationSource()); } + if (mLocalInsetsSourceProviders != null && mLocalInsetsSourceProviders.size() != 0) { + pw.println(prefix + mLocalInsetsSourceProviders.size() + " LocalInsetsSourceProviders"); + final String childPrefix = prefix + " "; + for (int i = 0; i < mLocalInsetsSourceProviders.size(); ++i) { + mLocalInsetsSourceProviders.valueAt(i).dump(pw, childPrefix); + } + } } final void updateSurfacePositionNonOrganized() {