diff options
| author | 2017-02-13 16:20:17 -0800 | |
|---|---|---|
| committer | 2017-02-14 17:28:15 -0800 | |
| commit | 875ba9bd8ec0fa3d29fe27efcb3a20e53ce85f4f (patch) | |
| tree | 20a0dc65f138c6b78109cc01446b2248b1449a68 | |
| parent | ef8c2257045f73f0576c90c05c715c5f31ef81d8 (diff) | |
Fixed a few coloring issues
The color of the icon was happening in a
non-animated way. We're now animating the
color properly.
This also fixes an issue where the action
bar could be fully black.
Test: add colorized notification, observe animation
Fixes: 35308322
Change-Id: I4fbc1794fc027efb42eee3ee8f06fd9d8c513456
7 files changed, 118 insertions, 15 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 45a46b302178..812daf8da8a9 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3684,7 +3684,8 @@ public class Notification implements Parcelable mContext, backgroundColor); mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor( mContext, backgroundColor); - mActionBarColor = NotificationColorUtil.resolveActionBarColor(backgroundColor); + mActionBarColor = NotificationColorUtil.resolveActionBarColor(mContext, + backgroundColor); } } @@ -4166,12 +4167,21 @@ public class Notification implements Parcelable mN.extras.putCharSequence(EXTRA_SUB_TEXT, newSummary); } } + Boolean colorized = (Boolean) mN.extras.get(EXTRA_COLORIZED); + mN.extras.putBoolean(EXTRA_COLORIZED, false); + RemoteViews header = makeNotificationHeader(); + if (summary != null) { mN.extras.putCharSequence(EXTRA_SUB_TEXT, summary); } else { mN.extras.remove(EXTRA_SUB_TEXT); } + if (colorized != null) { + mN.extras.putBoolean(EXTRA_COLORIZED, colorized); + } else { + mN.extras.remove(EXTRA_COLORIZED); + } mN.color = color; return header; } diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java index 0fe580a23983..26719576c2bb 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -456,7 +456,10 @@ public class NotificationColorUtil { } } - public static int resolveActionBarColor(int backgroundColor) { + public static int resolveActionBarColor(Context context, int backgroundColor) { + if (backgroundColor == Notification.COLOR_DEFAULT) { + return context.getColor(com.android.internal.R.color.notification_action_list); + } boolean useDark = shouldUseDark(backgroundColor); final double[] result = ColorUtilsFromCompat.getTempDouble3Array(); ColorUtilsFromCompat.colorToLAB(backgroundColor, result); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 3bbaf998cc9a..66d095762274 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -22,7 +22,6 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.Nullable; import android.content.Context; -import android.content.res.ColorStateList; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.ColorDrawable; @@ -331,10 +330,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { boolean isPreL = Boolean.TRUE.equals(expandedIcon.getTag(R.id.icon_is_pre_L)); boolean colorize = !isPreL || NotificationUtils.isGrayscale(expandedIcon, NotificationColorUtil.getInstance(mContext)); + int color = StatusBarIconView.NO_COLOR; if (colorize) { - int color = mEntry.getContrastedColor(mContext, mIsLowPriority && !isExpanded()); - expandedIcon.setImageTintList(ColorStateList.valueOf(color)); + color = mEntry.getContrastedColor(mContext, mIsLowPriority && !isExpanded()); } + expandedIcon.setStaticDrawableColor(color); } private void updateLimits() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 2425076a4442..d4ed1dca5781 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -23,6 +23,7 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; +import com.android.internal.widget.CachingIconView; import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.ViewInvertHelper; @@ -414,7 +415,8 @@ public class NotificationShelf extends ActivatableNotificationView { transitionAmount); float shelfIconSize = icon.getHeight() * icon.getIconScale(); float alpha = 1.0f; - if (!row.isShowingIcon()) { + boolean noIcon = !row.isShowingIcon(); + if (noIcon) { // The view currently doesn't have an icon, lets transform it in! alpha = transitionAmount; notificationIconSize = shelfIconSize / 2.0f; @@ -438,6 +440,13 @@ public class NotificationShelf extends ActivatableNotificationView { if (row.isAboveShelf()) { iconState.hidden = true; } + int shelfColor = icon.getStaticDrawableColor(); + if (!noIcon && shelfColor != StatusBarIconView.NO_COLOR) { + int notificationColor = row.getNotificationHeader().getOriginalNotificationColor(); + shelfColor = NotificationUtils.interpolateColors(notificationColor, shelfColor, + iconState.iconAppearAmount); + } + iconState.iconColor = shelfColor; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 6283148c84f8..cfbb0a82e016 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -19,9 +19,11 @@ package com.android.systemui.statusbar; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.app.Notification; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Canvas; @@ -37,7 +39,6 @@ import android.util.FloatProperty; import android.util.Log; import android.util.Property; import android.util.TypedValue; -import android.view.View; import android.view.ViewDebug; import android.view.accessibility.AccessibilityEvent; import android.view.animation.Interpolator; @@ -50,6 +51,9 @@ import com.android.systemui.statusbar.notification.NotificationUtils; import java.text.NumberFormat; public class StatusBarIconView extends AnimatedImageView { + public static final int NO_COLOR = 0; + private final int ANIMATION_DURATION_FAST = 100; + public static final int STATE_ICON = 0; public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; @@ -104,6 +108,17 @@ public class StatusBarIconView extends AnimatedImageView { private ObjectAnimator mDotAnimator; private float mDotAppearAmount; private OnVisibilityChangedListener mOnVisibilityChangedListener; + private int mDrawableColor; + private int mIconColor; + private ValueAnimator mColorAnimator; + private int mCurrentSetColor = NO_COLOR; + private int mAnimationStartColor = NO_COLOR; + private final ValueAnimator.AnimatorUpdateListener mColorUpdater + = animation -> { + int newColor = NotificationUtils.interpolateColors(mAnimationStartColor, mIconColor, + animation.getAnimatedFraction()); + setColorInternal(newColor); + }; public StatusBarIconView(Context context, String slot, Notification notification) { this(context, slot, notification, false); @@ -123,7 +138,7 @@ public class StatusBarIconView extends AnimatedImageView { setScaleType(ScaleType.CENTER); mDensity = context.getResources().getDisplayMetrics().densityDpi; if (mNotification != null) { - setIconTint(getContext().getColor( + setDecorColor(getContext().getColor( com.android.internal.R.color.notification_icon_default_color)); } reloadDimens(); @@ -446,10 +461,66 @@ public class StatusBarIconView extends AnimatedImageView { return c.getString(R.string.accessibility_desc_notification_icon, appName, desc); } - public void setIconTint(int iconTint) { + /** + * Set the color that is used to draw decoration like the overflow dot. This will not be applied + * to the drawable. + */ + public void setDecorColor(int iconTint) { mDotPaint.setColor(iconTint); } + /** + * Set the static color that should be used for the drawable of this icon if it's not + * transitioning this also immediately sets the color. + */ + public void setStaticDrawableColor(int color) { + mDrawableColor = color; + setColorInternal(color); + mIconColor = color; + } + + private void setColorInternal(int color) { + if (color != NO_COLOR) { + setImageTintList(ColorStateList.valueOf(color)); + } else { + setImageTintList(null); + } + mCurrentSetColor = color; + } + + public void setIconColor(int iconColor, boolean animate) { + if (mIconColor != iconColor) { + mIconColor = iconColor; + if (mColorAnimator != null) { + mColorAnimator.cancel(); + } + if (mCurrentSetColor == iconColor) { + return; + } + if (animate && mCurrentSetColor != NO_COLOR) { + mAnimationStartColor = mCurrentSetColor; + mColorAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); + mColorAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mColorAnimator.setDuration(ANIMATION_DURATION_FAST); + mColorAnimator.addUpdateListener(mColorUpdater); + mColorAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mColorAnimator = null; + mAnimationStartColor = NO_COLOR; + } + }); + mColorAnimator.start(); + } else { + setColorInternal(iconColor); + } + } + } + + public int getStaticDrawableColor() { + return mDrawableColor; + } + public void setVisibleState(int state) { setVisibleState(state, true /* animate */, null /* endRunnable */); } @@ -482,7 +553,7 @@ public class StatusBarIconView extends AnimatedImageView { mIconAppearAnimator = ObjectAnimator.ofFloat(this, ICON_APPEAR_AMOUNT, currentAmount, targetAmount); mIconAppearAnimator.setInterpolator(interpolator); - mIconAppearAnimator.setDuration(100); + mIconAppearAnimator.setDuration(ANIMATION_DURATION_FAST); mIconAppearAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -508,7 +579,7 @@ public class StatusBarIconView extends AnimatedImageView { mDotAnimator = ObjectAnimator.ofFloat(this, DOT_APPEAR_AMOUNT, currentAmount, targetAmount); mDotAnimator.setInterpolator(interpolator); - mDotAnimator.setDuration(100); + mDotAnimator.setDuration(ANIMATION_DURATION_FAST); final boolean runRunnable = !runnableAdded; mDotAnimator.addListener(new AnimatorListenerAdapter() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 6d7ab479d74d..707997d5be45 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -1,7 +1,6 @@ package com.android.systemui.statusbar.phone; import android.content.Context; -import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; @@ -226,12 +225,13 @@ public class NotificationIconAreaController implements DarkReceiver { for (int i = 0; i < mNotificationIcons.getChildCount(); i++) { StatusBarIconView v = (StatusBarIconView) mNotificationIcons.getChildAt(i); boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L)); + int color = StatusBarIconView.NO_COLOR; boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil); if (colorize) { - v.setImageTintList(ColorStateList.valueOf( - DarkIconDispatcher.getTint(mTintArea, v, mIconTint))); + color = DarkIconDispatcher.getTint(mTintArea, v, mIconTint); } - v.setIconTint(mIconTint); + v.setStaticDrawableColor(color); + v.setDecorColor(mIconTint); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 571ae2653948..dc5f98c13c6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -446,6 +446,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { public boolean useFullTransitionAmount; public boolean useLinearTransitionAmount; public boolean translateContent; + public int iconColor = StatusBarIconView.NO_COLOR; @Override public void applyToView(View view) { @@ -505,6 +506,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } icon.setVisibleState(visibleState, animationsAllowed); + icon.setIconColor(iconColor, needsCannedAnimation && animationsAllowed); if (animate) { animateTo(icon, animationProperties); } else { @@ -515,6 +517,14 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { needsCannedAnimation = false; } + @Override + public void initFrom(View view) { + super.initFrom(view); + if (view instanceof StatusBarIconView) { + iconColor = ((StatusBarIconView) view).getStaticDrawableColor(); + } + } + protected void onYTranslationAnimationFinished(View view) { if (hidden) { view.setVisibility(INVISIBLE); |