115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.res; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackbornimport android.content.pm.ActivityInfo; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 252269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 262269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for an array of values that were retrieved with 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)} 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link Resources#obtainAttributes}. Be 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sure to call {@link #recycle} when done with them. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The indices used to retrieve values from this structure correspond to 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the positions of the attributes given to obtainStyledAttributes. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TypedArray { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Resources mResources; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ XmlBlock.Parser mXml; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int[] mRsrcs; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int[] mData; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int[] mIndices; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int mLength; 467f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet /*package*/ TypedValue mValue = new TypedValue(); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of values in this array. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int length() { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLength; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the number of indices in the array that actually have data. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIndexCount() { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndices[0]; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an index in the array that has data. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param at The index you would like to returned, ranging from 0 to 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getIndexCount()}. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The index at the given offset, which can be used with 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getValue} and related APIs. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIndex(int at) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndices[1+at]; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the Resources object this array was loaded from. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the styled string value for the attribute at <var>index</var>. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence holding string data. May be styled. Returns 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null if the attribute is not defined. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getText(int index) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadStringValueAt(index); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = mValue; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "Converting to string: " + v); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v.coerceToString(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "getString of bad type: 0x" 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the string value for the attribute at <var>index</var>. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String holding string data. Any styling information is 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * removed. Returns null if the attribute is not defined. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getString(int index) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadStringValueAt(index).toString(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = mValue; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "Converting to string: " + v); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cs != null ? cs.toString() : null; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "getString of bad type: 0x" 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the string value for the attribute at <var>index</var>, but 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only if that string comes from an immediate value in an XML file. That 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, this does not allow references to string resources, string 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes, or conversions from other types. As such, this method 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will only return strings for TypedArray objects that come from 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes in an XML file. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return String holding string data. Any styling information is 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * removed. Returns null if the attribute is not defined or is not 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an immediate string value. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getNonResourceString(int index) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_STRING) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cookie = data[index+AssetManager.STYLE_ASSET_COOKIE]; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie < 0) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXml.getPooledString( 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA]).toString(); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 168cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @hide 169cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * Retrieve the string value for the attribute at <var>index</var> that is 170cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * not allowed to change with the given configurations. 171cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * 172cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @param index Index of attribute to retrieve. 173cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @param allowedChangingConfigs Bit mask of configurations from 1741d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn * {@link Configuration}.NATIVE_CONFIG_* that are allowed to change. 1751d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn * 176cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @return String holding string data. Any styling information is 177cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * removed. Returns null if the attribute is not defined. 178cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn */ 179cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn public String getNonConfigurationString(int index, int allowedChangingConfigs) { 180cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn index *= AssetManager.STYLE_NUM_ENTRIES; 181cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn final int[] data = mData; 182cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn final int type = data[index+AssetManager.STYLE_TYPE]; 183cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if ((data[index+AssetManager.STYLE_CHANGING_CONFIGURATIONS]&~allowedChangingConfigs) != 0) { 184cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return null; 185cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 186cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (type == TypedValue.TYPE_NULL) { 187cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return null; 188cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } else if (type == TypedValue.TYPE_STRING) { 189cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return loadStringValueAt(index).toString(); 190cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 191cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn 192cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn TypedValue v = mValue; 193cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (getValueAt(index, v)) { 194cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn Log.w(Resources.TAG, "Converting to string: " + v); 195cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn CharSequence cs = v.coerceToString(); 196cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return cs != null ? cs.toString() : null; 197cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 198cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn Log.w(Resources.TAG, "getString of bad type: 0x" 199cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn + Integer.toHexString(type)); 200cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return null; 201cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 202cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn 203cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the boolean value for the attribute at <var>index</var>. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute boolean value, or defValue if not defined. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getBoolean(int index, boolean defValue) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA] != 0; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = mValue; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "Converting to boolean: " + v); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XmlUtils.convertValueToBoolean( 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v.coerceToString(), defValue); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "getBoolean of bad type: 0x" 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute int value, or defValue if not defined. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInt(int index, int defValue) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = mValue; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "Converting to int: " + v); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XmlUtils.convertValueToInt( 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v.coerceToString(), defValue); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "getInt of bad type: 0x" 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the float value for the attribute at <var>index</var>. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute float value, or defValue if not defined.. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFloat(int index, float defValue) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_FLOAT) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Float.intBitsToFloat(data[index+AssetManager.STYLE_DATA]); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = mValue; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "Converting to float: " + v); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence str = v.coerceToString(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Float.parseFloat(str.toString()); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(Resources.TAG, "getFloat of bad type: 0x" 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the color value for the attribute at <var>index</var>. If 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the attribute references a color resource holding a complex 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.res.ColorStateList}, then the default color from 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the set is returned. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute color value, or defValue if not defined. 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getColor(int index, int defValue) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, value)) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ColorStateList csl = mResources.loadColorStateList( 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value, value.resourceId); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl.getDefaultColor(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to color: type=0x" 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the ColorStateList for the attribute at <var>index</var>. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value may be either a single solid color or a reference to 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a color or complex {@link android.content.res.ColorStateList} description. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return ColorStateList for the attribute, or null if not defined. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorStateList getColorStateList(int index) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.loadColorStateList(value, value.resourceId); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute integer value, or defValue if not defined. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInteger(int index, int defValue) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to integer: type=0x" 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var>. Unit 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * conversions are based on the current {@link DisplayMetrics} 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated with the resources this {@link TypedArray} object 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * came from. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute dimension value multiplied by the appropriate 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric, or defValue if not defined. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getDimension(int index, float defValue) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimension( 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], mResources.mMetrics); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to dimension: type=0x" 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as an offset in raw pixels. This is the same as 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for you. An offset conversion involves simply 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * truncating the base value to an integer. 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute dimension value multiplied by the appropriate 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels, or defValue if not defined. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelOffset(int index, int defValue) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelOffset( 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], mResources.mMetrics); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to dimension: type=0x" 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a size in raw pixels. This is the same as 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for use as a size. A size conversion involves 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rounding the base value, and ensuring that a non-zero base value 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is at least one pixel in size. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute dimension value multiplied by the appropriate 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels, or defValue if not defined. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDimensionPixelSize(int index, int defValue) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelSize( 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], mResources.mMetrics); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to dimension: type=0x" 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special version of {@link #getDimensionPixelSize} for retrieving 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}'s layout_width and layout_height 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes. This is only here for performance reasons; applications 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use {@link #getDimensionPixelSize}. 473579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of the attribute to retrieve. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name Textual name of attribute for error reporting. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute dimension value multiplied by the appropriate 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutDimension(int index, String name) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type >= TypedValue.TYPE_FIRST_INT 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelSize( 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], mResources.mMetrics); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(getPositionDescription() 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": You must supply a " + name + " attribute."); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special version of {@link #getDimensionPixelSize} for retrieving 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}'s layout_width and layout_height 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes. This is only here for performance reasons; applications 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use {@link #getDimensionPixelSize}. 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of the attribute to retrieve. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue The default value to return if this attribute is not 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default or contains the wrong type of data. 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute dimension value multiplied by the appropriate 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * metric and truncated to integer pixels. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutDimension(int index, int defValue) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type >= TypedValue.TYPE_FIRST_INT 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data[index+AssetManager.STYLE_DATA]; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToDimensionPixelSize( 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], mResources.mMetrics); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a fractional unit attribute at <var>index</var>. 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The base value of this fraction. In other words, a 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard fraction is multiplied by this value. 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pbase The parent base value of this fraction. In other 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * words, a parent fraction (nn%p) is multiplied by this 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value. 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute fractional value multiplied by the appropriate 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * base value, or defValue if not defined. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getFraction(int index, int base, int pbase, float defValue) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_FRACTION) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TypedValue.complexToFraction( 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA], base, pbase); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException("Can't convert to fraction: type=0x" 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(type)); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the resource identifier for the attribute at 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>index</var>. Note that attribute resource as resolved when 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall {@link TypedArray} object is retrieved. As a 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result, this function will return the resource identifier of the 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * final resource value that was found, <em>not</em> necessarily the 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original resource that was specified by the attribute. 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute resource identifier, or defValue if not defined. 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getResourceId(int index, int defValue) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data[index+AssetManager.STYLE_TYPE] != TypedValue.TYPE_NULL) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int resid = data[index+AssetManager.STYLE_RESOURCE_ID]; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return resid; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the Drawable for the attribute at <var>index</var>. This 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * gets the resource ID of the selected attribute, and uses 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getDrawable Resources.getDrawable} of the owning 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object to retrieve its Drawable. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Drawable for the attribute, or null if not defined. 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getDrawable(int index) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("******************************************************************"); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Got drawable resource: type=" 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + value.type 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " str=" + value.string 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " int=0x" + Integer.toHexString(value.data) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " cookie=" + value.assetCookie); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("******************************************************************"); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.loadDrawable(value, value.resourceId); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the CharSequence[] for the attribute at <var>index</var>. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This gets the resource ID of the selected attribute, and uses 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getTextArray Resources.getTextArray} of the owning 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object to retrieve its String[]. 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return CharSequence[] for the attribute, or null if not defined. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence[] getTextArray(int index) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("******************************************************************"); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Got drawable resource: type=" 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + value.type 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " str=" + value.string 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " int=0x" + Integer.toHexString(value.data) 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " cookie=" + value.assetCookie); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("******************************************************************"); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.getTextArray(value.resourceId); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the raw TypedValue for the attribute at <var>index</var>. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue TypedValue object in which to place the attribute's 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data. 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the value was retrieved, else false. 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getValue(int index, TypedValue outValue) { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, outValue); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether there is an attribute at <var>index</var>. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the attribute has a value, false otherwise. 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasValue(int index) { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index *= AssetManager.STYLE_NUM_ENTRIES; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return type != TypedValue.TYPE_NULL; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the raw TypedValue for the attribute at <var>index</var> 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and return a temporary object holding its data. This object is only 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * valid until the next call on to {@link TypedArray}. 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a TypedValue object if the attribute is defined, 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing its data; otherwise returns null. (You will not 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive a TypedValue whose type is TYPE_NULL.) 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TypedValue peekValue(int index) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index*AssetManager.STYLE_NUM_ENTRIES, value)) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a message about the parser state suitable for printing error messages. 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPositionDescription() { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXml != null ? mXml.getPositionDescription() : "<internal>"; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 688183bf116978e3c44292c9ead2bceb47e972624a1Scott Main * Give back a previously retrieved array, for later re-use. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recycle() { 69150707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn synchronized (mResources.mAccessLock) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray cached = mResources.mCachedStyledAttributes; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cached == null || cached.mData.length < mData.length) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mXml = null; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources.mCachedStyledAttributes = this; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean getValueAt(int index, TypedValue outValue) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int type = data[index+AssetManager.STYLE_TYPE]; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.type = type; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.data = data[index+AssetManager.STYLE_DATA]; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.assetCookie = data[index+AssetManager.STYLE_ASSET_COOKIE]; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.resourceId = data[index+AssetManager.STYLE_RESOURCE_ID]; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.changingConfigurations = data[index+AssetManager.STYLE_CHANGING_CONFIGURATIONS]; 7110d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn outValue.density = data[index+AssetManager.STYLE_DENSITY]; 71275399683a418fff55539e6028341caa2e7572362Gilles Debunne outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence loadStringValueAt(int index) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cookie = data[index+AssetManager.STYLE_ASSET_COOKIE]; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie < 0) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mXml != null) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXml.getPooledString( 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[index+AssetManager.STYLE_DATA]); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Getting pooled from: " + v); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.mAssets.getPooledString( 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cookie, data[index+AssetManager.STYLE_DATA]); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ TypedArray(Resources resources, int[] data, int[] indices, int len) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mData = data; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndices = indices; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLength = len; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Arrays.toString(mData); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root} 742