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