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
1919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.IProjectCallback;
20918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
2119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ResourceValue;
22c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
23c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.BridgeConstants;
24d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeContext;
25d2f664d42cc29507b01a98622298b69131463825Xavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
2604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohetimport com.android.layoutlib.bridge.impl.ParserFactory;
27c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.ResourceHelper;
28bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ninepatch.NinePatch;
2935ea7cd4c0c89122fda0b57af20061645082ffb9Xavier Ducrohetimport com.android.resources.ResourceType;
30b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohetimport com.android.util.Pair;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup.LayoutParams;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
4708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet *
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BridgeResources extends Resources {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BridgeContext mContext;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IProjectCallback mProjectCallback;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean[] mPlatformResourceFlag = new boolean[1];
5408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet     * Simpler wrapper around FileInputStream. This is used when the input stream represent
57bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet     * not a normal bitmap but a nine patch.
58bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet     * This is useful when the InputStream is created in a method but used in another that needs
59bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet     * to know whether this is 9-patch or not, such as BitmapFactory.
60bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet     */
61bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    public class NinePatchInputStream extends FileInputStream {
62779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        private boolean mFakeMarkSupport = true;
63bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        public NinePatchInputStream(File file) throws FileNotFoundException {
64bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            super(file);
65bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        }
66779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet
67779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        @Override
68779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        public boolean markSupported() {
69779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            if (mFakeMarkSupport) {
70779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet                // this is needed so that BitmapFactory doesn't wrap this in a BufferedInputStream.
71779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet                return true;
72779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            }
73779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet
74779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            return super.markSupported();
75779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        }
76779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet
77779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        public void disableFakeMarkSupport() {
78779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            // disable fake mark support so that in case codec actually try to use them
79779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            // we don't lie to them.
80779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet            mFakeMarkSupport = false;
81779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet        }
82bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    }
83bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
84bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This initializes the static field {@link Resources#mSystem} which is used
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by methods who get global resources using {@link Resources#getSystem()}.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * They will end up using our bridge resources.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Bridge} calls this method after setting up a new bridge.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
92569ed054042f0350e898b4352694b792b0fdef9bXavier Ducrohet    public static Resources initSystem(BridgeContext context,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AssetManager assets,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics,
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IProjectCallback projectCallback) {
97c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet        return Resources.mSystem = new BridgeResources(context,
98c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet                assets,
99c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet                metrics,
100c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet                config,
101c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet                projectCallback);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
105c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet     * Disposes the static {@link Resources#mSystem} to make sure we don't leave objects
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * around that would prevent us from unloading the library.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
108569ed054042f0350e898b4352694b792b0fdef9bXavier Ducrohet    public static void disposeSystem() {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Resources.mSystem instanceof BridgeResources) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((BridgeResources)(Resources.mSystem)).mContext = null;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((BridgeResources)(Resources.mSystem)).mProjectCallback = null;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources.mSystem = null;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BridgeResources(BridgeContext context, AssetManager assets, DisplayMetrics metrics,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Configuration config, IProjectCallback projectCallback) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(assets, metrics, config);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProjectCallback = projectCallback;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
123beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet    public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile,
124beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet            boolean platformStyleable, String styleableName) {
125beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet        return new BridgeTypedArray(this, mContext, numEntries, platformFile,
126beb5fb622b71693c21b6fab562a98e7000c64273Xavier Ducrohet                platformStyleable, styleableName);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
12904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet    private Pair<String, ResourceValue> getResourceValue(int id, boolean[] platformResFlag_out) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
131b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
13208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            platformResFlag_out[0] = true;
13504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String attributeName = resourceInfo.getSecond();
13604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet
13704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return Pair.of(attributeName, mContext.getRenderResources().getFrameworkResource(
13804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    resourceInfo.getFirst(), attributeName));
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // didn't find a match in the framework? look in the project.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProjectCallback != null) {
143b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
14408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resourceInfo != null) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                platformResFlag_out[0] = false;
14704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                String attributeName = resourceInfo.getSecond();
14804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet
14904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                return Pair.of(attributeName, mContext.getRenderResources().getProjectResource(
15004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        resourceInfo.getFirst(), attributeName));
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getDrawable(int id) throws NotFoundException {
15904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
16008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
16204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return ResourceHelper.getDrawable(value.getSecond(), mContext);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
16708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getColor(int id) throws NotFoundException {
17404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
17508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                return ResourceHelper.getColor(value.getSecond().getValue());
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NumberFormatException e) {
18051a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e,
18151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        null /*data*/);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
18808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorStateList getColorStateList(int id) throws NotFoundException {
19504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> resValue = getResourceValue(id, mPlatformResourceFlag);
1964d9e32f07c2d7aef47c82449371b0bf362e3647aXavier Ducrohet
1974d9e32f07c2d7aef47c82449371b0bf362e3647aXavier Ducrohet        if (resValue != null) {
19804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ColorStateList stateList = ResourceHelper.getColorStateList(resValue.getSecond(),
19904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    mContext);
200bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (stateList != null) {
201bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                return stateList;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
20708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence getText(int id) throws NotFoundException {
21404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
21508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
2177f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
2187f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
2197f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
2207f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
2217f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
2227f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
2237f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    return v;
2247f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
2257f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
23008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getLayout(int id) throws NotFoundException {
23704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
23808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
23904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (v != null) {
24004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ResourceValue value = v.getSecond();
2419223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            XmlPullParser parser = null;
24208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2439223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            try {
2449223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // check if the current parser can provide us with a custom parser.
2452fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                if (mPlatformResourceFlag[0] == false) {
24645b662e1bcff23dc59fb3a47bc32c99e63b2ac35Xavier Ducrohet                    parser = mProjectCallback.getParser(value);
2479223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // create a new one manually if needed.
2509223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                if (parser == null) {
2519223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    File xml = new File(value.getValue());
2529223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    if (xml.isFile()) {
2539223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                        // we need to create a pull parser around the layout XML file, and then
2549223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                        // give that to our XmlBlockParser
25504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        parser = ParserFactory.create(xml);
2569223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2589223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet
2599223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                if (parser != null) {
2609223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2619223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                }
2629223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            } catch (XmlPullParserException e) {
263918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
26451a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2659223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // we'll return null below.
2669223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            } catch (FileNotFoundException e) {
2679223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // this shouldn't happen since we check above.
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2699223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
27408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2802eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    public XmlResourceParser getAnimation(int id) throws NotFoundException {
28104ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
2822eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
28304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (v != null) {
28404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ResourceValue value = v.getSecond();
2852eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            XmlPullParser parser = null;
2862eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
2872eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            try {
2882eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                File xml = new File(value.getValue());
2892eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                if (xml.isFile()) {
2902eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    // we need to create a pull parser around the layout XML file, and then
2912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    // give that to our XmlBlockParser
29204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    parser = ParserFactory.create(xml);
2932eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
2942eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2952eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                }
2962eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            } catch (XmlPullParserException e) {
297918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
29851a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2992eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                // we'll return null below.
3002eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            } catch (FileNotFoundException e) {
3012eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                // this shouldn't happen since we check above.
3022eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            }
3032eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3042eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        }
3052eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3062eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        // id was not found or not resolved. Throw a NotFoundException.
3072eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        throwException(id);
3082eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3092eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        // this is not used since the method above always throws
3102eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        return null;
3112eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    }
3122eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3132eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    @Override
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext.obtainStyledAttributes(set, attrs);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainTypedArray(int id) throws NotFoundException {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
32308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getDimension(int id) throws NotFoundException {
32604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3297f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3307f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3317f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3327f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3337f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3347f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3357f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (v.equals(BridgeConstants.MATCH_PARENT) ||
3367f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            v.equals(BridgeConstants.FILL_PARENT)) {
3377f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return LayoutParams.MATCH_PARENT;
3387f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    } else if (v.equals(BridgeConstants.WRAP_CONTENT)) {
3397f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return LayoutParams.WRAP_CONTENT;
3407f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
34108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3427f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3437f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3447f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3457f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return mTmpValue.getDimension(getDisplayMetrics());
3467f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
35308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelOffset(int id) throws NotFoundException {
36004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3637f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3647f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3657f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3667f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3677f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3687f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3697f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3707f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3717f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3727f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return TypedValue.complexToDimensionPixelOffset(mTmpValue.data,
3737f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                                getDisplayMetrics());
3747f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
38108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelSize(int id) throws NotFoundException {
38804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3917f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3927f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3937f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3947f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3957f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3967f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3977f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3987f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3997f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
4007f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return TypedValue.complexToDimensionPixelSize(mTmpValue.data,
4017f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                                getDisplayMetrics());
4027f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
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 int getInteger(int id) throws NotFoundException {
41604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
41708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4187f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet        if (value != null) {
4197f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
4207f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
4217f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
4227f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
4237f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
4247f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
4257f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    int radix = 10;
4267f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (v.startsWith("0x")) {
4277f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        v = v.substring(2);
4287f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        radix = 16;
4297f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4307f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    try {
4317f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return Integer.parseInt(v, radix);
4327f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    } catch (NumberFormatException e) {
4337f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        // return exception below
4347f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4357f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
44108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
447162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    public boolean getBoolean(int id) throws NotFoundException {
448162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
449162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
4507f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet        if (value != null) {
4517f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
4527f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
4537f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
4547f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
4557f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
4567f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
4577f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    return Boolean.parseBoolean(v);
4587f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
4597f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            }
460162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        }
461162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
462162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        // id was not found or not resolved. Throw a NotFoundException.
463162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        throwException(id);
464162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
465162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        // this is not used since the method above always throws
466162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        return false;
467162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    }
468162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
469162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    @Override
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceEntryName(int resid) throws NotFoundException {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceName(int resid) throws NotFoundException {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceTypeName(int resid) throws NotFoundException {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id, Object... formatArgs) throws NotFoundException {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String s = getString(id);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s != null) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return String.format(s, formatArgs);
48908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
49408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id) throws NotFoundException {
50104ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
50208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
50304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (value != null && value.getSecond().getValue() != null) {
50404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return value.getSecond().getValue();
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
50908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(int id, TypedValue outValue, boolean resolveRefs)
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
51704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
52004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String v = value.getSecond().getValue();
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
52304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                if (ResourceHelper.parseFloatAttribute(value.getFirst(), v, outValue,
52404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        false /*requireUnit*/)) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
52808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                // else it's a string
52908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.type = TypedValue.TYPE_STRING;
53008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.string = v;
53108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                return;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(String name, TypedValue outValue, boolean resolveRefs)
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getXml(int id) throws NotFoundException {
54704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
55004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String v = value.getSecond().getValue();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
55404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                File f = new File(v);
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
55704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        XmlPullParser parser = ParserFactory.create(f);
55808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (XmlPullParserException e) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
58108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    public XmlResourceParser loadXmlResourceParser(String file, int id,
58208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            int assetCookie, String type) throws NotFoundException {
58308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // even though we know the XML file to load directly, we still need to resolve the
58408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // id so that we can know if it's a platform or project resource.
58508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // (mPlatformResouceFlag will get the result and will be used later).
58608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        getResourceValue(id, mPlatformResourceFlag);
58708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
58808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        File f = new File(file);
58908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        try {
59004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            XmlPullParser parser = ParserFactory.create(f);
59108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
59208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
59308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (XmlPullParserException e) {
59408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
59508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
59608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
59708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (FileNotFoundException e) {
59808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
59908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
60008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
60108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        }
60208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    }
60308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
60408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
60508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    @Override
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InputStream openRawResource(int id) throws NotFoundException {
60704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
61004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String path = value.getSecond().getValue();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
612bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (path != null) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
614bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                File f = new File(path);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
617bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // if it's a nine-patch return a custom input stream so that
618bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // other methods (mainly bitmap factory) can detect it's a 9-patch
619bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // and actually load it as a 9-patch instead of a normal bitmap
620bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
621bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                            return new NinePatchInputStream(f);
622bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new FileInputStream(f);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
64172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
64272e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        getValue(id, value, true);
64372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
644bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        String path = value.string.toString();
645bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
646bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        File f = new File(path);
64772e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        if (f.isFile()) {
64872e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            try {
649bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // if it's a nine-patch return a custom input stream so that
650bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // other methods (mainly bitmap factory) can detect it's a 9-patch
651bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // and actually load it as a 9-patch instead of a normal bitmap
652bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
653bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    return new NinePatchInputStream(f);
654bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                }
65572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                return new FileInputStream(f);
65672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            } catch (FileNotFoundException e) {
65772e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                NotFoundException exception = new NotFoundException();
65872e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                exception.initCause(e);
65972e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                throw exception;
66072e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            }
66172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        }
66272e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
66372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        throw new NotFoundException();
66472e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    }
66572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
66672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    @Override
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Builds and throws a {@link Resources.NotFoundException} based on a resource id and a resource type.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id the id of the resource
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NotFoundException
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void throwException(int id) throws NotFoundException {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
678b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the name is unknown in the framework, get it from the custom view loader.
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo == null && mProjectCallback != null) {
682b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String message = null;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.",
689b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet                    resourceInfo.getFirst(), id, resourceInfo.getSecond());
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not resolve resource value: 0x%1$X.", id);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new NotFoundException(message);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
698