Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 875ba9bd authored by Selim Cinek's avatar Selim Cinek
Browse files

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
parent ef8c2257
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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;
        }
+4 −1
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -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() {
+10 −1
Original line number Diff line number Diff line
@@ -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;
        }
    }

+76 −5
Original line number Diff line number Diff line
@@ -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
Loading