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