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