OSDN Git Service

Fixed the inline launch animation for notification groups
authorSelim Cinek <cinek@google.com>
Sat, 1 Dec 2018 02:06:57 +0000 (18:06 -0800)
committerSelim Cinek <cinek@google.com>
Thu, 6 Dec 2018 02:56:38 +0000 (02:56 +0000)
When launching a child of a group there would be strange artifacts
from the clipping. These are now fixed. Also made sure that
the notification can't be launched if the parent is translated.

Test: launch child in a group, observe normal animation
Change-Id: Iee8e4b49462e140d3eaffe5b2504caa1b67d04e2
Merged-In: Iee8e4b49462e140d3eaffe5b2504caa1b67d04e2
Fixes: 110093221

packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java

index 603ddd8..8ad93a1 100644 (file)
@@ -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) {
index edfa61b..caa51ba 100644 (file)
@@ -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
index ae8d844..3cd5c6e 100644 (file)
@@ -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<View> mMatchParentViews = new ArrayList<View>();
     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;
     }
index 469c3c2..87841a5 100644 (file)
@@ -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) {
index a68d75a..93646ab 100644 (file)
@@ -278,6 +278,10 @@ public class ActivityLaunchAnimator {
             return top;
         }
 
+        public int getBottom() {
+            return bottom;
+        }
+
         public int getWidth() {
             return right - left;
         }
index 2dd3d4e..d9e1150 100644 (file)
@@ -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() {