Move caption under DecorationContainerSurface
Therefore caption can be put at the same layer as other window decorations. It adds CaptionContainerSurface to host the caption so that WindowDecoration can put the caption at the same position as the task surface. Bug: 241598994 Test: atest WindowDecorationTests Test: Caption is shown in front of embedded activities. Change-Id: I9ec571859680f622449f4c3b5cea27222ec4c788
This commit is contained in:
@@ -89,7 +89,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
SurfaceControl mDecorationContainerSurface;
|
||||
SurfaceControl mTaskBackgroundSurface;
|
||||
|
||||
private final CaptionWindowManager mCaptionWindowManager;
|
||||
SurfaceControl mCaptionContainerSurface;
|
||||
private CaptionWindowManager mCaptionWindowManager;
|
||||
private SurfaceControlViewHost mViewHost;
|
||||
|
||||
private final Rect mCaptionInsetsRect = new Rect();
|
||||
@@ -127,11 +128,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
|
||||
mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId);
|
||||
mDecorWindowContext = mContext.createConfigurationContext(mTaskInfo.getConfiguration());
|
||||
|
||||
// Put caption under task surface because ViewRootImpl sets the destination frame of
|
||||
// windowless window layers and BLASTBufferQueue#update() doesn't support offset.
|
||||
mCaptionWindowManager =
|
||||
new CaptionWindowManager(mTaskInfo.getConfiguration(), mTaskSurface);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -213,6 +209,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
startT.setPosition(
|
||||
mDecorationContainerSurface, decorContainerOffsetX, decorContainerOffsetY)
|
||||
.setWindowCrop(mDecorationContainerSurface, outResult.mWidth, outResult.mHeight)
|
||||
// TODO(b/244455401): Change the z-order when it's better organized
|
||||
.setLayer(mDecorationContainerSurface, mTaskInfo.numActivities + 1)
|
||||
.show(mDecorationContainerSurface);
|
||||
|
||||
@@ -234,12 +231,35 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
startT.setWindowCrop(mTaskBackgroundSurface, taskBounds.width(), taskBounds.height())
|
||||
.setShadowRadius(mTaskBackgroundSurface, shadowRadius)
|
||||
.setColor(mTaskBackgroundSurface, mTmpColor)
|
||||
// TODO(b/244455401): Change the z-order when it's better organized
|
||||
.setLayer(mTaskBackgroundSurface, -1)
|
||||
.show(mTaskBackgroundSurface);
|
||||
|
||||
// CaptionContainerSurface, CaptionWindowManager
|
||||
if (mCaptionContainerSurface == null) {
|
||||
final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get();
|
||||
mCaptionContainerSurface = builder
|
||||
.setName("Caption container of Task=" + mTaskInfo.taskId)
|
||||
.setContainerLayer()
|
||||
.setParent(mDecorationContainerSurface)
|
||||
.build();
|
||||
}
|
||||
|
||||
final int captionHeight = (int) Math.ceil(captionHeightDp * outResult.mDensity);
|
||||
startT.setPosition(
|
||||
mCaptionContainerSurface, -decorContainerOffsetX, -decorContainerOffsetY)
|
||||
.setWindowCrop(mCaptionContainerSurface, taskBounds.width(), captionHeight)
|
||||
.show(mCaptionContainerSurface);
|
||||
|
||||
if (mCaptionWindowManager == null) {
|
||||
// Put caption under a container surface because ViewRootImpl sets the destination frame
|
||||
// of windowless window layers and BLASTBufferQueue#update() doesn't support offset.
|
||||
mCaptionWindowManager = new CaptionWindowManager(
|
||||
mTaskInfo.getConfiguration(), mCaptionContainerSurface);
|
||||
}
|
||||
|
||||
// Caption view
|
||||
mCaptionWindowManager.setConfiguration(taskConfig);
|
||||
final int captionHeight = (int) Math.ceil(captionHeightDp * outResult.mDensity);
|
||||
final WindowManager.LayoutParams lp =
|
||||
new WindowManager.LayoutParams(taskBounds.width(), captionHeight,
|
||||
WindowManager.LayoutParams.TYPE_APPLICATION,
|
||||
@@ -262,7 +282,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
mCaptionInsetsRect.bottom = mCaptionInsetsRect.top + captionHeight;
|
||||
wct.addRectInsetsProvider(mTaskInfo.token, mCaptionInsetsRect, CAPTION_INSETS_TYPES);
|
||||
} else {
|
||||
outResult.mRootView.setVisibility(View.GONE);
|
||||
startT.hide(mCaptionContainerSurface);
|
||||
}
|
||||
|
||||
// Task surface itself
|
||||
@@ -298,6 +318,13 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
mViewHost = null;
|
||||
}
|
||||
|
||||
mCaptionWindowManager = null;
|
||||
|
||||
if (mCaptionContainerSurface != null) {
|
||||
mCaptionContainerSurface.release();
|
||||
mCaptionContainerSurface = null;
|
||||
}
|
||||
|
||||
if (mDecorationContainerSurface != null) {
|
||||
mDecorationContainerSurface.release();
|
||||
mDecorationContainerSurface = null;
|
||||
|
||||
@@ -123,6 +123,10 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
final SurfaceControl.Builder taskBackgroundSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(taskBackgroundSurface);
|
||||
mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder);
|
||||
final SurfaceControl captionContainerSurface = mock(SurfaceControl.class);
|
||||
final SurfaceControl.Builder captionContainerSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(captionContainerSurface);
|
||||
mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder);
|
||||
|
||||
final ActivityManager.TaskDescription.Builder taskDescriptionBuilder =
|
||||
new ActivityManager.TaskDescription.Builder()
|
||||
@@ -147,6 +151,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
|
||||
verify(decorContainerSurfaceBuilder, never()).build();
|
||||
verify(taskBackgroundSurfaceBuilder, never()).build();
|
||||
verify(captionContainerSurfaceBuilder, never()).build();
|
||||
verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any());
|
||||
|
||||
verify(mMockSurfaceControlFinishT).hide(taskSurface);
|
||||
@@ -168,6 +173,10 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
final SurfaceControl.Builder taskBackgroundSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(taskBackgroundSurface);
|
||||
mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder);
|
||||
final SurfaceControl captionContainerSurface = mock(SurfaceControl.class);
|
||||
final SurfaceControl.Builder captionContainerSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(captionContainerSurface);
|
||||
mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder);
|
||||
|
||||
final ActivityManager.TaskDescription.Builder taskDescriptionBuilder =
|
||||
new ActivityManager.TaskDescription.Builder()
|
||||
@@ -205,6 +214,12 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
verify(mMockSurfaceControlStartT).setLayer(taskBackgroundSurface, -1);
|
||||
verify(mMockSurfaceControlStartT).show(taskBackgroundSurface);
|
||||
|
||||
verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface);
|
||||
verify(captionContainerSurfaceBuilder).setContainerLayer();
|
||||
verify(mMockSurfaceControlStartT).setPosition(captionContainerSurface, 20, 40);
|
||||
verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64);
|
||||
verify(mMockSurfaceControlStartT).show(captionContainerSurface);
|
||||
|
||||
verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any());
|
||||
verify(mMockSurfaceControlViewHost)
|
||||
.setView(same(mMockView),
|
||||
@@ -245,6 +260,10 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
final SurfaceControl.Builder taskBackgroundSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(taskBackgroundSurface);
|
||||
mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder);
|
||||
final SurfaceControl captionContainerSurface = mock(SurfaceControl.class);
|
||||
final SurfaceControl.Builder captionContainerSurfaceBuilder =
|
||||
createMockSurfaceControlBuilder(captionContainerSurface);
|
||||
mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder);
|
||||
|
||||
final ActivityManager.TaskDescription.Builder taskDescriptionBuilder =
|
||||
new ActivityManager.TaskDescription.Builder()
|
||||
@@ -270,6 +289,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
verify(mMockSurfaceControlViewHost, never()).release();
|
||||
verify(decorContainerSurface, never()).release();
|
||||
verify(taskBackgroundSurface, never()).release();
|
||||
verify(captionContainerSurface, never()).release();
|
||||
verify(mMockWindowContainerTransaction, never())
|
||||
.removeInsetsProvider(eq(taskInfo.token), any());
|
||||
|
||||
@@ -279,6 +299,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
verify(mMockSurfaceControlViewHost).release();
|
||||
verify(decorContainerSurface).release();
|
||||
verify(taskBackgroundSurface).release();
|
||||
verify(captionContainerSurface).release();
|
||||
verify(mMockWindowContainerTransaction).removeInsetsProvider(eq(taskInfo.token), any());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user