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
This commit is contained in:
Selim Cinek
2017-02-13 16:20:17 -08:00
parent ef8c225704
commit 875ba9bd8e
7 changed files with 118 additions and 15 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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);