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