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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user