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
This commit is contained in:
Garfield Tan
2022-08-01 18:20:12 -07:00
parent 3c7ff59bc6
commit 6a2e636f34
4 changed files with 72 additions and 4 deletions

View File

@@ -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) {

View File

@@ -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() {
@@ -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(
@@ -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;
@@ -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);
@@ -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

View File

@@ -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<SurfaceControl.Builder> {
@@ -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

View File

@@ -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() {