in resources/src/main/java/org/robolectric/res/android/ResTable_config.java [1447:1633]
public boolean match(final ResTable_config settings) {
if (imsi() != 0) {
if (mcc != 0 && mcc != settings.mcc) {
return false;
}
if (mnc != 0 && mnc != settings.mnc) {
return false;
}
}
if (locale() != 0) {
// Don't consider country and variants when deciding matches.
// (Theoretically, the variant can also affect the script. For
// example, "ar-alalc97" probably implies the Latin script, but since
// CLDR doesn't support getting likely scripts for that, we'll assume
// the variant doesn't change the script.)
//
// If two configs differ only in their country and variant,
// they can be weeded out in the isMoreSpecificThan test.
if (!langsAreEquivalent(language, settings.language)) {
return false;
}
// For backward compatibility and supporting private-use locales, we
// fall back to old behavior if we couldn't determine the script for
// either of the desired locale or the provided locale. But if we could determine
// the scripts, they should be the same for the locales to match.
boolean countriesMustMatch = false;
byte[] computed_script = new byte[4];
byte[] script = null;
if (settings.localeScript[0] == '\0') { // could not determine the request's script
countriesMustMatch = true;
} else {
if (localeScript[0] == '\0' && !localeScriptWasComputed) {
// script was not provided or computed, so we try to compute it
localeDataComputeScript(computed_script, language, country);
if (computed_script[0] == '\0') { // we could not compute the script
countriesMustMatch = true;
} else {
script = computed_script;
}
} else { // script was provided, so just use it
script = localeScript;
}
}
if (countriesMustMatch) {
if (country[0] != '\0' && !areIdentical(country, settings.country)) {
return false;
}
} else {
if (!Arrays.equals(script, settings.localeScript)) {
return false;
}
}
}
if (screenConfig() != 0) {
final int layoutDir = screenLayout&MASK_LAYOUTDIR;
final int setLayoutDir = settings.screenLayout&MASK_LAYOUTDIR;
if (layoutDir != 0 && layoutDir != setLayoutDir) {
return false;
}
final int screenSize = screenLayout&MASK_SCREENSIZE;
final int setScreenSize = settings.screenLayout&MASK_SCREENSIZE;
// Any screen sizes for larger screens than the setting do not
// match.
if (screenSize != 0 && screenSize > setScreenSize) {
return false;
}
final int screenLong = screenLayout&MASK_SCREENLONG;
final int setScreenLong = settings.screenLayout&MASK_SCREENLONG;
if (screenLong != 0 && screenLong != setScreenLong) {
return false;
}
final int uiModeType = uiMode&MASK_UI_MODE_TYPE;
final int setUiModeType = settings.uiMode&MASK_UI_MODE_TYPE;
if (uiModeType != 0 && uiModeType != setUiModeType) {
return false;
}
final int uiModeNight = uiMode&MASK_UI_MODE_NIGHT;
final int setUiModeNight = settings.uiMode&MASK_UI_MODE_NIGHT;
if (uiModeNight != 0 && uiModeNight != setUiModeNight) {
return false;
}
if (smallestScreenWidthDp != 0
&& smallestScreenWidthDp > settings.smallestScreenWidthDp) {
return false;
}
}
if (screenConfig2() != 0) {
final int screenRound = screenLayout2 & MASK_SCREENROUND;
final int setScreenRound = settings.screenLayout2 & MASK_SCREENROUND;
if (screenRound != 0 && screenRound != setScreenRound) {
return false;
}
}
final int hdr = colorMode & MASK_HDR;
final int setHdr = settings.colorMode & MASK_HDR;
if (hdr != 0 && hdr != setHdr) {
return false;
}
final int wideColorGamut = colorMode & MASK_WIDE_COLOR_GAMUT;
final int setWideColorGamut = settings.colorMode & MASK_WIDE_COLOR_GAMUT;
if (wideColorGamut != 0 && wideColorGamut != setWideColorGamut) {
return false;
}
if (screenSizeDp() != 0) {
if (screenWidthDp != 0 && screenWidthDp > settings.screenWidthDp) {
if (kDebugTableSuperNoisy) {
ALOGI("Filtering out width %d in requested %d", screenWidthDp,
settings.screenWidthDp);
}
return false;
}
if (screenHeightDp != 0 && screenHeightDp > settings.screenHeightDp) {
if (kDebugTableSuperNoisy) {
ALOGI("Filtering out height %d in requested %d", screenHeightDp,
settings.screenHeightDp);
}
return false;
}
}
if (screenType() != 0) {
if (orientation != 0 && orientation != settings.orientation) {
return false;
}
// density always matches - we can scale it. See isBetterThan
if (touchscreen != 0 && touchscreen != settings.touchscreen) {
return false;
}
}
if (input() != 0) {
final int keysHidden = inputFlags&MASK_KEYSHIDDEN;
final int setKeysHidden = settings.inputFlags&MASK_KEYSHIDDEN;
if (keysHidden != 0 && keysHidden != setKeysHidden) {
// For compatibility, we count a request for KEYSHIDDEN_NO as also
// matching the more recent KEYSHIDDEN_SOFT. Basically
// KEYSHIDDEN_NO means there is some kind of keyboard available.
if (kDebugTableSuperNoisy) {
ALOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
}
if (keysHidden != KEYSHIDDEN_NO || setKeysHidden != KEYSHIDDEN_SOFT) {
if (kDebugTableSuperNoisy) {
ALOGI("No match!");
}
return false;
}
}
final int navHidden = inputFlags&MASK_NAVHIDDEN;
final int setNavHidden = settings.inputFlags&MASK_NAVHIDDEN;
if (navHidden != 0 && navHidden != setNavHidden) {
return false;
}
if (keyboard != 0 && keyboard != settings.keyboard) {
return false;
}
if (navigation != 0 && navigation != settings.navigation) {
return false;
}
}
if (screenSize() != 0) {
if (screenWidth != 0 && screenWidth > settings.screenWidth) {
return false;
}
if (screenHeight != 0 && screenHeight > settings.screenHeight) {
return false;
}
}
if (version() != 0) {
if (sdkVersion != 0 && sdkVersion > settings.sdkVersion) {
return false;
}
if (minorVersion != 0 && minorVersion != settings.minorVersion) {
return false;
}
}
return true;
}