Loading core/java/android/app/Notification.java +11 −1 Original line number Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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; } Loading core/java/com/android/internal/util/NotificationColorUtil.java +4 −1 Original line number Diff line number Diff line Loading @@ -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); Loading packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +10 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } } Loading packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +76 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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 */); } Loading Loading @@ -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) { Loading @@ -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 Loading Loading
core/java/android/app/Notification.java +11 −1 Original line number Diff line number Diff line Loading @@ -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); } } Loading Loading @@ -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; } Loading
core/java/com/android/internal/util/NotificationColorUtil.java +4 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +10 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +76 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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(); Loading Loading @@ -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 */); } Loading Loading @@ -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) { Loading @@ -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 Loading