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