1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.statusbar.notification;
18
19import android.content.Context;
20import android.graphics.Color;
21import android.graphics.PorterDuff;
22import android.graphics.PorterDuffColorFilter;
23import android.graphics.drawable.Drawable;
24import android.widget.ImageView;
25
26import com.android.systemui.R;
27
28public class NotificationIconDozeHelper extends NotificationDozeHelper {
29
30    private final int mImageDarkAlpha;
31    private final int mImageDarkColor = 0xffffffff;
32    private final PorterDuffColorFilter mImageColorFilter = new PorterDuffColorFilter(
33            0, PorterDuff.Mode.SRC_ATOP);
34
35    private int mColor = Color.BLACK;
36
37    public NotificationIconDozeHelper(Context ctx) {
38        mImageDarkAlpha = ctx.getResources().getInteger(R.integer.doze_small_icon_alpha);
39    }
40
41    public void setColor(int color) {
42        mColor = color;
43    }
44
45    public void setImageDark(ImageView target, boolean dark, boolean fade, long delay,
46            boolean useGrayscale) {
47        if (fade) {
48            if (!useGrayscale) {
49                fadeImageColorFilter(target, dark, delay);
50                fadeImageAlpha(target, dark, delay);
51            } else {
52                fadeGrayscale(target, dark, delay);
53            }
54        } else {
55            if (!useGrayscale) {
56                updateImageColorFilter(target, dark);
57                updateImageAlpha(target, dark);
58            } else {
59                updateGrayscale(target, dark);
60            }
61        }
62    }
63
64    private void fadeImageColorFilter(final ImageView target, boolean dark, long delay) {
65        startIntensityAnimation(animation -> {
66            updateImageColorFilter(target, (Float) animation.getAnimatedValue());
67        }, dark, delay, null /* listener */);
68    }
69
70    private void fadeImageAlpha(final ImageView target, boolean dark, long delay) {
71        startIntensityAnimation(animation -> {
72            float t = (float) animation.getAnimatedValue();
73            target.setImageAlpha((int) (255 * (1f - t) + mImageDarkAlpha * t));
74        }, dark, delay, null /* listener */);
75    }
76
77    private void updateImageColorFilter(ImageView target, boolean dark) {
78        updateImageColorFilter(target, dark ? 1f : 0f);
79    }
80
81    private void updateImageColorFilter(ImageView target, float intensity) {
82        int color = NotificationUtils.interpolateColors(mColor, mImageDarkColor, intensity);
83        mImageColorFilter.setColor(color);
84        Drawable imageDrawable = target.getDrawable();
85
86        // Also, the notification might have been modified during the animation, so background
87        // might be null here.
88        if (imageDrawable != null) {
89            Drawable d = imageDrawable.mutate();
90            // DrawableContainer ignores the color filter if it's already set, so clear it first to
91            // get it set and invalidated properly.
92            d.setColorFilter(null);
93            d.setColorFilter(mImageColorFilter);
94        }
95    }
96
97    private void updateImageAlpha(ImageView target, boolean dark) {
98        target.setImageAlpha(dark ? mImageDarkAlpha : 255);
99    }
100
101}
102