From 5d0a007f855e747d04296f2ecf2ef6daf45ae9ca Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Thu, 6 Apr 2023 22:55:10 +0000 Subject: [PATCH] Remove the task background surface The decoration container surface was used to capture input events outside the task bounds, which required the task surface to be larger than the actual task size and thus a different background surface was needed to draw the backrground color on just the task size. Since outsets are no longer needed per Ib9764cf17f23ef9b5688ead7ae93dabbc1155049, the task surface size now matches the real task size and the background color can be drawn on that same surface, making the background surface obsolete. Bug: 270202228 Test: atest WindowDecorationTests Test: open freeform window, verify background is visible Change-Id: I063cda38ba1aebd1473d1b9522f4a54e2a5c095c --- .../shell/windowdecor/WindowDecoration.java | 52 +++++-------------- .../windowdecor/WindowDecorationTests.java | 31 ++--------- 2 files changed, 17 insertions(+), 66 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index 19a31822aabb8..8b35694ff8fda 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -91,7 +91,6 @@ public abstract class WindowDecoration Display mDisplay; Context mDecorWindowContext; SurfaceControl mDecorationContainerSurface; - SurfaceControl mTaskBackgroundSurface; SurfaceControl mCaptionContainerSurface; private WindowlessWindowManager mCaptionWindowManager; @@ -202,6 +201,11 @@ public abstract class WindowDecoration .inflate(params.mLayoutResId, null); } + final Resources resources = mDecorWindowContext.getResources(); + final Rect taskBounds = taskConfig.windowConfiguration.getBounds(); + outResult.mWidth = taskBounds.width(); + outResult.mHeight = taskBounds.height(); + // DecorationContainerSurface if (mDecorationContainerSurface == null) { final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get(); @@ -216,38 +220,9 @@ public abstract class WindowDecoration TaskConstants.TASK_CHILD_LAYER_WINDOW_DECORATIONS); } - final Rect taskBounds = taskConfig.windowConfiguration.getBounds(); - final Resources resources = mDecorWindowContext.getResources(); - outResult.mWidth = taskBounds.width(); - outResult.mHeight = taskBounds.height(); startT.setWindowCrop(mDecorationContainerSurface, outResult.mWidth, outResult.mHeight) .show(mDecorationContainerSurface); - // TODO(b/270202228): This surface can be removed. Instead, use - // |mDecorationContainerSurface| to set the background now that it no longer has outsets - // and its crop is set to the task bounds. - // TaskBackgroundSurface - if (mTaskBackgroundSurface == null) { - final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get(); - mTaskBackgroundSurface = builder - .setName("Background of Task=" + mTaskInfo.taskId) - .setEffectLayer() - .setParent(mTaskSurface) - .build(); - - startT.setLayer(mTaskBackgroundSurface, TaskConstants.TASK_CHILD_LAYER_TASK_BACKGROUND); - } - - float shadowRadius = loadDimension(resources, params.mShadowRadiusId); - int backgroundColorInt = mTaskInfo.taskDescription.getBackgroundColor(); - mTmpColor[0] = (float) Color.red(backgroundColorInt) / 255.f; - mTmpColor[1] = (float) Color.green(backgroundColorInt) / 255.f; - mTmpColor[2] = (float) Color.blue(backgroundColorInt) / 255.f; - startT.setWindowCrop(mTaskBackgroundSurface, taskBounds.width(), taskBounds.height()) - .setShadowRadius(mTaskBackgroundSurface, shadowRadius) - .setColor(mTaskBackgroundSurface, mTmpColor) - .show(mTaskBackgroundSurface); - // CaptionContainerSurface, CaptionWindowManager if (mCaptionContainerSurface == null) { final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get(); @@ -260,7 +235,6 @@ public abstract class WindowDecoration final int captionHeight = loadDimensionPixelSize(resources, params.mCaptionHeightId); final int captionWidth = taskBounds.width(); - startT.setWindowCrop(mCaptionContainerSurface, captionWidth, captionHeight) .show(mCaptionContainerSurface); @@ -301,8 +275,16 @@ public abstract class WindowDecoration } // Task surface itself + float shadowRadius = loadDimension(resources, params.mShadowRadiusId); + int backgroundColorInt = mTaskInfo.taskDescription.getBackgroundColor(); + mTmpColor[0] = (float) Color.red(backgroundColorInt) / 255.f; + mTmpColor[1] = (float) Color.green(backgroundColorInt) / 255.f; + mTmpColor[2] = (float) Color.blue(backgroundColorInt) / 255.f; Point taskPosition = mTaskInfo.positionInParent; - startT.show(mTaskSurface); + startT.setWindowCrop(mTaskSurface, outResult.mWidth, outResult.mHeight) + .setShadowRadius(mTaskSurface, shadowRadius) + .setColor(mTaskSurface, mTmpColor) + .show(mTaskSurface); finishT.setPosition(mTaskSurface, taskPosition.x, taskPosition.y) .setWindowCrop(mTaskSurface, outResult.mWidth, outResult.mHeight); } @@ -344,12 +326,6 @@ public abstract class WindowDecoration released = true; } - if (mTaskBackgroundSurface != null) { - t.remove(mTaskBackgroundSurface); - mTaskBackgroundSurface = null; - released = true; - } - if (released) { t.apply(); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java index 38a519af934be..c1e53a90b7e02 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java @@ -50,7 +50,6 @@ import android.view.ViewRootImpl; import android.view.WindowInsets; import android.view.WindowManager.LayoutParams; import android.window.SurfaceSyncGroup; -import android.window.TaskConstants; import android.window.WindowContainerTransaction; import androidx.test.filters.SmallTest; @@ -190,10 +189,6 @@ public class WindowDecorationTests extends ShellTestCase { 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 SurfaceControl captionContainerSurface = mock(SurfaceControl.class); final SurfaceControl.Builder captionContainerSurfaceBuilder = createMockSurfaceControlBuilder(captionContainerSurface); @@ -222,16 +217,6 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockSurfaceControlStartT).setTrustedOverlay(decorContainerSurface, true); verify(mMockSurfaceControlStartT).setWindowCrop(decorContainerSurface, 300, 100); - verify(taskBackgroundSurfaceBuilder).setParent(taskSurface); - verify(taskBackgroundSurfaceBuilder).setEffectLayer(); - verify(mMockSurfaceControlStartT).setWindowCrop(taskBackgroundSurface, 300, 100); - verify(mMockSurfaceControlStartT) - .setColor(taskBackgroundSurface, new float[] {1.f, 1.f, 0.f}); - verify(mMockSurfaceControlStartT).setShadowRadius(taskBackgroundSurface, 10); - verify(mMockSurfaceControlStartT).setLayer(taskBackgroundSurface, - TaskConstants.TASK_CHILD_LAYER_TASK_BACKGROUND); - verify(mMockSurfaceControlStartT).show(taskBackgroundSurface); - verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface); verify(captionContainerSurfaceBuilder).setContainerLayer(); verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64); @@ -260,6 +245,9 @@ public class WindowDecorationTests extends ShellTestCase { .setWindowCrop(taskSurface, 300, 100); verify(mMockSurfaceControlStartT) .show(taskSurface); + verify(mMockSurfaceControlStartT) + .setColor(taskSurface, new float[] {1.f, 1.f, 0.f}); + verify(mMockSurfaceControlStartT).setShadowRadius(taskSurface, 10); assertEquals(300, mRelayoutResult.mWidth); assertEquals(100, mRelayoutResult.mHeight); @@ -275,10 +263,6 @@ public class WindowDecorationTests extends ShellTestCase { 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 SurfaceControl captionContainerSurface = mock(SurfaceControl.class); final SurfaceControl.Builder captionContainerSurfaceBuilder = createMockSurfaceControlBuilder(captionContainerSurface); @@ -318,7 +302,6 @@ public class WindowDecorationTests extends ShellTestCase { releaseOrder.verify(mMockSurfaceControlViewHost).release(); releaseOrder.verify(t).remove(captionContainerSurface); releaseOrder.verify(t).remove(decorContainerSurface); - releaseOrder.verify(t).remove(taskBackgroundSurface); releaseOrder.verify(t).apply(); verify(mMockWindowContainerTransaction) .removeInsetsSource(eq(taskInfo.token), any(), anyInt(), anyInt()); @@ -379,10 +362,6 @@ public class WindowDecorationTests extends ShellTestCase { 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 SurfaceControl captionContainerSurface = mock(SurfaceControl.class); final SurfaceControl.Builder captionContainerSurfaceBuilder = createMockSurfaceControlBuilder(captionContainerSurface); @@ -451,10 +430,6 @@ public class WindowDecorationTests extends ShellTestCase { 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 SurfaceControl captionContainerSurface = mock(SurfaceControl.class); final SurfaceControl.Builder captionContainerSurfaceBuilder = createMockSurfaceControlBuilder(captionContainerSurface);