Merge "Fix divider rounded corner on specific devices" into sc-v2-dev
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user