BridgeResources.java revision 282e181b58cf72b6ca770dc7ca5f91f135444502
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage android.content.res; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.IProjectCallback; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceValue; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.Bridge; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.BridgeConstants; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.android.BridgeContext; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.android.BridgeXmlBlockParser; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.ParserFactory; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.ResourceHelper; 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ninepatch.NinePatch; 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.resources.ResourceType; 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.util.Pair; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParser; 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParserException; 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.drawable.Drawable; 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.AttributeSet; 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.DisplayMetrics; 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.TypedValue; 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup.LayoutParams; 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.File; 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream; 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileNotFoundException; 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.InputStream; 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic final class BridgeResources extends Resources { 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private BridgeContext mContext; 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private IProjectCallback mProjectCallback; 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private boolean[] mPlatformResourceFlag = new boolean[1]; 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Simpler wrapper around FileInputStream. This is used when the input stream represent 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * not a normal bitmap but a nine patch. 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This is useful when the InputStream is created in a method but used in another that needs 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * to know whether this is 9-patch or not, such as BitmapFactory. 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public class NinePatchInputStream extends FileInputStream { 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private boolean mFakeMarkSupport = true; 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public NinePatchInputStream(File file) throws FileNotFoundException { 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski super(file); 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean markSupported() { 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mFakeMarkSupport) { 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is needed so that BitmapFactory doesn't wrap this in a BufferedInputStream. 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return true; 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return super.markSupported(); 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void disableFakeMarkSupport() { 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // disable fake mark support so that in case codec actually try to use them 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we don't lie to them. 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mFakeMarkSupport = false; 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This initializes the static field {@link Resources#mSystem} which is used 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * by methods who get global resources using {@link Resources#getSystem()}. 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * <p/> 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * They will end up using our bridge resources. 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * <p/> 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * {@link Bridge} calls this method after setting up a new bridge. 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static Resources initSystem(BridgeContext context, 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski AssetManager assets, 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DisplayMetrics metrics, 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Configuration config, 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski IProjectCallback projectCallback) { 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return Resources.mSystem = new BridgeResources(context, 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assets, 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski metrics, 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski config, 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski projectCallback); 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Disposes the static {@link Resources#mSystem} to make sure we don't leave objects 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * around that would prevent us from unloading the library. 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static void disposeSystem() { 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (Resources.mSystem instanceof BridgeResources) { 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ((BridgeResources)(Resources.mSystem)).mContext = null; 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ((BridgeResources)(Resources.mSystem)).mProjectCallback = null; 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Resources.mSystem = null; 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private BridgeResources(BridgeContext context, AssetManager assets, DisplayMetrics metrics, 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Configuration config, IProjectCallback projectCallback) { 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski super(assets, metrics, config); 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mContext = context; 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mProjectCallback = projectCallback; 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) { 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BridgeTypedArray(this, mContext, numEntries, platformFile); 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private Pair<String, ResourceValue> getResourceValue(int id, boolean[] platformResFlag_out) { 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // first get the String related to this id in the framework 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id); 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resourceInfo != null) { 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski platformResFlag_out[0] = true; 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String attributeName = resourceInfo.getSecond(); 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return Pair.of(attributeName, mContext.getRenderResources().getFrameworkResource( 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resourceInfo.getFirst(), attributeName)); 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // didn't find a match in the framework? look in the project. 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mProjectCallback != null) { 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resourceInfo = mProjectCallback.resolveResourceId(id); 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resourceInfo != null) { 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski platformResFlag_out[0] = false; 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String attributeName = resourceInfo.getSecond(); 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return Pair.of(attributeName, mContext.getRenderResources().getProjectResource( 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resourceInfo.getFirst(), attributeName)); 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Drawable getDrawable(int id) throws NotFoundException { 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return ResourceHelper.getDrawable(value.getSecond(), mContext); 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getColor(int id) throws NotFoundException { 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return ResourceHelper.getColor(value.getSecond().getValue()); 177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (NumberFormatException e) { 178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e, 179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski null /*data*/); 180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public ColorStateList getColorStateList(int id) throws NotFoundException { 193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> resValue = getResourceValue(id, mPlatformResourceFlag); 194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ColorStateList stateList = ResourceHelper.getColorStateList(resValue.getSecond(), 197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mContext); 198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (stateList != null) { 199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return stateList; 200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public CharSequence getText(int id) throws NotFoundException { 212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return v; 222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public XmlResourceParser getLayout(int id) throws NotFoundException { 235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag); 236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue value = v.getSecond(); 239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XmlPullParser parser = null; 240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // check if the current parser can provide us with a custom parser. 243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mPlatformResourceFlag[0] == false) { 244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski parser = mProjectCallback.getParser(value); 245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // create a new one manually if needed. 248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (parser == null) { 249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File xml = new File(value.getValue()); 250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (xml.isFile()) { 251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we need to create a pull parser around the layout XML file, and then 252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // give that to our XmlBlockParser 253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski parser = ParserFactory.create(xml); 254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (parser != null) { 258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); 259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (XmlPullParserException e) { 261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.getLog().error(LayoutLog.TAG_BROKEN, 262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Failed to configure parser for " + value.getValue(), e, null /*data*/); 263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we'll return null below. 264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this shouldn't happen since we check above. 266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public XmlResourceParser getAnimation(int id) throws NotFoundException { 279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag); 280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue value = v.getSecond(); 283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XmlPullParser parser = null; 284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File xml = new File(value.getValue()); 287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (xml.isFile()) { 288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we need to create a pull parser around the layout XML file, and then 289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // give that to our XmlBlockParser 290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski parser = ParserFactory.create(xml); 291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); 293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (XmlPullParserException e) { 295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.getLog().error(LayoutLog.TAG_BROKEN, 296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Failed to configure parser for " + value.getValue(), e, null /*data*/); 297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we'll return null below. 298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this shouldn't happen since we check above. 300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { 313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mContext.obtainStyledAttributes(set, attrs); 314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public TypedArray obtainTypedArray(int id) throws NotFoundException { 318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public float getDimension(int id) throws NotFoundException { 324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v.equals(BridgeConstants.MATCH_PARENT) || 334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski v.equals(BridgeConstants.FILL_PARENT)) { 335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return LayoutParams.MATCH_PARENT; 336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } else if (v.equals(BridgeConstants.WRAP_CONTENT)) { 337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return LayoutParams.WRAP_CONTENT; 338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (ResourceHelper.parseFloatAttribute( 341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski value.getFirst(), v, mTmpValue, true /*requireUnit*/) && 342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTmpValue.type == TypedValue.TYPE_DIMENSION) { 343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mTmpValue.getDimension(getDisplayMetrics()); 344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getDimensionPixelOffset(int id) throws NotFoundException { 358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (ResourceHelper.parseFloatAttribute( 368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski value.getFirst(), v, mTmpValue, true /*requireUnit*/) && 369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTmpValue.type == TypedValue.TYPE_DIMENSION) { 370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return TypedValue.complexToDimensionPixelOffset(mTmpValue.data, 371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski getDisplayMetrics()); 372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getDimensionPixelSize(int id) throws NotFoundException { 386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (ResourceHelper.parseFloatAttribute( 396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski value.getFirst(), v, mTmpValue, true /*requireUnit*/) && 397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTmpValue.type == TypedValue.TYPE_DIMENSION) { 398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return TypedValue.complexToDimensionPixelSize(mTmpValue.data, 399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski getDisplayMetrics()); 400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getInteger(int id) throws NotFoundException { 414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int radix = 10; 424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v.startsWith("0x")) { 425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski v = v.substring(2); 426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski radix = 16; 427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return Integer.parseInt(v, radix); 430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (NumberFormatException e) { 431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // return exception below 432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 0; 442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean getBoolean(int id) throws NotFoundException { 446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceValue resValue = value.getSecond(); 450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert resValue != null; 452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resValue != null) { 453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = resValue.getValue(); 454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return Boolean.parseBoolean(v); 456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return false; 465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getResourceEntryName(int resid) throws NotFoundException { 469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getResourceName(int resid) throws NotFoundException { 474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getResourceTypeName(int resid) throws NotFoundException { 479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getString(int id, Object... formatArgs) throws NotFoundException { 484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String s = getString(id); 485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (s != null) { 486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return String.format(s, formatArgs); 487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public String getString(int id) throws NotFoundException { 499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null && value.getSecond().getValue() != null) { 502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return value.getSecond().getValue(); 503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void getValue(int id, TypedValue outValue, boolean resolveRefs) 514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throws NotFoundException { 515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = value.getSecond().getValue(); 519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (ResourceHelper.parseFloatAttribute(value.getFirst(), v, outValue, 522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski false /*requireUnit*/)) { 523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return; 524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // else it's a string 527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski outValue.type = TypedValue.TYPE_STRING; 528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski outValue.string = v; 529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return; 530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void getValue(String name, TypedValue outValue, boolean resolveRefs) 539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throws NotFoundException { 540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public XmlResourceParser getXml(int id) throws NotFoundException { 545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String v = value.getSecond().getValue(); 549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (v != null) { 551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // check this is a file 552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File f = new File(v); 553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (f.isFile()) { 554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XmlPullParser parser = ParserFactory.create(f); 556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); 558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (XmlPullParserException e) { 559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException newE = new NotFoundException(); 560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski newE.initCause(e); 561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw newE; 562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException newE = new NotFoundException(); 564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski newE.initCause(e); 565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw newE; 566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public XmlResourceParser loadXmlResourceParser(String file, int id, 580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int assetCookie, String type) throws NotFoundException { 581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // even though we know the XML file to load directly, we still need to resolve the 582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id so that we can know if it's a platform or project resource. 583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // (mPlatformResouceFlag will get the result and will be used later). 584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski getResourceValue(id, mPlatformResourceFlag); 585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File f = new File(file); 587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski XmlPullParser parser = ParserFactory.create(f); 589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]); 591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (XmlPullParserException e) { 592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException newE = new NotFoundException(); 593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski newE.initCause(e); 594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw newE; 595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException newE = new NotFoundException(); 597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski newE.initCause(e); 598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw newE; 599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 600282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public InputStream openRawResource(int id) throws NotFoundException { 605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); 606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (value != null) { 608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String path = value.getSecond().getValue(); 609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (path != null) { 611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // check this is a file 612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File f = new File(path); 613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (f.isFile()) { 614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // if it's a nine-patch return a custom input stream so that 616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // other methods (mainly bitmap factory) can detect it's a 9-patch 617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // and actually load it as a 9-patch instead of a normal bitmap 618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) { 619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new NinePatchInputStream(f); 620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new FileInputStream(f); 622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException newE = new NotFoundException(); 624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski newE.initCause(e); 625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw newE; 626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // id was not found or not resolved. Throw a NotFoundException. 632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throwException(id); 633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // this is not used since the method above always throws 635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public InputStream openRawResource(int id, TypedValue value) throws NotFoundException { 640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski getValue(id, value, true); 641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String path = value.string.toString(); 643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski File f = new File(path); 645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (f.isFile()) { 646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // if it's a nine-patch return a custom input stream so that 648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // other methods (mainly bitmap factory) can detect it's a 9-patch 649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // and actually load it as a 9-patch instead of a normal bitmap 650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (path.toLowerCase().endsWith(NinePatch.EXTENSION_9PATCH)) { 651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new NinePatchInputStream(f); 652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new FileInputStream(f); 654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } catch (FileNotFoundException e) { 655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski NotFoundException exception = new NotFoundException(); 656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski exception.initCause(e); 657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw exception; 658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new NotFoundException(); 662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public AssetFileDescriptor openRawResourceFd(int id) throws NotFoundException { 666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new UnsupportedOperationException(); 667282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Builds and throws a {@link Resources.NotFoundException} based on a resource id and a resource type. 671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @param id the id of the resource 672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @throws NotFoundException 673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private void throwException(int id) throws NotFoundException { 675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // first get the String related to this id in the framework 676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id); 677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // if the name is unknown in the framework, get it from the custom view loader. 679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resourceInfo == null && mProjectCallback != null) { 680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resourceInfo = mProjectCallback.resolveResourceId(id); 681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String message = null; 684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (resourceInfo != null) { 685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski message = String.format( 686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Could not find %1$s resource matching value 0x%2$X (resolved name: %3$s) in current configuration.", 687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski resourceInfo.getFirst(), id, resourceInfo.getSecond()); 688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } else { 689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski message = String.format( 690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski "Could not resolve resource value: 0x%1$X.", id); 691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new NotFoundException(message); 694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 696