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