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

Commit cc957752 authored by Adrian Roos's avatar Adrian Roos
Browse files

AOD: Use color filter to invert icons for AOD

Fixes an issue where the AOD icons where of different
brightness because they were converted to grayscale and
then inverted. Now we just set the appropriate color filter
instead.

Change-Id: Ic359aaee2e19274670f44c5b7380c636ee26e559
Test: Open AOD, observe that the icons are colored solid white (like the clock) instead of gray.
Fixes: 35850204
parent edfb65bb
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ 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;
@@ -127,12 +126,7 @@ public class NotificationShelf extends ActivatableNotificationView implements
        super.setDark(dark, fade, delay);
        if (mDark == dark) return;
        mDark = dark;
        if (fade) {
            mViewInvertHelper.fade(dark, delay);
        } else {
            mViewInvertHelper.update(dark);
        }
        mShelfIcons.setAmbient(dark);
        mShelfIcons.setDark(dark, fade, delay);
    }

    @Override
+29 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -46,6 +47,7 @@ import android.view.animation.Interpolator;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.NotificationIconDozeHelper;
import com.android.systemui.statusbar.notification.NotificationUtils;

import java.text.NumberFormat;
@@ -99,7 +101,6 @@ public class StatusBarIconView extends AnimatedImageView {
    private int mDensity;
    private float mIconScale = 1.0f;
    private final Paint mDotPaint = new Paint();
    private boolean mDotVisible;
    private float mDotRadius;
    private int mStaticDotRadius;
    private int mVisibleState = STATE_ICON;
@@ -110,6 +111,8 @@ public class StatusBarIconView extends AnimatedImageView {
    private OnVisibilityChangedListener mOnVisibilityChangedListener;
    private int mDrawableColor;
    private int mIconColor;
    private int mDecorColor;
    private float mDarkAmount;
    private ValueAnimator mColorAnimator;
    private int mCurrentSetColor = NO_COLOR;
    private int mAnimationStartColor = NO_COLOR;
@@ -119,6 +122,7 @@ public class StatusBarIconView extends AnimatedImageView {
                animation.getAnimatedFraction());
        setColorInternal(newColor);
    };
    private final NotificationIconDozeHelper mDozer;

    public StatusBarIconView(Context context, String slot, Notification notification) {
        this(context, slot, notification, false);
@@ -127,6 +131,7 @@ public class StatusBarIconView extends AnimatedImageView {
    public StatusBarIconView(Context context, String slot, Notification notification,
            boolean blocked) {
        super(context);
        mDozer = new NotificationIconDozeHelper(context);
        mBlocked = blocked;
        mSlot = slot;
        mNumberPain = new Paint();
@@ -190,6 +195,7 @@ public class StatusBarIconView extends AnimatedImageView {

    public StatusBarIconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mDozer = new NotificationIconDozeHelper(context);
        mBlocked = false;
        mAlwaysScaleIcon = true;
        updateIconScale();
@@ -466,7 +472,19 @@ public class StatusBarIconView extends AnimatedImageView {
     * to the drawable.
     */
    public void setDecorColor(int iconTint) {
        mDotPaint.setColor(iconTint);
        mDecorColor = iconTint;
        updateDecorColor();
    }

    private void updateDecorColor() {
        int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDarkAmount);
        if (mDotPaint.getColor() != color) {
            mDotPaint.setColor(color);

            if (mDotAppearAmount != 0) {
                invalidate();
            }
        }
    }

    /**
@@ -477,6 +495,7 @@ public class StatusBarIconView extends AnimatedImageView {
        mDrawableColor = color;
        setColorInternal(color);
        mIconColor = color;
        mDozer.setColor(color);
    }

    private void setColorInternal(int color) {
@@ -649,6 +668,14 @@ public class StatusBarIconView extends AnimatedImageView {
        mOnVisibilityChangedListener = listener;
    }

    public void setDark(boolean dark, boolean fade, long delay) {
        mDozer.setImageDark(this, dark, fade, delay, mIconColor != NO_COLOR);
        mDozer.setIntensityDark(f -> {
            mDarkAmount = f;
            updateDecorColor();
        }, dark, fade, delay);
    }

    public interface OnVisibilityChangedListener {
        void onVisibilityChanged(int newVisibility);
    }
+12 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.widget.ImageView;
import com.android.systemui.Interpolators;
import com.android.systemui.statusbar.phone.NotificationPanelView;

import java.util.function.Consumer;

public class NotificationDozeHelper {
    private final ColorMatrix mGrayscaleColorMatrix = new ColorMatrix();

@@ -70,6 +72,16 @@ public class NotificationDozeHelper {
        animator.start();
    }

    public void setIntensityDark(Consumer<Float> listener, boolean dark,
            boolean animate, long delay) {
        if (animate) {
            startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dark, delay,
                    null /* listener */);
        } else {
            listener.accept(dark ? 1f : 0f);
        }
    }

    public void updateGrayscaleMatrix(float intensity) {
        mGrayscaleColorMatrix.setSaturation(1 - intensity);
    }
+14 −4
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
    private int mActualLayoutWidth = NO_VALUE;
    private float mActualPaddingEnd = NO_VALUE;
    private float mActualPaddingStart = NO_VALUE;
    private boolean mCentered;
    private boolean mDark;
    private boolean mChangingViewPositions;
    private int mAddAnimationStartIndex = -1;
    private int mCannedAnimationStartIndex = -1;
@@ -183,6 +183,9 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
                mAddAnimationStartIndex = Math.min(mAddAnimationStartIndex, childIndex);
            }
        }
        if (mDark && child instanceof StatusBarIconView) {
            ((StatusBarIconView) child).setDark(mDark, false, 0);
        }
    }

    @Override
@@ -312,7 +315,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
                numDots++;
            }
        }
        if (mCentered && translationX < getLayoutEnd()) {
        boolean center = mDark;
        if (center && translationX < getLayoutEnd()) {
            float delta = (getLayoutEnd() - translationX) / 2;
            for (int i = 0; i < childCount; i++) {
                View view = getChildAt(i);
@@ -390,9 +394,15 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
        mChangingViewPositions = changingViewPositions;
    }

    public void setAmbient(boolean ambient) {
        mCentered = ambient;
    public void setDark(boolean dark, boolean fade, long delay) {
        mDark = dark;
        mDisallowNextAnimation = true;
        for (int i = 0; i < getChildCount(); i++) {
            View view = getChildAt(i);
            if (view instanceof StatusBarIconView) {
                ((StatusBarIconView) view).setDark(dark, fade, delay);
            }
        }
    }

    public IconState getIconState(StatusBarIconView icon) {