Merge "Remove decoration layers from hierarchy on release" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
2d4204a3b0
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user