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