From f07d06212b08939809aa4128f153bd5179f81fc7 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 21 Mar 2016 19:52:52 -0700 Subject: [PATCH] Fixed the group expand motion to better reflect the overflow The overflow now comes in only after the other notifications have fully transformed. Bug: 24866646 Change-Id: Ia950205669916a637c44ea7d41bfc06e750ea987 --- .../statusbar/ExpandableNotificationRow.java | 8 +- .../stack/NotificationChildrenContainer.java | 76 +++++++++++-------- 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 599ffef9f4ecd..2446535ae73dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -605,6 +605,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { return mPrivateLayout.getSingleLineView(); } + public boolean isOnKeyguard() { + return mOnKeyguard; + } + public interface ExpansionLogger { public void logNotificationExpansion(String key, boolean userAction, boolean expanded); } @@ -1289,7 +1293,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override public int getMinExpandHeight() { if (mIsSummaryWithChildren && !mShowingPublic) { - return mChildrenContainer.getMinExpandHeight(mOnKeyguard); + return mChildrenContainer.getMinExpandHeight(); } return getMinHeight(); } @@ -1376,7 +1380,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (isGroupExpanded()) { return 1.0f; } else if (isUserLocked()) { - return mChildrenContainer.getChildExpandFraction(); + return mChildrenContainer.getGroupExpandFraction(); } } return 0.0f; 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 5e1adb276d1e6..dc567fc201135 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -303,7 +303,7 @@ public class NotificationChildrenContainer extends ViewGroup { boolean firstChild = true; float expandFactor = 0; if (mUserLocked) { - expandFactor = getChildExpandFraction(); + expandFactor = getGroupExpandFraction(); } for (int i = 0; i < childCount; i++) { if (visibleChildren >= maxAllowedVisibleChildren) { @@ -353,12 +353,12 @@ public class NotificationChildrenContainer extends ViewGroup { int yPosition = mNotificationHeaderHeight; boolean firstChild = true; int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(); - boolean hasOverflow = !mChildrenExpanded && childCount > maxAllowedVisibleChildren - && maxAllowedVisibleChildren != NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED; int lastVisibleIndex = maxAllowedVisibleChildren - 1; + int firstOverflowIndex = lastVisibleIndex + 1; float expandFactor = 0; if (mUserLocked) { - expandFactor = getChildExpandFraction(); + expandFactor = getGroupExpandFraction(); + firstOverflowIndex = getMaxAllowedVisibleChildren(true /* likeCollapsed */); } for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); @@ -391,8 +391,13 @@ public class NotificationChildrenContainer extends ViewGroup { childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; childState.topOverLap = 0; - boolean visible = i <= lastVisibleIndex; - childState.alpha = visible ? 1 : 0; + childState.alpha = 0; + if (i < firstOverflowIndex) { + childState.alpha = 1; + } else if (expandFactor == 1.0f && i <= lastVisibleIndex) { + childState.alpha = (mActualHeight - childState.yTranslation) / childState.height; + childState.alpha = Math.max(0.0f, Math.min(1.0f, childState.alpha)); + } childState.location = parentState.location; yPosition += intrinsicHeight; } @@ -429,7 +434,8 @@ public class NotificationChildrenContainer extends ViewGroup { if (!likeCollapsed && (mChildrenExpanded || mNotificationParent.isUserLocked())) { return NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED; } - if (mNotificationParent.isExpanded() || mNotificationParent.isHeadsUp()) { + if (!mNotificationParent.isOnKeyguard() + && (mNotificationParent.isExpanded() || mNotificationParent.isHeadsUp())) { return NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED; } return NUMBER_OF_CHILDREN_WHEN_COLLAPSED; @@ -440,7 +446,7 @@ public class NotificationChildrenContainer extends ViewGroup { ViewState tmpState = new ViewState(); float expandFraction = 0.0f; if (mUserLocked) { - expandFraction = getChildExpandFraction(); + expandFraction = getGroupExpandFraction(); } for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); @@ -453,7 +459,8 @@ public class NotificationChildrenContainer extends ViewGroup { tmpState.yTranslation = viewState.yTranslation - mDividerHeight; float alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0; if (mUserLocked && viewState.alpha != 0) { - alpha = NotificationUtils.interpolate(0, 0.5f, expandFraction); + alpha = NotificationUtils.interpolate(0, 0.5f, + Math.min(viewState.alpha, expandFraction)); } tmpState.alpha = alpha; state.applyViewState(divider, tmpState); @@ -481,7 +488,7 @@ public class NotificationChildrenContainer extends ViewGroup { long baseDelay, long duration) { int childCount = mChildren.size(); ViewState tmpState = new ViewState(); - float expandFraction = getChildExpandFraction(); + float expandFraction = getGroupExpandFraction(); for (int i = childCount - 1; i >= 0; i--) { ExpandableNotificationRow child = mChildren.get(i); StackViewState viewState = state.getViewStateForView(child); @@ -493,7 +500,8 @@ public class NotificationChildrenContainer extends ViewGroup { tmpState.yTranslation = viewState.yTranslation - mDividerHeight; float alpha = mChildrenExpanded && viewState.alpha != 0 ? 0.5f : 0; if (mUserLocked && viewState.alpha != 0) { - alpha = NotificationUtils.interpolate(0, 0.5f, expandFraction); + alpha = NotificationUtils.interpolate(0, 0.5f, + Math.min(viewState.alpha, expandFraction)); } tmpState.alpha = alpha; stateAnimator.startViewAnimations(divider, tmpState, baseDelay, duration); @@ -563,44 +571,49 @@ public class NotificationChildrenContainer extends ViewGroup { return; } mActualHeight = actualHeight; - float fraction = getChildExpandFraction(); + float fraction = getGroupExpandFraction(); + int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */); int childCount = mChildren.size(); for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); float childHeight = child.isExpanded(true /* allowOnKeyguard */) ? child.getMaxExpandHeight() : child.getShowingLayout().getMinHeight(true /* likeGroupExpanded */); - float singleLineHeight = child.getShowingLayout().getMinHeight( - false /* likeGroupExpanded */); - child.setActualHeight((int) NotificationUtils.interpolate(singleLineHeight, childHeight, - fraction), false); + if (i < maxAllowedVisibleChildren) { + float singleLineHeight = child.getShowingLayout().getMinHeight( + false /* likeGroupExpanded */); + child.setActualHeight((int) NotificationUtils.interpolate(singleLineHeight, + childHeight, fraction), false); + } else { + child.setActualHeight((int) childHeight, false); + } } } - public float getChildExpandFraction() { - int allChildrenVisibleHeight = getChildrenExpandStartHeight(); - int maxContentHeight = getMaxContentHeight(); - float factor = (mActualHeight - allChildrenVisibleHeight) - / (float) (maxContentHeight - allChildrenVisibleHeight); + public float getGroupExpandFraction() { + int visibleChildrenExpandedHeight = getVisibleChildrenExpandHeight(); + int minExpandHeight = getMinExpandHeight(); + float factor = (mActualHeight - minExpandHeight) + / (float) (visibleChildrenExpandedHeight - minExpandHeight); return Math.max(0.0f, Math.min(1.0f, factor)); } - private int getChildrenExpandStartHeight() { - int intrinsicHeight = mNotificationHeaderHeight; + private int getVisibleChildrenExpandHeight() { + int intrinsicHeight = mNotificationHeaderHeight + mNotificatonTopPadding + mDividerHeight; int visibleChildren = 0; int childCount = mChildren.size(); + int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */); for (int i = 0; i < childCount; i++) { - if (visibleChildren >= NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED) { + if (visibleChildren >= maxAllowedVisibleChildren) { break; } ExpandableNotificationRow child = mChildren.get(i); - intrinsicHeight += child.getMinHeight(); + float childHeight = child.isExpanded(true /* allowOnKeyguard */) + ? child.getMaxExpandHeight() + : child.getShowingLayout().getMinHeight(true /* likeGroupExpanded */); + intrinsicHeight += childHeight; visibleChildren++; } - if (visibleChildren > 0) { - intrinsicHeight += (visibleChildren - 1) * mChildPadding; - } - intrinsicHeight += mCollapsedBottompadding; return intrinsicHeight; } @@ -608,9 +621,8 @@ public class NotificationChildrenContainer extends ViewGroup { return getIntrinsicHeight(NUMBER_OF_CHILDREN_WHEN_COLLAPSED); } - public int getMinExpandHeight(boolean onKeyguard) { - int maxAllowedVisibleChildren = onKeyguard ? NUMBER_OF_CHILDREN_WHEN_COLLAPSED - : getMaxAllowedVisibleChildren(true /* forceCollapsed */); + public int getMinExpandHeight() { + int maxAllowedVisibleChildren = getMaxAllowedVisibleChildren(true /* forceCollapsed */); int minExpandHeight = mNotificationHeaderHeight; int visibleChildren = 0; boolean firstChild = true;