Loading core/java/android/view/InsetsController.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +9 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final DisplayController mDisplayController; final ShellTaskOrganizer mTaskOrganizer; final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier; final Supplier<WindowContainerTransaction> mWindowContainerTransactionSupplier; final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory; private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener = new DisplayController.OnDisplaysChangedListener() { Loading Loading @@ -102,7 +103,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> RunningTaskInfo taskInfo, SurfaceControl taskSurface) { this(context, displayController, taskOrganizer, taskInfo, taskSurface, SurfaceControl.Builder::new, new SurfaceControlViewHostFactory() {}); SurfaceControl.Builder::new, WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {}); } WindowDecoration( Loading @@ -112,6 +114,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { mContext = context; mDisplayController = displayController; Loading @@ -119,6 +122,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mTaskInfo = taskInfo; mTaskSurface = taskSurface; mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier; mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); Loading Loading @@ -301,6 +305,10 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mTaskBackgroundSurface.release(); mTaskBackgroundSurface = null; } final WindowContainerTransaction wct = mWindowContainerTransactionSupplier.get(); wct.removeInsetsProvider(mTaskInfo.token, CAPTION_INSETS_TYPES); mTaskOrganizer.applyTransaction(wct); } @Override Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +55 −2 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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<SurfaceControl.Builder> { Loading Loading @@ -313,9 +364,11 @@ public class WindowDecorationTests extends ShellTestCase { ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { super(context, displayController, taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier, surfaceControlViewHostFactory); surfaceControlBuilderSupplier, windowContainerTransactionSupplier, surfaceControlViewHostFactory); } @Override Loading services/core/java/com/android/server/wm/WindowContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -3393,6 +3393,13 @@ class WindowContainer<E extends 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() { Loading Loading
core/java/android/view/InsetsController.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +9 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final DisplayController mDisplayController; final ShellTaskOrganizer mTaskOrganizer; final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier; final Supplier<WindowContainerTransaction> mWindowContainerTransactionSupplier; final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory; private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener = new DisplayController.OnDisplaysChangedListener() { Loading Loading @@ -102,7 +103,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> RunningTaskInfo taskInfo, SurfaceControl taskSurface) { this(context, displayController, taskOrganizer, taskInfo, taskSurface, SurfaceControl.Builder::new, new SurfaceControlViewHostFactory() {}); SurfaceControl.Builder::new, WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {}); } WindowDecoration( Loading @@ -112,6 +114,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { mContext = context; mDisplayController = displayController; Loading @@ -119,6 +122,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mTaskInfo = taskInfo; mTaskSurface = taskSurface; mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier; mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); Loading Loading @@ -301,6 +305,10 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mTaskBackgroundSurface.release(); mTaskBackgroundSurface = null; } final WindowContainerTransaction wct = mWindowContainerTransactionSupplier.get(); wct.removeInsetsProvider(mTaskInfo.token, CAPTION_INSETS_TYPES); mTaskOrganizer.applyTransaction(wct); } @Override Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +55 −2 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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<SurfaceControl.Builder> { Loading Loading @@ -313,9 +364,11 @@ public class WindowDecorationTests extends ShellTestCase { ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, SurfaceControl taskSurface, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, SurfaceControlViewHostFactory surfaceControlViewHostFactory) { super(context, displayController, taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier, surfaceControlViewHostFactory); surfaceControlBuilderSupplier, windowContainerTransactionSupplier, surfaceControlViewHostFactory); } @Override Loading
services/core/java/com/android/server/wm/WindowContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -3393,6 +3393,13 @@ class WindowContainer<E extends 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() { Loading