Merge "Swipe notification to edge of screen" into sc-dev

This commit is contained in:
Lyn Han
2021-03-23 17:44:02 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 10 deletions

View File

@@ -25,6 +25,7 @@ import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider;
import com.android.systemui.R; import com.android.systemui.R;
@@ -101,6 +102,28 @@ public abstract class ExpandableOutlineView extends ExpandableView {
} }
}; };
/**
* Get the relative start padding of a view relative to this view. This recursively walks up the
* hierarchy and does the corresponding measuring.
*
* @param view the view to get the padding for. The requested view has to be a child of this
* notification.
* @return the start padding
*/
public int getRelativeStartPadding(View view) {
boolean isRtl = isLayoutRtl();
int startPadding = 0;
while (view.getParent() instanceof ViewGroup) {
View parent = (View) view.getParent();
startPadding += isRtl ? parent.getWidth() - view.getRight() : view.getLeft();
view = parent;
if (view == this) {
return startPadding;
}
}
return startPadding;
}
protected Path getClipPath(boolean ignoreTranslation) { protected Path getClipPath(boolean ignoreTranslation) {
int left; int left;
int top; int top;
@@ -109,15 +132,17 @@ public abstract class ExpandableOutlineView extends ExpandableView {
int height; int height;
float topRoundness = mAlwaysRoundBothCorners float topRoundness = mAlwaysRoundBothCorners
? mOutlineRadius : getCurrentBackgroundRadiusTop(); ? mOutlineRadius : getCurrentBackgroundRadiusTop();
if (!mCustomOutline) { if (!mCustomOutline) {
int translation = mShouldTranslateContents && !ignoreTranslation // Extend left/right clip bounds beyond the notification by the
? (int) getTranslation() : 0; // 1) space between the notification and edge of screen
int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f); // 2) corner radius (so we do not see any rounding as the notification goes off screen)
left = Math.max(translation, 0) - halfExtraWidth; left = (int) (-getRelativeStartPadding(this) - mOutlineRadius);
top = mClipTopAmount + mBackgroundTop; right = (int) (((View) getParent()).getWidth() + mOutlineRadius);
right = getWidth() + halfExtraWidth + Math.min(translation, 0);
// If the top is rounded we want the bottom to be at most at the top roundness, in order // If the top is rounded we want the bottom to be at most at the top roundness, in order
// to avoid the shadow changing when scrolling up. // to avoid the shadow changing when scrolling up.
top = mClipTopAmount + mBackgroundTop;
bottom = Math.max(mMinimumHeightForClipping, bottom = Math.max(mMinimumHeightForClipping,
Math.max(getActualHeight() - mClipBottomAmount, (int) (top + topRoundness))); Math.max(getActualHeight() - mClipBottomAmount, (int) (top + topRoundness)));
} else { } else {

View File

@@ -69,6 +69,8 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable {
private float mContentTranslation; private float mContentTranslation;
protected boolean mLastInSection; protected boolean mLastInSection;
protected boolean mFirstInSection; protected boolean mFirstInSection;
private float mOutlineRadius;
private float mParentWidth;
public ExpandableView(Context context, AttributeSet attrs) { public ExpandableView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -79,6 +81,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable {
private void initDimens() { private void initDimens() {
mContentShift = getResources().getDimensionPixelSize( mContentShift = getResources().getDimensionPixelSize(
R.dimen.shelf_transform_content_shift); R.dimen.shelf_transform_content_shift);
mOutlineRadius = getResources().getDimensionPixelSize(R.dimen.notification_corner_radius);
} }
@Override @Override
@@ -150,6 +153,9 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable {
@Override @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom); super.onLayout(changed, left, top, right, bottom);
if (getParent() != null) {
mParentWidth = ((View) getParent()).getWidth();
}
updateClipping(); updateClipping();
} }
@@ -436,11 +442,15 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable {
protected void updateClipping() { protected void updateClipping() {
if (mClipToActualHeight && shouldClipToActualHeight()) { if (mClipToActualHeight && shouldClipToActualHeight()) {
int top = getClipTopAmount(); final int top = getClipTopAmount();
int bottom = Math.max(Math.max(getActualHeight() + getExtraBottomPadding() final int bottom = Math.max(Math.max(getActualHeight() + getExtraBottomPadding()
- mClipBottomAmount, top), mMinimumHeightForClipping); - mClipBottomAmount, top), mMinimumHeightForClipping);
int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f); // Extend left/right clip bounds beyond the notification by the
mClipRect.set(-halfExtraWidth, top, getWidth() + halfExtraWidth, bottom); // 1) space between the notification and edge of screen
// 2) corner radius (so we do not see any rounding as the notification goes off screen)
final int left = (int) (-getRelativeStartPadding(this) - mOutlineRadius);
final int right = (int) (mParentWidth + mOutlineRadius);
mClipRect.set(left, top, right, bottom);
setClipBounds(mClipRect); setClipBounds(mClipRect);
} else { } else {
setClipBounds(null); setClipBounds(null);