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