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 197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.AnyRes; 2080756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt; 21fde4e3b17a5ead9f1a0848bf35b4f49f16600795Alan Viveretteimport android.annotation.Nullable; 22d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Guptaimport android.annotation.StyleableRes; 23ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo; 24ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo.Config; 25ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarriimport android.graphics.Typeface; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 276bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viveretteimport android.os.StrictMode; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 312269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 322269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reckimport dalvik.system.VMRuntime; 35f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for an array of values that were retrieved with 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)} 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link Resources#obtainAttributes}. Be 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sure to call {@link #recycle} when done with them. 43fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The indices used to retrieve values from this structure correspond to 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the positions of the attributes given to obtainStyledAttributes. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TypedArray { 4852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 4952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette static TypedArray obtain(Resources res, int len) { 50f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck TypedArray attrs = res.mTypedArrayPool.acquire(); 51f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck if (attrs == null) { 52f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck attrs = new TypedArray(res); 5352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 5452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 55f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck attrs.mRecycled = false; 56f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck // Reset the assets, which may have changed due to configuration changes 57f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck // or further resource loading. 58f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck attrs.mAssets = res.getAssets(); 59ec05bc0fda9e10fe16cb98c5d3a4de37773ad5f8Adam Lesinski attrs.mMetrics = res.getDisplayMetrics(); 60f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck attrs.resize(len); 61f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck return attrs; 6252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 6352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 64bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski // STYLE_ prefixed constants are offsets within the typed data array. 65bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_NUM_ENTRIES = 6; 66bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_TYPE = 0; 67bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_DATA = 1; 68bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_ASSET_COOKIE = 2; 69bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_RESOURCE_ID = 3; 70bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_CHANGING_CONFIGURATIONS = 4; 71bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski static final int STYLE_DENSITY = 5; 72bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski 738b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette private final Resources mResources; 74ec05bc0fda9e10fe16cb98c5d3a4de37773ad5f8Adam Lesinski private DisplayMetrics mMetrics; 75e60064ab3c399fdd084de11dada73af48735d2fcAdam Lesinski private AssetManager mAssets; 768b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette 77fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette private boolean mRecycled; 78fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ XmlBlock.Parser mXml; 8052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /*package*/ Resources.Theme mTheme; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int[] mData; 82f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck /*package*/ long mDataAddress; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int[] mIndices; 84f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck /*package*/ long mIndicesAddress; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int mLength; 867f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet /*package*/ TypedValue mValue = new TypedValue(); 878eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 88f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck private void resize(int len) { 89f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck mLength = len; 90bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int dataLen = len * STYLE_NUM_ENTRIES; 91f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck final int indicesLen = len + 1; 92f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck final VMRuntime runtime = VMRuntime.getRuntime(); 93abd917d1393318f34ad434138b47623b675faaf2John Reck if (mDataAddress == 0 || mData.length < dataLen) { 94f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck mData = (int[]) runtime.newNonMovableArray(int.class, dataLen); 95f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck mDataAddress = runtime.addressOf(mData); 96f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck mIndices = (int[]) runtime.newNonMovableArray(int.class, indicesLen); 97f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck mIndicesAddress = runtime.addressOf(mIndices); 98f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck } 99f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck } 100f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1026bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Returns the number of values in this array. 1036bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 1046bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int length() { 107fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 108fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 109fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 110fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLength; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 113fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski * Returns the number of indices in the array that actually have data. Attributes with a value 11632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski * of @empty are included, as this is an explicit indicator. 1176bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 1186bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIndexCount() { 121fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 122fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 123fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 124fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndices[0]; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12932e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski * Returns an index in the array that has data. Attributes with a value of @empty are included, 13032e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski * as this is an explicit indicator. 131fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param at The index you would like to returned, ranging from 0 to 1336bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * {@link #getIndexCount()}. 134fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The index at the given offset, which can be used with 1366bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * {@link #getValue} and related APIs. 1376bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIndex(int at) { 140fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 141fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 142fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 143fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndices[1+at]; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 146fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1486bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Returns the Resources object this array was loaded from. 1496bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 1506bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Resources getResources() { 153fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 154fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 155fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 156fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 159fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1616bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the styled string value for the attribute at <var>index</var>. 1626bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 1636bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * If the attribute is not a string, this method will attempt to coerce 1646bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * it to a string. 165fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 167fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 1686bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return CharSequence holding string data. May be styled. Returns 1696bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * {@code null} if the attribute is not defined or could not be 1706bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * coerced to a string. 1716bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 173d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public CharSequence getText(@StyleableRes int index) { 174fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 175fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 176fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 177fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 178bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 180bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadStringValueAt(index); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1876bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v.coerceToString(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1916bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 1926bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 1936bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getText of bad type: 0x" + Integer.toHexString(type)); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1976bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the string value for the attribute at <var>index</var>. 1986bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 1996bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * If the attribute is not a string, this method will attempt to coerce 2006bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * it to a string. 201fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 203fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 2046bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return String holding string data. Any styling information is removed. 2056bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Returns {@code null} if the attribute is not defined or could 2066bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not be coerced to a string. 2076bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 209a6f354b78ecba3add458df2857d4fbd7b3f0dcbcAlan Viverette @Nullable 210d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public String getString(@StyleableRes int index) { 211fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 212fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 213fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 214fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 215bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 217bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return loadStringValueAt(index).toString(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2246bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 2266bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final CharSequence cs = v.coerceToString(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cs != null ? cs.toString() : null; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2296bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 2306bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 2316bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getString of bad type: 0x" + Integer.toHexString(type)); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2356bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the string value for the attribute at <var>index</var>, but 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only if that string comes from an immediate value in an XML file. That 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is, this does not allow references to string resources, string 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes, or conversions from other types. As such, this method 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will only return strings for TypedArray objects that come from 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes in an XML file. 241fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 243fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 2446bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return String holding string data. Any styling information is removed. 2456bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Returns {@code null} if the attribute is not defined or is not 2466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * an immediate string value. 2476bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public String getNonResourceString(@StyleableRes int index) { 250fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 251fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 252fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 253fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 254bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 256bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_STRING) { 258bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int cookie = data[index + STYLE_ASSET_COOKIE]; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie < 0) { 260bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return mXml.getPooledString(data[index + STYLE_DATA]).toString(); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 265fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2676bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the string value for the attribute at <var>index</var> that is 268cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * not allowed to change with the given configurations. 269fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 270cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @param index Index of attribute to retrieve. 271cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn * @param allowedChangingConfigs Bit mask of configurations from 2726bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * {@link Configuration}.NATIVE_CONFIG_* that are allowed to change. 2731d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn * 2746bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return String holding string data. Any styling information is removed. 2756bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Returns {@code null} if the attribute is not defined. 2766bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 2776bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @hide 278cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn */ 279ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public String getNonConfigurationString(@StyleableRes int index, 280ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int allowedChangingConfigs) { 281fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 282fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 283fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 284fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 285bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 286cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn final int[] data = mData; 287bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 288ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette final @Config int changingConfigs = ActivityInfo.activityInfoConfigNativeToJava( 289bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski data[index + STYLE_CHANGING_CONFIGURATIONS]); 290ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette if ((changingConfigs & ~allowedChangingConfigs) != 0) { 291cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return null; 292cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 293cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (type == TypedValue.TYPE_NULL) { 294cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return null; 295cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } else if (type == TypedValue.TYPE_STRING) { 296cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return loadStringValueAt(index).toString(); 297cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 298cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn 2996bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 300cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (getValueAt(index, v)) { 3016bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final CharSequence cs = v.coerceToString(); 302cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn return cs != null ? cs.toString() : null; 303cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 3046bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 3056bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 3066bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getNonConfigurationString of bad type: 0x" 3076bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette + Integer.toHexString(type)); 308cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn } 309cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn 310cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the boolean value for the attribute at <var>index</var>. 3126bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 3136bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * If the attribute is an integer value, this method will return whether 3146bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * it is equal to zero. If the attribute is not a boolean or integer value, 3156bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * this method will attempt to coerce it to an integer using 3166bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * {@link Integer#decode(String)} and return whether it is equal to zero. 317fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3196bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @param defValue Value to return if the attribute is not defined or 3206bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * cannot be coerced to an integer. 321fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3226bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return Boolean value of the attribute, or defValue if the attribute was 3236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not defined or could not be coerced to an integer. 3246bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 326d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public boolean getBoolean(@StyleableRes int index, boolean defValue) { 327fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 328fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 329fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 330fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 331bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 333bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 3376bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette && type <= TypedValue.TYPE_LAST_INT) { 338bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA] != 0; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3416bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 3436bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette StrictMode.noteResourceMismatch(v); 3446bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette return XmlUtils.convertValueToBoolean(v.coerceToString(), defValue); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 3476bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 3486bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getBoolean of bad type: 0x" + Integer.toHexString(type)); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 3536bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 3546bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * If the attribute is not an integer, this method will attempt to coerce 3556bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * it to an integer using {@link Integer#decode(String)}. 356fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 3586bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @param defValue Value to return if the attribute is not defined or 3596bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * cannot be coerced to an integer. 360fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3616bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return Integer value of the attribute, or defValue if the attribute was 3626bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not defined or could not be coerced to an integer. 3636bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 365d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getInt(@StyleableRes int index, int defValue) { 366fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 367fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 368fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 369fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 370bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 372bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 3766bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette && type <= TypedValue.TYPE_LAST_INT) { 377bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3806bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 3826bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette StrictMode.noteResourceMismatch(v); 3836bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette return XmlUtils.convertValueToInt(v.coerceToString(), defValue); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3856bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 3866bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 3876bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getInt of bad type: 0x" + Integer.toHexString(type)); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the float value for the attribute at <var>index</var>. 3926bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 3936bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * If the attribute is not a float or an integer, this method will attempt 3946bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * to coerce it to a float using {@link Float#parseFloat(String)}. 395fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 397fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 3986bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return Attribute float value, or defValue if the attribute was 3996bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not defined or could not be coerced to a float. 4006bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 402d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public float getFloat(@StyleableRes int index, float defValue) { 403fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 404fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 405fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 406fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 407bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 409bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_FLOAT) { 413bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return Float.intBitsToFloat(data[index + STYLE_DATA]); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 4156bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette && type <= TypedValue.TYPE_LAST_INT) { 416bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4196bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final TypedValue v = mValue; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, v)) { 4216bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette final CharSequence str = v.coerceToString(); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 4236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette StrictMode.noteResourceMismatch(v); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Float.parseFloat(str.toString()); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4276bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 4286bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette // We already checked for TYPE_NULL. This should never happen. 4296bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("getFloat of bad type: 0x" + Integer.toHexString(type)); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 431fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the color value for the attribute at <var>index</var>. If 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the attribute references a color resource holding a complex 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.res.ColorStateList}, then the default color from 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the set is returned. 4376bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 4386bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 4396bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer color or color state list. 440fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 444fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute color value, or defValue if not defined. 4466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 4476bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 4486bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer color or color state list. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 45080756e38882720860db52f1fcc21fa1505a02abfTor Norbye @ColorInt 451d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getColor(@StyleableRes int index, @ColorInt int defValue) { 452fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 453fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 454fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 455fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 4565b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 457bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 4585b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 460bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 4646bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette && type <= TypedValue.TYPE_LAST_INT) { 465bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_STRING) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getValueAt(index, value)) { 46945c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette final ColorStateList csl = mResources.loadColorStateList( 47045c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette value, value.resourceId, mTheme); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return csl.getDefaultColor(); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 474216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 47593795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 4765b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 4776bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 4785b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4815b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 4825b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to color: type=0x" + Integer.toHexString(type)); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 486dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * Retrieve the ComplexColor for the attribute at <var>index</var>. 487dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * The value may be either a {@link android.content.res.ColorStateList} which can wrap a simple 488dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * color value or a {@link android.content.res.GradientColor} 489dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * <p> 490dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * This method will return {@code null} if the attribute is not defined or 491dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * is not an integer color, color state list or GradientColor. 492dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * 493dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * @param index Index of attribute to retrieve. 494dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * 495dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * @return ComplexColor for the attribute, or {@code null} if not defined. 496dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * @throws RuntimeException if the attribute if the TypedArray has already 497dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * been recycled. 498dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * @throws UnsupportedOperationException if the attribute is defined but is 499dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu * not an integer color, color state list or GradientColor. 500e03c469fd416cf68c9d27268140f058028cd8666Teng-Hui Zhu * @hide 501dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu */ 502dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu @Nullable 503dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu public ComplexColor getComplexColor(@StyleableRes int index) { 504dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu if (mRecycled) { 505dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu throw new RuntimeException("Cannot make calls to a recycled instance!"); 506dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu } 507dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu 508dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu final TypedValue value = mValue; 509bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 510dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu if (value.type == TypedValue.TYPE_ATTRIBUTE) { 511dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu throw new UnsupportedOperationException( 512dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu "Failed to resolve attribute at index " + index + ": " + value); 513dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu } 514dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu return mResources.loadComplexColor(value, value.resourceId, mTheme); 515dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu } 516dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu return null; 517dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu } 518dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu 519dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu /** 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the ColorStateList for the attribute at <var>index</var>. 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value may be either a single solid color or a reference to 5226bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * a color or complex {@link android.content.res.ColorStateList} 5236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * description. 5246bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 5256bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will return {@code null} if the attribute is not defined or 5266bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * is not an integer color or color state list. 527fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 529fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 5306bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return ColorStateList for the attribute, or {@code null} if not 5316bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * defined. 5326bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the attribute if the TypedArray has already 5336bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * been recycled. 5346bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 5356bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer color or color state list. 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5376bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette @Nullable 538d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public ColorStateList getColorStateList(@StyleableRes int index) { 539fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 540fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 541fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 542fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 544bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 545216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette if (value.type == TypedValue.TYPE_ATTRIBUTE) { 5466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 54793795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette "Failed to resolve attribute at index " + index + ": " + value); 548216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } 54945c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette return mResources.loadColorStateList(value, value.resourceId, mTheme); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the integer value for the attribute at <var>index</var>. 5566bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 5576bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Unlike {@link #getInt(int, int)}, this method will throw an exception if 5586bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * the attribute is defined but is not an integer. 559fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 563fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute integer value, or defValue if not defined. 5656bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 5666bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 5676bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getInteger(@StyleableRes int index, int defValue) { 570fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 571fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 572fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 573fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 5745b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 575bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 5765b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 578bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type >= TypedValue.TYPE_FIRST_INT 5826bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette && type <= TypedValue.TYPE_LAST_INT) { 583bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 584216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 58593795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 5865b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 5876bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 5885b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5915b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 5925b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to integer: type=0x" + Integer.toHexString(type)); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5966bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieve a dimensional unit attribute at <var>index</var>. Unit 597fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * conversions are based on the current {@link DisplayMetrics} 598fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * associated with the resources this {@link TypedArray} object 599fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * came from. 6006bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 6016bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 6026bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension. 603fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 607fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 608fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute dimension value multiplied by the appropriate 6096bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * metric, or defValue if not defined. 6106bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 6116bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 6126bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer. 613fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 617d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public float getDimension(@StyleableRes int index, float defValue) { 618fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 619fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 620fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 621fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 6225b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 623bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 6245b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 626bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 630bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToDimension(data[index + STYLE_DATA], mMetrics); 631216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 63293795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 6335b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 6346bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 6355b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6385b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 6395b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to dimension: type=0x" + Integer.toHexString(type)); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as an offset in raw pixels. This is the same as 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for you. An offset conversion involves simply 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * truncating the base value to an integer. 6486bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 6496bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 6506bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension. 651fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 655fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 656fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute dimension value multiplied by the appropriate 6576bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * metric and truncated to integer pixels, or defValue if not defined. 6586bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 6596bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 6606bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not an integer. 661fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelSize 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 665d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getDimensionPixelOffset(@StyleableRes int index, int defValue) { 666fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 667fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 668fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 669fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 6705b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 671bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 6725b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 674bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 678bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToDimensionPixelOffset(data[index + STYLE_DATA], mMetrics); 679216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 68093795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 6815b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 6826bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 6835b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6865b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 6875b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to dimension: type=0x" + Integer.toHexString(type)); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a dimensional unit attribute at <var>index</var> for use 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a size in raw pixels. This is the same as 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDimension}, except the returned value is converted to 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer pixels for use as a size. A size conversion involves 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rounding the base value, and ensuring that a non-zero base value 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is at least one pixel in size. 6976bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 6986bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 6996bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension. 700fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 704fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 705fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute dimension value multiplied by the appropriate 7066bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * metric and truncated to integer pixels, or defValue if not defined. 7076bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 7086bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 7096bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension. 710fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimension 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDimensionPixelOffset 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 714d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getDimensionPixelSize(@StyleableRes int index, int defValue) { 715fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 716fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 717fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 718fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 7195b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 720bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 7215b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 723bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 727bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToDimensionPixelSize(data[index + STYLE_DATA], mMetrics); 728216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 72993795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 7305b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 7316bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 7325b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7355b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 7365b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to dimension: type=0x" + Integer.toHexString(type)); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special version of {@link #getDimensionPixelSize} for retrieving 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}'s layout_width and layout_height 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes. This is only here for performance reasons; applications 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use {@link #getDimensionPixelSize}. 7446bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 7456bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 7466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension or integer (enum). 747fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of the attribute to retrieve. 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name Textual name of attribute for error reporting. 750fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 751fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute dimension value multiplied by the appropriate 7526bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * metric and truncated to integer pixels. 7536bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 7546bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 7556bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a dimension or integer (enum). 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 757d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getLayoutDimension(@StyleableRes int index, String name) { 758fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 759fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 760fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 761fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 7625b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 763bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 7645b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 766bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type >= TypedValue.TYPE_FIRST_INT 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 769bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 771bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToDimensionPixelSize(data[index + STYLE_DATA], mMetrics); 772216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 77393795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 7745b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 7756bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 7765b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7796bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException(getPositionDescription() 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": You must supply a " + name + " attribute."); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 782fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special version of {@link #getDimensionPixelSize} for retrieving 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}'s layout_width and layout_height 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attributes. This is only here for performance reasons; applications 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should use {@link #getDimensionPixelSize}. 788fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of the attribute to retrieve. 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue The default value to return if this attribute is not 7916bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * default or contains the wrong type of data. 792fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 793fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute dimension value multiplied by the appropriate 7946bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * metric and truncated to integer pixels. 7956bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 797d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getLayoutDimension(@StyleableRes int index, int defValue) { 798fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 799fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 800fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 801fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 802bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 804bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type >= TypedValue.TYPE_FIRST_INT 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type <= TypedValue.TYPE_LAST_INT) { 807bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_DIMENSION) { 809bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToDimensionPixelSize(data[index + STYLE_DATA], mMetrics); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8166bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves a fractional unit attribute at <var>index</var>. 817fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 818fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @param index Index of attribute to retrieve. 819fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @param base The base value of this fraction. In other words, a 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard fraction is multiplied by this value. 821fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @param pbase The parent base value of this fraction. In other 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * words, a parent fraction (nn%p) is multiplied by this 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value. 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 826fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 827fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Attribute fractional value multiplied by the appropriate 8286bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * base value, or defValue if not defined. 8296bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 8306bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 8316bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a fraction. 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 833d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public float getFraction(@StyleableRes int index, int base, int pbase, float defValue) { 834fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 835fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 836fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 837fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 8385b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette final int attrIndex = index; 839bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 8405b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 842bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (type == TypedValue.TYPE_FRACTION) { 846bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return TypedValue.complexToFraction(data[index + STYLE_DATA], base, pbase); 847216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette } else if (type == TypedValue.TYPE_ATTRIBUTE) { 84893795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette final TypedValue value = mValue; 8495b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette getValueAt(index, value); 8506bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 8515b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette "Failed to resolve attribute at index " + attrIndex + ": " + value); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8545b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette throw new UnsupportedOperationException("Can't convert value at index " + attrIndex 8555b90e82827dbd0aa7fe9a0893f9174aab1a1602aAlan Viverette + " to fraction: type=0x" + Integer.toHexString(type)); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8596bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the resource identifier for the attribute at 860fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * <var>index</var>. Note that attribute resource as resolved when 861fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * the overall {@link TypedArray} object is retrieved. As a 862fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * result, this function will return the resource identifier of the 863fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * final resource value that was found, <em>not</em> necessarily the 864fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * original resource that was specified by the attribute. 865fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param defValue Value to return if the attribute is not defined or 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not a resource. 869fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Attribute resource identifier, or defValue if not defined. 8716bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8737b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye @AnyRes 874d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getResourceId(@StyleableRes int index, int defValue) { 875fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 876fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 877fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 878fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 879bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 881bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (data[index + STYLE_TYPE] != TypedValue.TYPE_NULL) { 882bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int resid = data[index + STYLE_RESOURCE_ID]; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return resid; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defValue; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8916bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Retrieves the theme attribute resource identifier for the attribute at 892500c56089f7e3e2735a105954a05801025d56921Alan Viverette * <var>index</var>. 893500c56089f7e3e2735a105954a05801025d56921Alan Viverette * 894500c56089f7e3e2735a105954a05801025d56921Alan Viverette * @param index Index of attribute to retrieve. 895500c56089f7e3e2735a105954a05801025d56921Alan Viverette * @param defValue Value to return if the attribute is not defined or not a 8966bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * resource. 8976bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 898500c56089f7e3e2735a105954a05801025d56921Alan Viverette * @return Theme attribute resource identifier, or defValue if not defined. 8996bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 900500c56089f7e3e2735a105954a05801025d56921Alan Viverette * @hide 901500c56089f7e3e2735a105954a05801025d56921Alan Viverette */ 902d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getThemeAttributeId(@StyleableRes int index, int defValue) { 903500c56089f7e3e2735a105954a05801025d56921Alan Viverette if (mRecycled) { 904500c56089f7e3e2735a105954a05801025d56921Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 905500c56089f7e3e2735a105954a05801025d56921Alan Viverette } 906500c56089f7e3e2735a105954a05801025d56921Alan Viverette 907bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 908500c56089f7e3e2735a105954a05801025d56921Alan Viverette final int[] data = mData; 909bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (data[index + STYLE_TYPE] == TypedValue.TYPE_ATTRIBUTE) { 910bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return data[index + STYLE_DATA]; 911500c56089f7e3e2735a105954a05801025d56921Alan Viverette } 912500c56089f7e3e2735a105954a05801025d56921Alan Viverette return defValue; 913500c56089f7e3e2735a105954a05801025d56921Alan Viverette } 914500c56089f7e3e2735a105954a05801025d56921Alan Viverette 915500c56089f7e3e2735a105954a05801025d56921Alan Viverette /** 916fde4e3b17a5ead9f1a0848bf35b4f49f16600795Alan Viverette * Retrieve the Drawable for the attribute at <var>index</var>. 9176bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 9186bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 9196bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a color or drawable resource. 920fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 922fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 9236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return Drawable for the attribute, or {@code null} if not defined. 9246bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 9256bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws UnsupportedOperationException if the attribute is defined but is 9266bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a color or drawable resource. 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 928fde4e3b17a5ead9f1a0848bf35b4f49f16600795Alan Viverette @Nullable 929d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public Drawable getDrawable(@StyleableRes int index) { 93050954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski return getDrawableForDensity(index, 0); 93150954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski } 93250954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski 93350954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski /** 93450954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski * Version of {@link #getDrawable(int)} that accepts an override density. 93550954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski * @hide 93650954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski */ 93750954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski @Nullable 93850954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski public Drawable getDrawableForDensity(@StyleableRes int index, int density) { 939fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 940fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 941fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 942fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 944bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 945216d3e6d8114a819758850c1be8d62fef59a107fAlan Viverette if (value.type == TypedValue.TYPE_ATTRIBUTE) { 9466bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new UnsupportedOperationException( 94793795053da04b0f16dadb6e56f6056bd2dd37875Alan Viverette "Failed to resolve attribute at index " + index + ": " + value); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94950954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski 95050954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski if (density > 0) { 95150954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski // If the density is overridden, the value in the TypedArray will not reflect this. 95250954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski // Do a separate lookup of the resourceId with the density override. 95350954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski mResources.getValueForDensity(value.resourceId, density, value, true); 95450954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski } 95550954d2b4ea938d787ef5021d75f6bc02826607aAdam Lesinski return mResources.loadDrawable(value, value.resourceId, density, mTheme); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 961ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * Retrieve the Typeface for the attribute at <var>index</var>. 962ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * <p> 963ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * This method will throw an exception if the attribute is defined but is 964ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * not a font. 965ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * 966ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * @param index Index of attribute to retrieve. 967ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * 968ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * @return Typeface for the attribute, or {@code null} if not defined. 969ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * @throws RuntimeException if the TypedArray has already been recycled. 970ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * @throws UnsupportedOperationException if the attribute is defined but is 971ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri * not a font resource. 972ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri */ 973ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri @Nullable 974ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri public Typeface getFont(@StyleableRes int index) { 975ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri if (mRecycled) { 976ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri throw new RuntimeException("Cannot make calls to a recycled instance!"); 977ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri } 978ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri 979ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri final TypedValue value = mValue; 980bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 981ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri if (value.type == TypedValue.TYPE_ATTRIBUTE) { 982ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri throw new UnsupportedOperationException( 983ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri "Failed to resolve attribute at index " + index + ": " + value); 984ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri } 985ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri return mResources.getFont(value, value.resourceId); 986ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri } 987ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri return null; 988ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri } 989ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri 990ed00bfdfae5d5cbc9e13f4e8affdece48f4c5b7fClara Bayarri /** 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the CharSequence[] for the attribute at <var>index</var>. 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This gets the resource ID of the selected attribute, and uses 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Resources#getTextArray Resources.getTextArray} of the owning 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resources object to retrieve its String[]. 9956bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * <p> 9966bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * This method will throw an exception if the attribute is defined but is 9976bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * not a text array resource. 998fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1000fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 10016bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return CharSequence[] for the attribute, or {@code null} if not 10026bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * defined. 10036bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1005d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public CharSequence[] getTextArray(@StyleableRes int index) { 1006fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1007fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1008fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1009fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 1011bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mResources.getTextArray(value.resourceId); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the raw TypedValue for the attribute at <var>index</var>. 1019fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outValue TypedValue object in which to place the attribute's 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data. 102352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 102432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski * @return {@code true} if the value was retrieved and not @empty, {@code false} otherwise. 10256bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 102652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 1027d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public boolean getValue(@StyleableRes int index, TypedValue outValue) { 1028fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1029fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 103052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 1031fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1032bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return getValueAt(index * STYLE_NUM_ENTRIES, outValue); 103352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 103452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 103552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 103652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Returns the type of attribute at the specified index. 103752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 103852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param index Index of attribute whose type to retrieve. 10396bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 104052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @return Attribute type. 10416bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 104252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 1043d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public int getType(@StyleableRes int index) { 1044fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1045fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1046fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1047fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1048bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 1049bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return mData[index + STYLE_TYPE]; 105052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 105152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 105252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether there is an attribute at <var>index</var>. 1054f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * <p> 1055f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * <strong>Note:</strong> If the attribute was set to {@code @empty} or 1056f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * {@code @undefined}, this method returns {@code false}. 1057fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1059fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the attribute has a value, false otherwise. 10616bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1063d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public boolean hasValue(@StyleableRes int index) { 1064fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1065fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1066fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1067fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1068bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 1070bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return type != TypedValue.TYPE_NULL; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1073fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1075f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * Determines whether there is an attribute at <var>index</var>, returning 1076f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * {@code true} if the attribute was explicitly set to {@code @empty} and 1077f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * {@code false} only if the attribute was undefined. 1078f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * 1079f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * @param index Index of attribute to retrieve. 1080f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * 1081f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette * @return True if the attribute has a value or is empty, false otherwise. 10826bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 1083f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette */ 1084d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public boolean hasValueOrEmpty(@StyleableRes int index) { 1085f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette if (mRecycled) { 1086f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1087f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette } 1088f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette 1089bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski index *= STYLE_NUM_ENTRIES; 1090f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette final int[] data = mData; 1091bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 1092f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette return type != TypedValue.TYPE_NULL 1093bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski || data[index + STYLE_DATA] == TypedValue.DATA_NULL_EMPTY; 1094f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette } 1095f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette 1096f2969405020a72e282c348a6ea201d56e9f8d4baAlan Viverette /** 1097fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * Retrieve the raw TypedValue for the attribute at <var>index</var> 1098fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * and return a temporary object holding its data. This object is only 1099fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * valid until the next call on to {@link TypedArray}. 1100fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index Index of attribute to retrieve. 1102fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * 1103fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * @return Returns a TypedValue object if the attribute is defined, 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containing its data; otherwise returns null. (You will not 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive a TypedValue whose type is TYPE_NULL.) 11066bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1108d7bb3f802973352dbbfdf2c9ce70f9027b5a3797Deepanshu Gupta public TypedValue peekValue(@StyleableRes int index) { 1109fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1110fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1111fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1112fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = mValue; 1114bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (getValueAt(index * STYLE_NUM_ENTRIES, value)) { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return value; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a message about the parser state suitable for printing error messages. 11226bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 11236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return Human-readable description of current parser state. 11246bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPositionDescription() { 1127fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1128fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1129fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1130fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mXml != null ? mXml.getPositionDescription() : "<internal>"; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11356bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * Recycles the TypedArray, to be re-used by a later caller. After calling 1136fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette * this function you must not ever touch the typed array again. 11376bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * 11386bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recycle() { 1141fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1142fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException(toString() + " recycled twice!"); 1143fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1144fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 1145fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette mRecycled = true; 11468eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette 114752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette // These may have been set by the client. 11488eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette mXml = null; 11498eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette mTheme = null; 1150e60064ab3c399fdd084de11dada73af48735d2fcAdam Lesinski mAssets = null; 115152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 11528b5b25b4487e22eb8a7dae32ee32f420210321a0Alan Viverette mResources.mTypedArrayPool.release(this); 115352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 115452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 115552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 115652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Extracts theme attributes from a typed array for later resolution using 11579cd14fc710cf81cc6d1c47d599abe349d3aa87dcAlan Viverette * {@link android.content.res.Resources.Theme#resolveAttributes(int[], int[])}. 11589cd14fc710cf81cc6d1c47d599abe349d3aa87dcAlan Viverette * Removes the entries from the typed array so that subsequent calls to typed 11599cd14fc710cf81cc6d1c47d599abe349d3aa87dcAlan Viverette * getters will return the default value without crashing. 116052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 11616bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @return an array of length {@link #getIndexCount()} populated with theme 11626bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * attributes, or null if there are no theme attributes in the typed 11636bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * array 11646bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 116552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @hide 116652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 116745c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette @Nullable 116852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public int[] extractThemeAttrs() { 116945c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette return extractThemeAttrs(null); 117045c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette } 117145c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette 117245c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette /** 117345c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette * @hide 117445c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette */ 117545c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette @Nullable 117645c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette public int[] extractThemeAttrs(@Nullable int[] scrap) { 1177fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette if (mRecycled) { 1178fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 1179fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette } 1180fd274a0d4ab5a6777213fecb8ddf6e8099675283Alan Viverette 118152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette int[] attrs = null; 118252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 11830cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette final int[] data = mData; 11841cd4612cc04ee715a916de3c437fc52d76d166cbAlan Viverette final int N = length(); 118552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette for (int i = 0; i < N; i++) { 1186bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int index = i * STYLE_NUM_ENTRIES; 1187bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski if (data[index + STYLE_TYPE] != TypedValue.TYPE_ATTRIBUTE) { 118845c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette // Not an attribute, ignore. 11890cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette continue; 11900cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette } 11910cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette 11920cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette // Null the entry so that we can safely call getZzz(). 1193bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski data[index + STYLE_TYPE] = TypedValue.TYPE_NULL; 11940cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette 1195bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int attr = data[index + STYLE_DATA]; 11960cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette if (attr == 0) { 119745c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette // Useless data, ignore. 11980cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette continue; 11990cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette } 12000cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette 120145c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette // Ensure we have a usable attribute array. 12020cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette if (attrs == null) { 120345c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette if (scrap != null && scrap.length == N) { 120445c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette attrs = scrap; 120545c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette Arrays.fill(attrs, 0); 120645c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette } else { 120745c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette attrs = new int[N]; 120845c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette } 120952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 121045c4bbbbce6bbad50a033efcba7948a23f1f117aAlan Viverette 12110cfb877f5a0a1bff82d9c3ee969195bf7812c0b5Alan Viverette attrs[i] = attr; 121252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 121352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 121452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return attrs; 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12178e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette /** 12188e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * Return a mask of the configuration parameters for which the values in 12198e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * this typed array may change. 12208e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * 12218e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @return Returns a mask of the changing configuration parameters, as 12228e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * defined by {@link android.content.pm.ActivityInfo}. 12236bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette * @throws RuntimeException if the TypedArray has already been recycled. 12248e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @see android.content.pm.ActivityInfo 12258e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette */ 1226ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 12276bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette if (mRecycled) { 12286bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette throw new RuntimeException("Cannot make calls to a recycled instance!"); 12296bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette } 12306bbb47b7d5ac1b49d916679e5f081fe181d8f162Alan Viverette 1231ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette @Config int changingConfig = 0; 12328e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 12338e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette final int[] data = mData; 12348e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette final int N = length(); 12358e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette for (int i = 0; i < N; i++) { 1236bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int index = i * STYLE_NUM_ENTRIES; 1237bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 12388e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette if (type == TypedValue.TYPE_NULL) { 12398e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette continue; 12408e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 1241ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette changingConfig |= ActivityInfo.activityInfoConfigNativeToJava( 1242bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski data[index + STYLE_CHANGING_CONFIGURATIONS]); 12438e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 12448e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette return changingConfig; 12458e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette } 12468e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean getValueAt(int index, TypedValue outValue) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 1249bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int type = data[index + STYLE_TYPE]; 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == TypedValue.TYPE_NULL) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outValue.type = type; 1254bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski outValue.data = data[index + STYLE_DATA]; 1255bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski outValue.assetCookie = data[index + STYLE_ASSET_COOKIE]; 1256bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski outValue.resourceId = data[index + STYLE_RESOURCE_ID]; 1257ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette outValue.changingConfigurations = ActivityInfo.activityInfoConfigNativeToJava( 1258bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski data[index + STYLE_CHANGING_CONFIGURATIONS]); 1259bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski outValue.density = data[index + STYLE_DENSITY]; 126075399683a418fff55539e6028341caa2e7572362Gilles Debunne outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null; 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence loadStringValueAt(int index) { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] data = mData; 1266bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski final int cookie = data[index + STYLE_ASSET_COOKIE]; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cookie < 0) { 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mXml != null) { 1269bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return mXml.getPooledString(data[index + STYLE_DATA]); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1273bebfcc46a249a70af04bc18490a897888a142fb8Adam Lesinski return mAssets.getPooledStringForCookie(cookie, data[index + STYLE_DATA]); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1276f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck /** @hide */ 1277f32adf447511d54c2aa0948d3c1ef44d461538acJohn Reck protected TypedArray(Resources resources) { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResources = resources; 1279fb302ccd8e0610a09691ea5503ff8111dc7a2e41Adam Lesinski mMetrics = mResources.getDisplayMetrics(); 1280fb302ccd8e0610a09691ea5503ff8111dc7a2e41Adam Lesinski mAssets = mResources.getAssets(); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1283562a6a8d834dbc7490d9580afc591f6cd521f20cAlan Viverette @Override 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Arrays.toString(mData); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 128715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root} 1288