14e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi/*
24e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Copyright (C) 2014 The Android Open Source Project
34e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi *
44e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
54e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * you may not use this file except in compliance with the License.
64e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * You may obtain a copy of the License at
74e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi *
84e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
94e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi *
104e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Unless required by applicable law or agreed to in writing, software
114e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
124e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * See the License for the specific language governing permissions and
144e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * limitations under the License
154e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi */
164e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
174e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggipackage com.android.systemui.statusbar;
184e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
194e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.animation.Animator;
204e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.animation.AnimatorListenerAdapter;
214e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.animation.ValueAnimator;
224e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.content.Context;
234e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.Color;
244e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.ColorFilter;
254e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.ColorMatrix;
264e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.ColorMatrixColorFilter;
274e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.PorterDuff;
284e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.PorterDuffColorFilter;
29dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggiimport android.graphics.drawable.Drawable;
304e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.view.View;
314e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.view.animation.AnimationUtils;
324e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.view.animation.Interpolator;
334e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.widget.ImageView;
344e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
354e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport com.android.systemui.R;
364e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport com.android.systemui.ViewInvertHelper;
374e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport com.android.systemui.statusbar.phone.NotificationPanelView;
384e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
394e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi/**
404e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Wraps a notification view inflated from a template.
414e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi */
424e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggipublic class NotificationTemplateViewWrapper extends NotificationViewWrapper {
434e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
444e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private final ColorMatrix mGrayscaleColorMatrix = new ColorMatrix();
454e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private final PorterDuffColorFilter mIconColorFilter = new PorterDuffColorFilter(
464e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            0, PorterDuff.Mode.SRC_ATOP);
474e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private final int mIconDarkAlpha;
484e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private final int mIconBackgroundDarkColor;
494e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private final Interpolator mLinearOutSlowInInterpolator;
504e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
51dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    private int mIconBackgroundColor;
52dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    private ViewInvertHelper mInvertHelper;
53dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    private ImageView mIcon;
54dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    protected ImageView mPicture;
55dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi
5692df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi    /** Whether the icon needs to be forced grayscale when in dark mode. */
5792df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi    private boolean mIconForceGraysaleWhenDark;
5892df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi
594e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    protected NotificationTemplateViewWrapper(Context ctx, View view) {
604e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        super(view);
614e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mIconDarkAlpha = ctx.getResources().getInteger(R.integer.doze_small_icon_alpha);
624e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mIconBackgroundDarkColor =
634e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                ctx.getResources().getColor(R.color.doze_small_icon_background_color);
644e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(ctx,
654e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                android.R.interpolator.linear_out_slow_in);
66dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        resolveViews();
67dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    }
68dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi
69dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    private void resolveViews() {
70dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        View mainColumn = mView.findViewById(com.android.internal.R.id.notification_main_column);
714e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mInvertHelper = mainColumn != null
724e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                ? new ViewInvertHelper(mainColumn, NotificationPanelView.DOZE_ANIMATION_DURATION)
734e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                : null;
74dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        ImageView largeIcon = (ImageView) mView.findViewById(com.android.internal.R.id.icon);
75dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        ImageView rightIcon = (ImageView) mView.findViewById(com.android.internal.R.id.right_icon);
764e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mIcon = resolveIcon(largeIcon, rightIcon);
774e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mPicture = resolvePicture(largeIcon);
784e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mIconBackgroundColor = resolveBackgroundColor(mIcon);
7992df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi
8092df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi        // If the icon already has a color filter, we assume that we already forced the icon to be
8192df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi        // white when we created the notification.
824faaaf6457f55b71018c5e254eff59a6f0ce6c6aDan Sandler        final Drawable iconDrawable = mIcon != null ? mIcon.getDrawable() : null;
834faaaf6457f55b71018c5e254eff59a6f0ce6c6aDan Sandler        mIconForceGraysaleWhenDark = iconDrawable != null && iconDrawable.getColorFilter() != null;
844e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
854e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
864e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private ImageView resolveIcon(ImageView largeIcon, ImageView rightIcon) {
874e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        return largeIcon != null && largeIcon.getBackground() != null ? largeIcon
8892df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                : rightIcon != null && rightIcon.getVisibility() == View.VISIBLE ? rightIcon
894e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                : null;
904e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
914e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
924e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private ImageView resolvePicture(ImageView largeIcon) {
934e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        return largeIcon != null && largeIcon.getBackground() == null
944e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                ? largeIcon
954e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                : null;
964e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
974e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
984e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private int resolveBackgroundColor(ImageView icon) {
994e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        if (icon != null && icon.getBackground() != null) {
1004e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            ColorFilter filter = icon.getBackground().getColorFilter();
1014e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            if (filter instanceof PorterDuffColorFilter) {
1024e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                return ((PorterDuffColorFilter) filter).getColor();
1034e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1044e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }
1054e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        return 0;
1064e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1074e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1084e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    @Override
109dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    public void notifyContentUpdated() {
110dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        super.notifyContentUpdated();
111dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi
112dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        // Reinspect the notification.
113dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        resolveViews();
114dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    }
115dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi
116dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi    @Override
1174e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    public void setDark(boolean dark, boolean fade, long delay) {
118394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi        if (mInvertHelper != null) {
119394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi            if (fade) {
120394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                mInvertHelper.fade(dark, delay);
121394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi            } else {
122394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                mInvertHelper.update(dark);
1234e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
124394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi        }
125394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi        if (mIcon != null) {
126394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi            if (fade) {
127394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                fadeIconColorFilter(mIcon, dark, delay);
128394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                fadeIconAlpha(mIcon, dark, delay);
12992df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                if (!mIconForceGraysaleWhenDark) {
13092df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                    fadeGrayscale(mIcon, dark, delay);
13192df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                }
132394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi            } else {
133394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                updateIconColorFilter(mIcon, dark);
134394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi                updateIconAlpha(mIcon, dark);
13592df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                if (!mIconForceGraysaleWhenDark) {
13692df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                    updateGrayscale(mIcon, dark);
13792df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi                }
1384e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1394e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }
140394a5d68b55ad06757270915288eaa93e6a0d89fJorim Jaggi        setPictureGrayscale(dark, fade, delay);
1414e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1424e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1434e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    protected void setPictureGrayscale(boolean grayscale, boolean fade, long delay) {
1444e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        if (mPicture != null) {
1454e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            if (fade) {
1464e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                fadeGrayscale(mPicture, grayscale, delay);
1474e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            } else {
1484e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                updateGrayscale(mPicture, grayscale);
1494e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1504e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }
1514e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1524e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1534e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void startIntensityAnimation(ValueAnimator.AnimatorUpdateListener updateListener,
1544e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            boolean dark, long delay, Animator.AnimatorListener listener) {
1554e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        float startIntensity = dark ? 0f : 1f;
1564e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        float endIntensity = dark ? 1f : 0f;
1574e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        ValueAnimator animator = ValueAnimator.ofFloat(startIntensity, endIntensity);
1584e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        animator.addUpdateListener(updateListener);
1594e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        animator.setDuration(NotificationPanelView.DOZE_ANIMATION_DURATION);
1604e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        animator.setInterpolator(mLinearOutSlowInInterpolator);
1614e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        animator.setStartDelay(delay);
1624e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        if (listener != null) {
1634e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            animator.addListener(listener);
1644e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }
1654e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        animator.start();
1664e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1674e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1684e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void fadeIconColorFilter(final ImageView target, boolean dark, long delay) {
1694e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        startIntensityAnimation(new ValueAnimator.AnimatorUpdateListener() {
1704e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            @Override
1714e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
1724e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                updateIconColorFilter(target, (Float) animation.getAnimatedValue());
1734e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1744e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }, dark, delay, null /* listener */);
1754e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1764e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1774e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void fadeIconAlpha(final ImageView target, boolean dark, long delay) {
1784e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        startIntensityAnimation(new ValueAnimator.AnimatorUpdateListener() {
1794e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            @Override
1804e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
1814e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                float t = (float) animation.getAnimatedValue();
1824e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                target.setImageAlpha((int) (255 * (1f - t) + mIconDarkAlpha * t));
1834e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1844e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }, dark, delay, null /* listener */);
1854e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
1864e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
1874e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    protected void fadeGrayscale(final ImageView target, final boolean dark, long delay) {
1884e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        startIntensityAnimation(new ValueAnimator.AnimatorUpdateListener() {
1894e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            @Override
1904e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
1914e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                updateGrayscaleMatrix((float) animation.getAnimatedValue());
1924e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                target.setColorFilter(new ColorMatrixColorFilter(mGrayscaleColorMatrix));
1934e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
1944e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }, dark, delay, new AnimatorListenerAdapter() {
1954e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            @Override
1964e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            public void onAnimationEnd(Animator animation) {
1974e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                if (!dark) {
1984e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                    target.setColorFilter(null);
1994e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                }
2004e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            }
2014e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        });
2024e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2034e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2044e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void updateIconColorFilter(ImageView target, boolean dark) {
2054e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        updateIconColorFilter(target, dark ? 1f : 0f);
2064e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2074e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2084e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void updateIconColorFilter(ImageView target, float intensity) {
2094e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int color = interpolateColor(mIconBackgroundColor, mIconBackgroundDarkColor, intensity);
2104e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mIconColorFilter.setColor(color);
211dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        Drawable background = target.getBackground();
212dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi
21392df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi        // The background might be null for legacy notifications. Also, the notification might have
21492df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi        // been modified during the animation, so background might be null here.
215dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        if (background != null) {
216dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi            background.mutate().setColorFilter(mIconColorFilter);
217dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi        }
2184e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2194e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2204e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void updateIconAlpha(ImageView target, boolean dark) {
2214e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        target.setImageAlpha(dark ? mIconDarkAlpha : 255);
2224e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2234e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2244e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    protected void updateGrayscale(ImageView target, boolean dark) {
2254e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        if (dark) {
2264e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            updateGrayscaleMatrix(1f);
2274e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            target.setColorFilter(new ColorMatrixColorFilter(mGrayscaleColorMatrix));
2284e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        } else {
2294e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            target.setColorFilter(null);
2304e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        }
2314e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2324e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2334e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private void updateGrayscaleMatrix(float intensity) {
2344e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        mGrayscaleColorMatrix.setSaturation(1 - intensity);
2354e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2364e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi
2374e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    private static int interpolateColor(int source, int target, float t) {
2384e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int aSource = Color.alpha(source);
2394e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int rSource = Color.red(source);
2404e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int gSource = Color.green(source);
2414e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int bSource = Color.blue(source);
2424e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int aTarget = Color.alpha(target);
2434e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int rTarget = Color.red(target);
2444e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int gTarget = Color.green(target);
2454e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        int bTarget = Color.blue(target);
2464e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        return Color.argb(
2474e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                (int) (aSource * (1f - t) + aTarget * t),
2484e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                (int) (rSource * (1f - t) + rTarget * t),
2494e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                (int) (gSource * (1f - t) + gTarget * t),
2504e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi                (int) (bSource * (1f - t) + bTarget * t));
2514e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    }
2524e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi}
253