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