diff options
| author | 2016-06-21 23:25:14 +0000 | |
|---|---|---|
| committer | 2016-06-21 23:25:16 +0000 | |
| commit | ea16efd52c0e37bddc677c216bd5e680e24a2f2e (patch) | |
| tree | edb928d2bb3cd7ed607dff10b8d84eb78be0210d | |
| parent | e4e424d80d87db739866a9a07d8fbe9da5f75eaa (diff) | |
| parent | 75524417ac507597b19abb2a91389044bec682ad (diff) | |
Merge "Fix stale transformations" into nyc-dev
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<View> 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<View> 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<View> 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<View> clipSet = (ArraySet<View>) 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(); } |