19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohetpackage android.content.res; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohetimport com.android.ide.common.rendering.api.DeclareStyleableResourceValue; 20918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog; 2170552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderResources; 2219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue; 2319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.StyleResourceValue; 242269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 25c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.Bridge; 26c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.BridgeConstants; 27d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeContext; 28d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeXmlBlockParser; 2904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohetimport com.android.layoutlib.bridge.impl.ParserFactory; 30c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.ResourceHelper; 3135ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohetimport com.android.resources.ResourceType; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 3456222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohetimport org.xmlpull.v1.XmlPullParserException; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 39fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohetimport android.view.LayoutInflater_Delegate; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup.LayoutParams; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 4335ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohetimport java.util.Arrays; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 47c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * Custom implementation of TypedArray to handle non compiled resources. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BridgeTypedArray extends TypedArray { 50eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 51beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet private final BridgeResources mBridgeResources; 52beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet private final BridgeContext mContext; 53beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet private final boolean mPlatformFile; 54beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet private final boolean mPlatformStyleable; 55beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet private final String mStyleableName; 56beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet 57c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet private ResourceValue[] mResourceData; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mNames; 59eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len, 61beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet boolean platformFile, boolean platformStyleable, String styleableName) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(null, null, null, 0); 63c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet mBridgeResources = resources; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlatformFile = platformFile; 66beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet mPlatformStyleable = platformStyleable; 67beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet mStyleableName = styleableName; 68c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet mResourceData = new ResourceValue[len]; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNames = new String[len]; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet /** A bridge-specific method that sets a value in the type array */ 73ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet public void bridgeSetValue(int index, String name, ResourceValue value) { 74c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet mResourceData[index] = value; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNames[index] = name; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * Seals the array after all calls to {@link #bridgeSetValue(int, String, ResourceValue)} have 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been done. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/>This allows to compute the list of non default values, permitting 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getIndexCount()} to return the proper value. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sealArray() { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fills TypedArray.mIndices which is used to implement getIndexCount/getIndexAt 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // first count the array size 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 88c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet for (ResourceValue data : mResourceData) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count++; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // allocate the table with an extra to store the size 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndices = new int[count+1]; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndices[0] = count; 97eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fill the array with the indices. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = 1; 100c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet for (int i = 0 ; i < mResourceData.length ; i++) { 101c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[i] != null) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndices[index++] = i; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of values in this array. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int length() { 112c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet return mResourceData.length; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 114eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the Resources object this array was loaded from. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 120c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet return mBridgeResources; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 122eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the styled string value for the attribute at <var>index</var>. 125eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 127eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 128eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return CharSequence holding string data. May be styled. Returns 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null if the attribute is not defined. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getText(int index) { 133d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 134d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 135d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 136d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 137c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] != null) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME: handle styled strings! 139c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet return mResourceData[index].getValue(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the string value for the attribute at <var>index</var>. 147eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 149eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String holding string data. Any styling information is 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * removed. Returns null if the attribute is not defined. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getString(int index) { 155d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 156d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 157d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 158d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 159c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] != null) { 160c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet return mResourceData[index].getValue(); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 162eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the boolean value for the attribute at <var>index</var>. 168eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined. 171eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute boolean value, or defValue if not defined. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBoolean(int index, boolean defValue) { 176d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 177d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 178d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 179d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 180c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 184c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String s = mResourceData[index].getValue(); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s != null) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XmlUtils.convertValueToBoolean(s, defValue); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 188eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 194eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined. 197eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute int value, or defValue if not defined. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInt(int index, int defValue) { 202d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 203d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 204d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 205d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 206c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String s = mResourceData[index].getValue(); 211eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 212f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet if (RenderResources.REFERENCE_NULL.equals(s)) { 213f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return defValue; 214f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 215f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (s == null) ? defValue : XmlUtils.convertValueToInt(s, defValue); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException e) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Field is not null and is not an integer. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for possible constants and try to find them. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the map of attribute-constant -> IntegerValue 225beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet Map<String, Integer> map = null; 226beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet if (mPlatformStyleable) { 227beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet map = Bridge.getEnumValues(mNames[index]); 22804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet } else if (mStyleableName != null) { 229beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet // get the styleable matching the resolved name 230beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet RenderResources res = mContext.getRenderResources(); 231beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet ResourceValue styleable = res.getProjectResource(ResourceType.DECLARE_STYLEABLE, 232beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet mStyleableName); 233beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet if (styleable instanceof DeclareStyleableResourceValue) { 234beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet map = ((DeclareStyleableResourceValue) styleable).getAttributeValues(mNames[index]); 235beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet } 236beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet } 237eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (map != null) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // accumulator to store the value of the 1+ constants. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = 0; 241eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // split the value in case this is a mix of several flags. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] keywords = s.split("\\|"); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String keyword : keywords) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Integer i = map.get(keyword.trim()); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i != null) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result |= i.intValue(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24951a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 25056222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 25151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "\"%s\" in attribute \"%2$s\" is not a valid value", 25251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet keyword, mNames[index]), null /*data*/); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the float value for the attribute at <var>index</var>. 263eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 265eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute float value, or defValue if not defined.. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFloat(int index, float defValue) { 270d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 271d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 272d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 273d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 274c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 278c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String s = mResourceData[index].getValue(); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s != null) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Float.parseFloat(s); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException e) { 28451a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 28556222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 28651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "\"%s\" in attribute \"%2$s\" cannot be converted to float.", 28751a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet s, mNames[index]), null /*data*/); 288eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we'll return the default value below. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 294eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the color value for the attribute at <var>index</var>. If 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the attribute references a color resource holding a complex 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.res.ColorStateList}, then the default color from 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the set is returned. 300eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 304eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute color value, or defValue if not defined. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getColor(int index, int defValue) { 309d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 310d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 311d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 312d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 313c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 316eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 317d96a7403cda1a873e640b6e6395ddab4c2f9b9f9Xavier Ducrohet ColorStateList colorStateList = ResourceHelper.getColorStateList( 318d96a7403cda1a873e640b6e6395ddab4c2f9b9f9Xavier Ducrohet mResourceData[index], mContext); 319d96a7403cda1a873e640b6e6395ddab4c2f9b9f9Xavier Ducrohet if (colorStateList != null) { 320d96a7403cda1a873e640b6e6395ddab4c2f9b9f9Xavier Ducrohet return colorStateList.getDefaultColor(); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the ColorStateList for the attribute at <var>index</var>. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value may be either a single solid color or a reference to 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a color or complex {@link android.content.res.ColorStateList} description. 330eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 332eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return ColorStateList for the attribute, or null if not defined. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorStateList getColorStateList(int index) { 337d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 338d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 339d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 340d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 341c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34502d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet ResourceValue resValue = mResourceData[index]; 34602d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet String value = resValue.getValue(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 351eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 352f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet if (RenderResources.REFERENCE_NULL.equals(value)) { 353f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return null; 354f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 355f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let the framework inflate the ColorStateList from the XML file. 35756222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet File f = new File(value); 35856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet if (f.isFile()) { 35956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet try { 36004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet XmlPullParser parser = ParserFactory.create(f); 361eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 36202d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser( 36302d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet parser, mContext, resValue.isFramework()); 36402d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet try { 36502d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet return ColorStateList.createFromXml(mContext.getResources(), blockParser); 36602d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet } finally { 36702d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet blockParser.ensurePopped(); 36802d2b5a4031c80bfe1012ce2f4f7b3695762abd9Xavier Ducrohet } 36956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet } catch (XmlPullParserException e) { 370918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().error(LayoutLog.TAG_BROKEN, 37151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Failed to configure parser for " + value, e, null /*data*/); 37256222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet return null; 37356222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet } catch (Exception e) { 37456222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet // this is an error and not warning since the file existence is checked before 37556222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet // attempting to parse it. 376918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().error(LayoutLog.TAG_RESOURCES_READ, 37751a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Failed to parse file " + value, e, null /*data*/); 37856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet 37956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet return null; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 382eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 38356222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet try { 38456222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet int color = ResourceHelper.getColor(value); 38556222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet return ColorStateList.valueOf(color); 38656222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet } catch (NumberFormatException e) { 38751a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e, null /*data*/); 38856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet } 389eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 392eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 395eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 399eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute integer value, or defValue if not defined. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInteger(int index, int defValue) { 40404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet return getInt(index, defValue); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 408eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * Retrieve a dimensional unit attribute at <var>index</var>. Unit 409eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * conversions are based on the current {@link DisplayMetrics} 410eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * associated with the resources this {@link TypedArray} object 411eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * came from. 412eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 416eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 417eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Attribute dimension value multiplied by the appropriate 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric, or defValue if not defined. 419eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getDimension(int index, float defValue) { 425d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 426d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 427d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 428d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 429c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 433c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String s = mResourceData[index].getValue(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 437bc3323bea64bbeab0edd0df5e344d844a8d89509Xavier Ducrohet } else if (s.equals(BridgeConstants.MATCH_PARENT) || 438bc3323bea64bbeab0edd0df5e344d844a8d89509Xavier Ducrohet s.equals(BridgeConstants.FILL_PARENT)) { 439980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy return LayoutParams.MATCH_PARENT; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (s.equals(BridgeConstants.WRAP_CONTENT)) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return LayoutParams.WRAP_CONTENT; 4426f2fb570642189ec2b6068632c25f02391007bb5Xavier Ducrohet } else if (RenderResources.REFERENCE_NULL.equals(s)) { 443f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return defValue; 444f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 445f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet 44604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) { 447d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohet return mValue.getDimension(mBridgeResources.getDisplayMetrics()); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 449eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // looks like we were unable to resolve the dimension value 45151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 45256222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 45351a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "\"%1$s\" in attribute \"%2$s\" is not a valid format.", 45451a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet s, mNames[index]), null /*data*/); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as an offset in raw pixels. This is the same as 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for you. An offset conversion involves simply 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * truncating the base value to an integer. 465eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 469eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 470eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Attribute dimension value multiplied by the appropriate 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels, or defValue if not defined. 472eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelOffset(int index, int defValue) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) getDimension(index, defValue); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a size in raw pixels. This is the same as 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for use as a size. A size conversion involves 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rounding the base value, and ensuring that a non-zero base value 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is at least one pixel in size. 488eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 492eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 493eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Attribute dimension value multiplied by the appropriate 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels, or defValue if not defined. 495eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelSize(int index, int defValue) { 501fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet try { 502fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet return getDimension(index); 503fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } catch (RuntimeException e) { 504fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (mResourceData[index] != null) { 505fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet String s = mResourceData[index].getValue(); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 507fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (s != null) { 508fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet // looks like we were unable to resolve the dimension value 509fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 510fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet String.format( 511fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet "\"%1$s\" in attribute \"%2$s\" is not a valid format.", 512fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet s, mNames[index]), null /*data*/); 513fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 514fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 516f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return defValue; 517f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special version of {@link #getDimensionPixelSize} for retrieving 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}'s layout_width and layout_height 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes. This is only here for performance reasons; applications 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use {@link #getDimensionPixelSize}. 525eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of the attribute to retrieve. 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name Textual name of attribute for error reporting. 528eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 529eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Attribute dimension value multiplied by the appropriate 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutDimension(int index, String name) { 534fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet try { 535fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet // this will throw an exception 536fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet return getDimension(index); 537fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } catch (RuntimeException e) { 538fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 539fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (LayoutInflater_Delegate.sIsInInclude) { 540fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet throw new RuntimeException(); 541fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 542fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 543fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 544fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet "You must supply a " + name + " attribute.", null); 545fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 546fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet return 0; 547fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 550eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet @Override 551eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet public int getLayoutDimension(int index, int defValue) { 552eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet return getDimensionPixelSize(index, defValue); 553eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet } 554eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 555fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet private int getDimension(int index) { 556fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (mResourceData[index] == null) { 557fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet throw new RuntimeException(); 558fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 559fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 560fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet String s = mResourceData[index].getValue(); 561fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 562fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (s == null) { 563fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet throw new RuntimeException(); 564fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } else if (s.equals(BridgeConstants.MATCH_PARENT) || 565fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet s.equals(BridgeConstants.FILL_PARENT)) { 566fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet return LayoutParams.MATCH_PARENT; 567fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } else if (s.equals(BridgeConstants.WRAP_CONTENT)) { 568fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet return LayoutParams.WRAP_CONTENT; 569fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } else if (RenderResources.REFERENCE_NULL.equals(s)) { 570fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet throw new RuntimeException(); 571fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 572fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 57304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) { 574d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohet float f = mValue.getDimension(mBridgeResources.getDisplayMetrics()); 575fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 576fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet final int res = (int)(f+0.5f); 577fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (res != 0) return res; 578fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (f == 0) return 0; 579fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet if (f > 0) return 1; 580fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 581fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 582fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet throw new RuntimeException(); 583fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet } 584fb93ce9684120a36862b5b5e67b1865a652907e9Xavier Ducrohet 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a fractional unit attribute at <var>index</var>. 587eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 588eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @param index Index of attribute to retrieve. 589eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @param base The base value of this fraction. In other words, a 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard fraction is multiplied by this value. 591eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @param pbase The parent base value of this fraction. In other 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * words, a parent fraction (nn%p) is multiplied by this 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value. 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 596eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 597eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Attribute fractional value multiplied by the appropriate 598eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * base value, or defValue if not defined. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFraction(int index, int base, int pbase, float defValue) { 602d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 603d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 604d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 605d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 606c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 610c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String value = mResourceData[index].getValue(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 614eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 61504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet if (ResourceHelper.parseFloatAttribute(mNames[index], value, mValue, 61604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet false /*requireUnit*/)) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValue.getFraction(base, pbase); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // looks like we were unable to resolve the fraction value 62151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 62256222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 62304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet "\"%1$s\" in attribute \"%2$s\" cannot be converted to a fraction.", 62451a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet value, mNames[index]), null /*data*/); 625eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the resource identifier for the attribute at 631eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * <var>index</var>. Note that attribute resource as resolved when 632eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * the overall {@link TypedArray} object is retrieved. As a 633eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * result, this function will return the resource identifier of the 634eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * final resource value that was found, <em>not</em> necessarily the 635eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * original resource that was specified by the attribute. 636eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 640eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute resource identifier, or defValue if not defined. 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getResourceId(int index, int defValue) { 645d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 646d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return defValue; 647d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 648d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 649c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet // get the Resource for this index 650c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet ResourceValue resValue = mResourceData[index]; 651eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no data, return the default value. 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resValue == null) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check if this is a style resource 658ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet if (resValue instanceof StyleResourceValue) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get the id that will represent this style. 660ffb42f6c5043de226f02318a1311669d35a90711Xavier Ducrohet return mContext.getDynamicIdByStyle((StyleResourceValue)resValue); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 662eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 663f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet if (RenderResources.REFERENCE_NULL.equals(resValue.getValue())) { 664f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return defValue; 665f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 666f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet 667eb87b3bb53a8a9e9a246b4b70ea40172e2229c85Xavier Ducrohet // if the attribute was a reference to a resource, and not a declaration of an id (@+id), 668eb87b3bb53a8a9e9a246b4b70ea40172e2229c85Xavier Ducrohet // then the xml attribute value was "resolved" which leads us to a ResourceValue with a 669eb87b3bb53a8a9e9a246b4b70ea40172e2229c85Xavier Ducrohet // valid getType() and getName() returning a resource name. 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (and getValue() returning null!). We need to handle this! 671b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet if (resValue.getResourceType() != null) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if this is a framework id 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPlatformFile || resValue.isFramework()) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // look for idName in the android R classes 675eb87b3bb53a8a9e9a246b4b70ea40172e2229c85Xavier Ducrohet return mContext.getFrameworkResourceValue( 67635ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet resValue.getResourceType(), resValue.getName(), defValue); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // look for idName in the project R class. 680eb87b3bb53a8a9e9a246b4b70ea40172e2229c85Xavier Ducrohet return mContext.getProjectResourceValue( 68135ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet resValue.getResourceType(), resValue.getName(), defValue); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // else, try to get the value, and resolve it somehow. 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = resValue.getValue(); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the value is just an integer, return it. 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = Integer.parseInt(value); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Integer.toString(i).equals(value)) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException e) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Handle the @id/<name>, @+id/<name> and @android:id/<name> 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We need to return the exact value that was compiled (from the various R classes), 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as these values can be reused internally with calls to findViewById(). 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There's a trick with platform layouts that not use "android:" but their IDs are in 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fact in the android.R and com.android.internal.R classes. 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The field mPlatformFile will indicate that all IDs are to be looked up in the android R 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // classes exclusively. 707eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if this is a reference to an id, find it. 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.startsWith("@id/") || value.startsWith("@+") || 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.startsWith("@android:id/")) { 711eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = value.indexOf('/'); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String idName = value.substring(pos + 1); 714eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if this is a framework id 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // look for idName in the android R classes 71835ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet return mContext.getFrameworkResourceValue(ResourceType.ID, idName, defValue); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // look for idName in the project R class. 72235ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet return mContext.getProjectResourceValue(ResourceType.ID, idName, defValue); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not a direct id valid reference? resolve it 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Integer idValue = null; 727eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resValue.isFramework()) { 729b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet idValue = Bridge.getResourceId(resValue.getResourceType(), 73035ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet resValue.getName()); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 732b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet idValue = mContext.getProjectCallback().getResourceId( 73335ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet resValue.getResourceType(), resValue.getName()); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idValue != null) { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return idValue.intValue(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 740918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_RESOLVE, 74156222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 74251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Unable to resolve id \"%1$s\" for attribute \"%2$s\"", value, mNames[index]), 74351a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet resValue); 744419e8296ea76c5f1db1abbaa88b39b538fa42403Xavier Ducrohet 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the Drawable for the attribute at <var>index</var>. This 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * gets the resource ID of the selected attribute, and uses 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getDrawable Resources.getDrawable} of the owning 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object to retrieve its Drawable. 753eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 755eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Drawable for the attribute, or null if not defined. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getDrawable(int index) { 760d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 761d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 762d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 763d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 764c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 768c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet ResourceValue value = mResourceData[index]; 76956a92e3ba0d7da310b4c6e09f54dee10f1f395bbXavier Ducrohet String stringValue = value.getValue(); 77070552fb92dbc5cb5b1d53b20f92f2a64969a50c4Xavier Ducrohet if (stringValue == null || RenderResources.REFERENCE_NULL.equals(stringValue)) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 773eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 774bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet return ResourceHelper.getDrawable(value, mContext); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the CharSequence[] for the attribute at <var>index</var>. 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This gets the resource ID of the selected attribute, and uses 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getTextArray Resources.getTextArray} of the owning 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object to retrieve its String[]. 783eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 785eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence[] for the attribute, or null if not defined. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence[] getTextArray(int index) { 790d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 791d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 792d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 793d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 794c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 798c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String value = mResourceData[index].getValue(); 799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (value != null) { 800f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet if (RenderResources.REFERENCE_NULL.equals(value)) { 801f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet return null; 802f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet } 803f20999965b94bdcc2b1f2c05b587ff405924bc96Xavier Ducrohet 804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return new CharSequence[] { value }; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 806eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 80751a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT, 80856222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format( 80956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet String.format("Unknown value for getTextArray(%d) => %s", //DEBUG 81051a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet index, mResourceData[index].getName())), null /*data*/); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return null; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the raw TypedValue for the attribute at <var>index</var>. 817eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue TypedValue object in which to place the attribute's 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data. 821eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 822eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Returns true if the value was retrieved, else false. 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getValue(int index, TypedValue outValue) { 826d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 827d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return false; 828d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 829d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 830c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet if (mResourceData[index] == null) { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 833eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 834c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet String s = mResourceData[index].getValue(); 835eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 83604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet return ResourceHelper.parseFloatAttribute(mNames[index], s, outValue, 83704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet false /*requireUnit*/); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether there is an attribute at <var>index</var>. 842eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 844eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the attribute has a value, false otherwise. 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasValue(int index) { 849d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 850d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return false; 851d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 852d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 853c77515e59029580caa68ba7602264ebdfd602dafXavier Ducrohet return mResourceData[index] != null; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 855eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 857eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * Retrieve the raw TypedValue for the attribute at <var>index</var> 858eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * and return a temporary object holding its data. This object is only 859eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * valid until the next call on to {@link TypedArray}. 860eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 862eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * 863eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet * @return Returns a TypedValue object if the attribute is defined, 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing its data; otherwise returns null. (You will not 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive a TypedValue whose type is TYPE_NULL.) 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedValue peekValue(int index) { 869d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet if (index < 0 || index >= mResourceData.length) { 870d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet return null; 871d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet } 872d292d2a03134eaca8b51b6313610b4b78de53c83Xavier Ducrohet 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValue(index, mValue)) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValue; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 876eba337ad09ba93b31f4e9ec8f99be3ae2811bf89Xavier Ducrohet 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a message about the parser state suitable for printing error messages. 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPositionDescription() { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "<internal -- stub if needed>"; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Give back a previously retrieved StyledAttributes, for later re-use. 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recycle() { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 89835ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohet return Arrays.toString(mResourceData); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 901