blob: 9f79ef2491d97084a2a3c0d8338bca7df6c85dee [file] [log] [blame]
Adrian Roos7bcf6d32017-04-04 16:44:25 -07001/*
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}