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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user