1 /*
2  * Copyright (C) 2019 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 
17 package com.android.launcher3.graphics;
18 
19 import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound;
20 
21 import android.graphics.Canvas;
22 import android.util.FloatProperty;
23 import android.view.View;
24 
25 import com.android.launcher3.Launcher;
26 import com.android.launcher3.uioverrides.WallpaperColorInfo;
27 
28 /**
29  * Contains general scrim properties such as wallpaper-extracted color that subclasses can use.
30  */
31 public class Scrim implements View.OnAttachStateChangeListener,
32         WallpaperColorInfo.OnChangeListener {
33 
34     public static final FloatProperty<Scrim> SCRIM_PROGRESS =
35             new FloatProperty<Scrim>("scrimProgress") {
36                 @Override
37                 public Float get(Scrim scrim) {
38                     return scrim.mScrimProgress;
39                 }
40 
41                 @Override
42                 public void setValue(Scrim scrim, float v) {
43                     scrim.setScrimProgress(v);
44                 }
45             };
46 
47     protected final Launcher mLauncher;
48     protected final WallpaperColorInfo mWallpaperColorInfo;
49     protected final View mRoot;
50 
51     protected float mScrimProgress;
52     protected int mScrimColor;
53     protected int mScrimAlpha = 0;
54 
Scrim(View view)55     public Scrim(View view) {
56         mRoot = view;
57         mLauncher = Launcher.getLauncher(view.getContext());
58         mWallpaperColorInfo = WallpaperColorInfo.INSTANCE.get(mLauncher);
59 
60         view.addOnAttachStateChangeListener(this);
61     }
62 
draw(Canvas canvas)63     public void draw(Canvas canvas) {
64         canvas.drawColor(setColorAlphaBound(mScrimColor, mScrimAlpha));
65     }
66 
setScrimProgress(float progress)67     private void setScrimProgress(float progress) {
68         if (mScrimProgress != progress) {
69             mScrimProgress = progress;
70             mScrimAlpha = Math.round(255 * mScrimProgress);
71             invalidate();
72         }
73     }
74 
75     @Override
onViewAttachedToWindow(View view)76     public void onViewAttachedToWindow(View view) {
77         mWallpaperColorInfo.addOnChangeListener(this);
78         onExtractedColorsChanged(mWallpaperColorInfo);
79     }
80 
81     @Override
onViewDetachedFromWindow(View view)82     public void onViewDetachedFromWindow(View view) {
83         mWallpaperColorInfo.removeOnChangeListener(this);
84     }
85 
86     @Override
onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo)87     public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) {
88         mScrimColor = wallpaperColorInfo.getMainColor();
89         if (mScrimAlpha > 0) {
90             invalidate();
91         }
92     }
93 
invalidate()94     public void invalidate() {
95         mRoot.invalidate();
96     }
97 }
98