Home | History | Annotate | Download | only in android
      1 package org.robolectric.android;
      2 
      3 import android.content.res.Configuration;
      4 import android.os.Build;
      5 import android.os.Build.VERSION_CODES;
      6 import android.util.DisplayMetrics;
      7 import com.google.common.annotations.VisibleForTesting;
      8 import org.robolectric.RuntimeEnvironment;
      9 import org.robolectric.res.Qualifiers;
     10 import org.robolectric.shadows.ShadowDisplayManager;
     11 import org.robolectric.shadows.ShadowWindowManagerImpl;
     12 
     13 public class Bootstrap {
     14 
     15   public static void setUpDisplay(Configuration configuration, DisplayMetrics displayMetrics) {
     16     if (Build.VERSION.SDK_INT == VERSION_CODES.JELLY_BEAN) {
     17       ShadowWindowManagerImpl.configureDefaultDisplayForJBOnly(configuration, displayMetrics);
     18     } else {
     19       ShadowDisplayManager.configureDefaultDisplay(configuration, displayMetrics);
     20     }
     21   }
     22 
     23   @VisibleForTesting
     24   public static void applyQualifiers(String qualifiersStrs, int apiLevel,
     25       Configuration configuration, DisplayMetrics displayMetrics) {
     26 
     27     String[] qualifiersParts = qualifiersStrs.split(" ");
     28     int i = qualifiersParts.length - 1;
     29     // find the index of the left-most qualifier string that doesn't start with '+'
     30     for (; i >= 0 ; i--) {
     31       String qualifiersStr = qualifiersParts[i];
     32       if (qualifiersStr.startsWith("+")) {
     33         qualifiersParts[i] = qualifiersStr.substring(1);
     34       } else {
     35         break;
     36       }
     37     }
     38 
     39     for (i = (i < 0) ? 0 : i; i < qualifiersParts.length ; i++) {
     40       String qualifiersStr = qualifiersParts[i];
     41       int platformVersion = Qualifiers.getPlatformVersion(qualifiersStr);
     42       if (platformVersion != -1 && platformVersion != apiLevel) {
     43         throw new IllegalArgumentException(
     44             "Cannot specify conflicting platform version in qualifiers: \"" + qualifiersStr + "\"");
     45       }
     46 
     47       Qualifiers qualifiers = Qualifiers.parse(qualifiersStr);
     48 
     49       DeviceConfig.applyToConfiguration(qualifiers, apiLevel, configuration, displayMetrics);
     50     }
     51 
     52     DeviceConfig.applyRules(configuration, displayMetrics, apiLevel);
     53 
     54     fixJellyBean(configuration, displayMetrics);
     55   }
     56 
     57   private static void fixJellyBean(Configuration configuration, DisplayMetrics displayMetrics) {
     58     if (RuntimeEnvironment.getApiLevel() < Build.VERSION_CODES.KITKAT) {
     59       int widthPx = (int) (configuration.screenWidthDp * displayMetrics.density);
     60       int heightPx = (int) (configuration.screenHeightDp * displayMetrics.density);
     61       displayMetrics.widthPixels = displayMetrics.noncompatWidthPixels = widthPx;
     62       displayMetrics.heightPixels = displayMetrics.noncompatHeightPixels = heightPx;
     63       displayMetrics.xdpi = displayMetrics.noncompatXdpi = displayMetrics.densityDpi;
     64       displayMetrics.ydpi = displayMetrics.noncompatYdpi = displayMetrics.densityDpi;
     65     }
     66   }
     67 
     68 }
     69