/* * Copyright (C) 2018 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.documentsui.ui; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.util.DisplayMetrics; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.documentsui.R; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; /** * The TestBase class define getThemeByUiMode API and prepare setUp and tearDown for Theme test */ @SmallTest @RunWith(AndroidJUnit4.class) public abstract class ThemeUiTestBase { protected Context mTargetContext; protected Configuration mConfiguration; protected DisplayMetrics mDisplayMetrics; protected CompatibilityInfo mCompatibilityInfo; protected Resources.Theme mTheme; @Before public void setUp() throws Exception { mTargetContext = InstrumentationRegistry.getTargetContext(); mConfiguration = mTargetContext.getResources().getConfiguration(); mDisplayMetrics = mTargetContext.getResources().getDisplayMetrics(); mCompatibilityInfo = mTargetContext.getResources().getCompatibilityInfo(); } @After public void tearDown() throws Exception { mTargetContext.getResources().updateConfiguration(mConfiguration, mDisplayMetrics, mCompatibilityInfo); } /** * The method to return the customized theme base on UI_MODE_NIGHT_YES or UI_MODE_NIGHT_NO * * @param context The applicationContext from Test App * @param nightModeFlag Only support Configuration.UI_MODE_NIGHT_YES or UI_MODE_NIGHT_NO * @return Resources.Theme Applied target App's style/DocumentsTheme */ protected Resources.Theme getThemeByUiMode(Context context, int nightModeFlag) { final CompatibilityInfo ci = context.getResources().getCompatibilityInfo(); final DisplayMetrics dm = context.getResources().getDisplayMetrics(); final Configuration nightConfig = new Configuration( context.getResources().getConfiguration()); nightConfig.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK; nightConfig.uiMode |= nightModeFlag; context.getResources().updateConfiguration(nightConfig, dm, ci); // Resources.theme won't be updated by updateConfiguration() // hence, we need to create new Resources.theme to force apply again final Resources.Theme theme = context.getResources().newTheme(); theme.applyStyle(R.style.DocumentsTheme, true); theme.applyStyle(R.style.DocumentsDefaultTheme, false); return theme; } /** * The method to assert target theme defined color match expected color * * @param styleable The scope of attrs defined in the theme * @param attr The specific target color to retrieve * @param expected The expected color in the theme */ protected void assertTheme(int[] styleable, int attr, int expected) { final TypedArray ta = mTheme.obtainStyledAttributes(styleable); final int targetColor = ta.getColor(attr, ~expected); ta.recycle(); assertThat(targetColor).isEqualTo(expected); } /** * The method to assert target theme defined config match expected boolean * * @param styleable The scope of attrs defined in the theme * @param attr The specific target config to retrieve * @param expected The expected boolean of defined attr in the theme */ protected void assertTheme(int[] styleable, int attr, boolean expected) { final TypedArray ta = mTheme.obtainStyledAttributes(styleable); final boolean targetBoolean = ta.getBoolean(attr, !expected); ta.recycle(); assertThat(targetBoolean).isEqualTo(expected); } }