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:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user