1 package org.robolectric.android; 2 3 import android.content.res.AssetManager; 4 import android.content.res.Configuration; 5 import android.content.res.Resources; 6 import android.util.DisplayMetrics; 7 import org.robolectric.res.Qualifiers; 8 import org.robolectric.shadows.ShadowDateUtils; 9 import org.robolectric.shadows.ShadowDisplayManager; 10 11 public class Bootstrap { 12 13 private static Configuration configuration = new Configuration(); 14 private static DisplayMetrics displayMetrics = new DisplayMetrics(); 15 private static Resources displayResources; 16 /** internal only */ 17 public static boolean displaySet = false; 18 getConfiguration()19 public static Configuration getConfiguration() { 20 if (displayResources != null) { 21 return displayResources.getConfiguration(); 22 } 23 return Bootstrap.configuration; 24 } 25 getDisplayMetrics()26 public static DisplayMetrics getDisplayMetrics() { 27 if (displayResources != null) { 28 return displayResources.getDisplayMetrics(); 29 } 30 return Bootstrap.displayMetrics; 31 } 32 33 /** internal only */ setDisplayConfiguration( Configuration configuration, DisplayMetrics displayMetrics)34 public static void setDisplayConfiguration( 35 Configuration configuration, DisplayMetrics displayMetrics) { 36 Bootstrap.configuration = configuration; 37 Bootstrap.displayMetrics = displayMetrics; 38 } 39 40 /** internal only */ resetDisplayConfiguration()41 public static void resetDisplayConfiguration() { 42 configuration = new Configuration(); 43 displayMetrics = new DisplayMetrics(); 44 displayResources = null; 45 displaySet = false; 46 } 47 48 /** internal only */ updateDisplayResources( Configuration configuration, DisplayMetrics displayMetrics)49 public static void updateDisplayResources( 50 Configuration configuration, DisplayMetrics displayMetrics) { 51 if (displayResources == null) { 52 displayResources = 53 new Resources( 54 AssetManager.getSystem(), Bootstrap.displayMetrics, Bootstrap.configuration); 55 } 56 displayResources.updateConfiguration(configuration, displayMetrics); 57 } 58 59 /** internal only */ setUpDisplay()60 public static void setUpDisplay() { 61 if (!displaySet) { 62 displaySet = true; 63 ShadowDisplayManager.configureDefaultDisplay(configuration, displayMetrics); 64 } 65 } 66 applyQualifiers( String qualifiersStrs, int apiLevel, Configuration configuration, DisplayMetrics displayMetrics)67 public static void applyQualifiers( 68 String qualifiersStrs, 69 int apiLevel, 70 Configuration configuration, 71 DisplayMetrics displayMetrics) { 72 73 String[] qualifiersParts = qualifiersStrs.split(" ", 0); 74 int i = qualifiersParts.length - 1; 75 // find the index of the left-most qualifier string that doesn't start with '+' 76 for (; i >= 0; i--) { 77 String qualifiersStr = qualifiersParts[i]; 78 if (qualifiersStr.startsWith("+")) { 79 qualifiersParts[i] = qualifiersStr.substring(1); 80 } else { 81 break; 82 } 83 } 84 85 for (i = (i < 0) ? 0 : i; i < qualifiersParts.length; i++) { 86 String qualifiersStr = qualifiersParts[i]; 87 int platformVersion = Qualifiers.getPlatformVersion(qualifiersStr); 88 if (platformVersion != -1 && platformVersion != apiLevel) { 89 throw new IllegalArgumentException( 90 "Cannot specify conflicting platform version in qualifiers: \"" + qualifiersStr + "\""); 91 } 92 93 Qualifiers qualifiers = Qualifiers.parse(qualifiersStr); 94 95 DeviceConfig.applyToConfiguration(qualifiers, apiLevel, configuration, displayMetrics); 96 } 97 98 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 99 100 // DateUtils has a static cache of the last Configuration, so it may need to be reset. 101 ShadowDateUtils.resetLastConfig(); 102 } 103 } 104