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