Fix notification launch animation for groups
This fixes a problem where the z ordering is not correct during the launch animation of a child notification inside a notification group. The launched notification was rendered below other notifications in some cases. Test: Manual, i.e. posting various types of notifications and analyzing the animations in screenrecordings. Bug: 246932690 Change-Id: I658b4b3db75da5199b7b7cb416b7d7fabbc75520
This commit is contained in:
@@ -976,10 +976,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
|
||||
/**
|
||||
* Updates states of all children.
|
||||
*/
|
||||
public void updateChildrenStates(AmbientState ambientState) {
|
||||
public void updateChildrenStates() {
|
||||
if (mIsSummaryWithChildren) {
|
||||
ExpandableViewState parentState = getViewState();
|
||||
mChildrenContainer.updateState(parentState, ambientState);
|
||||
mChildrenContainer.updateState(parentState);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -616,9 +616,8 @@ public class NotificationChildrenContainer extends ViewGroup
|
||||
* Update the state of all its children based on a linear layout algorithm.
|
||||
*
|
||||
* @param parentState the state of the parent
|
||||
* @param ambientState the ambient state containing ambient information
|
||||
*/
|
||||
public void updateState(ExpandableViewState parentState, AmbientState ambientState) {
|
||||
public void updateState(ExpandableViewState parentState) {
|
||||
int childCount = mAttachedChildren.size();
|
||||
int yPosition = mNotificationHeaderMargin + mCurrentHeaderTranslation;
|
||||
boolean firstChild = true;
|
||||
@@ -661,9 +660,17 @@ public class NotificationChildrenContainer extends ViewGroup
|
||||
childState.height = intrinsicHeight;
|
||||
childState.setYTranslation(yPosition + launchTransitionCompensation);
|
||||
childState.hidden = false;
|
||||
// When the group is expanded, the children cast the shadows rather than the parent
|
||||
// so use the parent's elevation here.
|
||||
if (childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications) {
|
||||
if (child.isExpandAnimationRunning() || mContainingNotification.hasExpandingChild()) {
|
||||
// Not modifying translationZ during launch animation. The translationZ of the
|
||||
// expanding child is handled inside ExpandableNotificationRow and the translationZ
|
||||
// of the other children inside the group should remain unchanged. In particular,
|
||||
// they should not take over the translationZ of the parent, since the parent has
|
||||
// a positive translationZ set only for the expanding child to be drawn above other
|
||||
// notifications.
|
||||
childState.setZTranslation(child.getTranslationZ());
|
||||
} else if (childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications) {
|
||||
// When the group is expanded, the children cast the shadows rather than the parent
|
||||
// so use the parent's elevation here.
|
||||
childState.setZTranslation(parentState.getZTranslation());
|
||||
} else {
|
||||
childState.setZTranslation(0);
|
||||
@@ -716,9 +723,15 @@ public class NotificationChildrenContainer extends ViewGroup
|
||||
mHeaderViewState = new ViewState();
|
||||
}
|
||||
mHeaderViewState.initFrom(mNotificationHeader);
|
||||
mHeaderViewState.setZTranslation(childrenExpandedAndNotAnimating
|
||||
? parentState.getZTranslation()
|
||||
: 0);
|
||||
|
||||
if (mContainingNotification.hasExpandingChild()) {
|
||||
// Not modifying translationZ during expand animation.
|
||||
mHeaderViewState.setZTranslation(mNotificationHeader.getTranslationZ());
|
||||
} else if (childrenExpandedAndNotAnimating) {
|
||||
mHeaderViewState.setZTranslation(parentState.getZTranslation());
|
||||
} else {
|
||||
mHeaderViewState.setZTranslation(0);
|
||||
}
|
||||
mHeaderViewState.setYTranslation(mCurrentHeaderTranslation);
|
||||
mHeaderViewState.setAlpha(mHeaderVisibleAmount);
|
||||
// The hiding is done automatically by the alpha, otherwise we'll pick it up again
|
||||
|
||||
@@ -128,7 +128,7 @@ public class StackScrollAlgorithm {
|
||||
updateSpeedBumpState(algorithmState, speedBumpIndex);
|
||||
updateShelfState(algorithmState, ambientState);
|
||||
updateAlphaState(algorithmState, ambientState);
|
||||
getNotificationChildrenStates(algorithmState, ambientState);
|
||||
getNotificationChildrenStates(algorithmState);
|
||||
}
|
||||
|
||||
private void updateAlphaState(StackScrollAlgorithmState algorithmState,
|
||||
@@ -231,14 +231,13 @@ public class StackScrollAlgorithm {
|
||||
}
|
||||
}
|
||||
|
||||
private void getNotificationChildrenStates(StackScrollAlgorithmState algorithmState,
|
||||
AmbientState ambientState) {
|
||||
private void getNotificationChildrenStates(StackScrollAlgorithmState algorithmState) {
|
||||
int childCount = algorithmState.visibleChildren.size();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
ExpandableView v = algorithmState.visibleChildren.get(i);
|
||||
if (v instanceof ExpandableNotificationRow) {
|
||||
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
|
||||
row.updateChildrenStates(ambientState);
|
||||
row.updateChildrenStates();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user