Merge "Remove decoration layers from hierarchy on release" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-09-02 14:21:58 +00:00
committed by Android (Google) Code Review
2 changed files with 51 additions and 22 deletions

View File

@@ -66,6 +66,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
final DisplayController mDisplayController; final DisplayController mDisplayController;
final ShellTaskOrganizer mTaskOrganizer; final ShellTaskOrganizer mTaskOrganizer;
final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier; final Supplier<SurfaceControl.Builder> mSurfaceControlBuilderSupplier;
final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier;
final Supplier<WindowContainerTransaction> mWindowContainerTransactionSupplier; final Supplier<WindowContainerTransaction> mWindowContainerTransactionSupplier;
final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory; final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory;
private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener = private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener =
@@ -104,8 +105,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
RunningTaskInfo taskInfo, RunningTaskInfo taskInfo,
SurfaceControl taskSurface) { SurfaceControl taskSurface) {
this(context, displayController, taskOrganizer, taskInfo, taskSurface, this(context, displayController, taskOrganizer, taskInfo, taskSurface,
SurfaceControl.Builder::new, WindowContainerTransaction::new, SurfaceControl.Builder::new, SurfaceControl.Transaction::new,
new SurfaceControlViewHostFactory() {}); WindowContainerTransaction::new, new SurfaceControlViewHostFactory() {});
} }
WindowDecoration( WindowDecoration(
@@ -115,6 +116,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
RunningTaskInfo taskInfo, RunningTaskInfo taskInfo,
SurfaceControl taskSurface, SurfaceControl taskSurface,
Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
SurfaceControlViewHostFactory surfaceControlViewHostFactory) { SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
mContext = context; mContext = context;
@@ -123,6 +125,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
mTaskInfo = taskInfo; mTaskInfo = taskInfo;
mTaskSurface = taskSurface; mTaskSurface = taskSurface;
mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier; mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier;
mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier;
mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; mWindowContainerTransactionSupplier = windowContainerTransactionSupplier;
mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; mSurfaceControlViewHostFactory = surfaceControlViewHostFactory;
@@ -320,19 +323,28 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
mCaptionWindowManager = null; mCaptionWindowManager = null;
final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get();
boolean released = false;
if (mCaptionContainerSurface != null) { if (mCaptionContainerSurface != null) {
mCaptionContainerSurface.release(); t.remove(mCaptionContainerSurface);
mCaptionContainerSurface = null; mCaptionContainerSurface = null;
released = true;
} }
if (mDecorationContainerSurface != null) { if (mDecorationContainerSurface != null) {
mDecorationContainerSurface.release(); t.remove(mDecorationContainerSurface);
mDecorationContainerSurface = null; mDecorationContainerSurface = null;
released = true;
} }
if (mTaskBackgroundSurface != null) { if (mTaskBackgroundSurface != null) {
mTaskBackgroundSurface.release(); t.remove(mTaskBackgroundSurface);
mTaskBackgroundSurface = null; mTaskBackgroundSurface = null;
released = true;
}
if (released) {
t.apply();
} }
final WindowContainerTransaction wct = mWindowContainerTransactionSupplier.get(); final WindowContainerTransaction wct = mWindowContainerTransactionSupplier.get();

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.argThat;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.same; import static org.mockito.Mockito.same;
@@ -59,6 +60,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock; import org.mockito.Mock;
import java.util.ArrayList; import java.util.ArrayList;
@@ -96,6 +98,8 @@ public class WindowDecorationTests extends ShellTestCase {
@Mock @Mock
private WindowContainerTransaction mMockWindowContainerTransaction; private WindowContainerTransaction mMockWindowContainerTransaction;
private final List<SurfaceControl.Transaction> mMockSurfaceControlTransactions =
new ArrayList<>();
private final List<SurfaceControl.Builder> mMockSurfaceControlBuilders = new ArrayList<>(); private final List<SurfaceControl.Builder> mMockSurfaceControlBuilders = new ArrayList<>();
private SurfaceControl.Transaction mMockSurfaceControlStartT; private SurfaceControl.Transaction mMockSurfaceControlStartT;
private SurfaceControl.Transaction mMockSurfaceControlFinishT; private SurfaceControl.Transaction mMockSurfaceControlFinishT;
@@ -265,6 +269,9 @@ public class WindowDecorationTests extends ShellTestCase {
createMockSurfaceControlBuilder(captionContainerSurface); createMockSurfaceControlBuilder(captionContainerSurface);
mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder);
final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
mMockSurfaceControlTransactions.add(t);
final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = final ActivityManager.TaskDescription.Builder taskDescriptionBuilder =
new ActivityManager.TaskDescription.Builder() new ActivityManager.TaskDescription.Builder()
.setBackgroundColor(Color.YELLOW); .setBackgroundColor(Color.YELLOW);
@@ -287,19 +294,19 @@ public class WindowDecorationTests extends ShellTestCase {
windowDecor.relayout(taskInfo); windowDecor.relayout(taskInfo);
verify(mMockSurfaceControlViewHost, never()).release(); verify(mMockSurfaceControlViewHost, never()).release();
verify(decorContainerSurface, never()).release(); verify(t, never()).apply();
verify(taskBackgroundSurface, never()).release();
verify(captionContainerSurface, never()).release();
verify(mMockWindowContainerTransaction, never()) verify(mMockWindowContainerTransaction, never())
.removeInsetsProvider(eq(taskInfo.token), any()); .removeInsetsProvider(eq(taskInfo.token), any());
taskInfo.isVisible = false; taskInfo.isVisible = false;
windowDecor.relayout(taskInfo); windowDecor.relayout(taskInfo);
verify(mMockSurfaceControlViewHost).release(); final InOrder releaseOrder = inOrder(t, mMockSurfaceControlViewHost);
verify(decorContainerSurface).release(); releaseOrder.verify(mMockSurfaceControlViewHost).release();
verify(taskBackgroundSurface).release(); releaseOrder.verify(t).remove(captionContainerSurface);
verify(captionContainerSurface).release(); releaseOrder.verify(t).remove(decorContainerSurface);
releaseOrder.verify(t).remove(taskBackgroundSurface);
releaseOrder.verify(t).apply();
verify(mMockWindowContainerTransaction).removeInsetsProvider(eq(taskInfo.token), any()); verify(mMockWindowContainerTransaction).removeInsetsProvider(eq(taskInfo.token), any());
} }
@@ -351,21 +358,30 @@ public class WindowDecorationTests extends ShellTestCase {
private TestWindowDecoration createWindowDecoration( private TestWindowDecoration createWindowDecoration(
ActivityManager.RunningTaskInfo taskInfo, SurfaceControl testSurface) { ActivityManager.RunningTaskInfo taskInfo, SurfaceControl testSurface) {
return new TestWindowDecoration(mContext, mMockDisplayController, mMockShellTaskOrganizer, return new TestWindowDecoration(mContext, mMockDisplayController, mMockShellTaskOrganizer,
taskInfo, testSurface, new MockSurfaceControlBuilderSupplier(), taskInfo, testSurface,
new MockObjectSupplier<>(mMockSurfaceControlBuilders,
() -> createMockSurfaceControlBuilder(mock(SurfaceControl.class))),
new MockObjectSupplier<>(mMockSurfaceControlTransactions,
() -> mock(SurfaceControl.Transaction.class)),
() -> mMockWindowContainerTransaction, mMockSurfaceControlViewHostFactory); () -> mMockWindowContainerTransaction, mMockSurfaceControlViewHostFactory);
} }
private class MockSurfaceControlBuilderSupplier implements Supplier<SurfaceControl.Builder> { private class MockObjectSupplier<T> implements Supplier<T> {
private final List<T> mObjects;
private final Supplier<T> mDefaultSupplier;
private int mNumOfCalls = 0; private int mNumOfCalls = 0;
private MockObjectSupplier(List<T> objects, Supplier<T> defaultSupplier) {
mObjects = objects;
mDefaultSupplier = defaultSupplier;
}
@Override @Override
public SurfaceControl.Builder get() { public T get() {
final SurfaceControl.Builder builder = final T mock = mNumOfCalls < mObjects.size()
mNumOfCalls < mMockSurfaceControlBuilders.size() ? mObjects.get(mNumOfCalls) : mDefaultSupplier.get();
? mMockSurfaceControlBuilders.get(mNumOfCalls)
: createMockSurfaceControlBuilder(mock(SurfaceControl.class));
++mNumOfCalls; ++mNumOfCalls;
return builder; return mock;
} }
} }
@@ -383,11 +399,12 @@ public class WindowDecorationTests extends ShellTestCase {
ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo, ShellTaskOrganizer taskOrganizer, ActivityManager.RunningTaskInfo taskInfo,
SurfaceControl taskSurface, SurfaceControl taskSurface,
Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier, Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier,
SurfaceControlViewHostFactory surfaceControlViewHostFactory) { SurfaceControlViewHostFactory surfaceControlViewHostFactory) {
super(context, displayController, taskOrganizer, taskInfo, taskSurface, super(context, displayController, taskOrganizer, taskInfo, taskSurface,
surfaceControlBuilderSupplier, windowContainerTransactionSupplier, surfaceControlBuilderSupplier, surfaceControlTransactionSupplier,
surfaceControlViewHostFactory); windowContainerTransactionSupplier, surfaceControlViewHostFactory);
} }
@Override @Override