xref: /aosp_15_r20/external/robolectric/shadows/framework/src/main/java/org/robolectric/android/Bootstrap.java (revision e6ba16074e6af37d123cb567d575f496bf0a58ee)
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