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 }