[Notif] Disable animations as screen is powering off

When showing an incog notification, it's getting added to the remove
anims, but the screen is turning off and animations are never getting
run (which means the transient view gets added but it doesn't get
removed).

The root cause is notifications clear temporary views in the power on
(due to collapse animations), but don't clear them when unlocking via
fingerprint.

Fixed by clearing remove animation setup (where transient views are
used) when disabling animations. This will stop the transient views from
being held on post-screen off/when animations are disabled.

Test: Visually with logging (tested before & after)
Test: Dumped hierarchy and checked that transient views weren't being mismanaged
Fixes: 77217401
Change-Id: I48835e45fd76c5e74810f5256c14b0c4c2ca3ec4
This commit is contained in:
Rohan Shah
2018-04-05 11:13:50 -07:00
parent 743d42d299
commit 8ee5365f7f

View File

@@ -3023,6 +3023,11 @@ public class NotificationStackScrollLayout extends ViewGroup
public void setAnimationsEnabled(boolean animationsEnabled) {
mAnimationsEnabled = animationsEnabled;
updateNotificationAnimationStates();
if (!animationsEnabled) {
mSwipedOutViews.clear();
mChildrenToRemoveAnimated.clear();
clearTemporaryViewsInGroup(this);
}
}
private void updateNotificationAnimationStates() {
@@ -3090,6 +3095,21 @@ public class NotificationStackScrollLayout extends ViewGroup
@Override
public void changeViewPosition(View child, int newIndex) {
int currentIndex = indexOfChild(child);
if (currentIndex == -1) {
boolean isTransient = false;
if (child instanceof ExpandableNotificationRow
&& ((ExpandableNotificationRow)child).getTransientContainer() != null) {
isTransient = true;
}
Log.e(TAG, "Attempting to re-position "
+ (isTransient ? "transient" : "")
+ " view {"
+ child
+ "}");
return;
}
if (child != null && child.getParent() == this && currentIndex != newIndex) {
mChangePositionInProgress = true;
((ExpandableView)child).setChangingPosition(true);
@@ -3569,17 +3589,17 @@ public class NotificationStackScrollLayout extends ViewGroup
private void clearTemporaryViews() {
// lets make sure nothing is in the overlay / transient anymore
clearTemporaryViews(this);
clearTemporaryViewsInGroup(this);
for (int i = 0; i < getChildCount(); i++) {
ExpandableView child = (ExpandableView) getChildAt(i);
if (child instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
clearTemporaryViews(row.getChildrenContainer());
clearTemporaryViewsInGroup(row.getChildrenContainer());
}
}
}
private void clearTemporaryViews(ViewGroup viewGroup) {
private void clearTemporaryViewsInGroup(ViewGroup viewGroup) {
while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
viewGroup.removeTransientView(viewGroup.getTransientView(0));
}