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