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
19b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Guptaimport com.android.SdkConstants;
20d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Guptaimport com.android.ide.common.rendering.api.AssetRepository;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ILayoutPullParser;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog;
2337dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderResources;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceValue;
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.StyleResourceValue;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.Bridge;
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.BridgeConstants;
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.android.view.WindowManagerImpl;
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.ParserFactory;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.Stack;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.resources.ResourceType;
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.util.Pair;
35eaf1853b98d7bf2c3d693ad702050968ef0a404cDeepanshu Guptaimport com.android.util.PropertiesMap;
36eaf1853b98d7bf2c3d693ad702050968ef0a404cDeepanshu Guptaimport com.android.util.PropertiesMap.Property;
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParser;
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport org.xmlpull.v1.XmlPullParserException;
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
414dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsenimport android.annotation.NonNull;
42eb26f5cecd5366b29b3cb746a7edaf3769f40480Deepanshu Guptaimport android.annotation.Nullable;
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.BroadcastReceiver;
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ComponentName;
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ContentResolver;
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.Context;
47ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Guptaimport android.content.ContextWrapper;
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.Intent;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.IntentFilter;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.IntentSender;
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.ServiceConnection;
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.SharedPreferences;
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.pm.ApplicationInfo;
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.pm.PackageManager;
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.AssetManager;
56d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Guptaimport android.content.res.BridgeAssetManager;
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.BridgeTypedArray;
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Configuration;
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources;
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.content.res.Resources.Theme;
61e05f1c4684fcc7e3f6a429ff01b210aa19f75304Deepanshu Guptaimport android.content.res.Resources_Delegate;
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.DatabaseErrorHandler;
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.sqlite.SQLiteDatabase;
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.database.sqlite.SQLiteDatabase.CursorFactory;
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.Bitmap;
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.drawable.Drawable;
67664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Guptaimport android.hardware.display.DisplayManager;
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.net.Uri;
69b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Guptaimport android.os.Build.VERSION_CODES;
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Bundle;
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Handler;
72b9b8aef94e5bad8f5f03f686a2d3d8a09c045a7bDeepanshu Guptaimport android.os.IBinder;
73d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Guptaimport android.os.IInterface;
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.Looper;
75d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Guptaimport android.os.Parcel;
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.PowerManager;
77d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Guptaimport android.os.RemoteException;
78e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitzimport android.os.ResultReceiver;
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.os.UserHandle;
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.AttributeSet;
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.DisplayMetrics;
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.util.TypedValue;
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.BridgeInflater;
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.Display;
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.DisplayAdjustments;
866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.LayoutInflater;
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup;
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.WindowManager;
90e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Guptaimport android.view.accessibility.AccessibilityManager;
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.textservice.TextServicesManager;
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.File;
94d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Guptaimport java.io.FileDescriptor;
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream;
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileNotFoundException;
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileOutputStream;
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.IOException;
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.InputStream;
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.ArrayList;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.HashMap;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.IdentityHashMap;
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List;
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Map;
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1062bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Guptaimport static com.android.layoutlib.bridge.android.RenderParamsFlags.FLAG_KEY_APPLICATION_PACKAGE;
1072bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Custom implementation of Context/Activity to handle non compiled resources.
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
11185d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta@SuppressWarnings("deprecation")  // For use of Pair.
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic final class BridgeContext extends Context {
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1140ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    /** The map adds cookies to each view so that IDE can link xml tags to views. */
11591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private final HashMap<View, Object> mViewKeyMap = new HashMap<>();
1160ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    /**
1170ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * In some cases, when inflating an xml, some objects are created. Then later, the objects are
1180ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * converted to views. This map stores the mapping from objects to cookies which can then be
1190ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     * used to populate the mViewKeyMap.
1200ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta     */
12191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private final HashMap<Object, Object> mViewKeyHelpMap = new HashMap<>();
122d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Gupta    private final BridgeAssetManager mAssets;
1230ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    private Resources mSystemResources;
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Object mProjectKey;
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final DisplayMetrics mMetrics;
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final RenderResources mRenderResources;
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final Configuration mConfig;
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final ApplicationInfo mApplicationInfo;
12937dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta    private final LayoutlibCallback mLayoutlibCallback;
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final WindowManager mWindowManager;
131664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta    private final DisplayManager mDisplayManager;
132d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    private final HashMap<View, Integer> mScrollYPos = new HashMap<>();
133d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    private final HashMap<View, Integer> mScrollXPos = new HashMap<>();
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Resources.Theme mTheme;
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
13791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private final Map<Object, PropertiesMap> mDefaultPropMaps = new IdentityHashMap<>();
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // maps for dynamically generated id representing style objects (StyleResourceValue)
140d758e042ce08c46712db3db2d63fc84795028dfeDeepanshu Gupta    @Nullable
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Map<Integer, StyleResourceValue> mDynamicIdToStyleMap;
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap;
143bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta    private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
145eb26f5cecd5366b29b3cb746a7edaf3769f40480Deepanshu Gupta    // cache for TypedArray generated from StyleResourceValue object
14691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private TypedArrayCache mTypedArrayCache;
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private BridgeInflater mBridgeInflater;
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private BridgeContentResolver mContentResolver;
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
15191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<>();
152dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta    private SharedPreferences mSharedPreferences;
153f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta    private ClassLoader mClassLoader;
154d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta    private IBinder mBinder;
155490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta    private PackageManager mPackageManager;
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
157b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta    /**
158b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     * Some applications that target both pre API 17 and post API 17, set the newer attrs to
159b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     * reference the older ones. For example, android:paddingStart will resolve to
160b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     * android:paddingLeft. This way the apps need to only define paddingLeft at any other place.
161b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     * This a map from value to attribute name. Warning for missing references shouldn't be logged
162b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     * if value and attr name pair is the same as an entry in this map.
163b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta     */
16491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private static Map<String, String> RTL_ATTRS = new HashMap<>(10);
165b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta
166b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta    static {
167b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/paddingLeft", "paddingStart");
168b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/paddingRight", "paddingEnd");
169b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_marginLeft", "layout_marginStart");
170b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_marginRight", "layout_marginEnd");
171af0f3bda17ee3de4ad3560c9a675527b20e2af5fSiva Velusamy        RTL_ATTRS.put("?android:attr/layout_toLeftOf", "layout_toStartOf");
172af0f3bda17ee3de4ad3560c9a675527b20e2af5fSiva Velusamy        RTL_ATTRS.put("?android:attr/layout_toRightOf", "layout_toEndOf");
173b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_alignParentLeft", "layout_alignParentStart");
174b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_alignParentRight", "layout_alignParentEnd");
175b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/drawableLeft", "drawableStart");
176b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta        RTL_ATTRS.put("?android:attr/drawableRight", "drawableEnd");
177b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta    }
178b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta
179f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta    /**
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param metrics the {@link DisplayMetrics}.
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param renderResources the configured resources (both framework and projects) for this
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * render.
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param config the Configuration object for this render.
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param targetSdkVersion the targetSdkVersion of the application.
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeContext(Object projectKey, DisplayMetrics metrics,
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            RenderResources renderResources,
189d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Gupta            AssetRepository assets,
19037dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            LayoutlibCallback layoutlibCallback,
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Configuration config,
1928930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            int targetSdkVersion,
1938930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            boolean hasRtlSupport) {
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mProjectKey = projectKey;
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mMetrics = metrics;
19637dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        mLayoutlibCallback = layoutlibCallback;
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mRenderResources = renderResources;
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mConfig = config;
2002ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta        AssetManager systemAssetManager = AssetManager.getSystem();
2012ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta        if (systemAssetManager instanceof BridgeAssetManager) {
2022ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta            mAssets = (BridgeAssetManager) systemAssetManager;
2032ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta        } else {
2042ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta            throw new AssertionError("Creating BridgeContext without initializing Bridge");
2052ea852541fd7c7af14b6919c5c2f57584b896d2bDeepanshu Gupta        }
206d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Gupta        mAssets.setAssetRepository(assets);
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mApplicationInfo = new ApplicationInfo();
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mApplicationInfo.targetSdkVersion = targetSdkVersion;
2108930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta        if (hasRtlSupport) {
2118930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta            mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL;
2128930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta        }
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mWindowManager = new WindowManagerImpl(mMetrics);
215664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        mDisplayManager = new DisplayManager(this);
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Initializes the {@link Resources} singleton to be linked to this {@link Context}, its
22037dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta     * {@link DisplayMetrics}, {@link Configuration}, and {@link LayoutlibCallback}.
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @see #disposeResources()
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void initResources() {
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        AssetManager assetManager = AssetManager.getSystem();
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
227e05f1c4684fcc7e3f6a429ff01b210aa19f75304Deepanshu Gupta        mSystemResources = Resources_Delegate.initSystem(
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                this,
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                assetManager,
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mMetrics,
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mConfig,
23237dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta                mLayoutlibCallback);
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mTheme = mSystemResources.newTheme();
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Disposes the {@link Resources} singleton.
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void disposeResources() {
240e05f1c4684fcc7e3f6a429ff01b210aa19f75304Deepanshu Gupta        Resources_Delegate.disposeSystem();
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setBridgeInflater(BridgeInflater inflater) {
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mBridgeInflater = inflater;
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void addViewKey(View view, Object viewKey) {
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mViewKeyMap.put(view, viewKey);
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getViewKey(View view) {
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mViewKeyMap.get(view);
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
2550ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    public void addCookie(Object o, Object cookie) {
2560ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta        mViewKeyHelpMap.put(o, cookie);
2570ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    }
2580ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta
2590ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    public Object getCookie(Object o) {
2600ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta        return mViewKeyHelpMap.get(o);
2610ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta    }
2620ff4568ca07c16f2ad4c61872995200115292ecfDeepanshu Gupta
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getProjectKey() {
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mProjectKey;
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public DisplayMetrics getMetrics() {
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mMetrics;
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27137dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta    public LayoutlibCallback getLayoutlibCallback() {
27237dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        return mLayoutlibCallback;
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public RenderResources getRenderResources() {
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mRenderResources;
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
279eaf1853b98d7bf2c3d693ad702050968ef0a404cDeepanshu Gupta    public Map<Object, PropertiesMap> getDefaultProperties() {
280eaf1853b98d7bf2c3d693ad702050968ef0a404cDeepanshu Gupta        return mDefaultPropMaps;
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Configuration getConfiguration() {
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mConfig;
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Adds a parser to the stack.
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param parser the parser to add.
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void pushParser(BridgeXmlBlockParser parser) {
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (ParserFactory.LOG_PARSER) {
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.out.println("PUSH " + parser.getParser().toString());
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mParserStack.push(parser);
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Removes the parser at the top of the stack
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void popParser() {
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BridgeXmlBlockParser parser = mParserStack.pop();
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (ParserFactory.LOG_PARSER) {
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.out.println("POPD " + parser.getParser().toString());
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns the current parser at the top the of the stack.
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return a parser or null.
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeXmlBlockParser getCurrentParser() {
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParserStack.peek();
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns the previous parser.
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return a parser or null if there isn't any previous parser
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BridgeXmlBlockParser getPreviousParser() {
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mParserStack.size() < 2) {
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mParserStack.get(mParserStack.size() - 2);
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    public boolean resolveThemeAttribute(int resId, TypedValue outValue, boolean resolveRefs) {
32891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resId);
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isFrameworkRes = true;
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo == null) {
33191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            resourceInfo = mLayoutlibCallback.resolveResourceId(resId);
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isFrameworkRes = false;
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo == null) {
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return false;
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResourceValue value = mRenderResources.findItemInTheme(resourceInfo.getSecond(),
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isFrameworkRes);
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resolveRefs) {
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            value = mRenderResources.resolveResValue(value);
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
345b6864ac6cde109be320e18188209eb8420c585f1Deepanshu Gupta        if (value == null) {
346b6864ac6cde109be320e18188209eb8420c585f1Deepanshu Gupta            // unable to find the attribute.
347b6864ac6cde109be320e18188209eb8420c585f1Deepanshu Gupta            return false;
348b6864ac6cde109be320e18188209eb8420c585f1Deepanshu Gupta        }
349b6864ac6cde109be320e18188209eb8420c585f1Deepanshu Gupta
350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // check if this is a style resource
351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (value instanceof StyleResourceValue) {
352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // get the id that will represent this style.
3532bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta            outValue.resourceId = getDynamicIdByStyle((StyleResourceValue) value);
354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return true;
355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int a;
358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // if this is a framework value.
359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (value.isFramework()) {
360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // look for idName in the android R classes.
361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // use 0 a default res value as it's not a valid id value.
362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            a = getFrameworkResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // look for idName in the project R class.
365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // use 0 a default res value as it's not a valid id value.
366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            a = getProjectResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (a != 0) {
370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            outValue.resourceId = a;
371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return true;
372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
378282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ResourceReference resolveId(int id) {
379282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // first get the String related to this id in the framework
380282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
381282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
382282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resourceInfo != null) {
383282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return new ResourceReference(resourceInfo.getSecond(), true);
384282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
385282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
386282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // didn't find a match in the framework? look in the project.
38737dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        if (mLayoutlibCallback != null) {
38837dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            resourceInfo = mLayoutlibCallback.resolveResourceId(id);
389282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resourceInfo != null) {
391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                return new ResourceReference(resourceInfo.getSecond(), false);
392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
395bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // The base value for R.style is 0x01030000 and the custom style is 0x02030000.
396bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        // So, if the second byte is 03, it's probably a style.
397bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        if ((id >> 16 & 0xFF) == 0x03) {
398bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta            return getStyleByDynamicId(id);
399bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta        }
400282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
401282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent,
404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean attachToRoot, boolean skipCallbackParser) {
405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isPlatformLayout = resource.isFramework();
406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
4079fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (!isPlatformLayout && !skipCallbackParser) {
408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // check if the project callback can provide us with a custom parser.
409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ILayoutPullParser parser = getParser(resource);
410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (parser != null) {
412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        this, resource.isFramework());
414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                try {
415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    pushParser(blockParser);
416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    return Pair.of(
417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            mBridgeInflater.inflate(blockParser, parent, attachToRoot),
41891fa3ba4cc8acd4caeeb88f90ce39198b5fea414Diego Perez                            Boolean.TRUE);
419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } finally {
420282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    popParser();
421282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
422282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
423282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
424282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
425282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ResourceValue resValue;
426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resource instanceof ResourceValue) {
427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            resValue = (ResourceValue) resource;
428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (isPlatformLayout) {
430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                resValue = mRenderResources.getFrameworkResource(ResourceType.LAYOUT,
431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resource.getName());
432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                resValue = mRenderResources.getProjectResource(ResourceType.LAYOUT,
434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resource.getName());
435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
438282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resValue != null) {
439282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
440282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            File xml = new File(resValue.getValue());
441282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (xml.isFile()) {
442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // we need to create a pull parser around the layout XML file, and then
443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // give that to our XmlBlockParser
444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                try {
445e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    XmlPullParser parser = ParserFactory.create(xml, true);
446282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
447282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // set the resource ref to have correct view cookies
448282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mBridgeInflater.setResourceReference(resource);
449282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
450282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
451282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            this, resource.isFramework());
452282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    try {
453282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        pushParser(blockParser);
454282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        return Pair.of(
455282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                mBridgeInflater.inflate(blockParser, parent, attachToRoot),
45691fa3ba4cc8acd4caeeb88f90ce39198b5fea414Diego Perez                                Boolean.FALSE);
457282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    } finally {
458282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        popParser();
459282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
460282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } catch (XmlPullParserException e) {
461282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    Bridge.getLog().error(LayoutLog.TAG_BROKEN,
462282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            "Failed to configure parser for " + xml, e, null /*data*/);
463282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // we'll return null below.
464282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } catch (FileNotFoundException e) {
465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // this shouldn't happen since we check above.
466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } finally {
467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mBridgeInflater.setResourceReference(null);
468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        String.format("File %s is missing!", xml), null);
472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "",
476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            resource.getName()), null);
477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
47991fa3ba4cc8acd4caeeb88f90ce39198b5fea414Diego Perez        return Pair.of(null, Boolean.FALSE);
480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @SuppressWarnings("deprecation")
483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private ILayoutPullParser getParser(ResourceReference resource) {
484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ILayoutPullParser parser;
485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (resource instanceof ResourceValue) {
48637dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            parser = mLayoutlibCallback.getParser((ResourceValue) resource);
487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
48837dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            parser = mLayoutlibCallback.getParser(resource.getName());
489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return parser;
491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ------------ Context methods
494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Resources getResources() {
497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSystemResources;
498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Theme getTheme() {
502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mTheme;
503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ClassLoader getClassLoader() {
5076330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // The documentation for this method states that it should return a class loader one can
5086330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // use to retrieve classes in this package. However, when called by LayoutInflater, we do
5096330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // not want the class loader to return app's custom views.
5106330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // This is so that the IDE can instantiate the custom views and also generate proper error
5116330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // messages in case of failure. This also enables the IDE to fallback to MockView in case
5126330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // there's an exception thrown when trying to inflate the custom view.
5136330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // To work around this issue, LayoutInflater is modified via LayoutLib Create tool to
5146330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // replace invocations of this method to a new method: getFrameworkClassLoader(). Also,
5156330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // the method is injected into Context. The implementation of getFrameworkClassLoader() is:
5166330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // "return getClass().getClassLoader();". This means that when LayoutInflater asks for
5176330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // the context ClassLoader, it gets only LayoutLib's ClassLoader which doesn't have
5186330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // access to the apps's custom views.
5196330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // This method can now return the right ClassLoader, which CustomViews can use to do the
5206330971ed293a2777bbdab09288f90ea4b2d0255Deepanshu Gupta        // right thing.
521f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta        if (mClassLoader == null) {
522f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta            mClassLoader = new ClassLoader(getClass().getClassLoader()) {
523f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                @Override
524f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                protected Class<?> findClass(String name) throws ClassNotFoundException {
525f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                    for (String prefix : BridgeInflater.getClassPrefixList()) {
526f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                        if (name.startsWith(prefix)) {
527f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                            // These are framework classes and should not be loaded from the app.
528f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                            throw new ClassNotFoundException(name + " not found");
529f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                        }
530f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                    }
531f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                    return BridgeContext.this.mLayoutlibCallback.findClass(name);
532f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta                }
533f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta            };
534f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta        }
535f8ea750455eec81e4e6d877b3e18e29a86d4ec95Deepanshu Gupta        return mClassLoader;
536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Object getSystemService(String service) {
540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (LAYOUT_INFLATER_SERVICE.equals(service)) {
541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mBridgeInflater;
542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (TEXT_SERVICES_MANAGER_SERVICE.equals(service)) {
545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // we need to return a valid service to avoid NPE
546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return TextServicesManager.getInstance();
547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (WINDOW_SERVICE.equals(service)) {
550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mWindowManager;
551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // needed by SearchView
554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (INPUT_METHOD_SERVICE.equals(service)) {
555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (POWER_SERVICE.equals(service)) {
559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return new PowerManager(this, new BridgePowerManager(), new Handler());
560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
562664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        if (DISPLAY_SERVICE.equals(service)) {
563664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta            return mDisplayManager;
564664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta        }
565664d6f1fe4d6dfa742b3e98051f924dbc190f8caDeepanshu Gupta
566e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        if (ACCESSIBILITY_SERVICE.equals(service)) {
567e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            return AccessibilityManager.getInstance(this);
568e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        }
569e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta
570282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        throw new UnsupportedOperationException("Unsupported Service: " + service);
571282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
572282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    @Override
5746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    public String getSystemServiceName(Class<?> serviceClass) {
5756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(LayoutInflater.class)) {
5766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return LAYOUT_INFLATER_SERVICE;
5776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(TextServicesManager.class)) {
5806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return TEXT_SERVICES_MANAGER_SERVICE;
5816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(WindowManager.class)) {
5846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return WINDOW_SERVICE;
5856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(PowerManager.class)) {
5886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return POWER_SERVICE;
5896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(DisplayManager.class)) {
5926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return DISPLAY_SERVICE;
5936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        if (serviceClass.equals(AccessibilityManager.class)) {
5966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            return ACCESSIBILITY_SERVICE;
5976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
5986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        throw new UnsupportedOperationException("Unsupported Service: " + serviceClass);
6006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
6034a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(int[] attrs) {
60491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        return obtainStyledAttributes(0, attrs);
605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
60891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(int resId, int[] attrs)
609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throws Resources.NotFoundException {
610e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta        StyleResourceValue style = null;
611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // get the StyleResourceValue based on the resId;
61291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        if (resId != 0) {
61391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            style = getStyleByDynamicId(resId);
614e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta
615e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            if (style == null) {
616e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                // In some cases, style may not be a dynamic id, so we do a full search.
61791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                ResourceReference ref = resolveId(resId);
618e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                if (ref != null) {
619e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                    style = mRenderResources.getStyle(ref.getName(), ref.isFramework());
620e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                }
6218657baa06d2efe845cafef571bd9dce627cf5045Deepanshu Gupta            }
6228657baa06d2efe845cafef571bd9dce627cf5045Deepanshu Gupta
623e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            if (style == null) {
624e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta                throw new Resources.NotFoundException();
625e64a5bd2fb54d84d6fd2119ef831df1eba4185ffDeepanshu Gupta            }
626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mTypedArrayCache == null) {
62991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            mTypedArrayCache = new TypedArrayCache();
630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
631282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
632eb26f5cecd5366b29b3cb746a7edaf3769f40480Deepanshu Gupta        List<StyleResourceValue> currentThemes = mRenderResources.getAllThemes();
633282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
63491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        Pair<BridgeTypedArray, PropertiesMap> typeArrayAndPropertiesPair =
63591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                mTypedArrayCache.get(attrs, currentThemes, resId);
636282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
63791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        if (typeArrayAndPropertiesPair == null) {
63891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            typeArrayAndPropertiesPair = createStyleBasedTypedArray(style, attrs);
63991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            mTypedArrayCache.put(attrs, currentThemes, resId, typeArrayAndPropertiesPair);
640282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
64191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        // Add value to defaultPropsMap if needed
64291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        if (typeArrayAndPropertiesPair.getSecond() != null) {
6438cdf61a02e4652d53560c9758b8b15e76c50bfd7Diego Perez            BridgeXmlBlockParser parser = getCurrentParser();
6448cdf61a02e4652d53560c9758b8b15e76c50bfd7Diego Perez            Object key = parser != null ? parser.getViewCookie() : null;
64591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            if (key != null) {
64691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                PropertiesMap defaultPropMap = mDefaultPropMaps.get(key);
64791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                if (defaultPropMap == null) {
64891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    defaultPropMap = typeArrayAndPropertiesPair.getSecond();
64991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    mDefaultPropMaps.put(key, defaultPropMap);
65091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                } else {
65191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    defaultPropMap.putAll(typeArrayAndPropertiesPair.getSecond());
65291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                }
65391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            }
65491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        }
65591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        return typeArrayAndPropertiesPair.getFirst();
656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
6594a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public final BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return obtainStyledAttributes(set, attrs, 0, 0);
661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
6644a605c6fa0027ee116beb29fbc9625721f0441f0Deepanshu Gupta    public BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
665282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int defStyleAttr, int defStyleRes) {
666282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
66791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        PropertiesMap defaultPropMap = null;
668282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        boolean isPlatformFile = true;
669282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (set instanceof BridgeXmlBlockParser) {
67285d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta            BridgeXmlBlockParser parser;
673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            parser = (BridgeXmlBlockParser)set;
674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isPlatformFile = parser.isPlatformFile();
676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Object key = parser.getViewCookie();
678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (key != null) {
679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                defaultPropMap = mDefaultPropMaps.get(key);
680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (defaultPropMap == null) {
68191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    defaultPropMap = new PropertiesMap();
682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    mDefaultPropMaps.put(key, defaultPropMap);
683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (set instanceof BridgeLayoutParamsMapAttributes) {
687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // this is only for temp layout params generated dynamically, so this is never
688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // platform content.
689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            isPlatformFile = false;
690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (set != null) { // null parser is ok
691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // really this should not be happening since its instantiated in Bridge
692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
69385d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    "Parser is not a BridgeXmlBlockParser!", null);
694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return null;
695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Pair<String, Boolean>> attributeList = searchAttrs(attrs);
698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
699e05f1c4684fcc7e3f6a429ff01b210aa19f75304Deepanshu Gupta        BridgeTypedArray ta =
700e05f1c4684fcc7e3f6a429ff01b210aa19f75304Deepanshu Gupta                Resources_Delegate.newTypeArray(mSystemResources, attrs.length, isPlatformFile);
701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // look for a custom style.
703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String customStyle = null;
704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (set != null) {
70585d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta            customStyle = set.getAttributeValue(null, "style");
706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        StyleResourceValue customStyleValues = null;
709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (customStyle != null) {
710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ResourceValue item = mRenderResources.findResValue(customStyle,
711fba1dd24bf7b56071490ac62428f96d14f682244Deepanshu Gupta                    isPlatformFile /*forceFrameworkOnly*/);
712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // resolve it in case it links to something else
714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            item = mRenderResources.resolveResValue(item);
715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (item instanceof StyleResourceValue) {
717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                customStyleValues = (StyleResourceValue)item;
718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // resolve the defStyleAttr value into a IStyleResourceValue
722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        StyleResourceValue defStyleValues = null;
723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (defStyleAttr != 0) {
725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // get the name from the int.
726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr);
727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
72885d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta            if (defStyleAttribute == null) {
72985d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                // This should be rare. Happens trying to map R.style.foo to @style/foo fails.
73085d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                // This will happen if the user explicitly used a non existing int value for
73185d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                // defStyleAttr or there's something wrong with the project structure/build.
73285d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE,
73385d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                        "Failed to find the style corresponding to the id " + defStyleAttr, null);
73485d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta            } else {
73579c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                String defStyleName = defStyleAttribute.getFirst();
736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73785d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                // look for the style in the current theme, and its parent:
73879c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                ResourceValue item = mRenderResources.findItemInTheme(defStyleName,
73985d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                        defStyleAttribute.getSecond());
740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
74185d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                if (item != null) {
74285d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    // item is a reference to a style entry. Search for it.
74385d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    item = mRenderResources.findResValue(item.getValue(), item.isFramework());
7445d1eaf4a197130f561b16c4ed083cf016b20ab92Deepanshu Gupta                    item = mRenderResources.resolveResValue(item);
74585d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    if (item instanceof StyleResourceValue) {
74685d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                        defStyleValues = (StyleResourceValue) item;
74785d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    }
74879c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                    if (defaultPropMap != null) {
74979c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                        if (defStyleAttribute.getSecond()) {
75079c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                            defStyleName = "android:" + defStyleName;
75179c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                        }
75279c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                        defaultPropMap.put("style", new Property(defStyleName, item.getValue()));
75379c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                    }
75485d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                } else {
75585d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                    Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
75685d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                            String.format(
75785d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                                    "Failed to find style '%s' in current theme",
75885d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                                    defStyleAttribute.getFirst()),
75985d72c4535003af3b9df77bd6eaa2b33e8a7cba2Deepanshu Gupta                            null);
760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else if (defStyleRes != 0) {
763d758e042ce08c46712db3db2d63fc84795028dfeDeepanshu Gupta            StyleResourceValue item = getStyleByDynamicId(defStyleRes);
764d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta            if (item != null) {
765d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                defStyleValues = item;
766d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta            } else {
767d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                boolean isFrameworkRes = true;
768d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
769d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                if (value == null) {
770d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    value = mLayoutlibCallback.resolveResourceId(defStyleRes);
771d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    isFrameworkRes = false;
772d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
774d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                if (value != null) {
775d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    if ((value.getFirst() == ResourceType.STYLE)) {
776d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        // look for the style in all resources:
777d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        item = mRenderResources.getStyle(value.getSecond(), isFrameworkRes);
778d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        if (item != null) {
779d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                            if (defaultPropMap != null) {
78079c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                                String name = item.getName();
78179c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                                defaultPropMap.put("style", new Property(name, name));
782d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                            }
783d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
784d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                            defStyleValues = item;
785d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        } else {
786d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                            Bridge.getLog().error(null,
787d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                    String.format(
788d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                            "Style with id 0x%x (resolved to '%s') does not exist.",
789d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                            defStyleRes, value.getSecond()),
790d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                    null);
791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    } else {
793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        Bridge.getLog().error(null,
794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                String.format(
795d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                        "Resource id 0x%x is not of type STYLE (instead %s)",
796d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                        defStyleRes, value.getFirst().toString()),
7974f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                                null);
798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } else {
800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    Bridge.getLog().error(null,
801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            String.format(
802d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                    "Failed to find style with id 0x%x in current theme",
803d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                                    defStyleRes),
8044f8ce228195be123eeb9b5f066a6abc92b8d923aDeepanshu Gupta                            null);
805282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
806282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
807282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
80937dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        String appNamespace = mLayoutlibCallback.getNamespace();
810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (attributeList != null) {
812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (int index = 0 ; index < attributeList.size() ; index++) {
813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                Pair<String, Boolean> attribute = attributeList.get(index);
814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (attribute == null) {
816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    continue;
817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                String attrName = attribute.getFirst();
8209fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                boolean frameworkAttr = attribute.getSecond();
821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                String value = null;
822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (set != null) {
823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    value = set.getAttributeValue(
824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            frameworkAttr ? BridgeConstants.NS_RESOURCES : appNamespace,
825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                    attrName);
826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if this is an app attribute, and the first get fails, try with the
828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // new res-auto namespace as well
8299fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                    if (!frameworkAttr && value == null) {
830282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName);
831282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
832282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
833282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
834282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // if there's no direct value for this attribute in the XML, we look for default
835282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // values in the widget defStyle, and then in the theme.
836282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (value == null) {
837282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ResourceValue resValue = null;
838282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
839282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // look for the value in the custom style first (and its parent if needed)
840282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (customStyleValues != null) {
841282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInStyle(customStyleValues,
842282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                attrName, frameworkAttr);
843282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
844282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
845282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // then look for the value in the default Style (and its parent if needed)
846282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue == null && defStyleValues != null) {
847282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInStyle(defStyleValues,
848282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                attrName, frameworkAttr);
849282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
850282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
851282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if the item is not present in the defStyle, we look in the main theme (and
852282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // its parent themes)
853282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue == null) {
854282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
855282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
856282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
857282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // if we found a value, we make sure this doesn't reference another value.
858282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // So we resolve it.
859282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (resValue != null) {
86079c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                        String preResolve = resValue.getValue();
86179c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                        resValue = mRenderResources.resolveResValue(resValue);
86279c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta
863282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        if (defaultPropMap != null) {
864a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                            defaultPropMap.put(
865a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                                    frameworkAttr ? SdkConstants.PREFIX_ANDROID + attrName :
866a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                                            attrName,
86779c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                                    new Property(preResolve, resValue.getValue()));
868282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        }
869282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
870b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                        // If the value is a reference to another theme attribute that doesn't
871b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                        // exist, we should log a warning and omit it.
872b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                        String val = resValue.getValue();
873b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                        if (val != null && val.startsWith(SdkConstants.PREFIX_THEME_REF)) {
874b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                            if (!attrName.equals(RTL_ATTRS.get(val)) ||
875b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                    getApplicationInfo().targetSdkVersion <
876b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                            VERSION_CODES.JELLY_BEAN_MR1) {
877b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                // Only log a warning if the referenced value isn't one of the RTL
878b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                // attributes, or the app targets old API.
879b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
880b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                        String.format("Failed to find '%s' in current theme.", val),
881b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                                        val);
882b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                            }
883b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                            resValue = null;
884b3e872be9e634c8d1f34d07778ea753880bbf2d9Deepanshu Gupta                        }
885282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    }
886282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
887282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ta.bridgeSetValue(index, attrName, frameworkAttr, resValue);
888282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } else {
889282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // there is a value in the XML, but we need to resolve it in case it's
890282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // referencing another resource or a theme value.
891282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    ta.bridgeSetValue(index, attrName, frameworkAttr,
892282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            mRenderResources.resolveValue(null, attrName, value, isPlatformFile));
893282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
894282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
895282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
896282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
897282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ta.sealArray();
898282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
899282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return ta;
900282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
901282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
902282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
903282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Looper getMainLooper() {
904282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return Looper.myLooper();
905282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
906282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
907282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
9082bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta    @Override
9092bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta    public String getPackageName() {
9102bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta        if (mApplicationInfo.packageName == null) {
9112bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta            mApplicationInfo.packageName = mLayoutlibCallback.getFlag(FLAG_KEY_APPLICATION_PACKAGE);
9122bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta        }
9132bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta        return mApplicationInfo.packageName;
9142bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta    }
9152bc2daa74eef01135f717eadfab87538a9bef29fDeepanshu Gupta
916490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta    @Override
917490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta    public PackageManager getPackageManager() {
918490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta        if (mPackageManager == null) {
919490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta            mPackageManager = new BridgePackageManager();
920490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta        }
921490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta        return mPackageManager;
922490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta    }
923490dd90c707de8426a068a90d74ec83c9c11fc83Deepanshu Gupta
924282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    // ------------- private new methods
925282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
926282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
927282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the
928bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     * values found in the given style. If no style is specified, the default theme, along with the
929bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     * styles applied to it are used.
930bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta     *
931282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @see #obtainStyledAttributes(int, int[])
932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
93391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private Pair<BridgeTypedArray, PropertiesMap> createStyleBasedTypedArray(
93491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            @Nullable StyleResourceValue style, int[] attrs) throws Resources.NotFoundException {
935282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Pair<String, Boolean>> attributes = searchAttrs(attrs);
936282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
937a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta        BridgeTypedArray ta =
938a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                Resources_Delegate.newTypeArray(mSystemResources, attrs.length, false);
939282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
94091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        PropertiesMap defaultPropMap = new PropertiesMap();
941282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // for each attribute, get its name so that we can search it in the style
94291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        for (int i = 0; i < attrs.length; i++) {
943282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Pair<String, Boolean> attribute = attributes.get(i);
944282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
945282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (attribute != null) {
946282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                // look for the value in the given style
947bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                ResourceValue resValue;
94891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                String attrName = attribute.getFirst();
949a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                boolean frameworkAttr = attribute.getSecond();
950bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                if (style != null) {
951a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                    resValue = mRenderResources.findItemInStyle(style, attrName, frameworkAttr);
952bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                } else {
953a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                    resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
954bfec73c2db5a34ced248213edf5519c80727a65fDeepanshu Gupta                }
955282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
956282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                if (resValue != null) {
95791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    // Add it to defaultPropMap before resolving
95879c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                    String preResolve = resValue.getValue();
959282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    // resolve it to make sure there are no references left.
96079c59fe4a8544bdda5c56efecf9c2bc72f2f0e4eDeepanshu Gupta                    resValue = mRenderResources.resolveResValue(resValue);
961a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                    ta.bridgeSetValue(i, attrName, frameworkAttr, resValue);
962a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                    defaultPropMap.put(
963a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                            frameworkAttr ? SdkConstants.ANDROID_PREFIX + attrName : attrName,
964a43c4fa09ff758400c17c3533b77d783e713a115Deepanshu Gupta                            new Property(preResolve, resValue.getValue()));
965282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
966282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
967282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
968282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
969282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ta.sealArray();
970282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
97191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        return Pair.of(ta, defaultPropMap);
972282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
973282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
974282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
975282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * The input int[] attrs is a list of attributes. The returns a list of information about
976282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * each attributes. The information is (name, isFramework)
977282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * <p/>
978282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
979282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param attrs An attribute array reference given to obtainStyledAttributes.
980282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return List of attribute information.
981282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
982282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private List<Pair<String, Boolean>> searchAttrs(int[] attrs) {
98391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        List<Pair<String, Boolean>> results = new ArrayList<>(attrs.length);
984282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
985282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // for each attribute, get its name so that we can search it in the style
9869fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        for (int attr : attrs) {
9879fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attr);
988282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean isFramework = false;
989282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resolvedResource != null) {
990282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                isFramework = true;
991282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
99237dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta                resolvedResource = mLayoutlibCallback.resolveResourceId(attr);
993282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
994282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
995282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (resolvedResource != null) {
996282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                results.add(Pair.of(resolvedResource.getSecond(), isFramework));
997282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            } else {
998282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                results.add(null);
999282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1000282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1001282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1002282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return results;
1003282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1004282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1005282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
1006282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Searches for the attribute referenced by its internal id.
1007282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
1008282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @param attr An attribute reference given to obtainStyledAttributes such as defStyle.
1009282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * @return A (name, isFramework) pair describing the attribute if found. Returns null
1010282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *         if nothing is found.
1011282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
101291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private Pair<String, Boolean> searchAttr(int attr) {
1013282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Pair<ResourceType, String> info = Bridge.resolveResourceId(attr);
1014282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (info != null) {
1015282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return Pair.of(info.getSecond(), Boolean.TRUE);
1016282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1017282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
101837dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta        info = mLayoutlibCallback.resolveResourceId(attr);
1019282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (info != null) {
1020282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return Pair.of(info.getSecond(), Boolean.FALSE);
1021282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1022282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1023282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1024282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1025282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1026282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getDynamicIdByStyle(StyleResourceValue resValue) {
1027282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mDynamicIdToStyleMap == null) {
1028282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // create the maps.
102991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            mDynamicIdToStyleMap = new HashMap<>();
103091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            mStyleToDynamicIdMap = new HashMap<>();
1031282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1032282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1033282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // look for an existing id
1034282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Integer id = mStyleToDynamicIdMap.get(resValue);
1035282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1036282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (id == null) {
1037282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // generate a new id
10389fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            id = ++mDynamicIdGenerator;
1039282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1040282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            // and add it to the maps.
1041282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDynamicIdToStyleMap.put(id, resValue);
1042282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mStyleToDynamicIdMap.put(resValue, id);
1043282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1044282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1045282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return id;
1046282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1047282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1048282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private StyleResourceValue getStyleByDynamicId(int i) {
1049282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mDynamicIdToStyleMap != null) {
1050282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            return mDynamicIdToStyleMap.get(i);
1051282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1052282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1053282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1054282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1055282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1056282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) {
10579fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (getRenderResources().getFrameworkResource(resType, resName) != null) {
10589fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            // Bridge.getResourceId creates a new resource id if an existing one isn't found. So,
10599fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            // we check for the existence of the resource before calling it.
10609fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta            return Bridge.getResourceId(resType, resName);
1061282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1062282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1063282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return defValue;
1064282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1065282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1066282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getProjectResourceValue(ResourceType resType, String resName, int defValue) {
10679fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        // getResourceId creates a new resource id if an existing resource id isn't found. So, we
10689fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        // check for the existence of the resource before calling it.
10699fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta        if (getRenderResources().getProjectResource(resType, resName) != null) {
107037dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta            if (mLayoutlibCallback != null) {
107137dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta                Integer value = mLayoutlibCallback.getResourceId(resType, resName);
10729fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                if (value != null) {
10739fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                    return value;
10749fa48b09ad06c39be0923d5ca64b81f6b0eee993Deepanshu Gupta                }
1075282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
1076282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1077282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1078282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return defValue;
1079282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1080282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1081ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta    public static Context getBaseContext(Context context) {
1082ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta        while (context instanceof ContextWrapper) {
1083ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta            context = ((ContextWrapper) context).getBaseContext();
1084ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta        }
1085ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta        return context;
1086ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta    }
1087ada8590547348b77d8cbd56abdb8fadb3e72c015Deepanshu Gupta
1088d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta    public IBinder getBinder() {
1089d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta        if (mBinder == null) {
1090d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta            // create a dummy binder. We only need it be not null.
1091d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta            mBinder = new IBinder() {
1092d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1093d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public String getInterfaceDescriptor() throws RemoteException {
1094d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return null;
1095d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1096d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1097d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1098d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public boolean pingBinder() {
1099d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return false;
1100d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1101d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1102d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1103d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public boolean isBinderAlive() {
1104d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return false;
1105d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1106d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1107d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1108d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public IInterface queryLocalInterface(String descriptor) {
1109d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return null;
1110d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1111d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1112d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1113d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public void dump(FileDescriptor fd, String[] args) throws RemoteException {
1114d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1115d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1116d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1117d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1118d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
1119d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1120d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1121d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1122d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1123d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public boolean transact(int code, Parcel data, Parcel reply, int flags)
1124d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        throws RemoteException {
1125d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return false;
1126d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1127d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1128d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1129d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public void linkToDeath(DeathRecipient recipient, int flags)
1130d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                        throws RemoteException {
1131d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1132d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1133d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1134d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                @Override
1135d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
1136d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                    return false;
1137d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta                }
1138e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitz
1139e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitz                @Override
1140e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitz                public void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
1141e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitz                  String[] args, ResultReceiver resultReceiver) {
1142e8a04cd5a68a5e5aa78a4f40b3269c86cc3f152fIan Pedowitz                }
1143d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta            };
1144d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta        }
1145d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta        return mBinder;
1146d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta    }
1147d5b82845450beac2d3c7db9cd80e9fc34d43a297Deepanshu Gupta
1148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //------------ NOT OVERRIDEN --------------------
1149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) {
1152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingOrSelfPermission(String arg0) {
1158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingOrSelfUriPermission(Uri arg0, int arg1) {
1164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingPermission(String arg0) {
1170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkCallingUriPermission(Uri arg0, int arg1) {
1176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkPermission(String arg0, int arg1, int arg2) {
1182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1187c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav    public int checkSelfPermission(String arg0) {
1188c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav        // pass
1189c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav        return 0;
1190c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav    }
1191c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav
1192c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav    @Override
1193ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    public int checkPermission(String arg0, int arg1, int arg2, IBinder arg3) {
1194ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn        // pass
1195ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn        return 0;
1196ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    }
1197ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn
1198ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    @Override
1199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3) {
1200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1205ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3, IBinder arg4) {
1206ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn        // pass
1207ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn        return 0;
1208ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    }
1209ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn
1210ff17024e583b170312d82089fd358d278ce16c9aDianne Hackborn    @Override
1211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int checkUriPermission(Uri arg0, String arg1, String arg2, int arg3,
1212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int arg4, int arg5) {
1213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0;
1215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void clearWallpaper() {
1219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createPackageContext(String arg0, int arg1) {
1225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createPackageContextAsUser(String arg0, int arg1, UserHandle user) {
1231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createConfigurationContext(Configuration overrideConfiguration) {
1237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context createDisplayContext(Display display) {
1243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String[] databaseList() {
1249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
12544f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    public Context createApplicationContext(ApplicationInfo application, int flags)
12554f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav            throws PackageManager.NameNotFoundException {
12564f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav        return null;
12574f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    }
12584f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav
12594f6a6c48a4e6b9f6e4ced3d10bb51db5d2c22eadSvetoslav    @Override
12608a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public boolean moveDatabaseFrom(Context sourceContext, String name) {
126135871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        // pass
126235871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        return false;
126335871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    }
126435871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey
126535871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    @Override
1266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean deleteDatabase(String arg0) {
1267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean deleteFile(String arg0) {
1273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingOrSelfPermission(String arg0, String arg1) {
1279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1,
1285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg2) {
1286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingPermission(String arg0, String arg1) {
1292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) {
1298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforcePermission(String arg0, int arg1, int arg2, String arg3) {
1304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3,
1310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg4) {
1311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void enforceUriPermission(Uri arg0, String arg1, String arg2,
1317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int arg3, int arg4, int arg5, String arg6) {
1318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String[] fileList() {
1324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1329d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Gupta    public BridgeAssetManager getAssets() {
1330d51834bdfad0cd3142ac464ab3a3b0db14f884c3Deepanshu Gupta        return mAssets;
1331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getCacheDir() {
1335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
13404ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    public File getCodeCacheDir() {
13414ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey        // pass
13424ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey        return null;
13434ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    }
13444ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey
13454ed745d359ada6986ac15d8718452e5c55f40170Jeff Sharkey    @Override
1346282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getExternalCacheDir() {
1347282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1348282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1349282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1350282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1351282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1352282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ContentResolver getContentResolver() {
1353282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mContentResolver == null) {
1354282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mContentResolver = new BridgeContentResolver(this);
1355282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
1356282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mContentResolver;
1357282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1358282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1359282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1360282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getDatabasePath(String arg0) {
1361282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1362282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1363282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1364282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1365282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1366282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getDir(String arg0, int arg1) {
1367282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1368282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1369282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1370282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1371282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1372282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getFileStreamPath(String arg0) {
1373282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1374282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1375282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1376282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1377282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
13786a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey    public File getSharedPreferencesPath(String name) {
13796a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey        // pass
13806a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey        return null;
13816a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey    }
13826a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey
13836a6cdafaec56fcd793214678c7fcc52f0b860cfcJeff Sharkey    @Override
13842c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey    public File getDataDir() {
13852c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey        // pass
13862c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey        return null;
13872c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey    }
13882c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey
13892c1ba9a961d4f96c26df260ee437655ad9e7c03eJeff Sharkey    @Override
1390282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getFilesDir() {
1391282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1392282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1393282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1394282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1395282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
139665665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    public File getNoBackupFilesDir() {
139765665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate        // pass
139865665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate        return null;
139965665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    }
140065665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate
140165665aac6387d644f0f40c6bdddf558f096b6e6eChristopher Tate    @Override
1402282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getExternalFilesDir(String type) {
1403282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1404282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1405282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1406282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1407282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1408282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getPackageCodePath() {
1409282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1410282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1411282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1412282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1413282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1414282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getBasePackageName() {
1415282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1416282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1417282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1418282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1419282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
14208732bd893ae507346dad068a33edcc4beb99faedKenny Root    public String getOpPackageName() {
14218732bd893ae507346dad068a33edcc4beb99faedKenny Root        // pass
14228732bd893ae507346dad068a33edcc4beb99faedKenny Root        return null;
14238732bd893ae507346dad068a33edcc4beb99faedKenny Root    }
14248732bd893ae507346dad068a33edcc4beb99faedKenny Root
14258732bd893ae507346dad068a33edcc4beb99faedKenny Root    @Override
1426282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ApplicationInfo getApplicationInfo() {
1427282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mApplicationInfo;
1428282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1429282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1430282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1431282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public String getPackageResourcePath() {
1432282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1433282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1434282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1435282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1436282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1437282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SharedPreferences getSharedPreferences(String arg0, int arg1) {
1438dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        if (mSharedPreferences == null) {
1439dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta            mSharedPreferences = new BridgeSharedPreferences();
1440dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        }
1441dfeffd4c0ae165a3f225b818ef8d6f5d1cb89a2cDeepanshu Gupta        return mSharedPreferences;
1442282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1443282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1444282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
14458fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey    public SharedPreferences getSharedPreferences(File arg0, int arg1) {
14468fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey        if (mSharedPreferences == null) {
14478fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey            mSharedPreferences = new BridgeSharedPreferences();
14488fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey        }
14498fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey        return mSharedPreferences;
14508fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey    }
14518fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey
14528fc29cf1052fd951a3a0828b65506db30df89eceJeff Sharkey    @Override
14538a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public boolean moveSharedPreferencesFrom(Context sourceContext, String name) {
145435871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        // pass
145535871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        return false;
145635871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    }
145735871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey
145835871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    @Override
145935871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    public boolean deleteSharedPreferences(String name) {
146035871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        // pass
146135871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey        return false;
146235871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    }
146335871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey
146435871f2c2bb114806b4e3f109960b7f863d7885cJeff Sharkey    @Override
1465282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Drawable getWallpaper() {
1466282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1467282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1468282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1469282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1470282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1471282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getWallpaperDesiredMinimumWidth() {
1472282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
1473282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1474282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1475282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1476282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getWallpaperDesiredMinimumHeight() {
1477282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return -1;
1478282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1479282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1480282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1481282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void grantUriPermission(String arg0, Uri arg1, int arg2) {
1482282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1483282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1484282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1485282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1486282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1487282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public FileInputStream openFileInput(String arg0) throws FileNotFoundException {
1488282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1489282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1490282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1491282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1492282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1493282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public FileOutputStream openFileOutput(String arg0, int arg1) throws FileNotFoundException {
1494282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1495282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1496282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1497282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1498282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1499282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2) {
1500282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1501282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1502282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1503282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1504282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1505282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1,
1506282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            CursorFactory arg2, DatabaseErrorHandler arg3) {
1507282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1508282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1509282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1510282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1511282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1512282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Drawable peekWallpaper() {
1513282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1514282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1515282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1516282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1517282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1518282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1) {
1519282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1520282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1521282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1522282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1523282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1524282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
1525282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String arg2, Handler arg3) {
1526282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1527282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1528282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1529282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1530282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1531282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5,
1532282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            IntentFilter arg1, String arg2, Handler arg3) {
1533282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1534282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1535282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1536282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1537282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1538282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void removeStickyBroadcast(Intent arg0) {
1539282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1540282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1541282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1542282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1543282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1544282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void revokeUriPermission(Uri arg0, int arg1) {
1545282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1546282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1547282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1548282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1549282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1550282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent arg0) {
1551282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1552282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1553282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1554282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1555282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1556282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent arg0, String arg1) {
1557282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1558282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1559282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1560282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1561282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1562d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
1563d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov        // pass
1564d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov
1565d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov    }
1566d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov
1567d4fd8c766da8a70e3359bbc7efbbc79496efe71aFyodor Kupolov    @Override
1568a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    public void sendBroadcast(Intent arg0, String arg1, Bundle arg2) {
1569a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn        // pass
1570a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn
1571a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    }
1572a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn
1573a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    @Override
1574282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1575282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1576282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1577282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1578282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1579282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1) {
1580282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1581282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1582282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1583282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1584282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1585282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1,
1586282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
1587282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle arg6) {
1588282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1589282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1590282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1591282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1592282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1593a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    public void sendOrderedBroadcast(Intent arg0, String arg1,
1594a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn            Bundle arg7, BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
1595a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn            Bundle arg6) {
1596a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn        // pass
1597a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn
1598a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    }
1599a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn
1600a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn    @Override
1601282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
1602282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
1603282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String initialData, Bundle initialExtras) {
1604282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1605282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1606282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1607282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1608282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1609282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1610282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1611282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1612282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1613282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1614282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String receiverPermission) {
1615282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1616282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1617282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
16186762301a10ba1176dc97083bef6785ec169378ffSvet Ganov    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1619e8b6debd9b1035a8b8da102cfe476b71986b341cSvet Ganov            String receiverPermission, int appOp) {
16206762301a10ba1176dc97083bef6785ec169378ffSvet Ganov        // pass
16216762301a10ba1176dc97083bef6785ec169378ffSvet Ganov    }
16226762301a10ba1176dc97083bef6785ec169378ffSvet Ganov
1623282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1624282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1625282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1626282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            int initialCode, String initialData, Bundle initialExtras) {
1627282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1628282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1629282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1630282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
16313cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
16323cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
16333cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            Handler scheduler,
1634fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn            int initialCode, String initialData, Bundle initialExtras) {
1635fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn        // pass
1636fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn    }
1637fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn
1638fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn    @Override
1639fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1640fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn            String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
1641fd854ee58c5d56f84047007ead9f88a767ae956fDianne Hackborn            Handler scheduler,
16423cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani            int initialCode, String initialData, Bundle initialExtras) {
16433cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani        // pass
16443cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    }
16453cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani
16463cf75729d5a27b8ddd1ea174626dbcf0349a1d07Amith Yamasani    @Override
1647282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyBroadcast(Intent arg0) {
1648282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1649282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1650282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1651282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1652282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1653282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyOrderedBroadcast(Intent intent,
1654282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData,
1655282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski           Bundle initialExtras) {
1656282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1657282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1658282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1659282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1660282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1661282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1662282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1663282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1664282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1665e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) {
1666e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn        // pass
1667e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    }
1668e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn
1669e0e413e2b17a0164e15c77f4ab51b3166f9111d2Dianne Hackborn    @Override
1670282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void sendStickyOrderedBroadcastAsUser(Intent intent,
1671282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            UserHandle user, BroadcastReceiver resultReceiver,
1672282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Handler scheduler, int initialCode, String initialData,
1673282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle initialExtras) {
1674282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1675282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1676282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1677282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1678282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1679282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1680282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1681282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1682282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1683282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setTheme(int arg0) {
1684282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1685282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1686282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1687282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1688282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1689282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setWallpaper(Bitmap arg0) throws IOException {
1690282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1691282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1692282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1693282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1694282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1695282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void setWallpaper(InputStream arg0) throws IOException {
1696282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1697282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1698282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1699282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1700282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1701282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivity(Intent arg0) {
1702282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1703282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1704282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1705282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1706282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivity(Intent arg0, Bundle arg1) {
1707282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1708282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1709282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1710282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1711282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startIntentSender(IntentSender intent,
1712282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1713282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throws IntentSender.SendIntentException {
1714282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1715282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1716282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1717282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1718282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startIntentSender(IntentSender intent,
1719282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
1720282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle options) throws IntentSender.SendIntentException {
1721282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1722282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1723282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1724282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1725282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean startInstrumentation(ComponentName arg0, String arg1,
1726282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bundle arg2) {
1727282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1728282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1729282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1730282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1731282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1732282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ComponentName startService(Intent arg0) {
1733282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1734282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1735282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1736282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1737282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1738282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean stopService(Intent arg0) {
1739282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1740282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1741282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1742282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1743282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1744282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public ComponentName startServiceAsUser(Intent arg0, UserHandle arg1) {
1745282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1746282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1747282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1748282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1749282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1750282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean stopServiceAsUser(Intent arg0, UserHandle arg1) {
1751282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1752282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1753282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1754282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1755282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1756282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void unbindService(ServiceConnection arg0) {
1757282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1758282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1759282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1760282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1761282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1762282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void unregisterReceiver(BroadcastReceiver arg0) {
1763282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1764282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1765282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1766282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1767282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1768282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Context getApplicationContext() {
1769282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return this;
1770282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1771282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1772282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1773282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivities(Intent[] arg0) {
1774282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1775282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1776282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1777282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1778282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1779282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void startActivities(Intent[] arg0, Bundle arg1) {
1780282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1781282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1782282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1783282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1784282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1785282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean isRestricted() {
1786282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return false;
1787282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1788282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1789282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1790282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File getObbDir() {
1791282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "OBB not supported", null);
1792282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1793282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1794282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1795282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1796282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public DisplayAdjustments getDisplayAdjustments(int displayId) {
1797282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1798282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return null;
1799282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1800282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1801282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
18020f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski    public Display getDisplay() {
18030f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski        // pass
18040f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski        return null;
18050f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski    }
18060f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski
18070f5caab5762d9ace8e7d87e29296bcb8fdfe9b4bAdam Lesinski    @Override
1808282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public int getUserId() {
1809282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return 0; // not used
1810282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1811282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1812282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1813282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getExternalFilesDirs(String type) {
1814282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1815282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1816282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1817282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1818282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1819282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getObbDirs() {
1820282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1821282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1822282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
1823282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
1824282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
1825282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public File[] getExternalCacheDirs() {
1826282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
1827282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return new File[0];
1828282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
18292ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey
18302ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    @Override
18312ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    public File[] getExternalMediaDirs() {
18322ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey        // pass
18332ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey        return new File[0];
18342ee3c1e189819cc6efb4d7de24f1438bdb824087Jeff Sharkey    }
18354dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen
18364dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen    public void setScrollYPos(@NonNull View view, int scrollPos) {
18374dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen        mScrollYPos.put(view, scrollPos);
18384dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen    }
18394dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen
18404dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen    public int getScrollYPos(@NonNull View view) {
18414dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen        Integer pos = mScrollYPos.get(view);
18424dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen        return pos != null ? pos : 0;
18434dfe4d43ce5634f059a3ba669e3cac4551c3a3eeJens Ole Lauridsen    }
18447a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey
1845d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    public void setScrollXPos(@NonNull View view, int scrollPos) {
1846d15459197f71f8cc940e2b057b399117df282f2cDiego Perez        mScrollXPos.put(view, scrollPos);
1847d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    }
1848d15459197f71f8cc940e2b057b399117df282f2cDiego Perez
1849d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    public int getScrollXPos(@NonNull View view) {
1850d15459197f71f8cc940e2b057b399117df282f2cDiego Perez        Integer pos = mScrollXPos.get(view);
1851d15459197f71f8cc940e2b057b399117df282f2cDiego Perez        return pos != null ? pos : 0;
1852d15459197f71f8cc940e2b057b399117df282f2cDiego Perez    }
1853d15459197f71f8cc940e2b057b399117df282f2cDiego Perez
18547a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    @Override
18558a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public Context createDeviceProtectedStorageContext() {
18567a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        // pass
18577a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        return null;
18587a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    }
18597a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey
18607a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    @Override
18618a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public Context createCredentialProtectedStorageContext() {
18627a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        // pass
18637a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        return null;
18647a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    }
18657a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey
18667a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    @Override
18678a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public boolean isDeviceProtectedStorage() {
18687a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        return false;
18697a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    }
18707a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey
18717a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    @Override
18728a372a0a280127743ce9a7ce4b6198c7a02d2a4fJeff Sharkey    public boolean isCredentialProtectedStorage() {
18737a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey        return false;
18747a30a30ebece75f4a73fa604d4c7721d28eecc16Jeff Sharkey    }
187591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
187691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    /**
187791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * The cached value depends on
187891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * <ol>
187991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * <li>{@code int[]}: the attributes for which TypedArray is created </li>
188091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * <li>{@code List<StyleResourceValue>}: the themes set on the context at the time of
188191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * creation of the TypedArray</li>
188291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * <li>{@code Integer}: the default style used at the time of creation</li>
188391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * </ol>
188491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     *
188591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * The class is created by using nested maps resolving one dependency at a time.
188691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * <p/>
188791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * The final value of the nested maps is a pair of the typed array and a map of properties
188891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     * that should be added to {@link #mDefaultPropMaps}, if needed.
188991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta     */
189091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    private static class TypedArrayCache {
189191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
189291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        private Map<int[],
189391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                Map<List<StyleResourceValue>,
189491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                        Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>> mCache;
189591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
189691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        public TypedArrayCache() {
189791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            mCache = new IdentityHashMap<>();
189891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        }
189991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
190091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        public Pair<BridgeTypedArray, PropertiesMap> get(int[] attrs,
190191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                List<StyleResourceValue> themes, int resId) {
190291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            Map<List<StyleResourceValue>, Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>
190391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    cacheFromThemes = mCache.get(attrs);
190491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            if (cacheFromThemes != null) {
190591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                Map<Integer, Pair<BridgeTypedArray, PropertiesMap>> cacheFromResId =
190691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                        cacheFromThemes.get(themes);
190791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                if (cacheFromResId != null) {
190891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    return cacheFromResId.get(resId);
190991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                }
191091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            }
191191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            return null;
191291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        }
191391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
191491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        public void put(int[] attrs, List<StyleResourceValue> themes, int resId,
191591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                Pair<BridgeTypedArray, PropertiesMap> value) {
191691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            Map<List<StyleResourceValue>, Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>
191791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    cacheFromThemes = mCache.get(attrs);
191891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            if (cacheFromThemes == null) {
191991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                cacheFromThemes = new HashMap<>();
192091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                mCache.put(attrs, cacheFromThemes);
192191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            }
192291253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            Map<Integer, Pair<BridgeTypedArray, PropertiesMap>> cacheFromResId =
192391253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                    cacheFromThemes.get(themes);
192491253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            if (cacheFromResId == null) {
192591253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                cacheFromResId = new HashMap<>();
192691253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta                cacheFromThemes.put(themes, cacheFromResId);
192791253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            }
192891253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta            cacheFromResId.put(resId, value);
192991253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta        }
193091253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta
193191253ed04696ecd57636472dd8ac74660f65c5c2Deepanshu Gupta    }
1932282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
1933