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 
17 package com.android.systemui.colorextraction;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertNotEquals;
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyInt;
23 import static org.mockito.ArgumentMatchers.eq;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.reset;
26 import static org.mockito.Mockito.verify;
27 
28 import android.app.WallpaperColors;
29 import android.app.WallpaperManager;
30 import android.graphics.Color;
31 
32 import androidx.test.filters.SmallTest;
33 import androidx.test.runner.AndroidJUnit4;
34 
35 import com.android.internal.colorextraction.ColorExtractor;
36 import com.android.internal.colorextraction.types.Tonal;
37 import com.android.systemui.SysuiTestCase;
38 import com.android.systemui.dump.DumpManager;
39 import com.android.systemui.statusbar.policy.ConfigurationController;
40 
41 import org.junit.Before;
42 import org.junit.Test;
43 import org.junit.runner.RunWith;
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 
47 /**
48  * Tests color extraction generation.
49  */
50 @SmallTest
51 @RunWith(AndroidJUnit4.class)
52 public class SysuiColorExtractorTests extends SysuiTestCase {
53 
54     private static int[] sWhich = new int[]{
55             WallpaperManager.FLAG_SYSTEM,
56             WallpaperManager.FLAG_LOCK};
57     private static int[] sTypes = new int[]{
58             ColorExtractor.TYPE_NORMAL,
59             ColorExtractor.TYPE_DARK,
60             ColorExtractor.TYPE_EXTRA_DARK};
61 
62     @Mock
63     private WallpaperManager mWallpaperManager;
64     @Mock
65     private DumpManager mDumpManager;
66     private ColorExtractor.GradientColors mColors;
67     private SysuiColorExtractor mColorExtractor;
68 
69     @Before
setUp()70     public void setUp() {
71         MockitoAnnotations.initMocks(this);
72         mColors = new ColorExtractor.GradientColors();
73         mColors.setMainColor(Color.RED);
74         mColors.setSecondaryColor(Color.RED);
75         mColorExtractor = new SysuiColorExtractor(
76                 getContext(),
77                 (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark,
78                         outGradientColorsExtraDark) -> {
79                     outGradientColorsNormal.set(mColors);
80                     outGradientColorsDark.set(mColors);
81                     outGradientColorsExtraDark.set(mColors);
82                 },
83                 mock(ConfigurationController.class),
84                 mWallpaperManager,
85                 mDumpManager,
86                 true /* immediately */);
87     }
88 
89     @Test
getColors()90     public void getColors() {
91         mColors.setMainColor(Color.RED);
92         mColors.setSecondaryColor(Color.RED);
93 
94         simulateEvent(mColorExtractor);
95         for (int which : sWhich) {
96             for (int type : sTypes) {
97                 assertEquals("Not using extracted colors!",
98                         mColorExtractor.getColors(which, type), mColors);
99             }
100         }
101     }
102 
103     @Test
getColors_fallbackWhenMediaIsVisible()104     public void getColors_fallbackWhenMediaIsVisible() {
105         simulateEvent(mColorExtractor);
106         mColorExtractor.setHasMediaArtwork(true);
107 
108         ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors();
109 
110         for (int type : sTypes) {
111             assertEquals("Not using fallback!",
112                     mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors);
113             assertNotEquals("Media visibility should not affect system wallpaper.",
114                     mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors);
115         }
116     }
117 
118     @Test
onUiModeChanged_reloadsColors()119     public void onUiModeChanged_reloadsColors() {
120         Tonal tonal = mock(Tonal.class);
121         ConfigurationController configurationController = mock(ConfigurationController.class);
122         SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(
123                 getContext(),
124                 tonal,
125                 configurationController,
126                 mWallpaperManager,
127                 mDumpManager,
128                 true /* immediately */);
129         verify(configurationController).addCallback(eq(sysuiColorExtractor));
130 
131         reset(tonal);
132         sysuiColorExtractor.onUiModeChanged();
133         verify(tonal).applyFallback(any(), any());
134     }
135 
136     @Test
onUiModeChanged_notifiesListener()137     public void onUiModeChanged_notifiesListener() {
138         ColorExtractor.OnColorsChangedListener listener = mock(
139                 ColorExtractor.OnColorsChangedListener.class);
140         mColorExtractor.addOnColorsChangedListener(listener);
141         mColorExtractor.onUiModeChanged();
142         verify(listener).onColorsChanged(any(), anyInt());
143     }
144 
simulateEvent(SysuiColorExtractor extractor)145     private void simulateEvent(SysuiColorExtractor extractor) {
146         // Let's fake a color event
147         extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.GREEN), null, null, 0),
148                 WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK);
149     }
150 }