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