BridgeContext.java revision e64a5bd2fb54d84d6fd2119ef831df1eba4185ff
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 com.android.layoutlib.bridge.android;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Guptaimport com.android.annotations.Nullable;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ILayoutPullParser;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.IProjectCallback;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderResources;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceValue;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.StyleResourceValue;
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.Bridge;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.BridgeConstants;
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.android.view.WindowManagerImpl;
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.ParserFactory;
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.Stack;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.resources.ResourceType;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.util.Pair;
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParser;
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParserException;
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.BroadcastReceiver;
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ComponentName;
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ContentResolver;
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.Context;
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.Intent;
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.IntentFilter;
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.IntentSender;
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ServiceConnection;
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.SharedPreferences;
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.pm.ApplicationInfo;
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.pm.PackageManager;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.AssetManager;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.BridgeResources;
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.BridgeTypedArray;
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Configuration;
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources;
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources.Theme;
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.DatabaseErrorHandler;
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.sqlite.SQLiteDatabase;
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.sqlite.SQLiteDatabase.CursorFactory;
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.Bitmap;
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.drawable.Drawable;
60664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Guptaimport android.hardware.display.DisplayManager;
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.net.Uri;
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Bundle;
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Handler;
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Looper;
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.PowerManager;
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.UserHandle;
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.AttributeSet;
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.DisplayMetrics;
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.TypedValue;
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.BridgeInflater;
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.Display;
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.DisplayAdjustments;
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View;
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup;
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.WindowManager;
76e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Guptaimport android.view.accessibility.AccessibilityManager;
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.textservice.TextServicesManager;
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.File;
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream;
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileNotFoundException;
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileOutputStream;
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.IOException;
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.InputStream;
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.ArrayList;
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.HashMap;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.IdentityHashMap;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List;
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Map;
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Custom implementation of Context/Activity to handle non compiled resources.
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic final class BridgeContext extends Context {
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
960ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    /** The map adds cookies to each view so that IDE can link xml tags to views. */
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final HashMap<View, Object> mViewKeyMap = new HashMap<View, Object>();
980ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    /**
990ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * In some cases, when inflating an xml, some objects are created. Then later, the objects are
1000ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * converted to views. This map stores the mapping from objects to cookies which can then be
1010ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * used to populate the mViewKeyMap.
1020ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     */
1030ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    private final HashMap<Object, Object> mViewKeyHelpMap = new HashMap<Object, Object>();
1040ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    private Resources mSystemResources;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Object mProjectKey;
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final DisplayMetrics mMetrics;
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final RenderResources mRenderResources;
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Configuration mConfig;
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final ApplicationInfo mApplicationInfo;
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final IProjectCallback mProjectCallback;
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final WindowManager mWindowManager;
112664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta    private final DisplayManager mDisplayManager;
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Resources.Theme mTheme;
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Map<Object, Map<String, String>> mDefaultPropMaps =
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        new IdentityHashMap<Object, Map<String,String>>();
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // maps for dynamically generated id representing style objects (StyleResourceValue)
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Map<Integer, StyleResourceValue> mDynamicIdToStyleMap;
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap;
122bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta    private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // cache for TypedArray generated from IStyleResourceValue object
1254a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    private Map<int[], Map<Integer, BridgeTypedArray>> mTypedArrayCache;
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private BridgeInflater mBridgeInflater;
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private BridgeContentResolver mContentResolver;
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<BridgeXmlBlockParser>();
131dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta    private SharedPreferences mSharedPreferences;
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
133dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta  /**
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param metrics the {@link DisplayMetrics}.
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param renderResources the configured resources (both framework and projects) for this
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * render.
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param config the Configuration object for this render.
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param targetSdkVersion the targetSdkVersion of the application.
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeContext(Object projectKey, DisplayMetrics metrics,
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            RenderResources renderResources,
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            IProjectCallback projectCallback,
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Configuration config,
1458930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            int targetSdkVersion,
1468930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            boolean hasRtlSupport) {
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mProjectKey = projectKey;
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mMetrics = metrics;
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mProjectCallback = projectCallback;
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mRenderResources = renderResources;
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mConfig = config;
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mApplicationInfo = new ApplicationInfo();
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mApplicationInfo.targetSdkVersion = targetSdkVersion;
1568930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta        if (hasRtlSupport) {
1578930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL;
1588930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta        }
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mWindowManager = new WindowManagerImpl(mMetrics);
161664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        mDisplayManager = new DisplayManager(this);
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Initializes the {@link Resources} singleton to be linked to this {@link Context}, its
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * {@link DisplayMetrics}, {@link Configuration}, and {@link IProjectCallback}.
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @see #disposeResources()
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void initResources() {
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AssetManager assetManager = AssetManager.getSystem();
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSystemResources = BridgeResources.initSystem(
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                this,
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                assetManager,
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mMetrics,
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mConfig,
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mProjectCallback);
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mTheme = mSystemResources.newTheme();
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Disposes the {@link Resources} singleton.
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void disposeResources() {
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BridgeResources.disposeSystem();
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setBridgeInflater(BridgeInflater inflater) {
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mBridgeInflater = inflater;
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void addViewKey(View view, Object viewKey) {
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mViewKeyMap.put(view, viewKey);
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getViewKey(View view) {
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mViewKeyMap.get(view);
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2010ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    public void addCookie(Object o, Object cookie) {
2020ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta        mViewKeyHelpMap.put(o, cookie);
2030ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    }
2040ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta
2050ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    public Object getCookie(Object o) {
2060ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta        return mViewKeyHelpMap.get(o);
2070ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    }
2080ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getProjectKey() {
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mProjectKey;
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public DisplayMetrics getMetrics() {
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mMetrics;
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public IProjectCallback getProjectCallback() {
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mProjectCallback;
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public RenderResources getRenderResources() {
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mRenderResources;
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Map<String, String> getDefaultPropMap(Object key) {
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mDefaultPropMaps.get(key);
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Configuration getConfiguration() {
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mConfig;
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Adds a parser to the stack.
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param parser the parser to add.
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void pushParser(BridgeXmlBlockParser parser) {
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (ParserFactory.LOG_PARSER) {
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.out.println("PUSH " + parser.getParser().toString());
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mParserStack.push(parser);
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Removes the parser at the top of the stack
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void popParser() {
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BridgeXmlBlockParser parser = mParserStack.pop();
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (ParserFactory.LOG_PARSER) {
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.out.println("POPD " + parser.getParser().toString());
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns the current parser at the top the of the stack.
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return a parser or null.
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeXmlBlockParser getCurrentParser() {
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParserStack.peek();
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns the previous parser.
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return a parser or null if there isn't any previous parser
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeXmlBlockParser getPreviousParser() {
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mParserStack.size() < 2) {
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParserStack.get(mParserStack.size() - 2);
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean resolveThemeAttribute(int resid, TypedValue outValue, boolean resolveRefs) {
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resid);
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isFrameworkRes = true;
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo == null) {
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            resourceInfo = mProjectCallback.resolveResourceId(resid);
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isFrameworkRes = false;
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo == null) {
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResourceValue value = mRenderResources.findItemInTheme(resourceInfo.getSecond(),
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isFrameworkRes);
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resolveRefs) {
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            value = mRenderResources.resolveResValue(value);
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // check if this is a style resource
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (value instanceof StyleResourceValue) {
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // get the id that will represent this style.
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            outValue.resourceId = getDynamicIdByStyle((StyleResourceValue)value);
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return true;
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int a;
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // if this is a framework value.
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (value.isFramework()) {
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // look for idName in the android R classes.
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // use 0 a default res value as it's not a valid id value.
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            a = getFrameworkResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // look for idName in the project R class.
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // use 0 a default res value as it's not a valid id value.
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            a = getProjectResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (a != 0) {
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            outValue.resourceId = a;
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return true;
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ResourceReference resolveId(int id) {
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // first get the String related to this id in the framework
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo != null) {
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return new ResourceReference(resourceInfo.getSecond(), true);
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // didn't find a match in the framework? look in the project.
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mProjectCallback != null) {
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            resourceInfo = mProjectCallback.resolveResourceId(id);
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resourceInfo != null) {
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return new ResourceReference(resourceInfo.getSecond(), false);
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
337bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // The base value for R.style is 0x01030000 and the custom style is 0x02030000.
338bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // So, if the second byte is 03, it's probably a style.
339bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        if ((id >> 16 & 0xFF) == 0x03) {
340bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta            return getStyleByDynamicId(id);
341bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        }
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent,
346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean attachToRoot, boolean skipCallbackParser) {
347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isPlatformLayout = resource.isFramework();
348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
3499fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (!isPlatformLayout && !skipCallbackParser) {
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // check if the project callback can provide us with a custom parser.
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ILayoutPullParser parser = getParser(resource);
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (parser != null) {
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        this, resource.isFramework());
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                try {
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    pushParser(blockParser);
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return Pair.of(
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            mBridgeInflater.inflate(blockParser, parent, attachToRoot),
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            true);
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } finally {
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    popParser();
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResourceValue resValue;
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resource instanceof ResourceValue) {
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            resValue = (ResourceValue) resource;
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (isPlatformLayout) {
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                resValue = mRenderResources.getFrameworkResource(ResourceType.LAYOUT,
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resource.getName());
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                resValue = mRenderResources.getProjectResource(ResourceType.LAYOUT,
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resource.getName());
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resValue != null) {
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            File xml = new File(resValue.getValue());
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (xml.isFile()) {
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // we need to create a pull parser around the layout XML file, and then
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // give that to our XmlBlockParser
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                try {
387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    XmlPullParser parser = ParserFactory.create(xml);
388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // set the resource ref to have correct view cookies
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mBridgeInflater.setResourceReference(resource);
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            this, resource.isFramework());
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    try {
395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        pushParser(blockParser);
396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        return Pair.of(
397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                mBridgeInflater.inflate(blockParser, parent, attachToRoot),
398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                false);
399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    } finally {
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        popParser();
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } catch (XmlPullParserException e) {
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    Bridge.getLog().error(LayoutLog.TAG_BROKEN,
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            "Failed to configure parser for " + xml, e, null /*data*/);
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // we'll return null below.
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } catch (FileNotFoundException e) {
407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // this shouldn't happen since we check above.
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } finally {
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mBridgeInflater.setResourceReference(null);
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        String.format("File %s is missing!", xml), null);
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "",
418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            resource.getName()), null);
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return Pair.of(null, false);
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @SuppressWarnings("deprecation")
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private ILayoutPullParser getParser(ResourceReference resource) {
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ILayoutPullParser parser;
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resource instanceof ResourceValue) {
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parser = mProjectCallback.getParser((ResourceValue) resource);
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parser = mProjectCallback.getParser(resource.getName());
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return parser;
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ------------ Context methods
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Resources getResources() {
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSystemResources;
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Theme getTheme() {
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mTheme;
445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ClassLoader getClassLoader() {
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return this.getClass().getClassLoader();
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getSystemService(String service) {
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (LAYOUT_INFLATER_SERVICE.equals(service)) {
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mBridgeInflater;
456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (TEXT_SERVICES_MANAGER_SERVICE.equals(service)) {
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // we need to return a valid service to avoid NPE
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return TextServicesManager.getInstance();
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (WINDOW_SERVICE.equals(service)) {
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mWindowManager;
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // needed by SearchView
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (INPUT_METHOD_SERVICE.equals(service)) {
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (POWER_SERVICE.equals(service)) {
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return new PowerManager(this, new BridgePowerManager(), new Handler());
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
476664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        if (DISPLAY_SERVICE.equals(service)) {
477664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta            return mDisplayManager;
478664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        }
479664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta
480e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        if (ACCESSIBILITY_SERVICE.equals(service)) {
481e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            return AccessibilityManager.getInstance(this);
482e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        }
483e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        throw new UnsupportedOperationException("Unsupported Service: " + service);
485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
4894a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(int[] attrs) {
490bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // No style is specified here, so create the typed array based on the default theme
491bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // and the styles already applied to it. A null value of style indicates that the default
492bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // theme should be used.
493bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        return createStyleBasedTypedArray(null, attrs);
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
4974a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(int resid, int[] attrs)
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throws Resources.NotFoundException {
499e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        StyleResourceValue style = null;
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // get the StyleResourceValue based on the resId;
501e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        if (resid != 0) {
502e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            style = getStyleByDynamicId(resid);
503e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta
504e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            if (style == null) {
505e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                // In some cases, style may not be a dynamic id, so we do a full search.
506e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                ResourceReference ref = resolveId(resid);
507e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                if (ref != null) {
508e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                    style = mRenderResources.getStyle(ref.getName(), ref.isFramework());
509e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                }
5108657baa06d2efe845cafef571bd9dce627cf5045Deepanshu Gupta            }
5118657baa06d2efe845cafef571bd9dce627cf5045Deepanshu Gupta
512e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            if (style == null) {
513e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                throw new Resources.NotFoundException();
514e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            }
515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mTypedArrayCache == null) {
5184a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta            mTypedArrayCache = new HashMap<int[], Map<Integer,BridgeTypedArray>>();
519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5204a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta            Map<Integer, BridgeTypedArray> map = new HashMap<Integer, BridgeTypedArray>();
521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mTypedArrayCache.put(attrs, map);
522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs);
524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            map.put(resid, ta);
525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return ta;
527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // get the 2nd map
5304a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta        Map<Integer, BridgeTypedArray> map = mTypedArrayCache.get(attrs);
531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (map == null) {
5324a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta            map = new HashMap<Integer, BridgeTypedArray>();
533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mTypedArrayCache.put(attrs, map);
534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // get the array from the 2nd map
5374a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta        BridgeTypedArray ta = map.get(resid);
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (ta == null) {
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ta = createStyleBasedTypedArray(style, attrs);
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            map.put(resid, ta);
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ta;
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
5484a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return obtainStyledAttributes(set, attrs, 0, 0);
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
5534a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int defStyleAttr, int defStyleRes) {
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Map<String, String> defaultPropMap = null;
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isPlatformFile = true;
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (set instanceof BridgeXmlBlockParser) {
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BridgeXmlBlockParser parser = null;
562282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parser = (BridgeXmlBlockParser)set;
563282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
564282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isPlatformFile = parser.isPlatformFile();
565282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
566282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Object key = parser.getViewCookie();
567282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (key != null) {
568282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                defaultPropMap = mDefaultPropMaps.get(key);
569282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (defaultPropMap == null) {
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    defaultPropMap = new HashMap<String, String>();
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mDefaultPropMaps.put(key, defaultPropMap);
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
573282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (set instanceof BridgeLayoutParamsMapAttributes) {
576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // this is only for temp layout params generated dynamically, so this is never
577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // platform content.
578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isPlatformFile = false;
579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (set != null) { // null parser is ok
580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // really this should not be happening since its instantiated in Bridge
581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    "Parser is not a BridgeXmlBlockParser!", null /*data*/);
583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Pair<String, Boolean>> attributeList = searchAttrs(attrs);
587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isPlatformFile);
590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // look for a custom style.
592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String customStyle = null;
593282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (set != null) {
594282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            customStyle = set.getAttributeValue(null /* namespace*/, "style");
595282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
596282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
597282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        StyleResourceValue customStyleValues = null;
598282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (customStyle != null) {
599282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ResourceValue item = mRenderResources.findResValue(customStyle,
600fba1dd24bf7b56071490ac62428f96d14f682244Deepanshu Gupta                    isPlatformFile /*forceFrameworkOnly*/);
601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // resolve it in case it links to something else
603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            item = mRenderResources.resolveResValue(item);
604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (item instanceof StyleResourceValue) {
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                customStyleValues = (StyleResourceValue)item;
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // resolve the defStyleAttr value into a IStyleResourceValue
611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        StyleResourceValue defStyleValues = null;
612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (defStyleAttr != 0) {
614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // get the name from the int.
615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr);
616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (defaultPropMap != null) {
618282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                String defStyleName = defStyleAttribute.getFirst();
619282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (defStyleAttribute.getSecond()) {
620282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    defStyleName = "android:" + defStyleName;
621282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
622282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                defaultPropMap.put("style", defStyleName);
623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // look for the style in the current theme, and its parent:
626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ResourceValue item = mRenderResources.findItemInTheme(defStyleAttribute.getFirst(),
627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    defStyleAttribute.getSecond());
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (item != null) {
630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // item is a reference to a style entry. Search for it.
6318dcfd4abe898bb2cd7a13edf77d41e4063180652Deepanshu Gupta                item = mRenderResources.findResValue(item.getValue(), item.isFramework());
632282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (item instanceof StyleResourceValue) {
634282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    defStyleValues = (StyleResourceValue)item;
635282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
637282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
638282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        String.format(
639282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                "Failed to find style '%s' in current theme",
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                defStyleAttribute.getFirst()),
641282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        null /*data*/);
642282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
643282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (defStyleRes != 0) {
644282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean isFrameworkRes = true;
645282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
646282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (value == null) {
647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                value = mProjectCallback.resolveResourceId(defStyleRes);
648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isFrameworkRes = false;
649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (value != null) {
6524f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                if ((value.getFirst() == ResourceType.STYLE)) {
6534f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                    // look for the style in all resources:
6544f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                    StyleResourceValue item = mRenderResources.getStyle(value.getSecond(),
655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            isFrameworkRes);
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (item != null) {
6574f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                        if (defaultPropMap != null) {
6584f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                            defaultPropMap.put("style", item.getName());
659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
6604f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta
6614f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                        defStyleValues = item;
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    } else {
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        Bridge.getLog().error(null,
664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                String.format(
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        "Style with id 0x%x (resolved to '%s') does not exist.",
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                        defStyleRes, value.getSecond()),
6674f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                                null);
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } else {
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    Bridge.getLog().error(null,
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            String.format(
6724f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                                    "Resource id 0x%x is not of type STYLE (instead %s)",
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    defStyleRes, value.getFirst().toString()),
6744f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                            null);
675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Bridge.getLog().error(null,
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        String.format(
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                "Failed to find style with id 0x%x in current theme",
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                defStyleRes),
6814f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                        null);
682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String appNamespace = mProjectCallback.getNamespace();
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (attributeList != null) {
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int index = 0 ; index < attributeList.size() ; index++) {
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Pair<String, Boolean> attribute = attributeList.get(index);
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (attribute == null) {
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                String attrName = attribute.getFirst();
6969fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                boolean frameworkAttr = attribute.getSecond();
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                String value = null;
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (set != null) {
699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    value = set.getAttributeValue(
700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            frameworkAttr ? BridgeConstants.NS_RESOURCES : appNamespace,
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    attrName);
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if this is an app attribute, and the first get fails, try with the
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // new res-auto namespace as well
7059fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                    if (!frameworkAttr && value == null) {
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName);
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // if there's no direct value for this attribute in the XML, we look for default
711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // values in the widget defStyle, and then in the theme.
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (value == null) {
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ResourceValue resValue = null;
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // look for the value in the custom style first (and its parent if needed)
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (customStyleValues != null) {
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInStyle(customStyleValues,
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                attrName, frameworkAttr);
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // then look for the value in the default Style (and its parent if needed)
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue == null && defStyleValues != null) {
723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInStyle(defStyleValues,
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                attrName, frameworkAttr);
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if the item is not present in the defStyle, we look in the main theme (and
728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // its parent themes)
729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue == null) {
730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if we found a value, we make sure this doesn't reference another value.
734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // So we resolve it.
735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue != null) {
736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        // put the first default value, before the resolution.
737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        if (defaultPropMap != null) {
738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            defaultPropMap.put(attrName, resValue.getValue());
739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.resolveResValue(resValue);
742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ta.bridgeSetValue(index, attrName, frameworkAttr, resValue);
745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } else {
746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // there is a value in the XML, but we need to resolve it in case it's
747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // referencing another resource or a theme value.
748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ta.bridgeSetValue(index, attrName, frameworkAttr,
749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            mRenderResources.resolveValue(null, attrName, value, isPlatformFile));
750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ta.sealArray();
755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ta;
757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Looper getMainLooper() {
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return Looper.myLooper();
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ------------- private new methods
766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the
769bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     * values found in the given style. If no style is specified, the default theme, along with the
770bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     * styles applied to it are used.
771bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     *
772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @see #obtainStyledAttributes(int, int[])
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
774bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta    private BridgeTypedArray createStyleBasedTypedArray(@Nullable StyleResourceValue style,
775bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta            int[] attrs) throws Resources.NotFoundException {
776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Pair<String, Boolean>> attributes = searchAttrs(attrs);
778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length,
780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                false);
781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // for each attribute, get its name so that we can search it in the style
783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int i = 0 ; i < attrs.length ; i++) {
784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Pair<String, Boolean> attribute = attributes.get(i);
785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (attribute != null) {
787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // look for the value in the given style
788bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                ResourceValue resValue;
789bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                if (style != null) {
790bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                    resValue = mRenderResources.findItemInStyle(style, attribute.getFirst(),
791bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                            attribute.getSecond());
792bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                } else {
793bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                    resValue = mRenderResources.findItemInTheme(attribute.getFirst(),
794bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                            attribute.getSecond());
795bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                }
796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (resValue != null) {
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // resolve it to make sure there are no references left.
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ta.bridgeSetValue(i, attribute.getFirst(), attribute.getSecond(),
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            mRenderResources.resolveResValue(resValue));
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
802282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
803282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
804282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ta.sealArray();
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ta;
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * The input int[] attrs is a list of attributes. The returns a list of information about
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * each attributes. The information is (name, isFramework)
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * <p/>
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param attrs An attribute array reference given to obtainStyledAttributes.
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return List of attribute information.
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private List<Pair<String, Boolean>> searchAttrs(int[] attrs) {
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Pair<String, Boolean>> results = new ArrayList<Pair<String, Boolean>>(attrs.length);
820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // for each attribute, get its name so that we can search it in the style
8229fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        for (int attr : attrs) {
8239fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attr);
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean isFramework = false;
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resolvedResource != null) {
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isFramework = true;
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
8289fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                resolvedResource = mProjectCallback.resolveResourceId(attr);
829282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resolvedResource != null) {
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                results.add(Pair.of(resolvedResource.getSecond(), isFramework));
833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                results.add(null);
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return results;
839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Searches for the attribute referenced by its internal id.
843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param attr An attribute reference given to obtainStyledAttributes such as defStyle.
845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return A (name, isFramework) pair describing the attribute if found. Returns null
846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *         if nothing is found.
847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Pair<String, Boolean> searchAttr(int attr) {
849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Pair<ResourceType, String> info = Bridge.resolveResourceId(attr);
850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (info != null) {
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return Pair.of(info.getSecond(), Boolean.TRUE);
852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        info = mProjectCallback.resolveResourceId(attr);
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (info != null) {
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return Pair.of(info.getSecond(), Boolean.FALSE);
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
860282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
861282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
862282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getDynamicIdByStyle(StyleResourceValue resValue) {
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mDynamicIdToStyleMap == null) {
864282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // create the maps.
865282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDynamicIdToStyleMap = new HashMap<Integer, StyleResourceValue>();
866282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mStyleToDynamicIdMap = new HashMap<StyleResourceValue, Integer>();
867282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // look for an existing id
870282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Integer id = mStyleToDynamicIdMap.get(resValue);
871282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
872282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (id == null) {
873282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // generate a new id
8749fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            id = ++mDynamicIdGenerator;
875282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
876282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // and add it to the maps.
877282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDynamicIdToStyleMap.put(id, resValue);
878282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mStyleToDynamicIdMap.put(resValue, id);
879282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
880282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
881282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return id;
882282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
883282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
884282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private StyleResourceValue getStyleByDynamicId(int i) {
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mDynamicIdToStyleMap != null) {
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mDynamicIdToStyleMap.get(i);
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) {
8939fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (getRenderResources().getFrameworkResource(resType, resName) != null) {
8949fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            // Bridge.getResourceId creates a new resource id if an existing one isn't found. So,
8959fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            // we check for the existence of the resource before calling it.
8969fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            return Bridge.getResourceId(resType, resName);
897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return defValue;
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getProjectResourceValue(ResourceType resType, String resName, int defValue) {
9039fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        // getResourceId creates a new resource id if an existing resource id isn't found. So, we
9049fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        // check for the existence of the resource before calling it.
9059fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (getRenderResources().getProjectResource(resType, resName) != null) {
9069fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            if (mProjectCallback != null) {
9079fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                Integer value = mProjectCallback.getResourceId(resType, resName);
9089fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                if (value != null) {
9099fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                    return value;
9109fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                }
911282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
912282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
913282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
914282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return defValue;
915282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
916282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
917282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //------------ NOT OVERRIDEN --------------------
918282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
919282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
920282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) {
921282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
922282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
923282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingOrSelfPermission(String arg0) {
927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
928282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
929282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
930282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingOrSelfUriPermission(Uri arg0, int arg1) {
933282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
934282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
937282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
938282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingPermission(String arg0) {
939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
940282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
942282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingUriPermission(Uri arg0, int arg1) {
945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
947282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
948282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
949282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
950282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkPermission(String arg0, int arg1, int arg2) {
951282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
952282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
953282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
954282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3) {
957282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
958282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
960282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
961282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
962282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkUriPermission(Uri arg0, String arg1, String arg2, int arg3,
963282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int arg4, int arg5) {
964282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void clearWallpaper() {
970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
971282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createPackageContext(String arg0, int arg1) {
976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createPackageContextAsUser(String arg0, int arg1, UserHandle user) {
982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
983282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
986282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
987282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createConfigurationContext(Configuration overrideConfiguration) {
988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
992282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createDisplayContext(Display display) {
994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String[] databaseList() {
1000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
10054f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    public Context createApplicationContext(ApplicationInfo application, int flags)
10064f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav            throws PackageManager.NameNotFoundException {
10074f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav        return null;
10084f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    }
10094f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav
10104f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    @Override
1011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean deleteDatabase(String arg0) {
1012282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean deleteFile(String arg0) {
1018282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingOrSelfPermission(String arg0, String arg1) {
1024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1029282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1,
1030282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg2) {
1031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingPermission(String arg0, String arg1) {
1037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1038282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) {
1043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforcePermission(String arg0, int arg1, int arg2, String arg3) {
1049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3,
1055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg4) {
1056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1057282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1058282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1059282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1060282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceUriPermission(Uri arg0, String arg1, String arg2,
1062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int arg3, int arg4, int arg5, String arg6) {
1063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1067282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1068282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String[] fileList() {
1069282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1070282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1071282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1072282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1073282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1074282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public AssetManager getAssets() {
1075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getCacheDir() {
1081282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1082282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1083282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1084282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1085282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
10864ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    public File getCodeCacheDir() {
10874ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey        // pass
10884ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey        return null;
10894ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    }
10904ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey
10914ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    @Override
1092282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getExternalCacheDir() {
1093282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1094282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1095282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1096282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1097282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1098282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ContentResolver getContentResolver() {
1099282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mContentResolver == null) {
1100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mContentResolver = new BridgeContentResolver(this);
1101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mContentResolver;
1103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getDatabasePath(String arg0) {
1107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getDir(String arg0, int arg1) {
1113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getFileStreamPath(String arg0) {
1119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getFilesDir() {
1125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
113065665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    public File getNoBackupFilesDir() {
113165665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate        // pass
113265665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate        return null;
113365665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    }
113465665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate
113565665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    @Override
1136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getExternalFilesDir(String type) {
1137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getPackageCodePath() {
1143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public PackageManager getPackageManager() {
1149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getPackageName() {
1155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getBasePackageName() {
1161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
11668732bd893ae507346dad068a33edcc4beb99faedKenny Root    public String getOpPackageName() {
11678732bd893ae507346dad068a33edcc4beb99faedKenny Root        // pass
11688732bd893ae507346dad068a33edcc4beb99faedKenny Root        return null;
11698732bd893ae507346dad068a33edcc4beb99faedKenny Root    }
11708732bd893ae507346dad068a33edcc4beb99faedKenny Root
11718732bd893ae507346dad068a33edcc4beb99faedKenny Root    @Override
1172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ApplicationInfo getApplicationInfo() {
1173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mApplicationInfo;
1174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getPackageResourcePath() {
1178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getSharedPrefsFile(String name) {
1184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SharedPreferences getSharedPreferences(String arg0, int arg1) {
1190dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        if (mSharedPreferences == null) {
1191dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta            mSharedPreferences = new BridgeSharedPreferences();
1192dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        }
1193dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        return mSharedPreferences;
1194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Drawable getWallpaper() {
1198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getWallpaperDesiredMinimumWidth() {
1204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
1205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getWallpaperDesiredMinimumHeight() {
1209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
1210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void grantUriPermission(String arg0, Uri arg1, int arg2) {
1214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public FileInputStream openFileInput(String arg0) throws FileNotFoundException {
1220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public FileOutputStream openFileOutput(String arg0, int arg1) throws FileNotFoundException {
1226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2) {
1232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1,
1238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            CursorFactory arg2, DatabaseErrorHandler arg3) {
1239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Drawable peekWallpaper() {
1245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1) {
1251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
1257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg2, Handler arg3) {
1258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5,
1264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            IntentFilter arg1, String arg2, Handler arg3) {
1265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void removeStickyBroadcast(Intent arg0) {
1271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void revokeUriPermission(Uri arg0, int arg1) {
1277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent arg0) {
1283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent arg0, String arg1) {
1289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1) {
1300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1,
1306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
1307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle arg6) {
1308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
1314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
1315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String initialData, Bundle initialExtras) {
1316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String receiverPermission) {
1327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int initialCode, String initialData, Bundle initialExtras) {
1334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
13383cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
13393cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
13403cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            Handler scheduler,
13413cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            int initialCode, String initialData, Bundle initialExtras) {
13423cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani        // pass
13433cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    }
13443cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani
13453cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    @Override
1346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyBroadcast(Intent arg0) {
1347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyOrderedBroadcast(Intent intent,
1353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData,
1354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski           Bundle initialExtras) {
1355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyOrderedBroadcastAsUser(Intent intent,
1365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            UserHandle user, BroadcastReceiver resultReceiver,
1366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Handler scheduler, int initialCode, String initialData,
1367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle initialExtras) {
1368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setTheme(int arg0) {
1378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setWallpaper(Bitmap arg0) throws IOException {
1384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1387282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1388282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setWallpaper(InputStream arg0) throws IOException {
1390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivity(Intent arg0) {
1396282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1397282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1398282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1399282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivity(Intent arg0, Bundle arg1) {
1401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startIntentSender(IntentSender intent,
1406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throws IntentSender.SendIntentException {
1408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startIntentSender(IntentSender intent,
1413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
1414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle options) throws IntentSender.SendIntentException {
1415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean startInstrumentation(ComponentName arg0, String arg1,
1420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle arg2) {
1421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ComponentName startService(Intent arg0) {
1427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean stopService(Intent arg0) {
1433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ComponentName startServiceAsUser(Intent arg0, UserHandle arg1) {
1439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean stopServiceAsUser(Intent arg0, UserHandle arg1) {
1445282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void unbindService(ServiceConnection arg0) {
1451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1456282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void unregisterReceiver(BroadcastReceiver arg0) {
1457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context getApplicationContext() {
1463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return this;
1464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivities(Intent[] arg0) {
1468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivities(Intent[] arg0, Bundle arg1) {
1474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean isRestricted() {
1480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getObbDir() {
1485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "OBB not supported", null);
1486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public DisplayAdjustments getDisplayAdjustments(int displayId) {
1491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getUserId() {
1497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0; // not used
1498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getExternalFilesDirs(String type) {
1502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getObbDirs() {
1508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getExternalCacheDirs() {
1514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
15172ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey
15182ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    @Override
15192ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    public File[] getExternalMediaDirs() {
15202ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey        // pass
15212ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey        return new File[0];
15222ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    }
1523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1524