Fixed the remove animations for notification children

Previously the children container wasn't fading out.
In addition was the child added to the wrong overlay leading
to completely wrong animations for the children.

Change-Id: I1ae395dc02cecb8629e509dfb55870f9c79d7854
Fixes: 27719756
This commit is contained in:
Selim Cinek
2016-05-11 21:23:16 -04:00
parent f91de68601
commit a5703187a9
4 changed files with 37 additions and 15 deletions

View File

@@ -329,7 +329,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
if (mChildrenContainer != null) {
mChildrenContainer.removeNotification(row);
}
mHeaderUtil.restoreNotificationHeader(row);
if (!row.isRemoved()) {
mHeaderUtil.restoreNotificationHeader(row);
}
onChildrenCountChanged();
row.setIsChildInGroup(false, null);
}
@@ -644,7 +646,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
continue;
}
mChildrenContainer.removeNotification(row);
mHeaderUtil.restoreNotificationHeader(row);
if (!row.isRemoved()) {
mHeaderUtil.restoreNotificationHeader(row);
}
row.setIsChildInGroup(false, null);
}
onChildrenCountChanged();
@@ -1330,6 +1334,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
@Override
protected View getContentView() {
if (mIsSummaryWithChildren) {
return mChildrenContainer;
}
return getShowingLayout();
}

View File

@@ -1485,6 +1485,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key));
return;
}
Entry entry = mNotificationData.get(key);
if (entry != null && entry.row != null) {
entry.row.setRemoved(true);
}
// Let's remove the children if this was a summary
handleGroupSummaryRemoved(key, ranking);
StatusBarNotification old = removeNotificationViews(key, ranking);
@@ -1524,12 +1528,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// always cancelled. We only remove them if they were dismissed by the user.
return;
}
entry.row.setRemoved(true);
List<ExpandableNotificationRow> notificationChildren =
entry.row.getNotificationChildren();
ArrayList<ExpandableNotificationRow> toRemove = new ArrayList<>(notificationChildren);
for (int i = 0; i < toRemove.size(); i++) {
toRemove.get(i).setKeepInParent(true);
// we need to set this state earlier as otherwise we might generate some weird
// animations
toRemove.get(i).setRemoved(true);
}
for (int i = 0; i < toRemove.size(); i++) {

View File

@@ -2138,7 +2138,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
}
private void onViewRemovedInternal(View child, ViewGroup transientContainer) {
private void onViewRemovedInternal(View child, ViewGroup container) {
if (mChangePositionInProgress) {
// This is only a position change, don't do anything special
return;
@@ -2150,10 +2150,10 @@ public class NotificationStackScrollLayout extends ViewGroup
boolean animationGenerated = generateRemoveAnimation(child);
if (animationGenerated) {
if (!mSwipedOutViews.contains(child)) {
getOverlay().add(child);
container.getOverlay().add(child);
} else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) {
transientContainer.addTransientView(child, 0);
expandableView.setTransientContainer(transientContainer);
container.addTransientView(child, 0);
expandableView.setTransientContainer(container);
}
} else {
mSwipedOutViews.remove(child);
@@ -2822,22 +2822,24 @@ public class NotificationStackScrollLayout extends ViewGroup
mPhoneStatusBar.resetUserExpandedStates();
// lets make sure nothing is in the overlay / transient anymore
clearTransientViews(this);
clearTemporaryViews(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
clearTransientViews(row.getChildrenContainer());
clearTemporaryViews(row.getChildrenContainer());
}
}
getOverlay().clear();
}
}
private void clearTransientViews(ViewGroup viewGroup) {
private void clearTemporaryViews(ViewGroup viewGroup) {
while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
viewGroup.removeTransientView(viewGroup.getTransientView(0));
}
if (viewGroup != null) {
viewGroup.getOverlay().clear();
}
}
public void onPanelTrackingStarted() {
@@ -2957,7 +2959,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private void clearViewOverlays() {
for (View view : mClearOverlayViewsWhenFinished) {
getOverlay().remove(view);
StackStateAnimator.removeFromOverlay(view);
}
}

View File

@@ -22,6 +22,7 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import com.android.systemui.Interpolators;
@@ -797,7 +798,7 @@ public class StackStateAnimator {
private void onAnimationFinished() {
mHostLayout.onChildAnimationFinished();
for (View v : mChildrenToClearFromOverlay) {
mHostLayout.getOverlay().remove(v);
removeFromOverlay(v);
}
mChildrenToClearFromOverlay.clear();
}
@@ -829,7 +830,7 @@ public class StackStateAnimator {
} else if (event.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE) {
if (changingView.getVisibility() == View.GONE) {
mHostLayout.getOverlay().remove(changingView);
removeFromOverlay(changingView);
continue;
}
@@ -854,7 +855,7 @@ public class StackStateAnimator {
@Override
public void run() {
// remove the temporary overlay
mHostLayout.getOverlay().remove(changingView);
removeFromOverlay(changingView);
}
});
} else if (event.animationType ==
@@ -909,6 +910,13 @@ public class StackStateAnimator {
}
}
public static void removeFromOverlay(View changingView) {
ViewGroup parent = (ViewGroup) changingView.getParent();
if (parent != null) {
parent.removeView(changingView);
}
}
public void animateOverScrollToAmount(float targetAmount, final boolean onTop,
final boolean isRubberbanded) {
final float startOverScrollAmount = mHostLayout.getCurrentOverScrollAmount(onTop);