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
1235d701eddcf7f4abd5867ec3bf2091916d5ebbdf1Xavier Ducrohet    public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) {
1245d701eddcf7f4abd5867ec3bf2091916d5ebbdf1Xavier Ducrohet        return new BridgeTypedArray(this, mContext, numEntries, platformFile);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
12704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet    private Pair<String, ResourceValue> getResourceValue(int id, boolean[] platformResFlag_out) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
129b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
13008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            platformResFlag_out[0] = true;
13304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String attributeName = resourceInfo.getSecond();
13404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet
13504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return Pair.of(attributeName, mContext.getRenderResources().getFrameworkResource(
13604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    resourceInfo.getFirst(), attributeName));
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // didn't find a match in the framework? look in the project.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProjectCallback != null) {
141b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
14208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resourceInfo != null) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                platformResFlag_out[0] = false;
14504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                String attributeName = resourceInfo.getSecond();
14604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet
14704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                return Pair.of(attributeName, mContext.getRenderResources().getProjectResource(
14804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        resourceInfo.getFirst(), attributeName));
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getDrawable(int id) throws NotFoundException {
15704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
15808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
16004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return ResourceHelper.getDrawable(value.getSecond(), mContext);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
16508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getColor(int id) throws NotFoundException {
17204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
17308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
17604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                return ResourceHelper.getColor(value.getSecond().getValue());
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (NumberFormatException e) {
17851a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e,
17951a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        null /*data*/);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
18608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorStateList getColorStateList(int id) throws NotFoundException {
19304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> resValue = getResourceValue(id, mPlatformResourceFlag);
1944d9e32f07c2d7aef47c82449371b0bf362e3647aXavier Ducrohet
1954d9e32f07c2d7aef47c82449371b0bf362e3647aXavier Ducrohet        if (resValue != null) {
19604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ColorStateList stateList = ResourceHelper.getColorStateList(resValue.getSecond(),
19704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    mContext);
198bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (stateList != null) {
199bbbb8326020368958a3f1d248878329e9d6b10c0Xavier 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 {
21204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
21308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
2157f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
2167f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
2177f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
2187f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
2197f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
2207f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
2217f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    return v;
2227f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
2237f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
22808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getLayout(int id) throws NotFoundException {
23504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
23608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
23704ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (v != null) {
23804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ResourceValue value = v.getSecond();
2399223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            XmlPullParser parser = null;
24008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2419223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            try {
2429223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // check if the current parser can provide us with a custom parser.
2432fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet                if (mPlatformResourceFlag[0] == false) {
24445b662e1bcff23dc59fb3a47bc32c99e63b2ac35Xavier Ducrohet                    parser = mProjectCallback.getParser(value);
2459223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // create a new one manually if needed.
2489223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                if (parser == null) {
2499223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    File xml = new File(value.getValue());
2509223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    if (xml.isFile()) {
2519223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                        // we need to create a pull parser around the layout XML file, and then
2529223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                        // give that to our XmlBlockParser
25304ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        parser = ParserFactory.create(xml);
2549223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2569223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet
2579223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                if (parser != null) {
2589223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2599223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                }
2609223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            } catch (XmlPullParserException e) {
261918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
26251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2639223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // we'll return null below.
2649223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet            } catch (FileNotFoundException e) {
2659223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet                // this shouldn't happen since we check above.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2679223b6737c56619c02125ce988bb21fc4fde264bXavier Ducrohet
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
27208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2782eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    public XmlResourceParser getAnimation(int id) throws NotFoundException {
27904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);
2802eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
28104ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (v != null) {
28204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            ResourceValue value = v.getSecond();
2832eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            XmlPullParser parser = null;
2842eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
2852eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            try {
2862eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                File xml = new File(value.getValue());
2872eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                if (xml.isFile()) {
2882eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    // we need to create a pull parser around the layout XML file, and then
2892eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    // give that to our XmlBlockParser
29004ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                    parser = ParserFactory.create(xml);
2912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
2922eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
2932eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                }
2942eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            } catch (XmlPullParserException e) {
295918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
29651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                        "Failed to configure parser for " + value.getValue(), e, null /*data*/);
2972eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                // we'll return null below.
2982eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            } catch (FileNotFoundException e) {
2992eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                // this shouldn't happen since we check above.
3002eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            }
3012eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3022eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        }
3032eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3042eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        // id was not found or not resolved. Throw a NotFoundException.
3052eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        throwException(id);
3062eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3072eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        // this is not used since the method above always throws
3082eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        return null;
3092eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    }
3102eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
3112eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    @Override
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext.obtainStyledAttributes(set, attrs);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TypedArray obtainTypedArray(int id) throws NotFoundException {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
32108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getDimension(int id) throws NotFoundException {
32404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3277f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3287f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3297f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3307f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3317f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3327f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3337f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (v.equals(BridgeConstants.MATCH_PARENT) ||
3347f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            v.equals(BridgeConstants.FILL_PARENT)) {
3357f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return LayoutParams.MATCH_PARENT;
3367f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    } else if (v.equals(BridgeConstants.WRAP_CONTENT)) {
3377f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return LayoutParams.WRAP_CONTENT;
3387f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
33908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3407f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3417f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3427f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3437f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return mTmpValue.getDimension(getDisplayMetrics());
3447f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
35108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelOffset(int id) throws NotFoundException {
35804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3617f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3627f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3637f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3647f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3657f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3667f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3677f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3687f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3697f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3707f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return TypedValue.complexToDimensionPixelOffset(mTmpValue.data,
3717f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                                getDisplayMetrics());
3727f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
37908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDimensionPixelSize(int id) throws NotFoundException {
38604ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
3897f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
3907f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
3917f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
3927f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
3937f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
3947f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
3957f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (ResourceHelper.parseFloatAttribute(
3967f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
3977f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                            mTmpValue.type == TypedValue.TYPE_DIMENSION) {
3987f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return TypedValue.complexToDimensionPixelSize(mTmpValue.data,
3997f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                                getDisplayMetrics());
4007f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
40708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getInteger(int id) throws NotFoundException {
41404ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
41508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4167f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet        if (value != null) {
4177f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
4187f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
4197f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
4207f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
4217f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
4227f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
4237f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    int radix = 10;
4247f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    if (v.startsWith("0x")) {
4257f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        v = v.substring(2);
4267f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        radix = 16;
4277f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4287f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    try {
4297f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        return Integer.parseInt(v, radix);
4307f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    } catch (NumberFormatException e) {
4317f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                        // return exception below
4327f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    }
4337f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
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 0;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
445162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    public boolean getBoolean(int id) throws NotFoundException {
446162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
447162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
4487f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet        if (value != null) {
4497f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            ResourceValue resValue = value.getSecond();
4507f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet
4517f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            assert resValue != null;
4527f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            if (resValue != null) {
4537f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                String v = resValue.getValue();
4547f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                if (v != null) {
4557f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                    return Boolean.parseBoolean(v);
4567f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet                }
4577f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet            }
458162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        }
459162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
460162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        // id was not found or not resolved. Throw a NotFoundException.
461162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        throwException(id);
462162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
463162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        // this is not used since the method above always throws
464162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet        return false;
465162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    }
466162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet
467162c1dcd5e635d17d8425936d7729d0ae5ed1a62Xavier Ducrohet    @Override
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceEntryName(int resid) throws NotFoundException {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceName(int resid) throws NotFoundException {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getResourceTypeName(int resid) throws NotFoundException {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id, Object... formatArgs) throws NotFoundException {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String s = getString(id);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s != null) {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return String.format(s, formatArgs);
48708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
49208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getString(int id) throws NotFoundException {
49904ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
50008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
50104ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        if (value != null && value.getSecond().getValue() != null) {
50204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            return value.getSecond().getValue();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
50708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(int id, TypedValue outValue, boolean resolveRefs)
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
51504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
51804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String v = value.getSecond().getValue();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
52104ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                if (ResourceHelper.parseFloatAttribute(value.getFirst(), v, outValue,
52204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        false /*requireUnit*/)) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
52608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                // else it's a string
52708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.type = TypedValue.TYPE_STRING;
52808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                outValue.string = v;
52908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet                return;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getValue(String name, TypedValue outValue, boolean resolveRefs)
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws NotFoundException {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser getXml(int id) throws NotFoundException {
54504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
54804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String v = value.getSecond().getValue();
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
55204ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                File f = new File(v);
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
55504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet                        XmlPullParser parser = ParserFactory.create(f);
55608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (XmlPullParserException e) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
57908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    public XmlResourceParser loadXmlResourceParser(String file, int id,
58008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            int assetCookie, String type) throws NotFoundException {
58108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // even though we know the XML file to load directly, we still need to resolve the
58208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // id so that we can know if it's a platform or project resource.
58308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        // (mPlatformResouceFlag will get the result and will be used later).
58408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        getResourceValue(id, mPlatformResourceFlag);
58508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
58608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        File f = new File(file);
58708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        try {
58804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            XmlPullParser parser = ParserFactory.create(f);
58908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
59008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
59108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (XmlPullParserException e) {
59208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
59308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
59408e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
59508e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        } catch (FileNotFoundException e) {
59608e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            NotFoundException newE = new NotFoundException();
59708e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            newE.initCause(e);
59808e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet            throw newE;
59908e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet        }
60008e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    }
60108e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
60208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
60308e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet    @Override
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InputStream openRawResource(int id) throws NotFoundException {
60504ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value != null) {
60804ce81113107d2bfa0b8248b13145b4cf24cb943Xavier Ducrohet            String path = value.getSecond().getValue();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
610bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            if (path != null) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // check this is a file
612bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                File f = new File(path);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (f.isFile()) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
615bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // if it's a nine-patch return a custom input stream so that
616bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // other methods (mainly bitmap factory) can detect it's a 9-patch
617bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        // and actually load it as a 9-patch instead of a normal bitmap
618bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
619bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                            return new NinePatchInputStream(f);
620bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return new FileInputStream(f);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (FileNotFoundException e) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NotFoundException newE = new NotFoundException();
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newE.initCause(e);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw newE;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // id was not found or not resolved. Throw a NotFoundException.
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throwException(id);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this is not used since the method above always throws
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
63972e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    public InputStream openRawResource(int id, TypedValue value) throws NotFoundException {
64072e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        getValue(id, value, true);
64172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
642bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        String path = value.string.toString();
643bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet
644bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet        File f = new File(path);
64572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        if (f.isFile()) {
64672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            try {
647bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // if it's a nine-patch return a custom input stream so that
648bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // other methods (mainly bitmap factory) can detect it's a 9-patch
649bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                // and actually load it as a 9-patch instead of a normal bitmap
650bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) {
651bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                    return new NinePatchInputStream(f);
652bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet                }
65372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                return new FileInputStream(f);
65472e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            } catch (FileNotFoundException e) {
65572e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                NotFoundException exception = new NotFoundException();
65672e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                exception.initCause(e);
65772e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet                throw exception;
65872e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet            }
65972e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        }
66072e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
66172e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet        throw new NotFoundException();
66272e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    }
66372e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet
66472e4bcd3d0da90f6c9550c93e58c12b2903a5ab8Xavier Ducrohet    @Override
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new UnsupportedOperationException();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Builds and throws a {@link Resources.NotFoundException} based on a resource id and a resource type.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id the id of the resource
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NotFoundException
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void throwException(int id) throws NotFoundException {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // first get the String related to this id in the framework
676b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the name is unknown in the framework, get it from the custom view loader.
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo == null && mProjectCallback != null) {
680b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet            resourceInfo = mProjectCallback.resolveResourceId(id);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String message = null;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resourceInfo != null) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.",
687b353495192ba1acce94b8ab8aeeffe3c9a3bcfacXavier Ducrohet                    resourceInfo.getFirst(), id, resourceInfo.getSecond());
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            message = String.format(
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Could not resolve resource value: 0x%1$X.", id);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69208e2a4b56f23ce02f17300438f76ccc1f663f183Xavier Ducrohet
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throw new NotFoundException(message);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
696