/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.setupwizardlib.util; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.robolectric.RuntimeEnvironment.application; import static org.robolectric.Shadows.shadowOf; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.provider.Settings; import android.provider.Settings.Global; import android.provider.Settings.Secure; import androidx.annotation.StyleRes; import com.android.setupwizardlib.R; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(sdk = Config.NEWEST_SDK) public class WizardManagerHelperTest { @Test public void testGetNextIntent() { final Intent intent = new Intent("test.intent.ACTION"); intent.putExtra("scriptUri", "android-resource://test-script"); intent.putExtra("actionId", "test_action_id"); intent.putExtra("theme", "test_theme"); intent.putExtra("ignoreExtra", "poof"); // extra is ignored because it's not known final Intent data = new Intent(); data.putExtra("extraData", "shazam"); final Intent nextIntent = WizardManagerHelper.getNextIntent(intent, Activity.RESULT_OK, data); assertWithMessage("Next intent action should be NEXT") .that(nextIntent.getAction()) .isEqualTo("com.android.wizard.NEXT"); assertWithMessage("Script URI should be the same as original intent") .that(nextIntent.getStringExtra("scriptUri")) .isEqualTo("android-resource://test-script"); assertWithMessage("Action ID should be the same as original intent") .that(nextIntent.getStringExtra("actionId")) .isEqualTo("test_action_id"); assertWithMessage("Theme extra should be the same as original intent") .that(nextIntent.getStringExtra("theme")) .isEqualTo("test_theme"); assertWithMessage("ignoreExtra should not be in nextIntent") .that(nextIntent.hasExtra("ignoreExtra")) .isFalse(); assertWithMessage("Result code extra should be RESULT_OK") .that(nextIntent.getIntExtra("com.android.setupwizard.ResultCode", 0)) .isEqualTo(Activity.RESULT_OK); assertWithMessage("Extra data should surface as extra in nextIntent") .that(nextIntent.getStringExtra("extraData")) .isEqualTo("shazam"); } @Test public void testIsSetupWizardTrue() { final Intent intent = new Intent(); intent.putExtra("firstRun", true); assertWithMessage("Is setup wizard should be true") .that(WizardManagerHelper.isSetupWizardIntent(intent)) .isTrue(); } @Test public void testIsDeferredSetupTrue() { final Intent intent = new Intent(); intent.putExtra("deferredSetup", true); assertWithMessage("Is deferred setup wizard should be true") .that(WizardManagerHelper.isDeferredSetupWizard(intent)) .isTrue(); } @Test public void testIsPreDeferredSetupTrue() { final Intent intent = new Intent(); intent.putExtra("preDeferredSetup", true); assertWithMessage("Is pre-deferred setup wizard should be true") .that(WizardManagerHelper.isPreDeferredSetupWizard(intent)) .isTrue(); } @Test public void testIsSetupWizardFalse() { final Intent intent = new Intent(); intent.putExtra("firstRun", false); assertWithMessage("Is setup wizard should be true") .that(WizardManagerHelper.isSetupWizardIntent(intent)) .isFalse(); } @Test public void isLightTheme_shouldReturnTrue_whenThemeIsLight() { List lightThemes = Arrays.asList( "holo_light", "material_light", "glif_light", "glif_v2_light", "glif_v3_light"); ArrayList unexpectedIntentThemes = new ArrayList<>(); ArrayList unexpectedStringThemes = new ArrayList<>(); for (final String theme : lightThemes) { Intent intent = new Intent(); intent.putExtra(WizardManagerHelper.EXTRA_THEME, theme); if (!WizardManagerHelper.isLightTheme(intent, false)) { unexpectedIntentThemes.add(theme); } if (!WizardManagerHelper.isLightTheme(theme, false)) { unexpectedStringThemes.add(theme); } } assertWithMessage("Intent themes " + unexpectedIntentThemes + " should be light") .that(unexpectedIntentThemes.isEmpty()) .isTrue(); assertWithMessage("String themes " + unexpectedStringThemes + " should be light") .that(unexpectedStringThemes.isEmpty()) .isTrue(); } @Test public void isLightTheme_shouldReturnFalse_whenThemeIsNotLight() { List lightThemes = Arrays.asList("holo", "material", "glif", "glif_v2", "glif_v3"); ArrayList unexpectedIntentThemes = new ArrayList<>(); ArrayList unexpectedStringThemes = new ArrayList<>(); for (final String theme : lightThemes) { Intent intent = new Intent(); intent.putExtra(WizardManagerHelper.EXTRA_THEME, theme); if (WizardManagerHelper.isLightTheme(intent, true)) { unexpectedIntentThemes.add(theme); } if (WizardManagerHelper.isLightTheme(theme, true)) { unexpectedStringThemes.add(theme); } } assertWithMessage("Intent themes " + unexpectedIntentThemes + " should not be light") .that(unexpectedIntentThemes.isEmpty()) .isTrue(); assertWithMessage("String themes " + unexpectedStringThemes + " should not be light") .that(unexpectedStringThemes.isEmpty()) .isTrue(); } @Test public void getThemeRes_whenOldestSupportedThemeTakeEffect_shouldReturnDefault() { Intent intent = new Intent(); intent.putExtra(WizardManagerHelper.EXTRA_THEME, "material"); assertThat(WizardManagerHelper.getThemeRes(intent, 0, WizardManagerHelper.THEME_GLIF_V2)) .isEqualTo(0); } @Test public void getThemeRes_whenOldestSupportedThemeNotTakeEffect_shouldReturnCurrent() { Intent intent = new Intent(); intent.putExtra(WizardManagerHelper.EXTRA_THEME, "glif_v3"); assertThat(WizardManagerHelper.getThemeRes(intent, 0, WizardManagerHelper.THEME_GLIF_V2)) .isEqualTo(R.style.SuwThemeGlifV3); } @Test public void testIsLightThemeDefault() { final Intent intent = new Intent(); intent.putExtra("theme", "abracadabra"); assertWithMessage("isLightTheme should return default value true") .that(WizardManagerHelper.isLightTheme(intent, true)) .isTrue(); assertWithMessage("isLightTheme should return default value false") .that(WizardManagerHelper.isLightTheme(intent, false)) .isFalse(); } @Test public void testIsLightThemeUnspecified() { final Intent intent = new Intent(); assertWithMessage("isLightTheme should return default value true") .that(WizardManagerHelper.isLightTheme(intent, true)) .isTrue(); assertWithMessage("isLightTheme should return default value false") .that(WizardManagerHelper.isLightTheme(intent, false)) .isFalse(); } @Test public void testGetThemeResGlifV3Light() { assertThat(WizardManagerHelper.getThemeRes("glif_v3_light", 0)) .isEqualTo(R.style.SuwThemeGlifV3_Light); } @Test public void testGetThemeResGlifV3() { assertThat(WizardManagerHelper.getThemeRes("glif_v3", 0)).isEqualTo(R.style.SuwThemeGlifV3); } @Test public void testGetThemeResGlifV2Light() { assertThat(WizardManagerHelper.getThemeRes("glif_v2_light", 0)) .isEqualTo(R.style.SuwThemeGlifV2_Light); } @Test public void testGetThemeResGlifV2() { assertThat(WizardManagerHelper.getThemeRes("glif_v2", 0)).isEqualTo(R.style.SuwThemeGlifV2); } @Test public void testGetThemeResGlifLight() { assertThat(WizardManagerHelper.getThemeRes("glif_light", 0)) .isEqualTo(R.style.SuwThemeGlif_Light); } @Test public void testGetThemeResGlif() { assertThat(WizardManagerHelper.getThemeRes("glif", 0)).isEqualTo(R.style.SuwThemeGlif); } @Test public void testGetThemeResMaterialLight() { assertThat(WizardManagerHelper.getThemeRes("material_light", 0)) .isEqualTo(R.style.SuwThemeMaterial_Light); } @Test public void testGetThemeResMaterial() { assertThat(WizardManagerHelper.getThemeRes("material", 0)).isEqualTo(R.style.SuwThemeMaterial); } @Test public void testGetThemeResDefault() { @StyleRes int def = 123; assertThat(WizardManagerHelper.getThemeRes("abracadabra", def)).isEqualTo(def); } @Test public void testGetThemeResNull() { @StyleRes int def = 123; assertThat(WizardManagerHelper.getThemeRes((String) null, def)).isEqualTo(def); } @Test public void testGetThemeResFromIntent() { Intent intent = new Intent(); intent.putExtra(WizardManagerHelper.EXTRA_THEME, "material"); assertThat(WizardManagerHelper.getThemeRes(intent, 0)).isEqualTo(R.style.SuwThemeMaterial); } @Test public void testCopyWizardManagerIntent() { Bundle wizardBundle = new Bundle(); wizardBundle.putString("foo", "bar"); Intent originalIntent = new Intent() .putExtra(WizardManagerHelper.EXTRA_THEME, "test_theme") .putExtra(WizardManagerHelper.EXTRA_WIZARD_BUNDLE, wizardBundle) .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true) .putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true) .putExtra(WizardManagerHelper.EXTRA_IS_PRE_DEFERRED_SETUP, true) // Script URI and Action ID are kept for backwards compatibility .putExtra(WizardManagerHelper.EXTRA_SCRIPT_URI, "test_script_uri") .putExtra(WizardManagerHelper.EXTRA_ACTION_ID, "test_action_id"); Intent intent = new Intent("test.intent.action"); WizardManagerHelper.copyWizardManagerExtras(originalIntent, intent); assertWithMessage("Intent action should be kept") .that(intent.getAction()) .isEqualTo("test.intent.action"); assertWithMessage("EXTRA_THEME should be copied") .that(intent.getStringExtra(WizardManagerHelper.EXTRA_THEME)) .isEqualTo("test_theme"); Bundle copiedWizardBundle = intent.getParcelableExtra(WizardManagerHelper.EXTRA_WIZARD_BUNDLE); assertWithMessage("Wizard bundle should be copied") .that(copiedWizardBundle.getString("foo")) .isEqualTo("bar"); assertWithMessage("EXTRA_IS_FIRST_RUN should be copied") .that(intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, false)) .isTrue(); assertWithMessage("EXTRA_IS_DEFERRED_SETUP should be copied") .that(intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, false)) .isTrue(); assertWithMessage("EXTRA_IS_PRE_DEFERRED_SETUP should be copied") .that(intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_PRE_DEFERRED_SETUP, false)) .isTrue(); // Script URI and Action ID are replaced by Wizard Bundle in M, but are kept for backwards // compatibility assertWithMessage("EXTRA_SCRIPT_URI should be copied") .that(intent.getStringExtra(WizardManagerHelper.EXTRA_SCRIPT_URI)) .isEqualTo("test_script_uri"); assertWithMessage("EXTRA_ACTION_ID should be copied") .that(intent.getStringExtra(WizardManagerHelper.EXTRA_ACTION_ID)) .isEqualTo("test_action_id"); } @TargetApi(VERSION_CODES.JELLY_BEAN_MR1) @Test public void testIsUserSetupComplete() { Settings.Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1); Settings.Secure.putInt(application.getContentResolver(), "user_setup_complete", 1); assertThat(WizardManagerHelper.isUserSetupComplete(application)).isTrue(); Settings.Secure.putInt(application.getContentResolver(), "user_setup_complete", 0); assertThat(WizardManagerHelper.isUserSetupComplete(application)).isFalse(); } @Test @Config(sdk = VERSION_CODES.JELLY_BEAN) public void testIsUserSetupCompleteCompat() { Settings.Secure.putInt(application.getContentResolver(), Secure.DEVICE_PROVISIONED, 1); assertThat(WizardManagerHelper.isUserSetupComplete(application)).isTrue(); Settings.Secure.putInt(application.getContentResolver(), Secure.DEVICE_PROVISIONED, 0); assertThat(WizardManagerHelper.isUserSetupComplete(application)).isFalse(); } @TargetApi(VERSION_CODES.JELLY_BEAN_MR1) @Test public void testIsDeviceProvisioned() { Settings.Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1); assertThat(WizardManagerHelper.isDeviceProvisioned(application)).isTrue(); Settings.Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0); assertThat(WizardManagerHelper.isDeviceProvisioned(application)).isFalse(); } @Test @Config(sdk = VERSION_CODES.JELLY_BEAN) public void testIsDeviceProvisionedCompat() { Settings.Secure.putInt(application.getContentResolver(), Secure.DEVICE_PROVISIONED, 1); assertThat(WizardManagerHelper.isDeviceProvisioned(application)).isTrue(); Settings.Secure.putInt(application.getContentResolver(), Secure.DEVICE_PROVISIONED, 0); assertThat(WizardManagerHelper.isDeviceProvisioned(application)).isFalse(); } @Test public void applyTheme_glifDayNight_shouldApplyThemeToActivity() { Activity activity = Robolectric.buildActivity( Activity.class, new Intent() .putExtra( WizardManagerHelper.EXTRA_THEME, WizardManagerHelper.THEME_GLIF_LIGHT)) .setup() .get(); WizardManagerHelper.applyTheme(activity); assertThat(shadowOf(activity).callGetThemeResId()).isEqualTo(R.style.SuwThemeGlif_DayNight); } }