From 75524417ac507597b19abb2a91389044bec682ad Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Tue, 21 Jun 2016 11:56:57 -0700 Subject: [PATCH] Fix stale transformations In messaging style we sometimes transform an individual message and sometimes we don't. This causes the ViewTransformationHelper to sometimes add the container and sometimes the individual messages, which prevented the right view from getting reset. To fix this, we now reset all views that were once managed by ViewTransformationHelper but no longer are. Change-Id: I1512434fde5b4444657db1c69f9a7bd1ba96fe5f Fixes: 29509682 --- .../systemui/statusbar/ViewTransformationHelper.java | 16 +++++++++++++++- .../statusbar/notification/HeaderTransformState.java | 11 +++++++---- .../notification/NotificationHeaderViewWrapper.java | 16 ++++++++++++++-- .../systemui/statusbar/notification/TransformState.java | 11 ++++++++--- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java index f75f357421f8..1ff2b1328464 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java @@ -20,6 +20,7 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.util.ArrayMap; +import android.util.ArraySet; import android.view.View; import android.view.ViewGroup; @@ -194,7 +195,7 @@ public class ViewTransformationHelper implements TransformableView { for (Integer viewType : mTransformedViews.keySet()) { TransformState ownState = getCurrentState(viewType); if (ownState != null) { - ownState.setVisible(visible); + ownState.setVisible(visible, false /* force */); ownState.recycle(); } } @@ -252,6 +253,19 @@ public class ViewTransformationHelper implements TransformableView { } } + public void resetTransformedView(View view) { + TransformState state = TransformState.createFrom(view); + state.setVisible(true /* visible */, true /* force */); + state.recycle(); + } + + /** + * @return a set of all views are being transformed. + */ + public ArraySet getAllTransformingViews() { + return new ArraySet<>(mTransformedViews.values()); + } + public static abstract class CustomTransformation { /** * Transform a state to the given view diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java index 8463e069abc1..9501f907e575 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/HeaderTransformState.java @@ -123,8 +123,9 @@ public class HeaderTransformState extends TransformState { } } - public void setVisible(boolean visible) { - super.setVisible(visible); + @Override + public void setVisible(boolean visible, boolean force) { + super.setVisible(visible, force); if (!(mTransformedView instanceof NotificationHeaderView)) { return; } @@ -132,11 +133,13 @@ public class HeaderTransformState extends TransformState { int childCount = header.getChildCount(); for (int i = 0; i < childCount; i++) { View headerChild = header.getChildAt(i); - if (headerChild.getVisibility() == View.GONE) { + if (!force && headerChild.getVisibility() == View.GONE) { continue; } headerChild.animate().cancel(); - headerChild.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + if (headerChild.getVisibility() != View.GONE) { + headerChild.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + } if (headerChild == mExpandButton) { headerChild.setAlpha(visible ? 1.0f : 0.0f); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java index 1bfbaa228532..7794d5ba9a0f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java @@ -22,18 +22,17 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Color; import android.graphics.ColorFilter; -import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.service.notification.StatusBarNotification; +import android.util.ArraySet; import android.view.NotificationHeaderView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.ViewInvertHelper; import com.android.systemui.statusbar.ExpandableNotificationRow; @@ -92,12 +91,25 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { @Override public void notifyContentUpdated(StatusBarNotification notification) { super.notifyContentUpdated(notification); + + ArraySet previousViews = mTransformationHelper.getAllTransformingViews(); + // Reinspect the notification. resolveHeaderViews(); updateInvertHelper(); updateTransformedTypes(); addRemainingTransformTypes(); updateCropToPaddingForImageViews(); + + // We need to reset all views that are no longer transforming in case a view was previously + // transformed, but now we decided to transform its container instead. + ArraySet currentViews = mTransformationHelper.getAllTransformingViews(); + for (int i = 0; i < previousViews.size(); i++) { + View view = previousViews.valueAt(i); + if (!currentViews.contains(view)) { + mTransformationHelper.resetTransformedView(view); + } + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index 7d3da1b67422..f0f5c8db1821 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -301,6 +301,9 @@ public class TransformState { } public static void setClippingDeactivated(final View transformedView, boolean deactivated) { + if (!(transformedView.getParent() instanceof ViewGroup)) { + return; + } ViewGroup view = (ViewGroup) transformedView.getParent(); while (true) { ArraySet clipSet = (ArraySet) view.getTag(CLIP_CLIPPING_SET); @@ -456,12 +459,14 @@ public class TransformState { mTransformationEndY = UNDEFINED; } - public void setVisible(boolean visible) { - if (mTransformedView.getVisibility() == View.GONE) { + public void setVisible(boolean visible, boolean force) { + if (!force && mTransformedView.getVisibility() == View.GONE) { return; } + if (mTransformedView.getVisibility() != View.GONE) { + mTransformedView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + } mTransformedView.animate().cancel(); - mTransformedView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); mTransformedView.setAlpha(visible ? 1.0f : 0.0f); resetTransformedView(); } -- 2.11.0