resources/src/main/java/org/robolectric/res/android/ResTable_config.java
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;
  }
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;
  }
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 ] == ' ' ) { // could not determine the request's script countriesMustMatch = true ; } else { if ( localeScript [ 0 ] == ' ' && ! localeScriptWasComputed ) { // script was not provided or computed, so we try to compute it localeDataComputeScript ( computed_script , language , country ) ; if ( computed_script [ 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 ] != ' ' && ! 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 ; }
/*
boolean match(final ResTable_config settings) {
System.out.println(this + ".match(" + settings + ")");
boolean result = match_(settings);
System.out.println("    -> " + result);
return result;
}
/ * boolean match ( final ResTable_config settings ) { System . out . println ( this + . match ( + settings + ) ) ; boolean result = match_ ( settings ) ; System . out . println ( - > + result ) ; return result ; }