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