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
174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpackage com.android.layoutlib.bridge.android;
184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.ide.common.rendering.api.IProjectCallback;
204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue;
224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.BridgeConstants;
244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.impl.ResourceHelper;
254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.ninepatch.NinePatch;
264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.resources.ResourceType;
274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.util.Pair;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.kxml2.io.KXmlParser;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.ColorStateList;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup.LayoutParams;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
5208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet *
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BridgeResources extends Resources {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BridgeContext mContext;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IProjectCallback mProjectCallback;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean[] mPlatformResourceFlag = new boolean[1];
5908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * Simpler wrapper around FileInputStream. This is used when the input stream represent
624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * not a normal bitmap but a nine patch.
634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * This is useful when the InputStream is created in a method but used in another that needs
644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * to know whether this is 9-patch or not, such as BitmapFactory.
654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     */
664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public class NinePatchInputStream extends FileInputStream {
674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        private boolean mFakeMarkSupport = true;
684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        public NinePatchInputStream(File file) throws FileNotFoundException {
694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            super(file);
704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        @Override
734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        public boolean markSupported() {
744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            if (mFakeMarkSupport) {
754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // this is needed so that BitmapFactory doesn't wrap this in a BufferedInputStream.
764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                return true;
774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            }
784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            return super.markSupported();
804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        public void disableFakeMarkSupport() {
834b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            // disable fake mark support so that in case codec actually try to use them
844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            // we don't lie to them.
854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            mFakeMarkSupport = false;
864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
874b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This initializes the static field {@link Resources#mSystem} which is used
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by methods who get global resources using {@link Resources#getSystem()}.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * They will end up using our bridge resources.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Bridge} calls this method after setting up a new bridge.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    /*package*/ static Resources initSystem(BridgeContext context,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AssetManager assets,
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics,
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config,
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IProjectCallback projectCallback) {
1024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        return Resources.mSystem = new BridgeResources(context,
1034b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                assets,
1044b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                metrics,
1054b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                config,
1064b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                projectCallback);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * Disposes the static {@link Resources#mSystem} to make sure we don't leave objects
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * around that would prevent us from unloading the library.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    /*package*/ static void disposeSystem() {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Resources.mSystem instanceof BridgeResources) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((BridgeResources)(Resources.mSystem)).mContext = null;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((BridgeResources)(Resources.mSystem)).mProjectCallback = null;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources.mSystem = null;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BridgeResources(BridgeContext context, AssetManager assets, DisplayMetrics metrics,
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config, IProjectCallback projectCallback) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(assets, metrics, config);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProjectCallback = projectCallback;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new BridgeTypedArray(this, mContext, numEntries, platformFile);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    private ResourceValue getResourceValue(int id, boolean[] platformResFlag_out) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
1344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
13508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            platformResFlag_out[0] = true;
1384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            return mContext.getRenderResources().getFrameworkResource(
1394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    resourceInfo.getFirst(), resourceInfo.getSecond());
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // didn't find a match in the framework? look in the project.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProjectCallback != null) {
1444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
14508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resourceInfo != null) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                platformResFlag_out[0] = false;
1484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                return mContext.getRenderResources().getProjectResource(
1494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        resourceInfo.getFirst(), resourceInfo.getSecond());
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getDrawable(int id) throws NotFoundException {
1584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
15908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
1614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            return ResourceHelper.getDrawable(value, mContext);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
16608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getColor(int id) throws NotFoundException {
1734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
17408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ResourceHelper.getColor(value.getValue());
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NumberFormatException e) {
1794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e,
1804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        null /*data*/);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
18708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorStateList getColorStateList(int id) throws NotFoundException {
1944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue resValue = getResourceValue(id, mPlatformResourceFlag);
19508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1964b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        if (resValue != null) {
1974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            ColorStateList stateList = ResourceHelper.getColorStateList(resValue, mContext);
1984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            if (stateList != null) {
1994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                return stateList;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
20508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getText(int id) throws NotFoundException {
2124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
21308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return value.getValue();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
22008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getLayout(int id) throws NotFoundException {
2274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
22808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
2304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            XmlPullParser parser = null;
2314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            try {
2334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // check if the current parser can provide us with a custom parser.
234e172a3fc23412ebc79d6bd93e6d43d4b1c58354bXavier Ducrohet                if (mPlatformResourceFlag[0] == false) {
235e172a3fc23412ebc79d6bd93e6d43d4b1c58354bXavier Ducrohet                    parser = mProjectCallback.getParser(value.getName());
2364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                }
2374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // create a new one manually if needed.
2394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                if (parser == null) {
2404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    File xml = new File(value.getValue());
2414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    if (xml.isFile()) {
2424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        // we need to create a pull parser around the layout XML file, and then
2434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        // give that to our XmlBlockParser
2444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        parser = new KXmlParser();
2454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
2468f17523dcac41f5a8962cfb61265c71ad0c0e463Xavier Ducrohet                        parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
2474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    }
2484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                }
2494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                if (parser != null) {
2514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                }
2534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            } catch (XmlPullParserException e) {
2544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
2554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // we'll return null below.
2574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            } catch (FileNotFoundException e) {
2584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // this shouldn't happen since we check above.
2594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            }
2604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
2624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        // id was not found or not resolved. Throw a NotFoundException.
2644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        throwException(id);
2654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        // this is not used since the method above always throws
2674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        return null;
2684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
2694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    @Override
2714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public XmlResourceParser getAnimation(int id) throws NotFoundException {
2724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
2734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        if (value != null) {
2754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            XmlPullParser parser = null;
2764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            try {
2784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                File xml = new File(value.getValue());
2794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                if (xml.isFile()) {
2804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    // we need to create a pull parser around the layout XML file, and then
2814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    // give that to our XmlBlockParser
2824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    parser = new KXmlParser();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
2848f17523dcac41f5a8962cfb61265c71ad0c0e463Xavier Ducrohet                    parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
28508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            } catch (XmlPullParserException e) {
2894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
2904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // we'll return null below.
2924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            } catch (FileNotFoundException e) {
2934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // this shouldn't happen since we check above.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2954b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
30008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext.obtainStyledAttributes(set, attrs);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainTypedArray(int id) throws NotFoundException {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
31508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getDimension(int id) throws NotFoundException {
3184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
324980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                if (v.equals(BridgeConstants.MATCH_PARENT) ||
325980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                        v.equals(BridgeConstants.FILL_PARENT)) {
326980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                    return LayoutParams.MATCH_PARENT;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.equals(BridgeConstants.WRAP_CONTENT)) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return LayoutParams.WRAP_CONTENT;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mTmpValue.getDimension(mMetrics);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
34008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelOffset(int id) throws NotFoundException {
3474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return TypedValue.complexToDimensionPixelOffset(mTmpValue.data, mMetrics);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
36208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelSize(int id) throws NotFoundException {
3694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return TypedValue.complexToDimensionPixelSize(mTmpValue.data, mMetrics);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
38408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getInteger(int id) throws NotFoundException {
3914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
39208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null && value.getValue() != null) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int radix = 10;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v.startsWith("0x")) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                v = v.substring(2);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                radix = 16;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Integer.parseInt(v, radix);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NumberFormatException e) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // return exception below
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
40908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceEntryName(int resid) throws NotFoundException {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceName(int resid) throws NotFoundException {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceTypeName(int resid) throws NotFoundException {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id, Object... formatArgs) throws NotFoundException {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String s = getString(id);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s != null) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return String.format(s, formatArgs);
43408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
43908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id) throws NotFoundException {
4464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
44708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null && value.getValue() != null) {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return value.getValue();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
45408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(int id, TypedValue outValue, boolean resolveRefs)
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
4624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ResourceHelper.stringToFloat(v, outValue)) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
47208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                // else it's a string
47308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.type = TypedValue.TYPE_STRING;
47408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.string = v;
47508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                return;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(String name, TypedValue outValue, boolean resolveRefs)
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getXml(int id) throws NotFoundException {
4914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String v = value.getValue();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                File f = new File(value.getValue());
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        KXmlParser parser = new KXmlParser();
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
5038f17523dcac41f5a8962cfb61265c71ad0c0e463Xavier Ducrohet                        parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
50408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (XmlPullParserException e) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
52708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    public XmlResourceParser loadXmlResourceParser(String file, int id,
52808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            int assetCookie, String type) throws NotFoundException {
52908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // even though we know the XML file to load directly, we still need to resolve the
53008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // id so that we can know if it's a platform or project resource.
53108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // (mPlatformResouceFlag will get the result and will be used later).
53208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        getResourceValue(id, mPlatformResourceFlag);
53308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
53408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        File f = new File(file);
53508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        try {
53608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            KXmlParser parser = new KXmlParser();
53708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
5388f17523dcac41f5a8962cfb61265c71ad0c0e463Xavier Ducrohet            parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
53908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
54008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
54108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (XmlPullParserException e) {
54208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
54308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
54408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
54508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (FileNotFoundException e) {
54608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
54708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
54808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
54908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        }
55008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    }
55108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
55208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
55308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    @Override
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InputStream openRawResource(int id) throws NotFoundException {
5554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
5584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            String path = value.getValue();
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            if (path != null) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
5624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                File f = new File(path);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
5654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        // if it's a nine-patch return a custom input stream so that
5664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        // other methods (mainly bitmap factory) can detect it's a 9-patch
5674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        // and actually load it as a 9-patch instead of a normal bitmap
5684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
5694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                            return new NinePatchInputStream(f);
5704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                        }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new FileInputStream(f);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
58972e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
59072e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        getValue(id, value, true);
59172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
5924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        String path = value.string.toString();
5934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
5944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        File f = new File(path);
59572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        if (f.isFile()) {
59672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            try {
5974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // if it's a nine-patch return a custom input stream so that
5984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // other methods (mainly bitmap factory) can detect it's a 9-patch
5994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                // and actually load it as a 9-patch instead of a normal bitmap
6004b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
6014b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    return new NinePatchInputStream(f);
6024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                }
60372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                return new FileInputStream(f);
60472e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            } catch (FileNotFoundException e) {
60572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                NotFoundException exception = new NotFoundException();
60672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                exception.initCause(e);
60772e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                throw exception;
60872e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            }
60972e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        }
61072e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
61172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        throw new NotFoundException();
61272e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    }
61372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
61472e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    @Override
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Builds and throws a {@link Resources.NotFoundException} based on a resource id and a resource type.
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id the id of the resource
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NotFoundException
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void throwException(int id) throws NotFoundException {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
6264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the name is unknown in the framework, get it from the custom view loader.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo == null && mProjectCallback != null) {
6304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
63208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String message = null;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.",
6374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                    resourceInfo.getFirst(), id, resourceInfo.getSecond());
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not resolve resource value: 0x%1$X.", id);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new NotFoundException(message);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
646