xref: /aosp_15_r20/frameworks/base/tools/aapt/AaptConfig.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include <androidfw/ResourceTypes.h>
18*d57664e9SAndroid Build Coastguard Worker #include <ctype.h>
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include "AaptConfig.h"
21*d57664e9SAndroid Build Coastguard Worker #include "AaptAssets.h"
22*d57664e9SAndroid Build Coastguard Worker #include "AaptUtil.h"
23*d57664e9SAndroid Build Coastguard Worker #include "ResourceFilter.h"
24*d57664e9SAndroid Build Coastguard Worker #include "SdkConstants.h"
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker using android::String8;
27*d57664e9SAndroid Build Coastguard Worker using android::Vector;
28*d57664e9SAndroid Build Coastguard Worker using android::ResTable_config;
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker namespace AaptConfig {
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker static const char* kWildcardName = "any";
33*d57664e9SAndroid Build Coastguard Worker 
parse(const String8 & str,ConfigDescription * out)34*d57664e9SAndroid Build Coastguard Worker bool parse(const String8& str, ConfigDescription* out) {
35*d57664e9SAndroid Build Coastguard Worker     Vector<String8> parts = AaptUtil::splitAndLowerCase(str, '-');
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     ConfigDescription config;
38*d57664e9SAndroid Build Coastguard Worker     AaptLocaleValue locale;
39*d57664e9SAndroid Build Coastguard Worker     ssize_t index = 0;
40*d57664e9SAndroid Build Coastguard Worker     ssize_t localeIndex = 0;
41*d57664e9SAndroid Build Coastguard Worker     const ssize_t N = parts.size();
42*d57664e9SAndroid Build Coastguard Worker     const char* part = parts[index].c_str();
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     if (str.length() == 0) {
45*d57664e9SAndroid Build Coastguard Worker         goto success;
46*d57664e9SAndroid Build Coastguard Worker     }
47*d57664e9SAndroid Build Coastguard Worker 
48*d57664e9SAndroid Build Coastguard Worker     if (parseMcc(part, &config)) {
49*d57664e9SAndroid Build Coastguard Worker         index++;
50*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
51*d57664e9SAndroid Build Coastguard Worker             goto success;
52*d57664e9SAndroid Build Coastguard Worker         }
53*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
54*d57664e9SAndroid Build Coastguard Worker     }
55*d57664e9SAndroid Build Coastguard Worker 
56*d57664e9SAndroid Build Coastguard Worker     if (parseMnc(part, &config)) {
57*d57664e9SAndroid Build Coastguard Worker         index++;
58*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
59*d57664e9SAndroid Build Coastguard Worker             goto success;
60*d57664e9SAndroid Build Coastguard Worker         }
61*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
62*d57664e9SAndroid Build Coastguard Worker     }
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker     // Locale spans a few '-' separators, so we let it
65*d57664e9SAndroid Build Coastguard Worker     // control the index.
66*d57664e9SAndroid Build Coastguard Worker     localeIndex = locale.initFromDirName(parts, index);
67*d57664e9SAndroid Build Coastguard Worker     if (localeIndex < 0) {
68*d57664e9SAndroid Build Coastguard Worker         return false;
69*d57664e9SAndroid Build Coastguard Worker     } else if (localeIndex > index) {
70*d57664e9SAndroid Build Coastguard Worker         locale.writeTo(&config);
71*d57664e9SAndroid Build Coastguard Worker         index = localeIndex;
72*d57664e9SAndroid Build Coastguard Worker         if (index >= N) {
73*d57664e9SAndroid Build Coastguard Worker             goto success;
74*d57664e9SAndroid Build Coastguard Worker         }
75*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
76*d57664e9SAndroid Build Coastguard Worker     }
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker     if (parseLayoutDirection(part, &config)) {
79*d57664e9SAndroid Build Coastguard Worker         index++;
80*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
81*d57664e9SAndroid Build Coastguard Worker             goto success;
82*d57664e9SAndroid Build Coastguard Worker         }
83*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
84*d57664e9SAndroid Build Coastguard Worker     }
85*d57664e9SAndroid Build Coastguard Worker 
86*d57664e9SAndroid Build Coastguard Worker     if (parseSmallestScreenWidthDp(part, &config)) {
87*d57664e9SAndroid Build Coastguard Worker         index++;
88*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
89*d57664e9SAndroid Build Coastguard Worker             goto success;
90*d57664e9SAndroid Build Coastguard Worker         }
91*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
92*d57664e9SAndroid Build Coastguard Worker     }
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker     if (parseScreenWidthDp(part, &config)) {
95*d57664e9SAndroid Build Coastguard Worker         index++;
96*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
97*d57664e9SAndroid Build Coastguard Worker             goto success;
98*d57664e9SAndroid Build Coastguard Worker         }
99*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
100*d57664e9SAndroid Build Coastguard Worker     }
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker     if (parseScreenHeightDp(part, &config)) {
103*d57664e9SAndroid Build Coastguard Worker         index++;
104*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
105*d57664e9SAndroid Build Coastguard Worker             goto success;
106*d57664e9SAndroid Build Coastguard Worker         }
107*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
108*d57664e9SAndroid Build Coastguard Worker     }
109*d57664e9SAndroid Build Coastguard Worker 
110*d57664e9SAndroid Build Coastguard Worker     if (parseScreenLayoutSize(part, &config)) {
111*d57664e9SAndroid Build Coastguard Worker         index++;
112*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
113*d57664e9SAndroid Build Coastguard Worker             goto success;
114*d57664e9SAndroid Build Coastguard Worker         }
115*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
116*d57664e9SAndroid Build Coastguard Worker     }
117*d57664e9SAndroid Build Coastguard Worker 
118*d57664e9SAndroid Build Coastguard Worker     if (parseScreenLayoutLong(part, &config)) {
119*d57664e9SAndroid Build Coastguard Worker         index++;
120*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
121*d57664e9SAndroid Build Coastguard Worker             goto success;
122*d57664e9SAndroid Build Coastguard Worker         }
123*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
124*d57664e9SAndroid Build Coastguard Worker     }
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker     if (parseScreenRound(part, &config)) {
127*d57664e9SAndroid Build Coastguard Worker         index++;
128*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
129*d57664e9SAndroid Build Coastguard Worker             goto success;
130*d57664e9SAndroid Build Coastguard Worker         }
131*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
132*d57664e9SAndroid Build Coastguard Worker     }
133*d57664e9SAndroid Build Coastguard Worker 
134*d57664e9SAndroid Build Coastguard Worker     if (parseWideColorGamut(part, &config)) {
135*d57664e9SAndroid Build Coastguard Worker         index++;
136*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
137*d57664e9SAndroid Build Coastguard Worker             goto success;
138*d57664e9SAndroid Build Coastguard Worker         }
139*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
140*d57664e9SAndroid Build Coastguard Worker     }
141*d57664e9SAndroid Build Coastguard Worker 
142*d57664e9SAndroid Build Coastguard Worker     if (parseHdr(part, &config)) {
143*d57664e9SAndroid Build Coastguard Worker         index++;
144*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
145*d57664e9SAndroid Build Coastguard Worker             goto success;
146*d57664e9SAndroid Build Coastguard Worker         }
147*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
148*d57664e9SAndroid Build Coastguard Worker     }
149*d57664e9SAndroid Build Coastguard Worker 
150*d57664e9SAndroid Build Coastguard Worker     if (parseOrientation(part, &config)) {
151*d57664e9SAndroid Build Coastguard Worker         index++;
152*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
153*d57664e9SAndroid Build Coastguard Worker             goto success;
154*d57664e9SAndroid Build Coastguard Worker         }
155*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
156*d57664e9SAndroid Build Coastguard Worker     }
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker     if (parseUiModeType(part, &config)) {
159*d57664e9SAndroid Build Coastguard Worker         index++;
160*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
161*d57664e9SAndroid Build Coastguard Worker             goto success;
162*d57664e9SAndroid Build Coastguard Worker         }
163*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
164*d57664e9SAndroid Build Coastguard Worker     }
165*d57664e9SAndroid Build Coastguard Worker 
166*d57664e9SAndroid Build Coastguard Worker     if (parseUiModeNight(part, &config)) {
167*d57664e9SAndroid Build Coastguard Worker         index++;
168*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
169*d57664e9SAndroid Build Coastguard Worker             goto success;
170*d57664e9SAndroid Build Coastguard Worker         }
171*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
172*d57664e9SAndroid Build Coastguard Worker     }
173*d57664e9SAndroid Build Coastguard Worker 
174*d57664e9SAndroid Build Coastguard Worker     if (parseDensity(part, &config)) {
175*d57664e9SAndroid Build Coastguard Worker         index++;
176*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
177*d57664e9SAndroid Build Coastguard Worker             goto success;
178*d57664e9SAndroid Build Coastguard Worker         }
179*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
180*d57664e9SAndroid Build Coastguard Worker     }
181*d57664e9SAndroid Build Coastguard Worker 
182*d57664e9SAndroid Build Coastguard Worker     if (parseTouchscreen(part, &config)) {
183*d57664e9SAndroid Build Coastguard Worker         index++;
184*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
185*d57664e9SAndroid Build Coastguard Worker             goto success;
186*d57664e9SAndroid Build Coastguard Worker         }
187*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
188*d57664e9SAndroid Build Coastguard Worker     }
189*d57664e9SAndroid Build Coastguard Worker 
190*d57664e9SAndroid Build Coastguard Worker     if (parseKeysHidden(part, &config)) {
191*d57664e9SAndroid Build Coastguard Worker         index++;
192*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
193*d57664e9SAndroid Build Coastguard Worker             goto success;
194*d57664e9SAndroid Build Coastguard Worker         }
195*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
196*d57664e9SAndroid Build Coastguard Worker     }
197*d57664e9SAndroid Build Coastguard Worker 
198*d57664e9SAndroid Build Coastguard Worker     if (parseKeyboard(part, &config)) {
199*d57664e9SAndroid Build Coastguard Worker         index++;
200*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
201*d57664e9SAndroid Build Coastguard Worker             goto success;
202*d57664e9SAndroid Build Coastguard Worker         }
203*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
204*d57664e9SAndroid Build Coastguard Worker     }
205*d57664e9SAndroid Build Coastguard Worker 
206*d57664e9SAndroid Build Coastguard Worker     if (parseNavHidden(part, &config)) {
207*d57664e9SAndroid Build Coastguard Worker         index++;
208*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
209*d57664e9SAndroid Build Coastguard Worker             goto success;
210*d57664e9SAndroid Build Coastguard Worker         }
211*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
212*d57664e9SAndroid Build Coastguard Worker     }
213*d57664e9SAndroid Build Coastguard Worker 
214*d57664e9SAndroid Build Coastguard Worker     if (parseNavigation(part, &config)) {
215*d57664e9SAndroid Build Coastguard Worker         index++;
216*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
217*d57664e9SAndroid Build Coastguard Worker             goto success;
218*d57664e9SAndroid Build Coastguard Worker         }
219*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
220*d57664e9SAndroid Build Coastguard Worker     }
221*d57664e9SAndroid Build Coastguard Worker 
222*d57664e9SAndroid Build Coastguard Worker     if (parseScreenSize(part, &config)) {
223*d57664e9SAndroid Build Coastguard Worker         index++;
224*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
225*d57664e9SAndroid Build Coastguard Worker             goto success;
226*d57664e9SAndroid Build Coastguard Worker         }
227*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
228*d57664e9SAndroid Build Coastguard Worker     }
229*d57664e9SAndroid Build Coastguard Worker 
230*d57664e9SAndroid Build Coastguard Worker     if (parseVersion(part, &config)) {
231*d57664e9SAndroid Build Coastguard Worker         index++;
232*d57664e9SAndroid Build Coastguard Worker         if (index == N) {
233*d57664e9SAndroid Build Coastguard Worker             goto success;
234*d57664e9SAndroid Build Coastguard Worker         }
235*d57664e9SAndroid Build Coastguard Worker         part = parts[index].c_str();
236*d57664e9SAndroid Build Coastguard Worker     }
237*d57664e9SAndroid Build Coastguard Worker 
238*d57664e9SAndroid Build Coastguard Worker     // Unrecognized.
239*d57664e9SAndroid Build Coastguard Worker     return false;
240*d57664e9SAndroid Build Coastguard Worker 
241*d57664e9SAndroid Build Coastguard Worker success:
242*d57664e9SAndroid Build Coastguard Worker     if (out != NULL) {
243*d57664e9SAndroid Build Coastguard Worker         applyVersionForCompatibility(&config);
244*d57664e9SAndroid Build Coastguard Worker         *out = config;
245*d57664e9SAndroid Build Coastguard Worker     }
246*d57664e9SAndroid Build Coastguard Worker     return true;
247*d57664e9SAndroid Build Coastguard Worker }
248*d57664e9SAndroid Build Coastguard Worker 
parseCommaSeparatedList(const String8 & str,std::set<ConfigDescription> * outSet)249*d57664e9SAndroid Build Coastguard Worker bool parseCommaSeparatedList(const String8& str, std::set<ConfigDescription>* outSet) {
250*d57664e9SAndroid Build Coastguard Worker     Vector<String8> parts = AaptUtil::splitAndLowerCase(str, ',');
251*d57664e9SAndroid Build Coastguard Worker     const size_t N = parts.size();
252*d57664e9SAndroid Build Coastguard Worker     for (size_t i = 0; i < N; i++) {
253*d57664e9SAndroid Build Coastguard Worker         ConfigDescription config;
254*d57664e9SAndroid Build Coastguard Worker         if (!parse(parts[i], &config)) {
255*d57664e9SAndroid Build Coastguard Worker             return false;
256*d57664e9SAndroid Build Coastguard Worker         }
257*d57664e9SAndroid Build Coastguard Worker         outSet->insert(config);
258*d57664e9SAndroid Build Coastguard Worker     }
259*d57664e9SAndroid Build Coastguard Worker     return true;
260*d57664e9SAndroid Build Coastguard Worker }
261*d57664e9SAndroid Build Coastguard Worker 
applyVersionForCompatibility(ConfigDescription * config)262*d57664e9SAndroid Build Coastguard Worker void applyVersionForCompatibility(ConfigDescription* config) {
263*d57664e9SAndroid Build Coastguard Worker     if (config == NULL) {
264*d57664e9SAndroid Build Coastguard Worker         return;
265*d57664e9SAndroid Build Coastguard Worker     }
266*d57664e9SAndroid Build Coastguard Worker 
267*d57664e9SAndroid Build Coastguard Worker     uint16_t minSdk = 0;
268*d57664e9SAndroid Build Coastguard Worker     if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE)
269*d57664e9SAndroid Build Coastguard Worker                 == ResTable_config::UI_MODE_TYPE_VR_HEADSET
270*d57664e9SAndroid Build Coastguard Worker             || config->colorMode & ResTable_config::MASK_WIDE_COLOR_GAMUT
271*d57664e9SAndroid Build Coastguard Worker             || config->colorMode & ResTable_config::MASK_HDR) {
272*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_O;
273*d57664e9SAndroid Build Coastguard Worker     } else if (config->screenLayout2 & ResTable_config::MASK_SCREENROUND) {
274*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_MNC;
275*d57664e9SAndroid Build Coastguard Worker     } else if (config->density == ResTable_config::DENSITY_ANY) {
276*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_LOLLIPOP;
277*d57664e9SAndroid Build Coastguard Worker     } else if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
278*d57664e9SAndroid Build Coastguard Worker             || config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY
279*d57664e9SAndroid Build Coastguard Worker             || config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
280*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_HONEYCOMB_MR2;
281*d57664e9SAndroid Build Coastguard Worker     } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE)
282*d57664e9SAndroid Build Coastguard Worker                 != ResTable_config::UI_MODE_TYPE_ANY
283*d57664e9SAndroid Build Coastguard Worker             ||  (config->uiMode & ResTable_config::MASK_UI_MODE_NIGHT)
284*d57664e9SAndroid Build Coastguard Worker                 != ResTable_config::UI_MODE_NIGHT_ANY) {
285*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_FROYO;
286*d57664e9SAndroid Build Coastguard Worker     } else if ((config->screenLayout & ResTable_config::MASK_SCREENSIZE)
287*d57664e9SAndroid Build Coastguard Worker                 != ResTable_config::SCREENSIZE_ANY
288*d57664e9SAndroid Build Coastguard Worker             ||  (config->screenLayout & ResTable_config::MASK_SCREENLONG)
289*d57664e9SAndroid Build Coastguard Worker                 != ResTable_config::SCREENLONG_ANY
290*d57664e9SAndroid Build Coastguard Worker             || config->density != ResTable_config::DENSITY_DEFAULT) {
291*d57664e9SAndroid Build Coastguard Worker         minSdk = SDK_DONUT;
292*d57664e9SAndroid Build Coastguard Worker     }
293*d57664e9SAndroid Build Coastguard Worker 
294*d57664e9SAndroid Build Coastguard Worker     if (minSdk > config->sdkVersion) {
295*d57664e9SAndroid Build Coastguard Worker         config->sdkVersion = minSdk;
296*d57664e9SAndroid Build Coastguard Worker     }
297*d57664e9SAndroid Build Coastguard Worker }
298*d57664e9SAndroid Build Coastguard Worker 
parseMcc(const char * name,ResTable_config * out)299*d57664e9SAndroid Build Coastguard Worker bool parseMcc(const char* name, ResTable_config* out) {
300*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
301*d57664e9SAndroid Build Coastguard Worker         if (out) out->mcc = 0;
302*d57664e9SAndroid Build Coastguard Worker         return true;
303*d57664e9SAndroid Build Coastguard Worker     }
304*d57664e9SAndroid Build Coastguard Worker     const char* c = name;
305*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'm') return false;
306*d57664e9SAndroid Build Coastguard Worker     c++;
307*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'c') return false;
308*d57664e9SAndroid Build Coastguard Worker     c++;
309*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'c') return false;
310*d57664e9SAndroid Build Coastguard Worker     c++;
311*d57664e9SAndroid Build Coastguard Worker 
312*d57664e9SAndroid Build Coastguard Worker     const char* val = c;
313*d57664e9SAndroid Build Coastguard Worker 
314*d57664e9SAndroid Build Coastguard Worker     while (*c >= '0' && *c <= '9') {
315*d57664e9SAndroid Build Coastguard Worker         c++;
316*d57664e9SAndroid Build Coastguard Worker     }
317*d57664e9SAndroid Build Coastguard Worker     if (*c != 0) return false;
318*d57664e9SAndroid Build Coastguard Worker     if (c-val != 3) return false;
319*d57664e9SAndroid Build Coastguard Worker 
320*d57664e9SAndroid Build Coastguard Worker     int d = atoi(val);
321*d57664e9SAndroid Build Coastguard Worker     if (d != 0) {
322*d57664e9SAndroid Build Coastguard Worker         if (out) out->mcc = d;
323*d57664e9SAndroid Build Coastguard Worker         return true;
324*d57664e9SAndroid Build Coastguard Worker     }
325*d57664e9SAndroid Build Coastguard Worker 
326*d57664e9SAndroid Build Coastguard Worker     return false;
327*d57664e9SAndroid Build Coastguard Worker }
328*d57664e9SAndroid Build Coastguard Worker 
parseMnc(const char * name,ResTable_config * out)329*d57664e9SAndroid Build Coastguard Worker bool parseMnc(const char* name, ResTable_config* out) {
330*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
331*d57664e9SAndroid Build Coastguard Worker         if (out) out->mcc = 0;
332*d57664e9SAndroid Build Coastguard Worker         return true;
333*d57664e9SAndroid Build Coastguard Worker     }
334*d57664e9SAndroid Build Coastguard Worker     const char* c = name;
335*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'm') return false;
336*d57664e9SAndroid Build Coastguard Worker     c++;
337*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'n') return false;
338*d57664e9SAndroid Build Coastguard Worker     c++;
339*d57664e9SAndroid Build Coastguard Worker     if (tolower(*c) != 'c') return false;
340*d57664e9SAndroid Build Coastguard Worker     c++;
341*d57664e9SAndroid Build Coastguard Worker 
342*d57664e9SAndroid Build Coastguard Worker     const char* val = c;
343*d57664e9SAndroid Build Coastguard Worker 
344*d57664e9SAndroid Build Coastguard Worker     while (*c >= '0' && *c <= '9') {
345*d57664e9SAndroid Build Coastguard Worker         c++;
346*d57664e9SAndroid Build Coastguard Worker     }
347*d57664e9SAndroid Build Coastguard Worker     if (*c != 0) return false;
348*d57664e9SAndroid Build Coastguard Worker     if (c-val == 0 || c-val > 3) return false;
349*d57664e9SAndroid Build Coastguard Worker 
350*d57664e9SAndroid Build Coastguard Worker     if (out) {
351*d57664e9SAndroid Build Coastguard Worker         out->mnc = atoi(val);
352*d57664e9SAndroid Build Coastguard Worker         if (out->mnc == 0) {
353*d57664e9SAndroid Build Coastguard Worker             out->mnc = ACONFIGURATION_MNC_ZERO;
354*d57664e9SAndroid Build Coastguard Worker         }
355*d57664e9SAndroid Build Coastguard Worker     }
356*d57664e9SAndroid Build Coastguard Worker 
357*d57664e9SAndroid Build Coastguard Worker     return true;
358*d57664e9SAndroid Build Coastguard Worker }
359*d57664e9SAndroid Build Coastguard Worker 
parseLayoutDirection(const char * name,ResTable_config * out)360*d57664e9SAndroid Build Coastguard Worker bool parseLayoutDirection(const char* name, ResTable_config* out) {
361*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
362*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
363*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
364*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::LAYOUTDIR_ANY;
365*d57664e9SAndroid Build Coastguard Worker         return true;
366*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "ldltr") == 0) {
367*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
368*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
369*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::LAYOUTDIR_LTR;
370*d57664e9SAndroid Build Coastguard Worker         return true;
371*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "ldrtl") == 0) {
372*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
373*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
374*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::LAYOUTDIR_RTL;
375*d57664e9SAndroid Build Coastguard Worker         return true;
376*d57664e9SAndroid Build Coastguard Worker     }
377*d57664e9SAndroid Build Coastguard Worker 
378*d57664e9SAndroid Build Coastguard Worker     return false;
379*d57664e9SAndroid Build Coastguard Worker }
380*d57664e9SAndroid Build Coastguard Worker 
parseScreenLayoutSize(const char * name,ResTable_config * out)381*d57664e9SAndroid Build Coastguard Worker bool parseScreenLayoutSize(const char* name, ResTable_config* out) {
382*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
383*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
384*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
385*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENSIZE_ANY;
386*d57664e9SAndroid Build Coastguard Worker         return true;
387*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "small") == 0) {
388*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
389*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
390*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENSIZE_SMALL;
391*d57664e9SAndroid Build Coastguard Worker         return true;
392*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "normal") == 0) {
393*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
394*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
395*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENSIZE_NORMAL;
396*d57664e9SAndroid Build Coastguard Worker         return true;
397*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "large") == 0) {
398*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
399*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
400*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENSIZE_LARGE;
401*d57664e9SAndroid Build Coastguard Worker         return true;
402*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "xlarge") == 0) {
403*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
404*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
405*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENSIZE_XLARGE;
406*d57664e9SAndroid Build Coastguard Worker         return true;
407*d57664e9SAndroid Build Coastguard Worker     }
408*d57664e9SAndroid Build Coastguard Worker 
409*d57664e9SAndroid Build Coastguard Worker     return false;
410*d57664e9SAndroid Build Coastguard Worker }
411*d57664e9SAndroid Build Coastguard Worker 
parseScreenLayoutLong(const char * name,ResTable_config * out)412*d57664e9SAndroid Build Coastguard Worker bool parseScreenLayoutLong(const char* name, ResTable_config* out) {
413*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
414*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
415*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
416*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENLONG_ANY;
417*d57664e9SAndroid Build Coastguard Worker         return true;
418*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "long") == 0) {
419*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
420*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
421*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENLONG_YES;
422*d57664e9SAndroid Build Coastguard Worker         return true;
423*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "notlong") == 0) {
424*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout =
425*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
426*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENLONG_NO;
427*d57664e9SAndroid Build Coastguard Worker         return true;
428*d57664e9SAndroid Build Coastguard Worker     }
429*d57664e9SAndroid Build Coastguard Worker     return false;
430*d57664e9SAndroid Build Coastguard Worker }
431*d57664e9SAndroid Build Coastguard Worker 
parseScreenRound(const char * name,ResTable_config * out)432*d57664e9SAndroid Build Coastguard Worker bool parseScreenRound(const char* name, ResTable_config* out) {
433*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
434*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout2 =
435*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
436*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENROUND_ANY;
437*d57664e9SAndroid Build Coastguard Worker         return true;
438*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "round") == 0) {
439*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout2 =
440*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
441*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENROUND_YES;
442*d57664e9SAndroid Build Coastguard Worker         return true;
443*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "notround") == 0) {
444*d57664e9SAndroid Build Coastguard Worker         if (out) out->screenLayout2 =
445*d57664e9SAndroid Build Coastguard Worker                 (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
446*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::SCREENROUND_NO;
447*d57664e9SAndroid Build Coastguard Worker         return true;
448*d57664e9SAndroid Build Coastguard Worker     }
449*d57664e9SAndroid Build Coastguard Worker     return false;
450*d57664e9SAndroid Build Coastguard Worker }
451*d57664e9SAndroid Build Coastguard Worker 
parseWideColorGamut(const char * name,ResTable_config * out)452*d57664e9SAndroid Build Coastguard Worker bool parseWideColorGamut(const char* name, ResTable_config* out) {
453*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
454*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
455*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_WIDE_COLOR_GAMUT)
456*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::WIDE_COLOR_GAMUT_ANY;
457*d57664e9SAndroid Build Coastguard Worker         return true;
458*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "widecg") == 0) {
459*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
460*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_WIDE_COLOR_GAMUT)
461*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::WIDE_COLOR_GAMUT_YES;
462*d57664e9SAndroid Build Coastguard Worker         return true;
463*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "nowidecg") == 0) {
464*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
465*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_WIDE_COLOR_GAMUT)
466*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::WIDE_COLOR_GAMUT_NO;
467*d57664e9SAndroid Build Coastguard Worker         return true;
468*d57664e9SAndroid Build Coastguard Worker     }
469*d57664e9SAndroid Build Coastguard Worker     return false;
470*d57664e9SAndroid Build Coastguard Worker }
471*d57664e9SAndroid Build Coastguard Worker 
parseHdr(const char * name,ResTable_config * out)472*d57664e9SAndroid Build Coastguard Worker bool parseHdr(const char* name, ResTable_config* out) {
473*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
474*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
475*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_HDR)
476*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::HDR_ANY;
477*d57664e9SAndroid Build Coastguard Worker         return true;
478*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "highdr") == 0) {
479*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
480*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_HDR)
481*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::HDR_YES;
482*d57664e9SAndroid Build Coastguard Worker         return true;
483*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "lowdr") == 0) {
484*d57664e9SAndroid Build Coastguard Worker         if (out) out->colorMode =
485*d57664e9SAndroid Build Coastguard Worker                 (out->colorMode&~ResTable_config::MASK_HDR)
486*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::HDR_NO;
487*d57664e9SAndroid Build Coastguard Worker         return true;
488*d57664e9SAndroid Build Coastguard Worker     }
489*d57664e9SAndroid Build Coastguard Worker     return false;
490*d57664e9SAndroid Build Coastguard Worker }
491*d57664e9SAndroid Build Coastguard Worker 
parseOrientation(const char * name,ResTable_config * out)492*d57664e9SAndroid Build Coastguard Worker bool parseOrientation(const char* name, ResTable_config* out) {
493*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
494*d57664e9SAndroid Build Coastguard Worker         if (out) out->orientation = out->ORIENTATION_ANY;
495*d57664e9SAndroid Build Coastguard Worker         return true;
496*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "port") == 0) {
497*d57664e9SAndroid Build Coastguard Worker         if (out) out->orientation = out->ORIENTATION_PORT;
498*d57664e9SAndroid Build Coastguard Worker         return true;
499*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "land") == 0) {
500*d57664e9SAndroid Build Coastguard Worker         if (out) out->orientation = out->ORIENTATION_LAND;
501*d57664e9SAndroid Build Coastguard Worker         return true;
502*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "square") == 0) {
503*d57664e9SAndroid Build Coastguard Worker         if (out) out->orientation = out->ORIENTATION_SQUARE;
504*d57664e9SAndroid Build Coastguard Worker         return true;
505*d57664e9SAndroid Build Coastguard Worker     }
506*d57664e9SAndroid Build Coastguard Worker 
507*d57664e9SAndroid Build Coastguard Worker     return false;
508*d57664e9SAndroid Build Coastguard Worker }
509*d57664e9SAndroid Build Coastguard Worker 
parseUiModeType(const char * name,ResTable_config * out)510*d57664e9SAndroid Build Coastguard Worker bool parseUiModeType(const char* name, ResTable_config* out) {
511*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
512*d57664e9SAndroid Build Coastguard Worker         if (out) out->uiMode =
513*d57664e9SAndroid Build Coastguard Worker                 (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
514*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::UI_MODE_TYPE_ANY;
515*d57664e9SAndroid Build Coastguard Worker         return true;
516*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "desk") == 0) {
517*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
518*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
519*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_DESK;
520*d57664e9SAndroid Build Coastguard Worker         return true;
521*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "car") == 0) {
522*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
523*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
524*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_CAR;
525*d57664e9SAndroid Build Coastguard Worker         return true;
526*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "television") == 0) {
527*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
528*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
529*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_TELEVISION;
530*d57664e9SAndroid Build Coastguard Worker         return true;
531*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "appliance") == 0) {
532*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
533*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
534*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_APPLIANCE;
535*d57664e9SAndroid Build Coastguard Worker         return true;
536*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "watch") == 0) {
537*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
538*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
539*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_WATCH;
540*d57664e9SAndroid Build Coastguard Worker         return true;
541*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "vrheadset") == 0) {
542*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
543*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
544*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_TYPE_VR_HEADSET;
545*d57664e9SAndroid Build Coastguard Worker         return true;
546*d57664e9SAndroid Build Coastguard Worker     }
547*d57664e9SAndroid Build Coastguard Worker 
548*d57664e9SAndroid Build Coastguard Worker     return false;
549*d57664e9SAndroid Build Coastguard Worker }
550*d57664e9SAndroid Build Coastguard Worker 
parseUiModeNight(const char * name,ResTable_config * out)551*d57664e9SAndroid Build Coastguard Worker bool parseUiModeNight(const char* name, ResTable_config* out) {
552*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
553*d57664e9SAndroid Build Coastguard Worker         if (out) out->uiMode =
554*d57664e9SAndroid Build Coastguard Worker                 (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
555*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::UI_MODE_NIGHT_ANY;
556*d57664e9SAndroid Build Coastguard Worker         return true;
557*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "night") == 0) {
558*d57664e9SAndroid Build Coastguard Worker         if (out) out->uiMode =
559*d57664e9SAndroid Build Coastguard Worker                 (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
560*d57664e9SAndroid Build Coastguard Worker                 | ResTable_config::UI_MODE_NIGHT_YES;
561*d57664e9SAndroid Build Coastguard Worker         return true;
562*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "notnight") == 0) {
563*d57664e9SAndroid Build Coastguard Worker       if (out) out->uiMode =
564*d57664e9SAndroid Build Coastguard Worker               (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
565*d57664e9SAndroid Build Coastguard Worker               | ResTable_config::UI_MODE_NIGHT_NO;
566*d57664e9SAndroid Build Coastguard Worker         return true;
567*d57664e9SAndroid Build Coastguard Worker     }
568*d57664e9SAndroid Build Coastguard Worker 
569*d57664e9SAndroid Build Coastguard Worker     return false;
570*d57664e9SAndroid Build Coastguard Worker }
571*d57664e9SAndroid Build Coastguard Worker 
parseDensity(const char * name,ResTable_config * out)572*d57664e9SAndroid Build Coastguard Worker bool parseDensity(const char* name, ResTable_config* out) {
573*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
574*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_DEFAULT;
575*d57664e9SAndroid Build Coastguard Worker         return true;
576*d57664e9SAndroid Build Coastguard Worker     }
577*d57664e9SAndroid Build Coastguard Worker 
578*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "anydpi") == 0) {
579*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_ANY;
580*d57664e9SAndroid Build Coastguard Worker         return true;
581*d57664e9SAndroid Build Coastguard Worker     }
582*d57664e9SAndroid Build Coastguard Worker 
583*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "nodpi") == 0) {
584*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_NONE;
585*d57664e9SAndroid Build Coastguard Worker         return true;
586*d57664e9SAndroid Build Coastguard Worker     }
587*d57664e9SAndroid Build Coastguard Worker 
588*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "ldpi") == 0) {
589*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_LOW;
590*d57664e9SAndroid Build Coastguard Worker         return true;
591*d57664e9SAndroid Build Coastguard Worker     }
592*d57664e9SAndroid Build Coastguard Worker 
593*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "mdpi") == 0) {
594*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_MEDIUM;
595*d57664e9SAndroid Build Coastguard Worker         return true;
596*d57664e9SAndroid Build Coastguard Worker     }
597*d57664e9SAndroid Build Coastguard Worker 
598*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "tvdpi") == 0) {
599*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_TV;
600*d57664e9SAndroid Build Coastguard Worker         return true;
601*d57664e9SAndroid Build Coastguard Worker     }
602*d57664e9SAndroid Build Coastguard Worker 
603*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "hdpi") == 0) {
604*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_HIGH;
605*d57664e9SAndroid Build Coastguard Worker         return true;
606*d57664e9SAndroid Build Coastguard Worker     }
607*d57664e9SAndroid Build Coastguard Worker 
608*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "xhdpi") == 0) {
609*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_XHIGH;
610*d57664e9SAndroid Build Coastguard Worker         return true;
611*d57664e9SAndroid Build Coastguard Worker     }
612*d57664e9SAndroid Build Coastguard Worker 
613*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "xxhdpi") == 0) {
614*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_XXHIGH;
615*d57664e9SAndroid Build Coastguard Worker         return true;
616*d57664e9SAndroid Build Coastguard Worker     }
617*d57664e9SAndroid Build Coastguard Worker 
618*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, "xxxhdpi") == 0) {
619*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
620*d57664e9SAndroid Build Coastguard Worker         return true;
621*d57664e9SAndroid Build Coastguard Worker     }
622*d57664e9SAndroid Build Coastguard Worker 
623*d57664e9SAndroid Build Coastguard Worker     char* c = (char*)name;
624*d57664e9SAndroid Build Coastguard Worker     while (*c >= '0' && *c <= '9') {
625*d57664e9SAndroid Build Coastguard Worker         c++;
626*d57664e9SAndroid Build Coastguard Worker     }
627*d57664e9SAndroid Build Coastguard Worker 
628*d57664e9SAndroid Build Coastguard Worker     // check that we have 'dpi' after the last digit.
629*d57664e9SAndroid Build Coastguard Worker     if (toupper(c[0]) != 'D' ||
630*d57664e9SAndroid Build Coastguard Worker             toupper(c[1]) != 'P' ||
631*d57664e9SAndroid Build Coastguard Worker             toupper(c[2]) != 'I' ||
632*d57664e9SAndroid Build Coastguard Worker             c[3] != 0) {
633*d57664e9SAndroid Build Coastguard Worker         return false;
634*d57664e9SAndroid Build Coastguard Worker     }
635*d57664e9SAndroid Build Coastguard Worker 
636*d57664e9SAndroid Build Coastguard Worker     // temporarily replace the first letter with \0 to
637*d57664e9SAndroid Build Coastguard Worker     // use atoi.
638*d57664e9SAndroid Build Coastguard Worker     char tmp = c[0];
639*d57664e9SAndroid Build Coastguard Worker     c[0] = '\0';
640*d57664e9SAndroid Build Coastguard Worker 
641*d57664e9SAndroid Build Coastguard Worker     int d = atoi(name);
642*d57664e9SAndroid Build Coastguard Worker     c[0] = tmp;
643*d57664e9SAndroid Build Coastguard Worker 
644*d57664e9SAndroid Build Coastguard Worker     if (d != 0) {
645*d57664e9SAndroid Build Coastguard Worker         if (out) out->density = d;
646*d57664e9SAndroid Build Coastguard Worker         return true;
647*d57664e9SAndroid Build Coastguard Worker     }
648*d57664e9SAndroid Build Coastguard Worker 
649*d57664e9SAndroid Build Coastguard Worker     return false;
650*d57664e9SAndroid Build Coastguard Worker }
651*d57664e9SAndroid Build Coastguard Worker 
parseTouchscreen(const char * name,ResTable_config * out)652*d57664e9SAndroid Build Coastguard Worker bool parseTouchscreen(const char* name, ResTable_config* out) {
653*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
654*d57664e9SAndroid Build Coastguard Worker         if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
655*d57664e9SAndroid Build Coastguard Worker         return true;
656*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "notouch") == 0) {
657*d57664e9SAndroid Build Coastguard Worker         if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
658*d57664e9SAndroid Build Coastguard Worker         return true;
659*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "stylus") == 0) {
660*d57664e9SAndroid Build Coastguard Worker         if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
661*d57664e9SAndroid Build Coastguard Worker         return true;
662*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "finger") == 0) {
663*d57664e9SAndroid Build Coastguard Worker         if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
664*d57664e9SAndroid Build Coastguard Worker         return true;
665*d57664e9SAndroid Build Coastguard Worker     }
666*d57664e9SAndroid Build Coastguard Worker 
667*d57664e9SAndroid Build Coastguard Worker     return false;
668*d57664e9SAndroid Build Coastguard Worker }
669*d57664e9SAndroid Build Coastguard Worker 
parseKeysHidden(const char * name,ResTable_config * out)670*d57664e9SAndroid Build Coastguard Worker bool parseKeysHidden(const char* name, ResTable_config* out) {
671*d57664e9SAndroid Build Coastguard Worker     uint8_t mask = 0;
672*d57664e9SAndroid Build Coastguard Worker     uint8_t value = 0;
673*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
674*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_KEYSHIDDEN;
675*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::KEYSHIDDEN_ANY;
676*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "keysexposed") == 0) {
677*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_KEYSHIDDEN;
678*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::KEYSHIDDEN_NO;
679*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "keyshidden") == 0) {
680*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_KEYSHIDDEN;
681*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::KEYSHIDDEN_YES;
682*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "keyssoft") == 0) {
683*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_KEYSHIDDEN;
684*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::KEYSHIDDEN_SOFT;
685*d57664e9SAndroid Build Coastguard Worker     }
686*d57664e9SAndroid Build Coastguard Worker 
687*d57664e9SAndroid Build Coastguard Worker     if (mask != 0) {
688*d57664e9SAndroid Build Coastguard Worker         if (out) out->inputFlags = (out->inputFlags&~mask) | value;
689*d57664e9SAndroid Build Coastguard Worker         return true;
690*d57664e9SAndroid Build Coastguard Worker     }
691*d57664e9SAndroid Build Coastguard Worker 
692*d57664e9SAndroid Build Coastguard Worker     return false;
693*d57664e9SAndroid Build Coastguard Worker }
694*d57664e9SAndroid Build Coastguard Worker 
parseKeyboard(const char * name,ResTable_config * out)695*d57664e9SAndroid Build Coastguard Worker bool parseKeyboard(const char* name, ResTable_config* out) {
696*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
697*d57664e9SAndroid Build Coastguard Worker         if (out) out->keyboard = out->KEYBOARD_ANY;
698*d57664e9SAndroid Build Coastguard Worker         return true;
699*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "nokeys") == 0) {
700*d57664e9SAndroid Build Coastguard Worker         if (out) out->keyboard = out->KEYBOARD_NOKEYS;
701*d57664e9SAndroid Build Coastguard Worker         return true;
702*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "qwerty") == 0) {
703*d57664e9SAndroid Build Coastguard Worker         if (out) out->keyboard = out->KEYBOARD_QWERTY;
704*d57664e9SAndroid Build Coastguard Worker         return true;
705*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "12key") == 0) {
706*d57664e9SAndroid Build Coastguard Worker         if (out) out->keyboard = out->KEYBOARD_12KEY;
707*d57664e9SAndroid Build Coastguard Worker         return true;
708*d57664e9SAndroid Build Coastguard Worker     }
709*d57664e9SAndroid Build Coastguard Worker 
710*d57664e9SAndroid Build Coastguard Worker     return false;
711*d57664e9SAndroid Build Coastguard Worker }
712*d57664e9SAndroid Build Coastguard Worker 
parseNavHidden(const char * name,ResTable_config * out)713*d57664e9SAndroid Build Coastguard Worker bool parseNavHidden(const char* name, ResTable_config* out) {
714*d57664e9SAndroid Build Coastguard Worker     uint8_t mask = 0;
715*d57664e9SAndroid Build Coastguard Worker     uint8_t value = 0;
716*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
717*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_NAVHIDDEN;
718*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::NAVHIDDEN_ANY;
719*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "navexposed") == 0) {
720*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_NAVHIDDEN;
721*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::NAVHIDDEN_NO;
722*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "navhidden") == 0) {
723*d57664e9SAndroid Build Coastguard Worker         mask = ResTable_config::MASK_NAVHIDDEN;
724*d57664e9SAndroid Build Coastguard Worker         value = ResTable_config::NAVHIDDEN_YES;
725*d57664e9SAndroid Build Coastguard Worker     }
726*d57664e9SAndroid Build Coastguard Worker 
727*d57664e9SAndroid Build Coastguard Worker     if (mask != 0) {
728*d57664e9SAndroid Build Coastguard Worker         if (out) out->inputFlags = (out->inputFlags&~mask) | value;
729*d57664e9SAndroid Build Coastguard Worker         return true;
730*d57664e9SAndroid Build Coastguard Worker     }
731*d57664e9SAndroid Build Coastguard Worker 
732*d57664e9SAndroid Build Coastguard Worker     return false;
733*d57664e9SAndroid Build Coastguard Worker }
734*d57664e9SAndroid Build Coastguard Worker 
parseNavigation(const char * name,ResTable_config * out)735*d57664e9SAndroid Build Coastguard Worker bool parseNavigation(const char* name, ResTable_config* out) {
736*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
737*d57664e9SAndroid Build Coastguard Worker         if (out) out->navigation = out->NAVIGATION_ANY;
738*d57664e9SAndroid Build Coastguard Worker         return true;
739*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "nonav") == 0) {
740*d57664e9SAndroid Build Coastguard Worker         if (out) out->navigation = out->NAVIGATION_NONAV;
741*d57664e9SAndroid Build Coastguard Worker         return true;
742*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "dpad") == 0) {
743*d57664e9SAndroid Build Coastguard Worker         if (out) out->navigation = out->NAVIGATION_DPAD;
744*d57664e9SAndroid Build Coastguard Worker         return true;
745*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "trackball") == 0) {
746*d57664e9SAndroid Build Coastguard Worker         if (out) out->navigation = out->NAVIGATION_TRACKBALL;
747*d57664e9SAndroid Build Coastguard Worker         return true;
748*d57664e9SAndroid Build Coastguard Worker     } else if (strcmp(name, "wheel") == 0) {
749*d57664e9SAndroid Build Coastguard Worker         if (out) out->navigation = out->NAVIGATION_WHEEL;
750*d57664e9SAndroid Build Coastguard Worker         return true;
751*d57664e9SAndroid Build Coastguard Worker     }
752*d57664e9SAndroid Build Coastguard Worker 
753*d57664e9SAndroid Build Coastguard Worker     return false;
754*d57664e9SAndroid Build Coastguard Worker }
755*d57664e9SAndroid Build Coastguard Worker 
parseScreenSize(const char * name,ResTable_config * out)756*d57664e9SAndroid Build Coastguard Worker bool parseScreenSize(const char* name, ResTable_config* out) {
757*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
758*d57664e9SAndroid Build Coastguard Worker         if (out) {
759*d57664e9SAndroid Build Coastguard Worker             out->screenWidth = out->SCREENWIDTH_ANY;
760*d57664e9SAndroid Build Coastguard Worker             out->screenHeight = out->SCREENHEIGHT_ANY;
761*d57664e9SAndroid Build Coastguard Worker         }
762*d57664e9SAndroid Build Coastguard Worker         return true;
763*d57664e9SAndroid Build Coastguard Worker     }
764*d57664e9SAndroid Build Coastguard Worker 
765*d57664e9SAndroid Build Coastguard Worker     const char* x = name;
766*d57664e9SAndroid Build Coastguard Worker     while (*x >= '0' && *x <= '9') x++;
767*d57664e9SAndroid Build Coastguard Worker     if (x == name || *x != 'x') return false;
768*d57664e9SAndroid Build Coastguard Worker     String8 xName(name, x-name);
769*d57664e9SAndroid Build Coastguard Worker     x++;
770*d57664e9SAndroid Build Coastguard Worker 
771*d57664e9SAndroid Build Coastguard Worker     const char* y = x;
772*d57664e9SAndroid Build Coastguard Worker     while (*y >= '0' && *y <= '9') y++;
773*d57664e9SAndroid Build Coastguard Worker     if (y == name || *y != 0) return false;
774*d57664e9SAndroid Build Coastguard Worker     String8 yName(x, y-x);
775*d57664e9SAndroid Build Coastguard Worker 
776*d57664e9SAndroid Build Coastguard Worker     uint16_t w = (uint16_t)atoi(xName.c_str());
777*d57664e9SAndroid Build Coastguard Worker     uint16_t h = (uint16_t)atoi(yName.c_str());
778*d57664e9SAndroid Build Coastguard Worker     if (w < h) {
779*d57664e9SAndroid Build Coastguard Worker         return false;
780*d57664e9SAndroid Build Coastguard Worker     }
781*d57664e9SAndroid Build Coastguard Worker 
782*d57664e9SAndroid Build Coastguard Worker     if (out) {
783*d57664e9SAndroid Build Coastguard Worker         out->screenWidth = w;
784*d57664e9SAndroid Build Coastguard Worker         out->screenHeight = h;
785*d57664e9SAndroid Build Coastguard Worker     }
786*d57664e9SAndroid Build Coastguard Worker 
787*d57664e9SAndroid Build Coastguard Worker     return true;
788*d57664e9SAndroid Build Coastguard Worker }
789*d57664e9SAndroid Build Coastguard Worker 
parseSmallestScreenWidthDp(const char * name,ResTable_config * out)790*d57664e9SAndroid Build Coastguard Worker bool parseSmallestScreenWidthDp(const char* name, ResTable_config* out) {
791*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
792*d57664e9SAndroid Build Coastguard Worker         if (out) {
793*d57664e9SAndroid Build Coastguard Worker             out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
794*d57664e9SAndroid Build Coastguard Worker         }
795*d57664e9SAndroid Build Coastguard Worker         return true;
796*d57664e9SAndroid Build Coastguard Worker     }
797*d57664e9SAndroid Build Coastguard Worker 
798*d57664e9SAndroid Build Coastguard Worker     if (*name != 's') return false;
799*d57664e9SAndroid Build Coastguard Worker     name++;
800*d57664e9SAndroid Build Coastguard Worker     if (*name != 'w') return false;
801*d57664e9SAndroid Build Coastguard Worker     name++;
802*d57664e9SAndroid Build Coastguard Worker     const char* x = name;
803*d57664e9SAndroid Build Coastguard Worker     while (*x >= '0' && *x <= '9') x++;
804*d57664e9SAndroid Build Coastguard Worker     if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
805*d57664e9SAndroid Build Coastguard Worker     String8 xName(name, x-name);
806*d57664e9SAndroid Build Coastguard Worker 
807*d57664e9SAndroid Build Coastguard Worker     if (out) {
808*d57664e9SAndroid Build Coastguard Worker         out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str());
809*d57664e9SAndroid Build Coastguard Worker     }
810*d57664e9SAndroid Build Coastguard Worker 
811*d57664e9SAndroid Build Coastguard Worker     return true;
812*d57664e9SAndroid Build Coastguard Worker }
813*d57664e9SAndroid Build Coastguard Worker 
parseScreenWidthDp(const char * name,ResTable_config * out)814*d57664e9SAndroid Build Coastguard Worker bool parseScreenWidthDp(const char* name, ResTable_config* out) {
815*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
816*d57664e9SAndroid Build Coastguard Worker         if (out) {
817*d57664e9SAndroid Build Coastguard Worker             out->screenWidthDp = out->SCREENWIDTH_ANY;
818*d57664e9SAndroid Build Coastguard Worker         }
819*d57664e9SAndroid Build Coastguard Worker         return true;
820*d57664e9SAndroid Build Coastguard Worker     }
821*d57664e9SAndroid Build Coastguard Worker 
822*d57664e9SAndroid Build Coastguard Worker     if (*name != 'w') return false;
823*d57664e9SAndroid Build Coastguard Worker     name++;
824*d57664e9SAndroid Build Coastguard Worker     const char* x = name;
825*d57664e9SAndroid Build Coastguard Worker     while (*x >= '0' && *x <= '9') x++;
826*d57664e9SAndroid Build Coastguard Worker     if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
827*d57664e9SAndroid Build Coastguard Worker     String8 xName(name, x-name);
828*d57664e9SAndroid Build Coastguard Worker 
829*d57664e9SAndroid Build Coastguard Worker     if (out) {
830*d57664e9SAndroid Build Coastguard Worker         out->screenWidthDp = (uint16_t)atoi(xName.c_str());
831*d57664e9SAndroid Build Coastguard Worker     }
832*d57664e9SAndroid Build Coastguard Worker 
833*d57664e9SAndroid Build Coastguard Worker     return true;
834*d57664e9SAndroid Build Coastguard Worker }
835*d57664e9SAndroid Build Coastguard Worker 
parseScreenHeightDp(const char * name,ResTable_config * out)836*d57664e9SAndroid Build Coastguard Worker bool parseScreenHeightDp(const char* name, ResTable_config* out) {
837*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
838*d57664e9SAndroid Build Coastguard Worker         if (out) {
839*d57664e9SAndroid Build Coastguard Worker             out->screenHeightDp = out->SCREENWIDTH_ANY;
840*d57664e9SAndroid Build Coastguard Worker         }
841*d57664e9SAndroid Build Coastguard Worker         return true;
842*d57664e9SAndroid Build Coastguard Worker     }
843*d57664e9SAndroid Build Coastguard Worker 
844*d57664e9SAndroid Build Coastguard Worker     if (*name != 'h') return false;
845*d57664e9SAndroid Build Coastguard Worker     name++;
846*d57664e9SAndroid Build Coastguard Worker     const char* x = name;
847*d57664e9SAndroid Build Coastguard Worker     while (*x >= '0' && *x <= '9') x++;
848*d57664e9SAndroid Build Coastguard Worker     if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
849*d57664e9SAndroid Build Coastguard Worker     String8 xName(name, x-name);
850*d57664e9SAndroid Build Coastguard Worker 
851*d57664e9SAndroid Build Coastguard Worker     if (out) {
852*d57664e9SAndroid Build Coastguard Worker         out->screenHeightDp = (uint16_t)atoi(xName.c_str());
853*d57664e9SAndroid Build Coastguard Worker     }
854*d57664e9SAndroid Build Coastguard Worker 
855*d57664e9SAndroid Build Coastguard Worker     return true;
856*d57664e9SAndroid Build Coastguard Worker }
857*d57664e9SAndroid Build Coastguard Worker 
parseVersion(const char * name,ResTable_config * out)858*d57664e9SAndroid Build Coastguard Worker bool parseVersion(const char* name, ResTable_config* out) {
859*d57664e9SAndroid Build Coastguard Worker     if (strcmp(name, kWildcardName) == 0) {
860*d57664e9SAndroid Build Coastguard Worker         if (out) {
861*d57664e9SAndroid Build Coastguard Worker             out->sdkVersion = out->SDKVERSION_ANY;
862*d57664e9SAndroid Build Coastguard Worker             out->minorVersion = out->MINORVERSION_ANY;
863*d57664e9SAndroid Build Coastguard Worker         }
864*d57664e9SAndroid Build Coastguard Worker         return true;
865*d57664e9SAndroid Build Coastguard Worker     }
866*d57664e9SAndroid Build Coastguard Worker 
867*d57664e9SAndroid Build Coastguard Worker     if (*name != 'v') {
868*d57664e9SAndroid Build Coastguard Worker         return false;
869*d57664e9SAndroid Build Coastguard Worker     }
870*d57664e9SAndroid Build Coastguard Worker 
871*d57664e9SAndroid Build Coastguard Worker     name++;
872*d57664e9SAndroid Build Coastguard Worker     const char* s = name;
873*d57664e9SAndroid Build Coastguard Worker     while (*s >= '0' && *s <= '9') s++;
874*d57664e9SAndroid Build Coastguard Worker     if (s == name || *s != 0) return false;
875*d57664e9SAndroid Build Coastguard Worker     String8 sdkName(name, s-name);
876*d57664e9SAndroid Build Coastguard Worker 
877*d57664e9SAndroid Build Coastguard Worker     if (out) {
878*d57664e9SAndroid Build Coastguard Worker         out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
879*d57664e9SAndroid Build Coastguard Worker         out->minorVersion = 0;
880*d57664e9SAndroid Build Coastguard Worker     }
881*d57664e9SAndroid Build Coastguard Worker 
882*d57664e9SAndroid Build Coastguard Worker     return true;
883*d57664e9SAndroid Build Coastguard Worker }
884*d57664e9SAndroid Build Coastguard Worker 
getVersion(const ResTable_config & config)885*d57664e9SAndroid Build Coastguard Worker String8 getVersion(const ResTable_config& config) {
886*d57664e9SAndroid Build Coastguard Worker     return String8::format("v%u", config.sdkVersion);
887*d57664e9SAndroid Build Coastguard Worker }
888*d57664e9SAndroid Build Coastguard Worker 
isSameExcept(const ResTable_config & a,const ResTable_config & b,int axisMask)889*d57664e9SAndroid Build Coastguard Worker bool isSameExcept(const ResTable_config& a, const ResTable_config& b, int axisMask) {
890*d57664e9SAndroid Build Coastguard Worker     return a.diff(b) == axisMask;
891*d57664e9SAndroid Build Coastguard Worker }
892*d57664e9SAndroid Build Coastguard Worker 
isDensityOnly(const ResTable_config & config)893*d57664e9SAndroid Build Coastguard Worker bool isDensityOnly(const ResTable_config& config) {
894*d57664e9SAndroid Build Coastguard Worker     if (config.density == ResTable_config::DENSITY_DEFAULT) {
895*d57664e9SAndroid Build Coastguard Worker         return false;
896*d57664e9SAndroid Build Coastguard Worker     }
897*d57664e9SAndroid Build Coastguard Worker 
898*d57664e9SAndroid Build Coastguard Worker     if (config.density == ResTable_config::DENSITY_ANY) {
899*d57664e9SAndroid Build Coastguard Worker         if (config.sdkVersion != SDK_LOLLIPOP) {
900*d57664e9SAndroid Build Coastguard Worker             // Someone modified the sdkVersion from the default, this is not safe to assume.
901*d57664e9SAndroid Build Coastguard Worker             return false;
902*d57664e9SAndroid Build Coastguard Worker         }
903*d57664e9SAndroid Build Coastguard Worker     } else if (config.sdkVersion != SDK_DONUT) {
904*d57664e9SAndroid Build Coastguard Worker         return false;
905*d57664e9SAndroid Build Coastguard Worker     }
906*d57664e9SAndroid Build Coastguard Worker 
907*d57664e9SAndroid Build Coastguard Worker     const uint32_t mask = ResTable_config::CONFIG_DENSITY | ResTable_config::CONFIG_VERSION;
908*d57664e9SAndroid Build Coastguard Worker     const ConfigDescription nullConfig;
909*d57664e9SAndroid Build Coastguard Worker     return (nullConfig.diff(config) & ~mask) == 0;
910*d57664e9SAndroid Build Coastguard Worker }
911*d57664e9SAndroid Build Coastguard Worker 
912*d57664e9SAndroid Build Coastguard Worker } // namespace AaptConfig
913