19f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamspackage org.robolectric.android; 29f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 39f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport static com.google.common.base.Strings.isNullOrEmpty; 49f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 59f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport android.content.res.Configuration; 69f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport android.os.Build; 79f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport android.os.Build.VERSION_CODES; 89f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport android.util.DisplayMetrics; 99f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport java.util.Locale; 109f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport org.robolectric.res.Qualifiers; 119f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport org.robolectric.res.android.ConfigDescription; 129f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamsimport org.robolectric.res.android.ResTable_config; 139f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 149f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams/** 159f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams * Supports device configuration for Robolectric tests. 169f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams * 179f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams * @see [Device Configuration](http://robolectric.org/device-configuration/) 189f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams */ 199f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williamspublic class DeviceConfig { 209f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public static final int DEFAULT_DENSITY = ResTable_config.DENSITY_DPI_MDPI; 219f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public static final ScreenSize DEFAULT_SCREEN_SIZE = ScreenSize.normal; 229f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 239f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams /** 249f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams * Standard sizes for the 259f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams * [screen size qualifier](https://developer.android.com/guide/topics/resources/providing-resources.html#ScreenSizeQualifier). 269f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams */ 279f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public enum ScreenSize { 289f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams small(320, 426, Configuration.SCREENLAYOUT_SIZE_SMALL), 299f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams normal(320, 470, Configuration.SCREENLAYOUT_SIZE_NORMAL), 309f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams large(480, 640, Configuration.SCREENLAYOUT_SIZE_LARGE), 319f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams xlarge(720, 960, Configuration.SCREENLAYOUT_SIZE_XLARGE); 329f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 339f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public final int width; 349f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public final int height; 359f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public final int landscapeWidth; 369f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams public final int landscapeHeight; 379f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private final int configValue; 389f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 399f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ScreenSize(int width, int height, int configValue) { 409f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams this.width = width; 419f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams this.height = height; 429f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 439f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 449f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams this.landscapeWidth = height; 459f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 469f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams this.landscapeHeight = width; 479f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 489f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams this.configValue = configValue; 499f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 509f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 519f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private boolean isSmallerThanOrEqualTo(int x, int y) { 529f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (y < x) { 539f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int oldY = y; 549f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 559f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams y = x; 569f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 579f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams x = oldY; 589f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 599f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 609f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return width <= x && height <= y; 619f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 629f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 639f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams static ScreenSize find(int configValue) { 649f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams switch (configValue) { 659f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case Configuration.SCREENLAYOUT_SIZE_SMALL: 669f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return small; 679f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case Configuration.SCREENLAYOUT_SIZE_NORMAL: 689f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return normal; 699f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case Configuration.SCREENLAYOUT_SIZE_LARGE: 709f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return large; 719f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case Configuration.SCREENLAYOUT_SIZE_XLARGE: 729f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return xlarge; 739f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case Configuration.SCREENLAYOUT_SIZE_UNDEFINED: 749f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return null; 759f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams default: 769f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams throw new IllegalArgumentException(); 779f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 789f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 799f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 809f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams static ScreenSize match(int x, int y) { 819f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ScreenSize bestMatch = small; 829f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 839f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams for (ScreenSize screenSize : values()) { 849f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (screenSize.isSmallerThanOrEqualTo(x, y)) { 859f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams bestMatch = screenSize; 869f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 879f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 889f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 899f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return bestMatch; 909f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 919f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 929f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 939f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private DeviceConfig() { 949f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 959f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 969f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams static void applyToConfiguration(Qualifiers qualifiers, int apiLevel, 979f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams Configuration configuration, DisplayMetrics displayMetrics) { 989f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ResTable_config resTab = qualifiers.getConfig(); 999f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1009f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.mcc != 0) { 1019f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.mcc = resTab.mcc; 1029f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1039f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1049f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.mnc != 0) { 1059f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.mnc = resTab.mnc; 1069f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1079f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1089f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams // screenLayout includes size, long, layoutdir, and round. 1099f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams // layoutdir may be overridden by setLocale(), so do this first: 1109f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int screenLayoutSize = getScreenLayoutSize(configuration); 1119f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabSize = resTab.screenLayoutSize(); 1129f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabSize != ResTable_config.SCREENSIZE_ANY) { 1139f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams screenLayoutSize = resTabSize; 11432688a8334107e514372ec2e08b40718035f62ecChristian Williams 11532688a8334107e514372ec2e08b40718035f62ecChristian Williams if (resTab.screenWidthDp == 0) { 11632688a8334107e514372ec2e08b40718035f62ecChristian Williams configuration.screenWidthDp = 0; 11732688a8334107e514372ec2e08b40718035f62ecChristian Williams } 11832688a8334107e514372ec2e08b40718035f62ecChristian Williams 11932688a8334107e514372ec2e08b40718035f62ecChristian Williams if (resTab.screenHeightDp == 0) { 12032688a8334107e514372ec2e08b40718035f62ecChristian Williams configuration.screenHeightDp = 0; 12132688a8334107e514372ec2e08b40718035f62ecChristian Williams } 1229f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1239f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1249f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int screenLayoutLong = getScreenLayoutLong(configuration); 1259f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabLong = resTab.screenLayoutLong(); 1269f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabLong != ResTable_config.SCREENLONG_ANY) { 1279f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams screenLayoutLong = resTabLong; 1289f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1299f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1309f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int screenLayoutLayoutDir = getScreenLayoutLayoutDir(configuration); 1319f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabLayoutDir = resTab.screenLayoutDirection(); 1329f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabLayoutDir != ResTable_config.LAYOUTDIR_ANY) { 1339f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams screenLayoutLayoutDir = resTabLayoutDir; 1349f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1359f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1369f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int screenLayoutRound = getScreenLayoutRound(configuration); 1379f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabRound = resTab.screenLayoutRound(); 1389f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabRound != ResTable_config.SCREENROUND_ANY) { 1399f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams screenLayoutRound = resTabRound << 8; 1409f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1419f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1429f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenLayout = 1439f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams screenLayoutSize | screenLayoutLong | screenLayoutLayoutDir | screenLayoutRound; 1449f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1459f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams // locale... 1469f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams String lang = resTab.languageString(); 1479f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams String region = resTab.regionString(); 1489f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams String script = resTab.scriptString(); 1499f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1509f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams Locale locale; 1519f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (isNullOrEmpty(lang) && isNullOrEmpty(region) && isNullOrEmpty(script)) { 1529f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams locale = null; 1539f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } else { 1549f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams locale = new Locale.Builder() 1559f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams .setLanguage(lang) 1569f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams .setRegion(region) 1579f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams .setScript(script == null ? "" : script) 1589f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams .build(); 1599f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1609f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (locale != null) { 1619f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setLocale(apiLevel, configuration, locale); 1629f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1639f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1649f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.smallestScreenWidthDp != 0) { 1659f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.smallestScreenWidthDp = resTab.smallestScreenWidthDp; 1669f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1679f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1689f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.screenWidthDp != 0) { 1699f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenWidthDp = resTab.screenWidthDp; 1709f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1719f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1729f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.screenHeightDp != 0) { 1739f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenHeightDp = resTab.screenHeightDp; 1749f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1759f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1769f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.orientation != ResTable_config.ORIENTATION_ANY) { 1779f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.orientation = resTab.orientation; 1789f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1799f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1809f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams // uiMode includes type and night... 1819f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int uiModeType = getUiModeType(configuration); 1829f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabType = resTab.uiModeType(); 1839f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabType != ResTable_config.UI_MODE_TYPE_ANY) { 1849f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams uiModeType = resTabType; 1859f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1869f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1879f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int uiModeNight = getUiModeNight(configuration); 1889f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int resTabNight = resTab.uiModeNight(); 1899f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTabNight != ResTable_config.UI_MODE_NIGHT_ANY) { 1909f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams uiModeNight = resTabNight; 1919f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1929f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.uiMode = uiModeType | uiModeNight; 1939f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1949f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.density != ResTable_config.DENSITY_DEFAULT) { 1959f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setDensity(resTab.density, apiLevel, configuration, displayMetrics); 1969f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 1979f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 1989f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.touchscreen != ResTable_config.TOUCHSCREEN_ANY) { 1999f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.touchscreen = resTab.touchscreen; 2009f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2019f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2029f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.keyboard != ResTable_config.KEYBOARD_ANY) { 2039f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.keyboard = resTab.keyboard; 2049f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2059f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2069f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.keyboardHidden() != ResTable_config.KEYSHIDDEN_ANY) { 2079f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.keyboardHidden = resTab.keyboardHidden(); 2089f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2099f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2109f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.navigation != ResTable_config.NAVIGATION_ANY) { 2119f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.navigation = resTab.navigation; 2129f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2139f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2149f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (resTab.navigationHidden() != ResTable_config.NAVHIDDEN_ANY) { 2159f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.navigationHidden = resTab.navigationHidden(); 2169f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 217c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 218c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams if (apiLevel >= VERSION_CODES.O) { 219c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams if (resTab.colorModeWideColorGamut() != ResTable_config.WIDE_COLOR_GAMUT_ANY) { 220c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams setColorModeGamut(configuration, resTab.colorMode & ResTable_config.MASK_WIDE_COLOR_GAMUT); 221c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 222c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 223c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams if (resTab.colorModeHdr() != ResTable_config.HDR_ANY) { 224c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams setColorModeHdr(configuration, resTab.colorMode & ResTable_config.MASK_HDR); 225c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 226c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 2279f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2289f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2299f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setDensity(int densityDpi, int apiLevel, Configuration configuration, 2309f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams DisplayMetrics displayMetrics) { 2319f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (apiLevel >= VERSION_CODES.JELLY_BEAN_MR1) { 2329f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.densityDpi = densityDpi; 2339f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2349f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams displayMetrics.densityDpi = densityDpi; 2359f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams displayMetrics.density = displayMetrics.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE; 2369f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2379f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2389f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams static void applyRules(Configuration configuration, DisplayMetrics displayMetrics, int apiLevel) { 2399f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams Locale locale = getLocale(configuration, apiLevel); 2409f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2419f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams String language = locale == null ? "" : locale.getLanguage(); 2429f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (language.isEmpty()) { 2439f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams language = "en"; 2449f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2459f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams String country = locale == null ? "" : locale.getCountry(); 2469f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (country.isEmpty()) { 2479f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams country = "us"; 2489f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2499f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2509f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams locale = new Locale(language, country); 2519f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setLocale(apiLevel, configuration, locale); 2529f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2539f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2549f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (apiLevel <= ConfigDescription.SDK_JELLY_BEAN && 2559f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams getScreenLayoutLayoutDir(configuration) == Configuration.SCREENLAYOUT_LAYOUTDIR_UNDEFINED) { 2569f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setScreenLayoutLayoutDir(configuration, Configuration.SCREENLAYOUT_LAYOUTDIR_LTR); 2579f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2589f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 25932688a8334107e514372ec2e08b40718035f62ecChristian Williams ScreenSize requestedScreenSize = getScreenSize(configuration); 2609f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (requestedScreenSize == null) { 2619f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams requestedScreenSize = DEFAULT_SCREEN_SIZE; 2629f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2639f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2649f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.orientation == Configuration.ORIENTATION_UNDEFINED 2659f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams && configuration.screenWidthDp != 0 && configuration.screenHeightDp != 0) { 2669f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.orientation = (configuration.screenWidthDp > configuration.screenHeightDp) 2679f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ? Configuration.ORIENTATION_LANDSCAPE 2689f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams : Configuration.ORIENTATION_PORTRAIT; 2699f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2709f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2719f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.screenWidthDp == 0) { 2729f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenWidthDp = requestedScreenSize.width; 2739f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2749f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2759f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.screenHeightDp == 0) { 2769f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenHeightDp = requestedScreenSize.height; 2779f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2789f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if ((configuration.screenLayout & Configuration.SCREENLAYOUT_LONG_MASK) 2799f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams == Configuration.SCREENLAYOUT_LONG_YES) { 2809f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenHeightDp = (int) (configuration.screenHeightDp * 1.25f); 2819f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2829f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2839f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2849f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int lesserDimenPx = Math.min(configuration.screenWidthDp, configuration.screenHeightDp); 2859f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int greaterDimenPx = Math.max(configuration.screenWidthDp, configuration.screenHeightDp); 2869f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2879f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.smallestScreenWidthDp == 0) { 2889f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.smallestScreenWidthDp = lesserDimenPx; 2899f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2909f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2919f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (getScreenLayoutSize(configuration) == Configuration.SCREENLAYOUT_SIZE_UNDEFINED) { 2929f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ScreenSize screenSize = 2939f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ScreenSize.match(configuration.screenWidthDp, configuration.screenHeightDp); 2949f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setScreenLayoutSize(configuration, screenSize.configValue); 2959f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 2969f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 2979f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (getScreenLayoutLong(configuration) == Configuration.SCREENLAYOUT_LONG_UNDEFINED) { 2989f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setScreenLayoutLong(configuration, 2999f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ((float) greaterDimenPx) / lesserDimenPx >= 1.75 3009f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ? Configuration.SCREENLAYOUT_LONG_YES 3019f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams : Configuration.SCREENLAYOUT_LONG_NO); 3029f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3039f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3049f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (getScreenLayoutRound(configuration) == Configuration.SCREENLAYOUT_ROUND_UNDEFINED) { 3059f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setScreenLayoutRound(configuration, Configuration.SCREENLAYOUT_ROUND_NO); 3069f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3079f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3089f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.orientation == Configuration.ORIENTATION_UNDEFINED) { 3099f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.orientation = configuration.screenWidthDp > configuration.screenHeightDp 3109f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams ? Configuration.ORIENTATION_LANDSCAPE 3119f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams : Configuration.ORIENTATION_PORTRAIT; 3129f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } else if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT 3139f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams && configuration.screenWidthDp > configuration.screenHeightDp) { 3149f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams swapXY(configuration); 3159f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } else if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE 3169f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams && configuration.screenWidthDp < configuration.screenHeightDp) { 3179f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams swapXY(configuration); 3189f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3199f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3209f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (getUiModeNight(configuration) == Configuration.UI_MODE_NIGHT_UNDEFINED) { 3219f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setUiModeNight(configuration, Configuration.UI_MODE_NIGHT_NO); 3229f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3239f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3249f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams switch (displayMetrics.densityDpi) { 3259f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case ResTable_config.DENSITY_DPI_ANY: 3269f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams throw new IllegalArgumentException("'anydpi' isn't actually a dpi"); 3279f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case ResTable_config.DENSITY_DPI_NONE: 3289f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams throw new IllegalArgumentException("'nodpi' isn't actually a dpi"); 3299f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams case ResTable_config.DENSITY_DPI_UNDEFINED: 3309f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams // DisplayMetrics.DENSITY_DEFAULT is mdpi 3319f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams setDensity(DEFAULT_DENSITY, apiLevel, configuration, displayMetrics); 3329f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3339f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3349f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.touchscreen == Configuration.TOUCHSCREEN_UNDEFINED) { 3359f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.touchscreen = Configuration.TOUCHSCREEN_FINGER; 3369f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3379f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3389f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.keyboardHidden == Configuration.KEYBOARDHIDDEN_UNDEFINED) { 3399f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.keyboardHidden = Configuration.KEYBOARDHIDDEN_SOFT; 3409f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3419f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3429f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.keyboard == Configuration.KEYBOARD_UNDEFINED) { 343605b0c0426c447679b7269f3fc41ac8d28ac8daeChristian Williams configuration.keyboard = Configuration.KEYBOARD_NOKEYS; 3449f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3459f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3469f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.navigationHidden == Configuration.NAVIGATIONHIDDEN_UNDEFINED) { 3479f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.navigationHidden = Configuration.NAVIGATIONHIDDEN_YES; 3489f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3499f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3509f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (configuration.navigation == Configuration.NAVIGATION_UNDEFINED) { 3519f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.navigation = Configuration.NAVIGATION_NONAV; 3529f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3539f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3549f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 35532688a8334107e514372ec2e08b40718035f62ecChristian Williams public static ScreenSize getScreenSize(Configuration configuration) { 35632688a8334107e514372ec2e08b40718035f62ecChristian Williams return ScreenSize.find(getScreenLayoutSize(configuration)); 35732688a8334107e514372ec2e08b40718035f62ecChristian Williams } 35832688a8334107e514372ec2e08b40718035f62ecChristian Williams 3599f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void swapXY(Configuration configuration) { 3609f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams int oldWidth = configuration.screenWidthDp; 3619f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 3629f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenWidthDp = configuration.screenHeightDp; 3639f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams //noinspection SuspiciousNameCombination 3649f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenHeightDp = oldWidth; 3659f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3669f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3679f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setLocale(int apiLevel, Configuration configuration, Locale locale) { 3689f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (apiLevel >= VERSION_CODES.JELLY_BEAN_MR1) { 3699f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.setLocale(locale); 3709f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } else { 3719f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.locale = locale; 3729f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3739f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3749f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3759f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static Locale getLocale(Configuration configuration, int apiLevel) { 3769f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams Locale locale; 3779f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams if (apiLevel > Build.VERSION_CODES.M) { 3789f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams locale = configuration.getLocales().get(0); 3799f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } else { 3809f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams locale = configuration.locale; 3819f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3829f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return locale; 3839f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3849f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3859f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getScreenLayoutSize(Configuration configuration) { 3869f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; 3879f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3889f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3899f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setScreenLayoutSize(Configuration configuration, int value) { 3909f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenLayout = 3919f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams (configuration.screenLayout & ~Configuration.SCREENLAYOUT_SIZE_MASK) 3929f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams | value; 3939f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3949f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3959f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getScreenLayoutLong(Configuration configuration) { 3969f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.screenLayout & Configuration.SCREENLAYOUT_LONG_MASK; 3979f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 3989f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 3999f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setScreenLayoutLong(Configuration configuration, int value) { 4009f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenLayout = 4019f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams (configuration.screenLayout & ~Configuration.SCREENLAYOUT_LONG_MASK) 4029f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams | value; 4039f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4049f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4059f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getScreenLayoutLayoutDir(Configuration configuration) { 4069f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.screenLayout & Configuration.SCREENLAYOUT_LAYOUTDIR_MASK; 4079f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4089f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4099f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setScreenLayoutLayoutDir(Configuration configuration, int value) { 4109f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenLayout = 4119f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams (configuration.screenLayout & ~Configuration.SCREENLAYOUT_LAYOUTDIR_MASK) 4129f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams | value; 4139f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4149f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4159f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getScreenLayoutRound(Configuration configuration) { 4169f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.screenLayout & Configuration.SCREENLAYOUT_ROUND_MASK; 4179f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4189f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4199f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setScreenLayoutRound(Configuration configuration, int value) { 4209f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.screenLayout = 4219f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams (configuration.screenLayout & ~Configuration.SCREENLAYOUT_ROUND_MASK) 4229f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams | value; 4239f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4249f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4259f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getUiModeType(Configuration configuration) { 4269f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.uiMode & Configuration.UI_MODE_TYPE_MASK; 4279f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4289f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4299f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setUiModeType(Configuration configuration, int value) { 4309f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.uiMode = (configuration.uiMode & ~Configuration.UI_MODE_TYPE_MASK) | value; 4319f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4329f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4339f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static int getUiModeNight(Configuration configuration) { 4349f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams return configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; 4359f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 4369f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams 4379f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams private static void setUiModeNight(Configuration configuration, int value) { 4389f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams configuration.uiMode = (configuration.uiMode & ~Configuration.UI_MODE_NIGHT_MASK) | value; 4399f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams } 440c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 441c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams private static int getColorModeGamut(Configuration configuration) { 442c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams return configuration.colorMode & Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_MASK; 443c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 444c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 445c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams private static void setColorModeGamut(Configuration configuration, int value) { 446c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams configuration.colorMode = (configuration.colorMode & ~Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_MASK) | value; 447c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 448c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 449c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams private static int getColorModeHdr(Configuration configuration) { 450c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams return configuration.colorMode & Configuration.COLOR_MODE_HDR_MASK; 451c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 452c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams 453c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams private static void setColorModeHdr(Configuration configuration, int value) { 454c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams configuration.colorMode = (configuration.colorMode & ~Configuration.COLOR_MODE_HDR_MASK) | value; 455c19b8447057501b0f615244f17b9d97f998ecae9Christian Williams } 4569f69dc80a8ac7e48cbf50f65974d4986ab7f00ecChristian Williams} 457