Merge "Fix divider rounded corner on specific devices" into sc-v2-dev

This commit is contained in:
Tony Huang
2021-10-29 05:23:51 +00:00
committed by Android (Google) Code Review
7 changed files with 66 additions and 22 deletions

View File

@@ -23,7 +23,7 @@
</style> </style>
<style name="DockedDividerHandle"> <style name="DockedDividerHandle">
<item name="android:layout_gravity">center_vertical</item> <item name="android:layout_gravity">center</item>
<item name="android:layout_width">48dp</item> <item name="android:layout_width">48dp</item>
<item name="android:layout_height">96dp</item> <item name="android:layout_height">96dp</item>
</style> </style>

View File

@@ -43,7 +43,7 @@
</style> </style>
<style name="DockedDividerHandle"> <style name="DockedDividerHandle">
<item name="android:layout_gravity">center_horizontal</item> <item name="android:layout_gravity">center</item>
<item name="android:layout_width">96dp</item> <item name="android:layout_width">96dp</item>
<item name="android:layout_height">48dp</item> <item name="android:layout_height">48dp</item>
</style> </style>

View File

@@ -19,6 +19,8 @@ package com.android.wm.shell.common.split;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.Context; import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
@@ -57,6 +59,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
private SplitLayout mSplitLayout; private SplitLayout mSplitLayout;
private SplitWindowManager mSplitWindowManager;
private SurfaceControlViewHost mViewHost; private SurfaceControlViewHost mViewHost;
private DividerHandleView mHandle; private DividerHandleView mHandle;
private View mBackground; private View mBackground;
@@ -67,6 +70,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
private int mStartPos; private int mStartPos;
private GestureDetector mDoubleTapDetector; private GestureDetector mDoubleTapDetector;
private boolean mInteractive; private boolean mInteractive;
private boolean mSetTouchRegion = true;
/** /**
* Tracks divider bar visible bounds in screen-based coordination. Used to calculate with * Tracks divider bar visible bounds in screen-based coordination. Used to calculate with
@@ -93,6 +97,18 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
} }
}; };
private AnimatorListenerAdapter mAnimatorListener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mSetTouchRegion = true;
}
@Override
public void onAnimationCancel(Animator animation) {
mSetTouchRegion = true;
}
};
public DividerView(@NonNull Context context) { public DividerView(@NonNull Context context) {
super(context); super(context);
} }
@@ -114,9 +130,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
/** Sets up essential dependencies of the divider bar. */ /** Sets up essential dependencies of the divider bar. */
public void setup( public void setup(
SplitLayout layout, SplitLayout layout,
SplitWindowManager splitWindowManager,
SurfaceControlViewHost viewHost, SurfaceControlViewHost viewHost,
InsetsState insetsState) { InsetsState insetsState) {
mSplitLayout = layout; mSplitLayout = layout;
mSplitWindowManager = splitWindowManager;
mViewHost = viewHost; mViewHost = viewHost;
mDividerBounds.set(layout.getDividerBounds()); mDividerBounds.set(layout.getDividerBounds());
onInsetsChanged(insetsState, false /* animate */); onInsetsChanged(insetsState, false /* animate */);
@@ -138,9 +156,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
DIVIDER_HEIGHT_PROPERTY, mDividerBounds.height(), mTempRect.height()); DIVIDER_HEIGHT_PROPERTY, mDividerBounds.height(), mTempRect.height());
animator.setInterpolator(InsetsController.RESIZE_INTERPOLATOR); animator.setInterpolator(InsetsController.RESIZE_INTERPOLATOR);
animator.setDuration(InsetsController.ANIMATION_DURATION_RESIZE); animator.setDuration(InsetsController.ANIMATION_DURATION_RESIZE);
animator.addListener(mAnimatorListener);
animator.start(); animator.start();
} else { } else {
DIVIDER_HEIGHT_PROPERTY.set(this, mTempRect.height()); DIVIDER_HEIGHT_PROPERTY.set(this, mTempRect.height());
mSetTouchRegion = true;
} }
mDividerBounds.set(mTempRect); mDividerBounds.set(mTempRect);
} }
@@ -161,6 +181,17 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
setOnTouchListener(this); setOnTouchListener(this);
} }
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mSetTouchRegion) {
mTempRect.set(mHandle.getLeft(), mHandle.getTop(), mHandle.getRight(),
mHandle.getBottom());
mSplitWindowManager.setTouchRegion(mTempRect);
mSetTouchRegion = false;
}
}
@Override @Override
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
if (mSplitLayout == null || !mInteractive) { if (mSplitLayout == null || !mInteractive) {

View File

@@ -40,8 +40,10 @@ import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.view.Display;
import android.view.InsetsSourceControl; import android.view.InsetsSourceControl;
import android.view.InsetsState; import android.view.InsetsState;
import android.view.RoundedCorner;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.WindowInsets; import android.view.WindowInsets;
import android.view.WindowManager; import android.view.WindowManager;
@@ -53,6 +55,7 @@ import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.internal.policy.DockedDividerUtils; import com.android.internal.policy.DockedDividerUtils;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.animation.Interpolators; import com.android.wm.shell.animation.Interpolators;
import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayImeController;
@@ -133,17 +136,32 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mDismissingEffectPolicy = new DismissingEffectPolicy(applyDismissingParallax); mDismissingEffectPolicy = new DismissingEffectPolicy(applyDismissingParallax);
final Resources resources = context.getResources(); final Resources resources = context.getResources();
mDividerWindowWidth = resources.getDimensionPixelSize( mDividerSize = resources.getDimensionPixelSize(R.dimen.split_divider_bar_width);
com.android.internal.R.dimen.docked_stack_divider_thickness); mDividerInsets = getDividerInsets(resources, context.getDisplay());
mDividerInsets = resources.getDimensionPixelSize( mDividerWindowWidth = mDividerSize + 2 * mDividerInsets;
com.android.internal.R.dimen.docked_stack_divider_insets);
mDividerSize = mDividerWindowWidth - mDividerInsets * 2;
mRootBounds.set(configuration.windowConfiguration.getBounds()); mRootBounds.set(configuration.windowConfiguration.getBounds());
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
resetDividerPosition(); resetDividerPosition();
} }
private int getDividerInsets(Resources resources, Display display) {
final int dividerInset = resources.getDimensionPixelSize(
com.android.internal.R.dimen.docked_stack_divider_insets);
int radius = 0;
RoundedCorner corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT);
radius = corner != null ? Math.max(radius, corner.getRadius()) : radius;
corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT);
radius = corner != null ? Math.max(radius, corner.getRadius()) : radius;
corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT);
radius = corner != null ? Math.max(radius, corner.getRadius()) : radius;
corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT);
radius = corner != null ? Math.max(radius, corner.getRadius()) : radius;
return Math.max(dividerInset, radius);
}
/** Gets bounds of the primary split. */ /** Gets bounds of the primary split. */
public Rect getBounds1() { public Rect getBounds1() {
return new Rect(mBounds1); return new Rect(mBounds1);

View File

@@ -31,7 +31,6 @@ import android.graphics.PixelFormat;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Region; import android.graphics.Region;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder;
import android.view.IWindow; import android.view.IWindow;
import android.view.InsetsState; import android.view.InsetsState;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -41,6 +40,7 @@ import android.view.SurfaceSession;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.WindowlessWindowManager; import android.view.WindowlessWindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.wm.shell.R; import com.android.wm.shell.R;
@@ -71,9 +71,10 @@ public final class SplitWindowManager extends WindowlessWindowManager {
mWindowName = windowName; mWindowName = windowName;
} }
@Override void setTouchRegion(@NonNull Rect region) {
public void setTouchRegion(IBinder window, Region region) { if (mViewHost != null) {
super.setTouchRegion(window, region); setTouchRegion(mViewHost.getWindowToken().asBinder(), new Region(region));
}
} }
@Override @Override
@@ -122,7 +123,7 @@ public final class SplitWindowManager extends WindowlessWindowManager {
lp.setTitle(mWindowName); lp.setTitle(mWindowName);
lp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | PRIVATE_FLAG_TRUSTED_OVERLAY; lp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | PRIVATE_FLAG_TRUSTED_OVERLAY;
mViewHost.setView(mDividerView, lp); mViewHost.setView(mDividerView, lp);
mDividerView.setup(splitLayout, mViewHost, insetsState); mDividerView.setup(splitLayout, this, mViewHost, insetsState);
} }
/** /**

View File

@@ -78,7 +78,7 @@ fun FlickerTestParameter.appPairsPrimaryBoundsIsVisibleAtEnd(
assertLayersEnd { assertLayersEnd {
val dividerRegion = layer(APP_PAIR_SPLIT_DIVIDER_COMPONENT).visibleRegion.region val dividerRegion = layer(APP_PAIR_SPLIT_DIVIDER_COMPONENT).visibleRegion.region
visibleRegion(primaryComponent) visibleRegion(primaryComponent)
.coversExactly(getPrimaryRegion(dividerRegion, rotation)) .overlaps(getPrimaryRegion(dividerRegion, rotation))
} }
} }
@@ -89,7 +89,7 @@ fun FlickerTestParameter.dockedStackPrimaryBoundsIsVisibleAtEnd(
assertLayersEnd { assertLayersEnd {
val dividerRegion = layer(DOCKED_STACK_DIVIDER_COMPONENT).visibleRegion.region val dividerRegion = layer(DOCKED_STACK_DIVIDER_COMPONENT).visibleRegion.region
visibleRegion(primaryComponent) visibleRegion(primaryComponent)
.coversExactly(getPrimaryRegion(dividerRegion, rotation)) .overlaps(getPrimaryRegion(dividerRegion, rotation))
} }
} }
@@ -100,7 +100,7 @@ fun FlickerTestParameter.appPairsSecondaryBoundsIsVisibleAtEnd(
assertLayersEnd { assertLayersEnd {
val dividerRegion = layer(APP_PAIR_SPLIT_DIVIDER_COMPONENT).visibleRegion.region val dividerRegion = layer(APP_PAIR_SPLIT_DIVIDER_COMPONENT).visibleRegion.region
visibleRegion(secondaryComponent) visibleRegion(secondaryComponent)
.coversExactly(getSecondaryRegion(dividerRegion, rotation)) .overlaps(getSecondaryRegion(dividerRegion, rotation))
} }
} }
@@ -111,7 +111,7 @@ fun FlickerTestParameter.dockedStackSecondaryBoundsIsVisibleAtEnd(
assertLayersEnd { assertLayersEnd {
val dividerRegion = layer(DOCKED_STACK_DIVIDER_COMPONENT).visibleRegion.region val dividerRegion = layer(DOCKED_STACK_DIVIDER_COMPONENT).visibleRegion.region
visibleRegion(secondaryComponent) visibleRegion(secondaryComponent)
.coversExactly(getSecondaryRegion(dividerRegion, rotation)) .overlaps(getSecondaryRegion(dividerRegion, rotation))
} }
} }

View File

@@ -25,12 +25,6 @@
<item name="android:layout_gravity">center_horizontal</item> <item name="android:layout_gravity">center_horizontal</item>
</style> </style>
<style name="DockedDividerHandle">
<item name="android:layout_gravity">center_vertical</item>
<item name="android:layout_width">48dp</item>
<item name="android:layout_height">96dp</item>
</style>
<style name="DockedDividerMinimizedShadow"> <style name="DockedDividerMinimizedShadow">
<item name="android:layout_width">8dp</item> <item name="android:layout_width">8dp</item>
<item name="android:layout_height">match_parent</item> <item name="android:layout_height">match_parent</item>