diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 603ddd8f11c5d..8ad93a1d9d90f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -1856,7 +1856,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView float interpolation = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(params.getProgress()); int startClipTopAmount = params.getStartClipTopAmount(); if (mNotificationParent != null) { - top -= mNotificationParent.getTranslationY(); + float parentY = mNotificationParent.getTranslationY(); + top -= parentY; mNotificationParent.setTranslationZ(translationZ); int parentStartClipTopAmount = params.getParentStartClipTopAmount(); if (startClipTopAmount != 0) { @@ -1866,8 +1867,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mNotificationParent.setClipTopAmount(clipTopAmount); } mNotificationParent.setExtraWidthForClipping(extraWidthForClipping); - mNotificationParent.setMinimumHeightForClipping(params.getHeight() - + mNotificationParent.getActualHeight()); + float clipBottom = Math.max(params.getBottom(), + parentY + mNotificationParent.getActualHeight() + - mNotificationParent.getClipBottomAmount()); + float clipTop = Math.min(params.getTop(), parentY); + int minimumHeightForClipping = (int) (clipBottom - clipTop); + mNotificationParent.setMinimumHeightForClipping(minimumHeightForClipping); } else if (startClipTopAmount != 0) { int clipTopAmount = (int) MathUtils.lerp(startClipTopAmount, 0, interpolation); setClipTopAmount(clipTopAmount); @@ -1922,6 +1927,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private void setChildIsExpanding(boolean isExpanding) { mChildIsExpanding = isExpanding; + updateClipping(); + invalidate(); } @Override @@ -1931,7 +1938,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override protected boolean shouldClipToActualHeight() { - return super.shouldClipToActualHeight() && !mExpandAnimationRunning && !mChildIsExpanding; + return super.shouldClipToActualHeight() && !mExpandAnimationRunning; } @Override @@ -2827,7 +2834,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return true; } } else if (child == mChildrenContainer) { - if (!mChildIsExpanding && (isClippingNeeded() || !hasNoRounding())) { + if (isClippingNeeded() || !hasNoRounding()) { return true; } } else if (child instanceof NotificationGuts) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java index edfa61b4ddc2e..caa51ba2ff83d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java @@ -78,8 +78,6 @@ public abstract class ExpandableOutlineView extends ExpandableView { protected boolean mShouldTranslateContents; private boolean mTopAmountRounded; private float mDistanceToTopRoundness = -1; - private float mExtraWidthForClipping; - private int mMinimumHeightForClipping = 0; private final ViewOutlineProvider mProvider = new ViewOutlineProvider() { @Override @@ -120,11 +118,13 @@ public abstract class ExpandableOutlineView extends ExpandableView { if (!mCustomOutline) { int translation = mShouldTranslateContents && !ignoreTranslation ? (int) getTranslation() : 0; - left = Math.max(translation, 0); + int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f); + left = Math.max(translation, 0) - halfExtraWidth; top = mClipTopAmount + mBackgroundTop; - right = getWidth() + Math.min(translation, 0); + right = getWidth() + halfExtraWidth + Math.min(translation, 0); bottom = Math.max(getActualHeight(), top); - int intersectBottom = Math.max(getActualHeight() - mClipBottomAmount, top); + int intersectBottom = Math.max(mMinimumHeightForClipping, + Math.max(getActualHeight() - mClipBottomAmount, top)); if (bottom != intersectBottom) { if (clipRoundedToBottom) { bottom = intersectBottom; @@ -237,12 +237,16 @@ public abstract class ExpandableOutlineView extends ExpandableView { return result; } + @Override public void setExtraWidthForClipping(float extraWidthForClipping) { - mExtraWidthForClipping = extraWidthForClipping; + super.setExtraWidthForClipping(extraWidthForClipping); + invalidate(); } + @Override public void setMinimumHeightForClipping(int minimumHeightForClipping) { - mMinimumHeightForClipping = minimumHeightForClipping; + super.setMinimumHeightForClipping(minimumHeightForClipping); + invalidate(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index ae8d844504049..3cd5c6efdea1b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -41,6 +41,8 @@ public abstract class ExpandableView extends FrameLayout { private int mActualHeight; protected int mClipTopAmount; protected int mClipBottomAmount; + protected int mMinimumHeightForClipping = 0; + protected float mExtraWidthForClipping = 0; private boolean mDark; private ArrayList mMatchParentViews = new ArrayList(); private static Rect mClipRect = new Rect(); @@ -390,14 +392,26 @@ public abstract class ExpandableView extends FrameLayout { protected void updateClipping() { if (mClipToActualHeight && shouldClipToActualHeight()) { int top = getClipTopAmount(); - mClipRect.set(0, top, getWidth(), Math.max(getActualHeight() + getExtraBottomPadding() - - mClipBottomAmount, top)); + int bottom = Math.max(Math.max(getActualHeight() + getExtraBottomPadding() + - mClipBottomAmount, top), mMinimumHeightForClipping); + int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f); + mClipRect.set(-halfExtraWidth, top, getWidth() + halfExtraWidth, bottom); setClipBounds(mClipRect); } else { setClipBounds(null); } } + public void setMinimumHeightForClipping(int minimumHeightForClipping) { + mMinimumHeightForClipping = minimumHeightForClipping; + updateClipping(); + } + + public void setExtraWidthForClipping(float extraWidthForClipping) { + mExtraWidthForClipping = extraWidthForClipping; + updateClipping(); + } + public float getHeaderVisibleAmount() { return 1.0f; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java index 469c3c2c60b17..87841a5a413f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java @@ -156,10 +156,17 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. } // Check if the notification is displaying the menu, if so slide notification back - if (row.getProvider() != null && row.getProvider().isMenuVisible()) { + if (isMenuVisible(row)) { row.animateTranslateNotification(0); return; - } + } else if (row.isChildInGroup() && isMenuVisible(row.getNotificationParent())) { + row.getNotificationParent().animateTranslateNotification(0); + return; + } else if (row.isSummaryWithChildren() && row.areChildrenExpanded()) { + // We never want to open the app directly if the user clicks in between + // the notifications. + return; + } // Mark notification for one frame. row.setJustClicked(true); @@ -168,6 +175,10 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater. mCallback.onNotificationClicked(sbn, row); } + private boolean isMenuVisible(ExpandableNotificationRow row) { + return row.getProvider() != null && row.getProvider().isMenuVisible(); + } + public void register(ExpandableNotificationRow row, StatusBarNotification sbn) { Notification notification = sbn.getNotification(); if (notification.contentIntent != null || notification.fullScreenIntent != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index a68d75a54f7b1..93646ab4825b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -278,6 +278,10 @@ public class ActivityLaunchAnimator { return top; } + public int getBottom() { + return bottom; + } + public int getWidth() { return right - left; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index 2dd3d4e131db6..d9e1150035a30 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -869,6 +869,7 @@ public class NotificationChildrenContainer extends ViewGroup { ExpandableNotificationRow child = mChildren.get(childIdx); child.setChildrenExpanded(childrenExpanded, false); } + updateHeaderTouchability(); } public void setContainingNotification(ExpandableNotificationRow parent) { @@ -1209,6 +1210,13 @@ public class NotificationChildrenContainer extends ViewGroup { ExpandableNotificationRow child = mChildren.get(i); child.setUserLocked(userLocked && !showingAsLowPriority()); } + updateHeaderTouchability(); + } + + private void updateHeaderTouchability() { + if (mNotificationHeader != null) { + mNotificationHeader.setAcceptAllTouches(mChildrenExpanded || mUserLocked); + } } public void onNotificationUpdated() {