Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +35 −8 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); } /** Loading Loading @@ -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); Loading @@ -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, Loading @@ -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 Loading Loading @@ -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; Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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); Loading @@ -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() Loading Loading @@ -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), Loading Loading @@ -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() Loading @@ -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()); Loading @@ -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()); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +35 −8 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); } /** Loading Loading @@ -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); Loading @@ -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, Loading @@ -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 Loading Loading @@ -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; Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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); Loading @@ -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() Loading Loading @@ -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), Loading Loading @@ -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() Loading @@ -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()); Loading @@ -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()); } Loading