1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/*
2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2008 The Android Open Source Project
3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License.
6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at
7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and
14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License.
15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage android.util;
18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
19a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perezimport com.android.ide.common.rendering.api.AttrResourceValue;
20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.RenderResources;
21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceValue;
22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.internal.util.XmlUtils;
23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge;
24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.BridgeConstants;
25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.android.BridgeContext;
26c244feee4f2f1c8e0c466c152ab5a1ab025333d2Deepanshu Guptaimport com.android.layoutlib.bridge.impl.ResourceHelper;
27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.resources.ResourceType;
28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport org.xmlpull.v1.XmlPullParser;
30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
31a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perezimport android.annotation.NonNull;
32a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
33a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perezimport java.util.Map;
34a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perezimport java.util.function.Function;
35a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/**
37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * A correct implementation of the {@link AttributeSet} interface on top of a XmlPullParser
38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipublic class BridgeXmlPullAttributes extends XmlPullAttributes {
40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final BridgeContext mContext;
42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final boolean mPlatformFile;
43a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    private final Function<String, Map<String, Integer>> mFrameworkEnumValueSupplier;
44a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    private final Function<String, Map<String, Integer>> mProjectEnumValueSupplier;
45a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
46a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    // VisibleForTesting
47a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    BridgeXmlPullAttributes(@NonNull XmlPullParser parser, @NonNull BridgeContext context,
48a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            boolean platformFile,
49a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            @NonNull Function<String, Map<String, Integer>> frameworkEnumValueSupplier,
50a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            @NonNull Function<String, Map<String, Integer>> projectEnumValueSupplier) {
51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        super(parser);
52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mContext = context;
53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mPlatformFile = platformFile;
54a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        mFrameworkEnumValueSupplier = frameworkEnumValueSupplier;
55a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        mProjectEnumValueSupplier = projectEnumValueSupplier;
56a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    }
57a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
58a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    public BridgeXmlPullAttributes(@NonNull XmlPullParser parser, @NonNull BridgeContext context,
59a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            boolean platformFile) {
60a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        this(parser, context, platformFile, Bridge::getEnumValues, attrName -> {
61a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            // get the styleable matching the resolved name
62a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            RenderResources res = context.getRenderResources();
63a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            ResourceValue attr = res.getProjectResource(ResourceType.ATTR, attrName);
64a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            return attr instanceof AttrResourceValue ?
65a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                    ((AttrResourceValue) attr).getAttributeValues() : null;
66a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        });
67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /*
70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * (non-Javadoc)
71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @see android.util.XmlPullAttributes#getAttributeNameResource(int)
72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *
73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * This methods must return com.android.internal.R.attr.<name> matching
74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * the name of the attribute.
75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * It returns 0 if it doesn't find anything.
76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeNameResource(int index) {
79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the attribute name.
80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String name = getAttributeName(index);
81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the attribute namespace
83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String ns = mParser.getAttributeNamespace(index);
84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (BridgeConstants.NS_RESOURCES.equals(ns)) {
86a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            return Bridge.getResourceId(ResourceType.ATTR, name);
87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // this is not an attribute in the android namespace, we query the customviewloader, if
91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // the namespaces match.
92b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        if (mContext.getLayoutlibCallback().getNamespace().equals(ns)) {
93b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            Integer v = mContext.getLayoutlibCallback().getResourceId(ResourceType.ATTR, name);
94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (v != null) {
95a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                return v;
96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeListValue(String namespace, String attribute,
104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String[] options, int defaultValue) {
105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(namespace, attribute);
106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value != null) {
107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(value);
108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                value = r.getValue();
111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
113ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return XmlUtils.convertValueToList(value, options, defaultValue);
114ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
115ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
116ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
117ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean getAttributeBooleanValue(String namespace, String attribute,
121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            boolean defaultValue) {
122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(namespace, attribute);
123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value != null) {
124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(value);
125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                value = r.getValue();
128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return XmlUtils.convertValueToBoolean(value, defaultValue);
131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
133ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
135ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
136ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
137ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) {
138ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(namespace, attribute);
139ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
140ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return resolveResourceValue(value, defaultValue);
141ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
142ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
143ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
144a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez    public int getAttributeIntValue(String namespace, String attribute, int defaultValue) {
145ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(namespace, attribute);
146a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        if (value == null) {
147a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            return defaultValue;
148a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        }
149ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
150a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        ResourceValue r = getResourceValue(value);
151ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
152a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        if (r != null) {
153a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            value = r.getValue();
154ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
155ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
156a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        if (value.charAt(0) == '#') {
157a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            return ResourceHelper.getColor(value);
158a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        }
159a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
160a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        try {
161a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            return XmlUtils.convertValueToInt(value, defaultValue);
162a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        } catch (NumberFormatException e) {
163a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            // This is probably an enum
164a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            Map<String, Integer> enumValues = BridgeConstants.NS_RESOURCES.equals(namespace) ?
165a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                    mFrameworkEnumValueSupplier.apply(attribute) :
166a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                    mProjectEnumValueSupplier.apply(attribute);
167a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
168a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            Integer enumValue = enumValues != null ? enumValues.get(value) : null;
169a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            if (enumValue != null) {
170a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                return enumValue;
171a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            }
172a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez
173a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            // We weren't able to find the enum int value
174a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez            throw e;
175a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        }
176ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
177ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
178ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
179ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeUnsignedIntValue(String namespace, String attribute,
180ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            int defaultValue) {
181ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(namespace, attribute);
182ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value != null) {
183ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(value);
184ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
185ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
186ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                value = r.getValue();
187ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
188ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
189ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return XmlUtils.convertValueToUnsignedInt(value, defaultValue);
190ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
191ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
192ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
193ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
194ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
195ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
196ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public float getAttributeFloatValue(String namespace, String attribute,
197ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            float defaultValue) {
198ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String s = getAttributeValue(namespace, attribute);
199ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (s != null) {
200ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(s);
201ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
202ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
203ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                s = r.getValue();
204ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
205ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
206ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return Float.parseFloat(s);
207ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
208ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
209ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
210ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
211ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
212ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeListValue(int index,
214ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String[] options, int defaultValue) {
215ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return XmlUtils.convertValueToList(
216ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            getAttributeValue(index), options, defaultValue);
217ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
218ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
219ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
220ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean getAttributeBooleanValue(int index, boolean defaultValue) {
221ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(index);
222ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value != null) {
223ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(value);
224ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
225ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
226ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                value = r.getValue();
227ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
228ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
229ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return XmlUtils.convertValueToBoolean(value, defaultValue);
230ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
231ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
232ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
233ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
234ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
235ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
236ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeResourceValue(int index, int defaultValue) {
237ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(index);
238ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return resolveResourceValue(value, defaultValue);
240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
242ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
243ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeIntValue(int index, int defaultValue) {
244a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez        return getAttributeIntValue(mParser.getAttributeNamespace(index),
245a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                getAttributeName(index)
246a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perez                , defaultValue);
247ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
248ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getAttributeUnsignedIntValue(int index, int defaultValue) {
251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String value = getAttributeValue(index);
252ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value != null) {
253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(value);
254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
256ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                value = r.getValue();
257ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
258ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
259ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return XmlUtils.convertValueToUnsignedInt(value, defaultValue);
260ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
261ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
263ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
264ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public float getAttributeFloatValue(int index, float defaultValue) {
267ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String s = getAttributeValue(index);
268ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (s != null) {
269ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue r = getResourceValue(s);
270ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
271ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (r != null) {
272ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                s = r.getValue();
273ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
274ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return Float.parseFloat(s);
276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
277ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
278ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
279ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
280ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
281ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // -- private helper methods
282ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
283ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
284ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns a resolved {@link ResourceValue} from a given value.
285ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
286ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private ResourceValue getResourceValue(String value) {
287ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // now look for this particular value
288ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        RenderResources resources = mContext.getRenderResources();
289ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return resources.resolveResValue(resources.findResValue(value, mPlatformFile));
290ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
291ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
292ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
293ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Resolves and return a value to its associated integer.
294ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
295ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private int resolveResourceValue(String value, int defaultValue) {
296ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ResourceValue resource = getResourceValue(value);
297ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resource != null) {
2983780b5f90d3b967c2b02b50a27ad315ee86de090Diego Perez            Integer id;
299ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (mPlatformFile || resource.isFramework()) {
300ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                id = Bridge.getResourceId(resource.getResourceType(), resource.getName());
301ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            } else {
302b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta                id = mContext.getLayoutlibCallback().getResourceId(
303ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        resource.getResourceType(), resource.getName());
304ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
306ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (id != null) {
307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                return id;
308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
311ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defaultValue;
312ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
313ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski}
314