1 /* 2 * Copyright (C) 2021 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.managedprovisioning.common; 18 19 import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO; 20 import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES; 21 22 import static com.android.managedprovisioning.provisioning.Constants.FLAG_ENABLE_LIGHT_DARK_MODE; 23 24 import static com.google.common.truth.Truth.assertThat; 25 26 import android.content.Context; 27 import android.content.Intent; 28 29 import androidx.test.InstrumentationRegistry; 30 import androidx.test.filters.SmallTest; 31 32 import com.android.managedprovisioning.R; 33 34 import com.google.android.setupcompat.util.WizardManagerHelper; 35 36 import org.junit.After; 37 import org.junit.Before; 38 import org.junit.Test; 39 40 import java.util.Objects; 41 42 @SmallTest 43 public class ThemeHelperTest { 44 private static final String THEME_TEST_VALUE = "glif_v3_light"; 45 private static final Intent INTENT_WITH_THEME = 46 new Intent().putExtra(WizardManagerHelper.EXTRA_THEME, THEME_TEST_VALUE); 47 private static final Intent INTENT_NO_THEME = new Intent(); 48 49 private final Context mContext = InstrumentationRegistry.getTargetContext(); 50 private boolean mInitialFeatureFlagValue; 51 private ThemeHelper.SetupWizardBridge mSetupWizardBridge; 52 53 @Before setUp()54 public void setUp() { 55 mInitialFeatureFlagValue = FLAG_ENABLE_LIGHT_DARK_MODE; 56 } 57 58 @After tearDown()59 public void tearDown() { 60 FLAG_ENABLE_LIGHT_DARK_MODE = mInitialFeatureFlagValue; 61 } 62 63 @Test inferThemeResId_themeProvidedAsExtra_suwDayNightEnabled_themesMatch()64 public void inferThemeResId_themeProvidedAsExtra_suwDayNightEnabled_themesMatch() { 65 FLAG_ENABLE_LIGHT_DARK_MODE = true; 66 ThemeHelper themeHelper = createThemeHelperWithDayNightEnabled(true); 67 Intent intent = new Intent() 68 .putExtra(WizardManagerHelper.EXTRA_THEME, THEME_TEST_VALUE); 69 int expectedResId = mSetupWizardBridge.resolveTheme( 70 R.style.SudThemeGlifV4_DayNight, 71 THEME_TEST_VALUE, 72 /* suppressDayNight= */ false); 73 74 assertThat(themeHelper.inferThemeResId(mContext, intent)).isEqualTo(expectedResId); 75 } 76 77 @Test inferThemeResId_themeProvidedAsExtra_suwDayNightDisabled_themesMatch()78 public void inferThemeResId_themeProvidedAsExtra_suwDayNightDisabled_themesMatch() { 79 FLAG_ENABLE_LIGHT_DARK_MODE = true; 80 ThemeHelper themeHelper = createThemeHelperWithDayModeValues(); 81 Intent intent = new Intent() 82 .putExtra(WizardManagerHelper.EXTRA_THEME, THEME_TEST_VALUE); 83 int expectedResId = mSetupWizardBridge.resolveTheme( 84 R.style.SudThemeGlifV4_Light, 85 THEME_TEST_VALUE, 86 /* suppressDayNight= */ true); 87 88 assertThat(themeHelper.inferThemeResId(mContext, intent)).isEqualTo(expectedResId); 89 } 90 91 @Test 92 public void inferThemeResId_themeProvidedAsExtra_suwDayNightEnabled_flagDisabled_themesMatch()93 inferThemeResId_themeProvidedAsExtra_suwDayNightEnabled_flagDisabled_themesMatch() { 94 FLAG_ENABLE_LIGHT_DARK_MODE = false; 95 ThemeHelper themeHelper = createThemeHelperWithDayNightEnabled(true); 96 Intent intent = new Intent() 97 .putExtra(WizardManagerHelper.EXTRA_THEME, THEME_TEST_VALUE); 98 int expectedResId = mSetupWizardBridge.resolveTheme( 99 R.style.SudThemeGlifV4_DayNight, 100 THEME_TEST_VALUE, 101 /* suppressDayNight= */ true); 102 103 assertThat(themeHelper.inferThemeResId(mContext, intent)).isEqualTo(expectedResId); 104 } 105 106 @Test 107 public void inferThemeResId_themeProvidedAsExtra_suwDayNightDisabled_flagDisabled_themesMatch()108 inferThemeResId_themeProvidedAsExtra_suwDayNightDisabled_flagDisabled_themesMatch() { 109 FLAG_ENABLE_LIGHT_DARK_MODE = false; 110 ThemeHelper themeHelper = createThemeHelperWithDayModeValues(); 111 Intent intent = new Intent() 112 .putExtra(WizardManagerHelper.EXTRA_THEME, THEME_TEST_VALUE); 113 int expectedResId = mSetupWizardBridge.resolveTheme( 114 R.style.SudThemeGlifV4_Light, 115 THEME_TEST_VALUE, 116 /* suppressDayNight= */ true); 117 118 assertThat(themeHelper.inferThemeResId(mContext, intent)).isEqualTo(expectedResId); 119 } 120 121 @Test inferThemeResId_systemPropertyThemeUsed_suwDayNightEnabled_themesMatch()122 public void inferThemeResId_systemPropertyThemeUsed_suwDayNightEnabled_themesMatch() { 123 FLAG_ENABLE_LIGHT_DARK_MODE = true; 124 ThemeHelper themeHelper = 125 createThemeHelperWithDayNightEnabledAndSystemPropertyTheme( 126 true, THEME_TEST_VALUE); 127 int expectedResId = mSetupWizardBridge.resolveTheme( 128 R.style.SudThemeGlifV4_DayNight, 129 THEME_TEST_VALUE, 130 /* suppressDayNight= */ false); 131 132 assertThat(themeHelper.inferThemeResId(mContext, new Intent())).isEqualTo(expectedResId); 133 } 134 135 @Test inferThemeResId_glifLightThemeUsed_suwDayNightEnabled_themesMatch()136 public void inferThemeResId_glifLightThemeUsed_suwDayNightEnabled_themesMatch() { 137 FLAG_ENABLE_LIGHT_DARK_MODE = true; 138 ThemeHelper themeHelper = 139 createThemeHelperWithDayNightEnabled(true); 140 int expectedResId = mSetupWizardBridge.resolveTheme( 141 R.style.SudThemeGlifV4_DayNight, 142 com.google.android.setupdesign.util.ThemeHelper.THEME_GLIF_V4, 143 /* suppressDayNight= */ false); 144 145 assertThat(themeHelper.inferThemeResId(mContext, new Intent())).isEqualTo(expectedResId); 146 } 147 148 @Test inferThemeResId_suppressDayNight_systemNightMode_noSetupWizard_isDarkMode()149 public void inferThemeResId_suppressDayNight_systemNightMode_noSetupWizard_isDarkMode() { 150 FLAG_ENABLE_LIGHT_DARK_MODE = true; 151 ThemeHelper themeHelper = 152 createThemeHelperWithDayNightAndSystemNightModeEnabled( 153 /* setupWizardDayNightEnabled= */ false, 154 /* isSystemNightMode= */ true); 155 int expectedResId = mSetupWizardBridge.resolveTheme( 156 R.style.SudThemeGlifV4_Light, 157 com.google.android.setupdesign.util.ThemeHelper.THEME_GLIF_V4, 158 /* suppressDayNight= */ true); 159 160 assertThat(themeHelper.inferThemeResId(mContext, new Intent())).isEqualTo(expectedResId); 161 } 162 163 @Test inferThemeResId_suppressDayNight_systemNightMode_noSetupWizard_isLightMode()164 public void inferThemeResId_suppressDayNight_systemNightMode_noSetupWizard_isLightMode() { 165 FLAG_ENABLE_LIGHT_DARK_MODE = true; 166 ThemeHelper themeHelper = 167 createThemeHelperWithDayNightAndSystemNightModeEnabled( 168 /* setupWizardDayNightEnabled= */ false, 169 /* isSystemNightMode= */ false); 170 int expectedResId = mSetupWizardBridge.resolveTheme( 171 R.style.SudThemeGlifV4_Light, 172 com.google.android.setupdesign.util.ThemeHelper.THEME_GLIF_V4_LIGHT, 173 /* suppressDayNight= */ true); 174 175 assertThat(themeHelper.inferThemeResId(mContext, new Intent())).isEqualTo(expectedResId); 176 } 177 178 @Test getDefaultNightMode_returnsYes()179 public void getDefaultNightMode_returnsYes() { 180 FLAG_ENABLE_LIGHT_DARK_MODE = true; 181 ThemeHelper themeHelper = createThemeHelperForNightMode(); 182 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_WITH_THEME)) 183 .isEqualTo(MODE_NIGHT_YES); 184 } 185 186 @Test getDefaultNightMode_featureFlagDisabled_returnsNo()187 public void getDefaultNightMode_featureFlagDisabled_returnsNo() { 188 FLAG_ENABLE_LIGHT_DARK_MODE = false; 189 ThemeHelper themeHelper = createThemeHelperForNightMode(); 190 191 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_WITH_THEME)) 192 .isEqualTo(MODE_NIGHT_NO); 193 } 194 195 @Test getDefaultNightMode_setupWizardDayNightDisabled_returnsNo()196 public void getDefaultNightMode_setupWizardDayNightDisabled_returnsNo() { 197 FLAG_ENABLE_LIGHT_DARK_MODE = true; 198 ThemeHelper themeHelper = createThemeHelperWithDayNightEnabled(false); 199 200 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_WITH_THEME)) 201 .isEqualTo(MODE_NIGHT_NO); 202 } 203 204 @Test getDefaultNightMode_systemNightModeFalse_returnsNo()205 public void getDefaultNightMode_systemNightModeFalse_returnsNo() { 206 FLAG_ENABLE_LIGHT_DARK_MODE = true; 207 ThemeHelper themeHelper = createThemeHelperWithSystemNightModeEnabled(false); 208 209 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_WITH_THEME)) 210 .isEqualTo(MODE_NIGHT_NO); 211 } 212 213 @Test getDefaultNightMode_systemNightModeFalse_noThemeExtra_returnsNo()214 public void getDefaultNightMode_systemNightModeFalse_noThemeExtra_returnsNo() { 215 FLAG_ENABLE_LIGHT_DARK_MODE = true; 216 ThemeHelper themeHelper = createThemeHelperWithSystemNightModeEnabled(false); 217 218 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_NO_THEME)) 219 .isEqualTo(MODE_NIGHT_NO); 220 } 221 222 @Test getDefaultNightMode_systemNightModeTrue_noThemeExtra_returnsYes()223 public void getDefaultNightMode_systemNightModeTrue_noThemeExtra_returnsYes() { 224 FLAG_ENABLE_LIGHT_DARK_MODE = true; 225 ThemeHelper themeHelper = createThemeHelperWithSystemNightModeEnabled(true); 226 227 assertThat(themeHelper.getDefaultNightMode(mContext, INTENT_NO_THEME)) 228 .isEqualTo(MODE_NIGHT_YES); 229 } 230 createThemeHelperForNightMode()231 private ThemeHelper createThemeHelperForNightMode() { 232 return createThemeHelper( 233 /* setupWizardDayNightEnabled= */ true, 234 /* systemPropertySetupWizardTheme= */ null, 235 /* isSystemNightMode= */ true); 236 } 237 createThemeHelperWithDayNightEnabled(boolean setupWizardDayNightEnabled)238 private ThemeHelper createThemeHelperWithDayNightEnabled(boolean setupWizardDayNightEnabled) { 239 return createThemeHelper( 240 setupWizardDayNightEnabled, 241 /* systemPropertySetupWizardTheme= */ null, 242 /* isSystemNightMode= */ true); 243 } 244 createThemeHelperWithDayNightAndSystemNightModeEnabled( boolean setupWizardDayNightEnabled, boolean isSystemNightMode)245 private ThemeHelper createThemeHelperWithDayNightAndSystemNightModeEnabled( 246 boolean setupWizardDayNightEnabled, 247 boolean isSystemNightMode) { 248 return createThemeHelper( 249 setupWizardDayNightEnabled, 250 /* systemPropertySetupWizardTheme= */ null, 251 /* isSystemNightMode= */ isSystemNightMode); 252 } 253 createThemeHelperWithSystemNightModeEnabled(boolean isSystemNightMode)254 private ThemeHelper createThemeHelperWithSystemNightModeEnabled(boolean isSystemNightMode) { 255 return createThemeHelper( 256 /* setupWizardDayNightEnabled= */ false, 257 /* systemPropertySetupWizardTheme= */ null, 258 isSystemNightMode); 259 } 260 createThemeHelperWithDayModeValues()261 private ThemeHelper createThemeHelperWithDayModeValues() { 262 return createThemeHelper( 263 /* setupWizardDayNightEnabled= */ false, 264 /* systemPropertySetupWizardTheme= */ null, 265 /* isSystemNightMode= */ false); 266 } 267 createThemeHelperWithDayNightEnabledAndSystemPropertyTheme( boolean setupWizardDayNightEnabled, String systemPropertySetupWizardTheme)268 private ThemeHelper createThemeHelperWithDayNightEnabledAndSystemPropertyTheme( 269 boolean setupWizardDayNightEnabled, String systemPropertySetupWizardTheme) { 270 return createThemeHelper( 271 setupWizardDayNightEnabled, 272 systemPropertySetupWizardTheme, 273 /* isSystemNightMode= */ false); 274 } 275 createThemeHelper( boolean setupWizardDayNightEnabled, String systemPropertySetupWizardTheme, boolean isSystemNightMode)276 private ThemeHelper createThemeHelper( 277 boolean setupWizardDayNightEnabled, 278 String systemPropertySetupWizardTheme, 279 boolean isSystemNightMode) { 280 mSetupWizardBridge = new ThemeHelper.SetupWizardBridge() { 281 @Override 282 public boolean isSetupWizardDayNightEnabled(Context context) { 283 return setupWizardDayNightEnabled; 284 } 285 286 @Override 287 public String getSystemPropertySetupWizardTheme() { 288 return systemPropertySetupWizardTheme; 289 } 290 291 @Override 292 public int resolveTheme(int defaultTheme, String themeName, boolean suppressDayNight) { 293 return Objects.hash(defaultTheme, themeName, suppressDayNight); 294 } 295 }; 296 return new ThemeHelper(context -> isSystemNightMode, mSetupWizardBridge); 297 } 298 } 299