Add rounded corners for freeform tasks
Set corner radius during relayout Bug: 258070472 Test: Manual testing Change-Id: I2511bd41025dbb0a04030f0505453a25e47beffe
This commit is contained in:
@@ -23,6 +23,7 @@ import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Region;
|
||||
@@ -95,7 +96,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
|
||||
private int mWindowingPillHeight;
|
||||
private int mMoreActionsPillHeight;
|
||||
private int mShadowRadius;
|
||||
private int mCornerRadius;
|
||||
private int mMenuCornerRadius;
|
||||
|
||||
DesktopModeWindowDecoration(
|
||||
Context context,
|
||||
@@ -182,6 +183,11 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
|
||||
mRelayoutParams.mShadowRadiusId = shadowRadiusID;
|
||||
mRelayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw;
|
||||
|
||||
final TypedArray ta = mContext.obtainStyledAttributes(
|
||||
new int[]{android.R.attr.dialogCornerRadius});
|
||||
mRelayoutParams.mCornerRadius = ta.getDimensionPixelSize(0, 0);
|
||||
ta.recycle();
|
||||
|
||||
relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult);
|
||||
// After this line, mTaskInfo is up-to-date and should be used instead of taskInfo
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.wm.shell.windowdecor;
|
||||
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
|
||||
|
||||
import android.app.ActivityManager.RunningTaskInfo;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@@ -256,13 +258,17 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
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;
|
||||
final Point taskPosition = mTaskInfo.positionInParent;
|
||||
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);
|
||||
if (mTaskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
|
||||
startT.setCornerRadius(mTaskSurface, params.mCornerRadius);
|
||||
finishT.setCornerRadius(mTaskSurface, params.mCornerRadius);
|
||||
}
|
||||
|
||||
if (mCaptionWindowManager == null) {
|
||||
// Put caption under a container surface because ViewRootImpl sets the destination frame
|
||||
@@ -414,6 +420,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
int mCaptionWidthId;
|
||||
int mShadowRadiusId;
|
||||
|
||||
int mCornerRadius;
|
||||
|
||||
int mCaptionX;
|
||||
int mCaptionY;
|
||||
|
||||
@@ -425,6 +433,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
||||
mCaptionWidthId = Resources.ID_NULL;
|
||||
mShadowRadiusId = Resources.ID_NULL;
|
||||
|
||||
mCornerRadius = 0;
|
||||
|
||||
mCaptionX = 0;
|
||||
mCaptionY = 0;
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.wm.shell.windowdecor;
|
||||
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
|
||||
|
||||
import static com.android.wm.shell.MockSurfaceControlHelper.createMockSurfaceControlBuilder;
|
||||
import static com.android.wm.shell.MockSurfaceControlHelper.createMockSurfaceControlTransaction;
|
||||
|
||||
@@ -86,6 +88,7 @@ import java.util.function.Supplier;
|
||||
public class WindowDecorationTests extends ShellTestCase {
|
||||
private static final Rect TASK_BOUNDS = new Rect(100, 300, 400, 400);
|
||||
private static final Point TASK_POSITION_IN_PARENT = new Point(40, 60);
|
||||
private static final int CORNER_RADIUS = 20;
|
||||
|
||||
private final WindowDecoration.RelayoutResult<TestView> mRelayoutResult =
|
||||
new WindowDecoration.RelayoutResult<>();
|
||||
@@ -130,6 +133,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
mCaptionMenuShadowRadiusId = R.dimen.test_caption_menu_shadow_radius;
|
||||
mCaptionMenuCornerRadiusId = R.dimen.test_caption_menu_corner_radius;
|
||||
mRelayoutParams.mShadowRadiusId = R.dimen.test_window_decor_shadow_radius;
|
||||
mRelayoutParams.mCornerRadius = CORNER_RADIUS;
|
||||
|
||||
doReturn(mMockSurfaceControlViewHost).when(mMockSurfaceControlViewHostFactory)
|
||||
.create(any(), any(), any());
|
||||
@@ -209,6 +213,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
.setBounds(TASK_BOUNDS)
|
||||
.setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y)
|
||||
.setVisible(true)
|
||||
.setWindowingMode(WINDOWING_MODE_FREEFORM)
|
||||
.build();
|
||||
taskInfo.isFocused = true;
|
||||
// Density is 2. Shadow radius is 10px. Caption height is 64px.
|
||||
@@ -249,6 +254,8 @@ public class WindowDecorationTests extends ShellTestCase {
|
||||
.setPosition(taskSurface, TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y);
|
||||
verify(mMockSurfaceControlFinishT)
|
||||
.setWindowCrop(taskSurface, 300, 100);
|
||||
verify(mMockSurfaceControlStartT).setCornerRadius(taskSurface, CORNER_RADIUS);
|
||||
verify(mMockSurfaceControlFinishT).setCornerRadius(taskSurface, CORNER_RADIUS);
|
||||
verify(mMockSurfaceControlStartT)
|
||||
.show(taskSurface);
|
||||
verify(mMockSurfaceControlStartT)
|
||||
|
||||
Reference in New Issue
Block a user