blob: b6f4217453de2a34db9d8b12c858e392aea10f80 [file] [log] [blame]
/*
* 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);
}
}