1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/*
2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2008 The Android Open Source Project
3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License.
6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at
7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and
14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License.
15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage com.android.layoutlib.bridge.android;
18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
19ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Guptaimport com.android.SdkConstants;
20807ee60dded3034941966f844a5e434473863660Deepanshu Guptaimport com.android.ide.common.rendering.api.AssetRepository;
21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ILayoutPullParser;
22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog;
23b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback;
24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.RenderResources;
250358a99f349e418142779f328a3136b1f5f1565eMichal Bendowskiimport com.android.ide.common.rendering.api.ResourceNamespace;
260358a99f349e418142779f328a3136b1f5f1565eMichal Bendowskiimport com.android.ide.common.rendering.api.ResourceNamespace.Resolver;
27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference;
28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceValue;
29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.StyleResourceValue;
30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge;
31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.BridgeConstants;
32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.android.view.WindowManagerImpl;
33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.ParserFactory;
34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.Stack;
35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.resources.ResourceType;
36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.util.Pair;
3718be29a3d14f1b3e840e8ee88b5a1951a6f6e9c8Deepanshu Guptaimport com.android.util.PropertiesMap;
3818be29a3d14f1b3e840e8ee88b5a1951a6f6e9c8Deepanshu Guptaimport com.android.util.PropertiesMap.Property;
39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport org.xmlpull.v1.XmlPullParser;
41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport org.xmlpull.v1.XmlPullParserException;
42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
43c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsenimport android.annotation.NonNull;
449f07d7c5e819577a6f638d32ffe93afeff58743dDeepanshu Guptaimport android.annotation.Nullable;
4533c5bdb3a4e5aab21e9744449d1efcdb2eb11a4fDiego Perezimport android.app.SystemServiceRegistry_Accessor;
46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.BroadcastReceiver;
47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.ComponentName;
48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.ContentResolver;
49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.Context;
501f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Guptaimport android.content.ContextWrapper;
51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.Intent;
52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.IntentFilter;
53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.IntentSender;
54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.ServiceConnection;
55ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.SharedPreferences;
56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.pm.ApplicationInfo;
57ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.pm.PackageManager;
58ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.res.AssetManager;
59807ee60dded3034941966f844a5e434473863660Deepanshu Guptaimport android.content.res.BridgeAssetManager;
60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.res.BridgeTypedArray;
61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.res.Configuration;
62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.res.Resources;
63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.content.res.Resources.Theme;
64896eb1c37f6a44d65d3a459891475e99170b657cDeepanshu Guptaimport android.content.res.Resources_Delegate;
65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.database.DatabaseErrorHandler;
66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.database.sqlite.SQLiteDatabase;
67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.database.sqlite.SQLiteDatabase.CursorFactory;
68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.graphics.Bitmap;
690986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perezimport android.graphics.Color;
70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.graphics.drawable.Drawable;
71bad51e55e21cd00d49bfe394c001bce260685cacDeepanshu Guptaimport android.hardware.display.DisplayManager;
72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.net.Uri;
73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.Bundle;
74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.Handler;
75b025e67cebd7c1297bc96ee4238191cc2cd22012Deepanshu Guptaimport android.os.IBinder;
76d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Guptaimport android.os.IInterface;
77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.Looper;
78d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Guptaimport android.os.Parcel;
79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.PowerManager;
80d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Guptaimport android.os.RemoteException;
81c179bccfd754fc6ee203f2842ceac12194cf9401Ian Pedowitzimport android.os.ResultReceiver;
82f6215420fe3432e2b756251a32c0cf62ad1787a3Dianne Hackbornimport android.os.ShellCallback;
83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.UserHandle;
84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.util.AttributeSet;
85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.util.DisplayMetrics;
86ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.util.TypedValue;
87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.BridgeInflater;
88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.Display;
89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.DisplayAdjustments;
90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.View;
91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.ViewGroup;
92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.WindowManager;
936ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Guptaimport android.view.accessibility.AccessibilityManager;
94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.textservice.TextServicesManager;
95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.File;
97d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Guptaimport java.io.FileDescriptor;
98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.FileInputStream;
99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.FileNotFoundException;
100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.FileOutputStream;
101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.IOException;
102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.InputStream;
103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.ArrayList;
1040358a99f349e418142779f328a3136b1f5f1565eMichal Bendowskiimport java.util.Collections;
105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.HashMap;
106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.IdentityHashMap;
107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.List;
108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.Map;
109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1103c5e3381983b1f2e98560a7bdbaadd4e7491144cDiego Perezimport static android.os._Original_Build.VERSION_CODES.JELLY_BEAN_MR1;
111cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Guptaimport static com.android.layoutlib.bridge.android.RenderParamsFlags.FLAG_KEY_APPLICATION_PACKAGE;
112cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta
113ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/**
114ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Custom implementation of Context/Activity to handle non compiled resources.
115ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
116f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta@SuppressWarnings("deprecation")  // For use of Pair.
117a082f4bd3bb8fd0e0a10d4b461bd1519bf7ed7a6Diego Perezpublic class BridgeContext extends Context {
1189b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez    private static final String PREFIX_THEME_APPCOMPAT = "Theme.AppCompat";
119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
12091137872e6b68a70adc1c750c122241065f0c125Diego Perez    private static final Map<String, ResourceValue> FRAMEWORK_PATCHED_VALUES = new HashMap<>(2);
121898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez    private static final Map<String, ResourceValue> FRAMEWORK_REPLACE_VALUES = new HashMap<>(3);
12291137872e6b68a70adc1c750c122241065f0c125Diego Perez
1230358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski    private static final Resolver LEGACY_NAMESPACE_RESOLVER =
1240358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski            Collections.singletonMap(SdkConstants.TOOLS_PREFIX, SdkConstants.TOOLS_URI)::get;
1250358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski
12691137872e6b68a70adc1c750c122241065f0c125Diego Perez    static {
12791137872e6b68a70adc1c750c122241065f0c125Diego Perez        FRAMEWORK_PATCHED_VALUES.put("animateFirstView", new ResourceValue(
1288848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                ResourceType.BOOL, "animateFirstView", "false", false));
1298848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez        FRAMEWORK_PATCHED_VALUES.put("animateLayoutChanges",
1308848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                new ResourceValue(ResourceType.BOOL, "animateLayoutChanges", "false", false));
131898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez
132898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez
1338848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez        FRAMEWORK_REPLACE_VALUES.put("textEditSuggestionItemLayout",
1348848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                new ResourceValue(ResourceType.LAYOUT, "textEditSuggestionItemLayout",
1358848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                        "text_edit_suggestion_item", true));
1368848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez        FRAMEWORK_REPLACE_VALUES.put("textEditSuggestionContainerLayout",
1378848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                new ResourceValue(ResourceType.LAYOUT, "textEditSuggestionContainerLayout",
1388848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                        "text_edit_suggestion_container", true));
1398848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez        FRAMEWORK_REPLACE_VALUES.put("textEditSuggestionHighlightStyle",
1408848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                new ResourceValue(ResourceType.STYLE, "textEditSuggestionHighlightStyle",
1418848268eefc54ee9280be576c77ff2cc8f3926bcDiego Perez                        "TextAppearance.Holo.SuggestionHighlight", true));
142898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez
143898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez    }
14491137872e6b68a70adc1c750c122241065f0c125Diego Perez
145de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    /** The map adds cookies to each view so that IDE can link xml tags to views. */
1465719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private final HashMap<View, Object> mViewKeyMap = new HashMap<>();
147de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    /**
148de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta     * In some cases, when inflating an xml, some objects are created. Then later, the objects are
149de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta     * converted to views. This map stores the mapping from objects to cookies which can then be
150de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta     * used to populate the mViewKeyMap.
151de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta     */
1525719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private final HashMap<Object, Object> mViewKeyHelpMap = new HashMap<>();
153807ee60dded3034941966f844a5e434473863660Deepanshu Gupta    private final BridgeAssetManager mAssets;
154de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    private Resources mSystemResources;
155ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final Object mProjectKey;
156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final DisplayMetrics mMetrics;
157ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final RenderResources mRenderResources;
158ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final Configuration mConfig;
159ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final ApplicationInfo mApplicationInfo;
160b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    private final LayoutlibCallback mLayoutlibCallback;
161ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private final WindowManager mWindowManager;
162bad51e55e21cd00d49bfe394c001bce260685cacDeepanshu Gupta    private final DisplayManager mDisplayManager;
163777163c3facaed668b43061d726a572fd58f6f60Diego Perez    private final HashMap<View, Integer> mScrollYPos = new HashMap<>();
164777163c3facaed668b43061d726a572fd58f6f60Diego Perez    private final HashMap<View, Integer> mScrollXPos = new HashMap<>();
165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
166ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private Resources.Theme mTheme;
167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1685719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private final Map<Object, PropertiesMap> mDefaultPropMaps = new IdentityHashMap<>();
169ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
170ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // maps for dynamically generated id representing style objects (StyleResourceValue)
17120e5913c77e01b1b4c322076e3c2177c0cf76681Deepanshu Gupta    @Nullable
172ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private Map<Integer, StyleResourceValue> mDynamicIdToStyleMap;
173ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap;
1746a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta    private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
175ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1769f07d7c5e819577a6f638d32ffe93afeff58743dDeepanshu Gupta    // cache for TypedArray generated from StyleResourceValue object
1775719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private TypedArrayCache mTypedArrayCache;
178ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private BridgeInflater mBridgeInflater;
179ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
180ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private BridgeContentResolver mContentResolver;
181ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1825719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<>();
183ef10b6c0edbc4b7f47e7202816c734672789f52cDeepanshu Gupta    private SharedPreferences mSharedPreferences;
184f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta    private ClassLoader mClassLoader;
185d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta    private IBinder mBinder;
18639c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta    private PackageManager mPackageManager;
1879b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez    private Boolean mIsThemeAppCompat;
188ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
189ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta    /**
190ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     * Some applications that target both pre API 17 and post API 17, set the newer attrs to
191ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     * reference the older ones. For example, android:paddingStart will resolve to
192ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     * android:paddingLeft. This way the apps need to only define paddingLeft at any other place.
193ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     * This a map from value to attribute name. Warning for missing references shouldn't be logged
194ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     * if value and attr name pair is the same as an entry in this map.
195ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta     */
1965719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private static Map<String, String> RTL_ATTRS = new HashMap<>(10);
197ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta
198ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta    static {
199ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/paddingLeft", "paddingStart");
200ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/paddingRight", "paddingEnd");
201ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_marginLeft", "layout_marginStart");
202ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_marginRight", "layout_marginEnd");
20305954d5ec954d360bc75df29be2ebf511e472bc5Siva Velusamy        RTL_ATTRS.put("?android:attr/layout_toLeftOf", "layout_toStartOf");
20405954d5ec954d360bc75df29be2ebf511e472bc5Siva Velusamy        RTL_ATTRS.put("?android:attr/layout_toRightOf", "layout_toEndOf");
205ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_alignParentLeft", "layout_alignParentStart");
206ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/layout_alignParentRight", "layout_alignParentEnd");
207ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/drawableLeft", "drawableStart");
208ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta        RTL_ATTRS.put("?android:attr/drawableRight", "drawableEnd");
209ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta    }
210ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta
211f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta    /**
212ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param projectKey An Object identifying the project. This is used for the cache mechanism.
213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param metrics the {@link DisplayMetrics}.
214ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param renderResources the configured resources (both framework and projects) for this
215ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * render.
216ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param config the Configuration object for this render.
217ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param targetSdkVersion the targetSdkVersion of the application.
218ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
21903faa7e778e24fbc3de3ec1212e265c2d04a8f47Diego Perez    public BridgeContext(Object projectKey, @NonNull DisplayMetrics metrics,
22003faa7e778e24fbc3de3ec1212e265c2d04a8f47Diego Perez            @NonNull RenderResources renderResources,
22103faa7e778e24fbc3de3ec1212e265c2d04a8f47Diego Perez            @NonNull AssetRepository assets,
22203faa7e778e24fbc3de3ec1212e265c2d04a8f47Diego Perez            @NonNull LayoutlibCallback layoutlibCallback,
22303faa7e778e24fbc3de3ec1212e265c2d04a8f47Diego Perez            @NonNull Configuration config,
224363e1cfa527a887b8d70c4c085f4383b23754948Deepanshu Gupta            int targetSdkVersion,
225363e1cfa527a887b8d70c4c085f4383b23754948Deepanshu Gupta            boolean hasRtlSupport) {
226ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mProjectKey = projectKey;
227ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mMetrics = metrics;
228b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        mLayoutlibCallback = layoutlibCallback;
229ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
230ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mRenderResources = renderResources;
231ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mConfig = config;
23285ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta        AssetManager systemAssetManager = AssetManager.getSystem();
23385ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta        if (systemAssetManager instanceof BridgeAssetManager) {
23485ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta            mAssets = (BridgeAssetManager) systemAssetManager;
23585ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta        } else {
23685ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta            throw new AssertionError("Creating BridgeContext without initializing Bridge");
23785ce0498994c007dc1a8732a4dc125c0061be0d1Deepanshu Gupta        }
238807ee60dded3034941966f844a5e434473863660Deepanshu Gupta        mAssets.setAssetRepository(assets);
239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mApplicationInfo = new ApplicationInfo();
241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mApplicationInfo.targetSdkVersion = targetSdkVersion;
242363e1cfa527a887b8d70c4c085f4383b23754948Deepanshu Gupta        if (hasRtlSupport) {
243363e1cfa527a887b8d70c4c085f4383b23754948Deepanshu Gupta            mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL;
244363e1cfa527a887b8d70c4c085f4383b23754948Deepanshu Gupta        }
245ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
246ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mWindowManager = new WindowManagerImpl(mMetrics);
247bad51e55e21cd00d49bfe394c001bce260685cacDeepanshu Gupta        mDisplayManager = new DisplayManager(this);
248ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Initializes the {@link Resources} singleton to be linked to this {@link Context}, its
252b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta     * {@link DisplayMetrics}, {@link Configuration}, and {@link LayoutlibCallback}.
253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *
254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @see #disposeResources()
255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
256ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void initResources() {
257ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AssetManager assetManager = AssetManager.getSystem();
258ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
259896eb1c37f6a44d65d3a459891475e99170b657cDeepanshu Gupta        mSystemResources = Resources_Delegate.initSystem(
260ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                this,
261ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                assetManager,
262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                mMetrics,
263ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                mConfig,
264b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta                mLayoutlibCallback);
265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mTheme = mSystemResources.newTheme();
266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
267ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
268ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
269ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Disposes the {@link Resources} singleton.
270ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
271ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void disposeResources() {
272896eb1c37f6a44d65d3a459891475e99170b657cDeepanshu Gupta        Resources_Delegate.disposeSystem();
273ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
274ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void setBridgeInflater(BridgeInflater inflater) {
276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mBridgeInflater = inflater;
277ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
278ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
279ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void addViewKey(View view, Object viewKey) {
280ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mViewKeyMap.put(view, viewKey);
281ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
282ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
283ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Object getViewKey(View view) {
284ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mViewKeyMap.get(view);
285ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
286ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
287de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    public void addCookie(Object o, Object cookie) {
288de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta        mViewKeyHelpMap.put(o, cookie);
289de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    }
290de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta
291de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    public Object getCookie(Object o) {
292de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta        return mViewKeyHelpMap.get(o);
293de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta    }
294de84301edebf36de5a32fac4b68ebd1316dc3f15Deepanshu Gupta
295ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Object getProjectKey() {
296ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mProjectKey;
297ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
298ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
299ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public DisplayMetrics getMetrics() {
300ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mMetrics;
301ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
302ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
303b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta    public LayoutlibCallback getLayoutlibCallback() {
304b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        return mLayoutlibCallback;
305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
306ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public RenderResources getRenderResources() {
308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mRenderResources;
309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
31118be29a3d14f1b3e840e8ee88b5a1951a6f6e9c8Deepanshu Gupta    public Map<Object, PropertiesMap> getDefaultProperties() {
31218be29a3d14f1b3e840e8ee88b5a1951a6f6e9c8Deepanshu Gupta        return mDefaultPropMaps;
313ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
314ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
315ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Configuration getConfiguration() {
316ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mConfig;
317ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
318ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
319ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
320ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Adds a parser to the stack.
321ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param parser the parser to add.
322ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
323ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void pushParser(BridgeXmlBlockParser parser) {
324ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (ParserFactory.LOG_PARSER) {
325ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            System.out.println("PUSH " + parser.getParser().toString());
326ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
327ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        mParserStack.push(parser);
328ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
329ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
330ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
331ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Removes the parser at the top of the stack
332ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
333ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void popParser() {
334ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        BridgeXmlBlockParser parser = mParserStack.pop();
335ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (ParserFactory.LOG_PARSER) {
336ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            System.out.println("POPD " + parser.getParser().toString());
337ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
338ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
339ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
340ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
341ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the current parser at the top the of the stack.
342ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @return a parser or null.
343ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
344898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez    private BridgeXmlBlockParser getCurrentParser() {
345ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mParserStack.peek();
346ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
347ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
348ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
349ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the previous parser.
350ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @return a parser or null if there isn't any previous parser
351ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
352ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public BridgeXmlBlockParser getPreviousParser() {
353ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (mParserStack.size() < 2) {
354ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return null;
355ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
356ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mParserStack.get(mParserStack.size() - 2);
357ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
358ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
3595719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    public boolean resolveThemeAttribute(int resId, TypedValue outValue, boolean resolveRefs) {
3605719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(resId);
361ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        boolean isFrameworkRes = true;
362ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resourceInfo == null) {
3635719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            resourceInfo = mLayoutlibCallback.resolveResourceId(resId);
364ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            isFrameworkRes = false;
365ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
366ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
367ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resourceInfo == null) {
368ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return false;
369ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
370ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
371ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ResourceValue value = mRenderResources.findItemInTheme(resourceInfo.getSecond(),
372ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                isFrameworkRes);
373ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resolveRefs) {
374ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            value = mRenderResources.resolveResValue(value);
375ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
376ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
377c8a55f3e2e36475d8a86a5967a9f2db629e02d1cDeepanshu Gupta        if (value == null) {
378c8a55f3e2e36475d8a86a5967a9f2db629e02d1cDeepanshu Gupta            // unable to find the attribute.
379c8a55f3e2e36475d8a86a5967a9f2db629e02d1cDeepanshu Gupta            return false;
380c8a55f3e2e36475d8a86a5967a9f2db629e02d1cDeepanshu Gupta        }
381c8a55f3e2e36475d8a86a5967a9f2db629e02d1cDeepanshu Gupta
382ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // check if this is a style resource
383ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value instanceof StyleResourceValue) {
384ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // get the id that will represent this style.
385cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta            outValue.resourceId = getDynamicIdByStyle((StyleResourceValue) value);
386ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return true;
387ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
388ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
3890986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez        String stringValue = value.getValue();
3900986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez        if (!stringValue.isEmpty()) {
3910986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez            if (stringValue.charAt(0) == '#') {
3920986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez                outValue.type = TypedValue.TYPE_INT_COLOR_ARGB8;
3930986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez                outValue.data = Color.parseColor(value.getValue());
3940986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez            }
3950986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez            else if (stringValue.charAt(0) == '@') {
3960986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez                outValue.type = TypedValue.TYPE_REFERENCE;
3970986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez            }
3980986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez
3990986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez        }
4000986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez
401ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        int a;
402ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // if this is a framework value.
403ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (value.isFramework()) {
404ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // look for idName in the android R classes.
405ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // use 0 a default res value as it's not a valid id value.
406ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            a = getFrameworkResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
407ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else {
408ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // look for idName in the project R class.
409ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // use 0 a default res value as it's not a valid id value.
410ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            a = getProjectResourceValue(value.getResourceType(), value.getName(), 0 /*defValue*/);
411ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
412ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
413ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (a != 0) {
414ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            outValue.resourceId = a;
415ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return true;
416ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
417ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
418ea1734b5a1c15857eba67749cebb5323bf759d94Diego Perez        // If the value is not a valid reference, fallback to pass the value as a string.
4190986aa118c279a45fd21af0128f2f81e3d7daa6fDiego Perez        outValue.string = stringValue;
420ea1734b5a1c15857eba67749cebb5323bf759d94Diego Perez        return true;
421ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
422ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
423ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
424ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ResourceReference resolveId(int id) {
425ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // first get the String related to this id in the framework
426ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);
427ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
428ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resourceInfo != null) {
429ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return new ResourceReference(resourceInfo.getSecond(), true);
430ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
431ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
432ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // didn't find a match in the framework? look in the project.
433b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        if (mLayoutlibCallback != null) {
434b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            resourceInfo = mLayoutlibCallback.resolveResourceId(id);
435ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
436ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (resourceInfo != null) {
437ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                return new ResourceReference(resourceInfo.getSecond(), false);
438ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
439ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
440ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
4416a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta        // The base value for R.style is 0x01030000 and the custom style is 0x02030000.
4426a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta        // So, if the second byte is 03, it's probably a style.
4436a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta        if ((id >> 16 & 0xFF) == 0x03) {
4446a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta            return getStyleByDynamicId(id);
4456a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta        }
446ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
447ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
448ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
449ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent,
450898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez            @SuppressWarnings("SameParameterValue") boolean attachToRoot,
451898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez            boolean skipCallbackParser) {
452ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        boolean isPlatformLayout = resource.isFramework();
453ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
454d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta        if (!isPlatformLayout && !skipCallbackParser) {
455ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // check if the project callback can provide us with a custom parser.
456ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ILayoutPullParser parser = getParser(resource);
457ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
458ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (parser != null) {
459ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
460ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        this, resource.isFramework());
461ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                try {
462ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    pushParser(blockParser);
463ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    return Pair.of(
464ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            mBridgeInflater.inflate(blockParser, parent, attachToRoot),
46541e2568ca7a5c333c57f3b8cf5d1f6294e65a062Diego Perez                            Boolean.TRUE);
466ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } finally {
467ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    popParser();
468ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
469ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
470ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
471ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
472ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ResourceValue resValue;
473ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resource instanceof ResourceValue) {
474ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            resValue = (ResourceValue) resource;
475ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else {
476ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (isPlatformLayout) {
477ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                resValue = mRenderResources.getFrameworkResource(ResourceType.LAYOUT,
478ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        resource.getName());
479ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            } else {
480ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                resValue = mRenderResources.getProjectResource(ResourceType.LAYOUT,
481ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        resource.getName());
482ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
483ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
484ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
485ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resValue != null) {
486ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
487ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            File xml = new File(resValue.getValue());
488ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (xml.isFile()) {
489ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                // we need to create a pull parser around the layout XML file, and then
490ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                // give that to our XmlBlockParser
491ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                try {
49297ec082dda2f1ca25d38437716583c8254740866Deepanshu Gupta                    XmlPullParser parser = ParserFactory.create(xml, true);
493ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
494ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // set the resource ref to have correct view cookies
495ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    mBridgeInflater.setResourceReference(resource);
496ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
497ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser,
498ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            this, resource.isFramework());
499ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    try {
500ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        pushParser(blockParser);
501ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        return Pair.of(
502ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                mBridgeInflater.inflate(blockParser, parent, attachToRoot),
50341e2568ca7a5c333c57f3b8cf5d1f6294e65a062Diego Perez                                Boolean.FALSE);
504ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    } finally {
505ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        popParser();
506ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
507ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } catch (XmlPullParserException e) {
508ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    Bridge.getLog().error(LayoutLog.TAG_BROKEN,
509ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            "Failed to configure parser for " + xml, e, null /*data*/);
510ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // we'll return null below.
511ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } catch (FileNotFoundException e) {
512ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // this shouldn't happen since we check above.
513ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } finally {
514ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    mBridgeInflater.setResourceReference(null);
515ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
516ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            } else {
517ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                Bridge.getLog().error(LayoutLog.TAG_BROKEN,
518ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        String.format("File %s is missing!", xml), null);
519ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
520ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else {
521ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
522ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "",
523ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            resource.getName()), null);
524ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
525ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
52641e2568ca7a5c333c57f3b8cf5d1f6294e65a062Diego Perez        return Pair.of(null, Boolean.FALSE);
527ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
528ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
5299b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez    /**
5309b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez     * Returns whether the current selected theme is based on AppCompat
5319b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez     */
5329b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez    public boolean isAppCompatTheme() {
5339b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // If a cached value exists, return it.
5349b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        if (mIsThemeAppCompat != null) {
5359b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            return mIsThemeAppCompat;
5369b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        }
5379b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // Ideally, we should check if the corresponding activity extends
5389b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // android.support.v7.app.ActionBarActivity, and not care about the theme name at all.
5399b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        StyleResourceValue defaultTheme = mRenderResources.getDefaultTheme();
5409b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // We can't simply check for parent using resources.themeIsParentOf() since the
5419b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // inheritance structure isn't really what one would expect. The first common parent
5429b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        // between Theme.AppCompat.Light and Theme.AppCompat is Theme.Material (for v21).
5439b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        boolean isThemeAppCompat = false;
5449b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        for (int i = 0; i < 50; i++) {
5459b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            if (defaultTheme == null) {
5469b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez                break;
5479b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            }
5489b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            // for loop ensures that we don't run into cyclic theme inheritance.
5499b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            if (defaultTheme.getName().startsWith(PREFIX_THEME_APPCOMPAT)) {
5509b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez                isThemeAppCompat = true;
5519b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez                break;
5529b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            }
5539b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez            defaultTheme = mRenderResources.getParent(defaultTheme);
5549b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        }
5559b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        mIsThemeAppCompat = isThemeAppCompat;
5569b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez        return isThemeAppCompat;
5579b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez    }
5589b30e13d8a9896da848fb5db5f91c802fc5249b2Diego Perez
559ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @SuppressWarnings("deprecation")
560ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private ILayoutPullParser getParser(ResourceReference resource) {
561ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ILayoutPullParser parser;
562ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (resource instanceof ResourceValue) {
563b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            parser = mLayoutlibCallback.getParser((ResourceValue) resource);
564ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else {
565b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            parser = mLayoutlibCallback.getParser(resource.getName());
566ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
567ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return parser;
568ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
569ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
570ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ------------ Context methods
571ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
572ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
573ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Resources getResources() {
574ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mSystemResources;
575ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
576ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
577ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
578ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Theme getTheme() {
579ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mTheme;
580ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
581ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
582ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
583ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ClassLoader getClassLoader() {
5848b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // The documentation for this method states that it should return a class loader one can
5858b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // use to retrieve classes in this package. However, when called by LayoutInflater, we do
5868b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // not want the class loader to return app's custom views.
5878b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // This is so that the IDE can instantiate the custom views and also generate proper error
5888b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // messages in case of failure. This also enables the IDE to fallback to MockView in case
5898b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // there's an exception thrown when trying to inflate the custom view.
5908b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // To work around this issue, LayoutInflater is modified via LayoutLib Create tool to
5918b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // replace invocations of this method to a new method: getFrameworkClassLoader(). Also,
5928b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // the method is injected into Context. The implementation of getFrameworkClassLoader() is:
5938b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // "return getClass().getClassLoader();". This means that when LayoutInflater asks for
5948b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // the context ClassLoader, it gets only LayoutLib's ClassLoader which doesn't have
5958b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // access to the apps's custom views.
5968b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // This method can now return the right ClassLoader, which CustomViews can use to do the
5978b8e217e45dcdf4c6ad2a398282e2be94d9b9dbbDeepanshu Gupta        // right thing.
598f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta        if (mClassLoader == null) {
599f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta            mClassLoader = new ClassLoader(getClass().getClassLoader()) {
600f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                @Override
601f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                protected Class<?> findClass(String name) throws ClassNotFoundException {
602f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                    for (String prefix : BridgeInflater.getClassPrefixList()) {
603f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                        if (name.startsWith(prefix)) {
604f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                            // These are framework classes and should not be loaded from the app.
605f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                            throw new ClassNotFoundException(name + " not found");
606f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                        }
607f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                    }
608f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                    return BridgeContext.this.mLayoutlibCallback.findClass(name);
609f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta                }
610f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta            };
611f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta        }
612f4d62181569ea4f112046a5400acd24e5c5d196bDeepanshu Gupta        return mClassLoader;
613ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
614ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
615ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
616ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Object getSystemService(String service) {
617ab93443117844cf490af35be356fa478ceeb3746Diego Perez        switch (service) {
618ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case LAYOUT_INFLATER_SERVICE:
619ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return mBridgeInflater;
620ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
621ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case TEXT_SERVICES_MANAGER_SERVICE:
622ab93443117844cf490af35be356fa478ceeb3746Diego Perez                // we need to return a valid service to avoid NPE
623ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return TextServicesManager.getInstance();
624ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
625ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case WINDOW_SERVICE:
626ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return mWindowManager;
627ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
628ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case POWER_SERVICE:
629ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return new PowerManager(this, new BridgePowerManager(), new Handler());
630ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
631ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case DISPLAY_SERVICE:
632ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return mDisplayManager;
633ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
634ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case ACCESSIBILITY_SERVICE:
635ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return AccessibilityManager.getInstance(this);
636bad51e55e21cd00d49bfe394c001bce260685cacDeepanshu Gupta
637ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case INPUT_METHOD_SERVICE:  // needed by SearchView
638ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case AUTOFILL_MANAGER_SERVICE:
639ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case AUDIO_SERVICE:
640ab93443117844cf490af35be356fa478ceeb3746Diego Perez            case TEXT_CLASSIFICATION_SERVICE:
641ab93443117844cf490af35be356fa478ceeb3746Diego Perez                return null;
642ab93443117844cf490af35be356fa478ceeb3746Diego Perez            default:
643ab93443117844cf490af35be356fa478ceeb3746Diego Perez                assert false : "Unsupported Service: " + service;
64411e84b1a1039c47c93dbdc041fc91db6473124aaDiego Perez        }
64511e84b1a1039c47c93dbdc041fc91db6473124aaDiego Perez
6460609785e6f839bfd27e33fa2630e6a1c12be9a20Diego Perez        return null;
647ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
648ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
6496b08f4b3e405058c78a7d176402f7158fd892856Jeff Brown    @Override
6506b08f4b3e405058c78a7d176402f7158fd892856Jeff Brown    public String getSystemServiceName(Class<?> serviceClass) {
65133c5bdb3a4e5aab21e9744449d1efcdb2eb11a4fDiego Perez        return SystemServiceRegistry_Accessor.getSystemServiceName(serviceClass);
6526b08f4b3e405058c78a7d176402f7158fd892856Jeff Brown    }
653ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
654ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
655dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    /**
656dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     * Same as Context#obtainStyledAttributes. We do not override the base method to give the
657dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     * original Context the chance to override the theme when needed.
658dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     */
659dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    @Nullable
660dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    public final BridgeTypedArray internalObtainStyledAttributes(int resId, int[] attrs)
661ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            throws Resources.NotFoundException {
6626ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta        StyleResourceValue style = null;
663ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the StyleResourceValue based on the resId;
6645719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        if (resId != 0) {
6655719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            style = getStyleByDynamicId(resId);
6666ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta
6676ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta            if (style == null) {
6686ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta                // In some cases, style may not be a dynamic id, so we do a full search.
6695719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                ResourceReference ref = resolveId(resId);
6706ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta                if (ref != null) {
6716ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta                    style = mRenderResources.getStyle(ref.getName(), ref.isFramework());
6726ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta                }
67398bfcb1c681013fb91352bc5d44a17471c5ae95eDeepanshu Gupta            }
67498bfcb1c681013fb91352bc5d44a17471c5ae95eDeepanshu Gupta
6756ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta            if (style == null) {
6760609785e6f839bfd27e33fa2630e6a1c12be9a20Diego Perez                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE,
6770609785e6f839bfd27e33fa2630e6a1c12be9a20Diego Perez                        "Failed to find style with " + resId, null);
6780609785e6f839bfd27e33fa2630e6a1c12be9a20Diego Perez                return null;
6796ba2eb811ef54a128739299b4b510c7a9c19fb2bDeepanshu Gupta            }
680ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
681ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
682ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (mTypedArrayCache == null) {
6835719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            mTypedArrayCache = new TypedArrayCache();
684ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
685ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
6869f07d7c5e819577a6f638d32ffe93afeff58743dDeepanshu Gupta        List<StyleResourceValue> currentThemes = mRenderResources.getAllThemes();
687ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
6885719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        Pair<BridgeTypedArray, PropertiesMap> typeArrayAndPropertiesPair =
6895719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                mTypedArrayCache.get(attrs, currentThemes, resId);
690ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
6915719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        if (typeArrayAndPropertiesPair == null) {
6925719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            typeArrayAndPropertiesPair = createStyleBasedTypedArray(style, attrs);
6935719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            mTypedArrayCache.put(attrs, currentThemes, resId, typeArrayAndPropertiesPair);
694ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
6955719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        // Add value to defaultPropsMap if needed
6965719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        if (typeArrayAndPropertiesPair.getSecond() != null) {
6978997bbe69bb4ebf1fbafe65aa8c736c8a452edd0Diego Perez            BridgeXmlBlockParser parser = getCurrentParser();
6988997bbe69bb4ebf1fbafe65aa8c736c8a452edd0Diego Perez            Object key = parser != null ? parser.getViewCookie() : null;
6995719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            if (key != null) {
7005719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                PropertiesMap defaultPropMap = mDefaultPropMaps.get(key);
7015719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                if (defaultPropMap == null) {
7025719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    defaultPropMap = typeArrayAndPropertiesPair.getSecond();
7035719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    mDefaultPropMaps.put(key, defaultPropMap);
7045719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                } else {
7055719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    defaultPropMap.putAll(typeArrayAndPropertiesPair.getSecond());
7065719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                }
7075719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            }
7085719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        }
7095719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        return typeArrayAndPropertiesPair.getFirst();
710ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
711ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
712dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    /**
713dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     * Same as Context#obtainStyledAttributes. We do not override the base method to give the
714dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     * original Context the chance to override the theme when needed.
715dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez     */
716dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    @Nullable
717dc3d0176993003aa949f0baf61327f1096f453d8Diego Perez    public BridgeTypedArray internalObtainStyledAttributes(@Nullable AttributeSet set, int[] attrs,
718ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            int defStyleAttr, int defStyleRes) {
719ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
7205719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        PropertiesMap defaultPropMap = null;
721ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        boolean isPlatformFile = true;
722ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
7230358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        // TODO(namespaces): We need to figure out how to keep track of the namespace of the current
7240358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        // layout file.
7250358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        ResourceNamespace currentFileNamespace = ResourceNamespace.TODO;
7260358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski
7270358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        // TODO(namespaces): get this through the callback, only in non-namespaced projects.
7280358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        ResourceNamespace.Resolver resolver = LEGACY_NAMESPACE_RESOLVER;
7290358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski
730ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // Hint: for XmlPullParser, attach source //DEVICE_SRC/dalvik/libcore/xml/src/java
731ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (set instanceof BridgeXmlBlockParser) {
732f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta            BridgeXmlBlockParser parser;
733ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            parser = (BridgeXmlBlockParser)set;
734ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
735ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            isPlatformFile = parser.isPlatformFile();
736ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
737ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Object key = parser.getViewCookie();
738ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (key != null) {
739898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                defaultPropMap = mDefaultPropMaps.computeIfAbsent(key, k -> new PropertiesMap());
740ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
741ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
7420358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski            resolver = parser::getNamespace;
7430358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski            currentFileNamespace = ResourceNamespace.fromBoolean(parser.isPlatformFile());
744ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else if (set instanceof BridgeLayoutParamsMapAttributes) {
745ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // this is only for temp layout params generated dynamically, so this is never
746ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // platform content.
747ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            isPlatformFile = false;
748ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        } else if (set != null) { // null parser is ok
749ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // really this should not be happening since its instantiated in Bridge
750ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bridge.getLog().error(LayoutLog.TAG_BROKEN,
751f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                    "Parser is not a BridgeXmlBlockParser!", null);
752ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return null;
753ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
754ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
755bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        List<AttributeHolder> attributeList = searchAttrs(attrs);
756ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
757896eb1c37f6a44d65d3a459891475e99170b657cDeepanshu Gupta        BridgeTypedArray ta =
758896eb1c37f6a44d65d3a459891475e99170b657cDeepanshu Gupta                Resources_Delegate.newTypeArray(mSystemResources, attrs.length, isPlatformFile);
759ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
760ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // look for a custom style.
761ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        String customStyle = null;
762ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (set != null) {
763f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta            customStyle = set.getAttributeValue(null, "style");
764ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
765ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
766ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        StyleResourceValue customStyleValues = null;
767ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (customStyle != null) {
768ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            ResourceValue item = mRenderResources.findResValue(customStyle,
769babf20eeba53b56f4bee8f13719b003ea79e40cfDeepanshu Gupta                    isPlatformFile /*forceFrameworkOnly*/);
770ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
771ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // resolve it in case it links to something else
772ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            item = mRenderResources.resolveResValue(item);
773ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
774ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (item instanceof StyleResourceValue) {
775ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                customStyleValues = (StyleResourceValue)item;
776ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
777ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
778ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
779ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // resolve the defStyleAttr value into a IStyleResourceValue
780ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        StyleResourceValue defStyleValues = null;
781ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
782ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (defStyleAttr != 0) {
783ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // get the name from the int.
784ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Pair<String, Boolean> defStyleAttribute = searchAttr(defStyleAttr);
785ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
786f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta            if (defStyleAttribute == null) {
787f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                // This should be rare. Happens trying to map R.style.foo to @style/foo fails.
788f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                // This will happen if the user explicitly used a non existing int value for
789f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                // defStyleAttr or there's something wrong with the project structure/build.
790f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_RESOLVE,
791f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                        "Failed to find the style corresponding to the id " + defStyleAttr, null);
792f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta            } else {
793d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                String defStyleName = defStyleAttribute.getFirst();
794ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
795f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                // look for the style in the current theme, and its parent:
796d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                ResourceValue item = mRenderResources.findItemInTheme(defStyleName,
797f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                        defStyleAttribute.getSecond());
798ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
799f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                if (item != null) {
800f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                    // item is a reference to a style entry. Search for it.
801f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                    item = mRenderResources.findResValue(item.getValue(), item.isFramework());
8023cf86178f3510f08452dda9ef78f431b7fbae32cDeepanshu Gupta                    item = mRenderResources.resolveResValue(item);
803f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                    if (item instanceof StyleResourceValue) {
804f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                        defStyleValues = (StyleResourceValue) item;
805f122f22516a3ddc8b15f1cc9ab6e4a3fcad54d24Deepanshu Gupta                    }
806d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                    if (defaultPropMap != null) {
807d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                        if (defStyleAttribute.getSecond()) {
808d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                            defStyleName = "android:" + defStyleName;
809d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                        }
810d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                        defaultPropMap.put("style", new Property(defStyleName, item.getValue()));
811d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                    }
812ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
813ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
814767052452e64bd6979c0b177c08312d8eb43e38fDiego Perez        }
815767052452e64bd6979c0b177c08312d8eb43e38fDiego Perez
816767052452e64bd6979c0b177c08312d8eb43e38fDiego Perez        if (defStyleValues == null && defStyleRes != 0) {
81720e5913c77e01b1b4c322076e3c2177c0cf76681Deepanshu Gupta            StyleResourceValue item = getStyleByDynamicId(defStyleRes);
818d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta            if (item != null) {
819d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                defStyleValues = item;
820d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta            } else {
821d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                boolean isFrameworkRes = true;
822d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                Pair<ResourceType, String> value = Bridge.resolveResourceId(defStyleRes);
823d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                if (value == null) {
824d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    value = mLayoutlibCallback.resolveResourceId(defStyleRes);
825d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    isFrameworkRes = false;
826d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
827ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
828d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                if (value != null) {
829d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    if ((value.getFirst() == ResourceType.STYLE)) {
830d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        // look for the style in all resources:
831d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        item = mRenderResources.getStyle(value.getSecond(), isFrameworkRes);
832d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        if (item != null) {
833d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                            if (defaultPropMap != null) {
834d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                                String name = item.getName();
835d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                                defaultPropMap.put("style", new Property(name, name));
836d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                            }
837d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
838d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                            defStyleValues = item;
839d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        } else {
840d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                            Bridge.getLog().error(null,
841d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                    String.format(
842d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                            "Style with id 0x%x (resolved to '%s') does not exist.",
843d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                            defStyleRes, value.getSecond()),
844d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                    null);
845ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        }
846ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    } else {
847ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        Bridge.getLog().error(null,
848ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                String.format(
849d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                        "Resource id 0x%x is not of type STYLE (instead %s)",
850d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                        defStyleRes, value.getFirst().toString()),
851ef2f7424f96bd08e59c099f464ece61aecea5370Deepanshu Gupta                                null);
852ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
853ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } else {
854ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    Bridge.getLog().error(null,
855ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            String.format(
856d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                    "Failed to find style with id 0x%x in current theme",
857d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                                    defStyleRes),
858ef2f7424f96bd08e59c099f464ece61aecea5370Deepanshu Gupta                            null);
859ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
860ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
861ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
862ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
863b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        String appNamespace = mLayoutlibCallback.getNamespace();
864ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
865ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (attributeList != null) {
866ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            for (int index = 0 ; index < attributeList.size() ; index++) {
867bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                AttributeHolder attributeHolder = attributeList.get(index);
868ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
869bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                if (attributeHolder == null) {
870ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    continue;
871ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
872ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
873bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                String attrName = attributeHolder.name;
874bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                boolean frameworkAttr = attributeHolder.isFramework;
875ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                String value = null;
876ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                if (set != null) {
877ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    value = set.getAttributeValue(
878ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                            frameworkAttr ? BridgeConstants.NS_RESOURCES : appNamespace,
879ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                    attrName);
880ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
881ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // if this is an app attribute, and the first get fails, try with the
882ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // new res-auto namespace as well
883d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta                    if (!frameworkAttr && value == null) {
884ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName);
885ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
886ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
887ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
888bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                // Calculate the default value from the Theme in two cases:
889bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                //   - If defaultPropMap is not null, get the default value to add it to the list
890bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                //   of default values of properties.
891bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                //   - If value is null, it means that the attribute is not directly set as an
892bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                //   attribute in the XML so try to get the default value.
893bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                ResourceValue defaultValue = null;
894bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                if (defaultPropMap != null || value == null) {
895ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // look for the value in the custom style first (and its parent if needed)
896ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    if (customStyleValues != null) {
897bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        defaultValue = mRenderResources.findItemInStyle(customStyleValues, attrName,
898bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                                frameworkAttr);
899ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
900ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
901ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // then look for the value in the default Style (and its parent if needed)
902bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    if (defaultValue == null && defStyleValues != null) {
903bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        defaultValue = mRenderResources.findItemInStyle(defStyleValues, attrName,
904bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                                frameworkAttr);
905ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
906ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
907ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // if the item is not present in the defStyle, we look in the main theme (and
908ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // its parent themes)
909bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    if (defaultValue == null) {
910bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        defaultValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
911ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
912ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
913ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // if we found a value, we make sure this doesn't reference another value.
914ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // So we resolve it.
915bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    if (defaultValue != null) {
916bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        String preResolve = defaultValue.getValue();
917bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        defaultValue = mRenderResources.resolveResValue(defaultValue);
918d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta
919ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        if (defaultPropMap != null) {
92018ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                            defaultPropMap.put(
92118ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                                    frameworkAttr ? SdkConstants.PREFIX_ANDROID + attrName :
922bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                                            attrName, new Property(preResolve, defaultValue.getValue()));
923ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                        }
924bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    }
925bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                }
926bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                // Done calculating the defaultValue
927ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
928bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                // if there's no direct value for this attribute in the XML, we look for default
929bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                // values in the widget defStyle, and then in the theme.
930bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                if (value == null) {
93191137872e6b68a70adc1c750c122241065f0c125Diego Perez                    if (frameworkAttr) {
93291137872e6b68a70adc1c750c122241065f0c125Diego Perez                        // For some framework values, layoutlib patches the actual value in the
93391137872e6b68a70adc1c750c122241065f0c125Diego Perez                        // theme when it helps to improve the final preview. In most cases
93491137872e6b68a70adc1c750c122241065f0c125Diego Perez                        // we just disable animations.
93591137872e6b68a70adc1c750c122241065f0c125Diego Perez                        ResourceValue patchedValue = FRAMEWORK_PATCHED_VALUES.get(attrName);
93691137872e6b68a70adc1c750c122241065f0c125Diego Perez                        if (patchedValue != null) {
93791137872e6b68a70adc1c750c122241065f0c125Diego Perez                            defaultValue = patchedValue;
93891137872e6b68a70adc1c750c122241065f0c125Diego Perez                        }
93991137872e6b68a70adc1c750c122241065f0c125Diego Perez                    }
94091137872e6b68a70adc1c750c122241065f0c125Diego Perez
941bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    // if we found a value, we make sure this doesn't reference another value.
942bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    // So we resolve it.
943bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                    if (defaultValue != null) {
944ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                        // If the value is a reference to another theme attribute that doesn't
945ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                        // exist, we should log a warning and omit it.
946bdcc221005b9246910cdf03b51b8f497f125c6e5Diego Perez                        String val = defaultValue.getValue();
947ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                        if (val != null && val.startsWith(SdkConstants.PREFIX_THEME_REF)) {
948898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            // Because we always use the latest framework code, some resources might
949898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            // fail to resolve when using old themes (they haven't been backported).
950898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            // Since this is an artifact caused by us using always the latest
951898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            // code, we check for some of those values and replace them here.
952898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            defaultValue = FRAMEWORK_REPLACE_VALUES.get(attrName);
953898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez
954898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                            if (defaultValue == null &&
955898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                                    (getApplicationInfo().targetSdkVersion < JELLY_BEAN_MR1 ||
956898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                                    !attrName.equals(RTL_ATTRS.get(val)))) {
957ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                                // Only log a warning if the referenced value isn't one of the RTL
958ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                                // attributes, or the app targets old API.
959ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                                Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
960ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                                        String.format("Failed to find '%s' in current theme.", val),
961ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                                        val);
962ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                            }
963ab7aef7fe5d0e7bb842bc1b65871fbe97f6687acDeepanshu Gupta                        }
964ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    }
965ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
966bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                    ta.bridgeSetValue(index, attrName, frameworkAttr, attributeHolder.resourceId,
967bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                            defaultValue);
968ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                } else {
9690358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                    // There is a value in the XML, but we need to resolve it in case it's
970ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // referencing another resource or a theme value.
9710358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                    ResourceValue dummy =
9720358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                            new ResourceValue(
9730358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                                    currentFileNamespace,
9740358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                                    null,
9750358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                                    attrName,
9760358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                                    value);
9770358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                    dummy.setNamespaceLookup(resolver);
9780358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski
9790358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                    ta.bridgeSetValue(
9800358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                            index, attrName, frameworkAttr, attributeHolder.resourceId,
9810358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                            mRenderResources.resolveResValue(dummy));
982ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
983ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
984ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
985ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
986ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ta.sealArray();
987ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
988ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return ta;
989ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
990ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
991ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
992ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Looper getMainLooper() {
993ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return Looper.myLooper();
994ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
995ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
996ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
997cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta    @Override
998cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta    public String getPackageName() {
999cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta        if (mApplicationInfo.packageName == null) {
1000cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta            mApplicationInfo.packageName = mLayoutlibCallback.getFlag(FLAG_KEY_APPLICATION_PACKAGE);
1001cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta        }
1002cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta        return mApplicationInfo.packageName;
1003cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta    }
1004cb40f2cb35d559d9ea60382b6dee80022c851124Deepanshu Gupta
100539c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta    @Override
100639c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta    public PackageManager getPackageManager() {
100739c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta        if (mPackageManager == null) {
100839c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta            mPackageManager = new BridgePackageManager();
100939c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta        }
101039c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta        return mPackageManager;
101139c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta    }
101239c818ea1f1fcbe249959202d796dcb6afa44ac8Deepanshu Gupta
1013ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ------------- private new methods
1014ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1015ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
1016ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Creates a {@link BridgeTypedArray} by filling the values defined by the int[] with the
10176a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta     * values found in the given style. If no style is specified, the default theme, along with the
10186a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta     * styles applied to it are used.
10196a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta     *
1020ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @see #obtainStyledAttributes(int, int[])
1021ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
10225719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private Pair<BridgeTypedArray, PropertiesMap> createStyleBasedTypedArray(
10235719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            @Nullable StyleResourceValue style, int[] attrs) throws Resources.NotFoundException {
1024bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        List<AttributeHolder> attributes = searchAttrs(attrs);
1025ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
102618ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta        BridgeTypedArray ta =
102718ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                Resources_Delegate.newTypeArray(mSystemResources, attrs.length, false);
1028ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
10295719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        PropertiesMap defaultPropMap = new PropertiesMap();
1030ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // for each attribute, get its name so that we can search it in the style
10315719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        for (int i = 0; i < attrs.length; i++) {
1032bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            AttributeHolder attrHolder = attributes.get(i);
1033ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1034bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            if (attrHolder != null) {
1035ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                // look for the value in the given style
10366a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta                ResourceValue resValue;
1037bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                String attrName = attrHolder.name;
1038bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                boolean frameworkAttr = attrHolder.isFramework;
10396a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta                if (style != null) {
104018ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                    resValue = mRenderResources.findItemInStyle(style, attrName, frameworkAttr);
10416a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta                } else {
104218ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                    resValue = mRenderResources.findItemInTheme(attrName, frameworkAttr);
10436a3ba682d669a115a3850bd323eb0892d56a85a7Deepanshu Gupta                }
1044ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1045ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                if (resValue != null) {
10465719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    // Add it to defaultPropMap before resolving
1047d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                    String preResolve = resValue.getValue();
1048ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    // resolve it to make sure there are no references left.
1049d94cff87ccbae3042dc4c328863619f4794cc8a5Deepanshu Gupta                    resValue = mRenderResources.resolveResValue(resValue);
1050bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                    ta.bridgeSetValue(i, attrName, frameworkAttr, attrHolder.resourceId,
1051bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                            resValue);
105218ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                    defaultPropMap.put(
105318ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                            frameworkAttr ? SdkConstants.ANDROID_PREFIX + attrName : attrName,
105418ba2f64c15380780855fbc72dd041ce56c62a74Deepanshu Gupta                            new Property(preResolve, resValue.getValue()));
1055ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                }
1056ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
1057ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1058ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1059ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        ta.sealArray();
1060ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
10615719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        return Pair.of(ta, defaultPropMap);
1062ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1063ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1064ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
1065bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai     * The input int[] attributeIds is a list of attributes. The returns a list of information about
1066ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * each attributes. The information is (name, isFramework)
1067ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * <p/>
1068ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *
1069bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai     * @param attributeIds An attribute array reference given to obtainStyledAttributes.
1070ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @return List of attribute information.
1071ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
1072bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai    private List<AttributeHolder> searchAttrs(int[] attributeIds) {
1073bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        List<AttributeHolder> results = new ArrayList<>(attributeIds.length);
1074ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1075ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // for each attribute, get its name so that we can search it in the style
1076bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        for (int id : attributeIds) {
1077bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(id);
1078ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            boolean isFramework = false;
1079ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (resolvedResource != null) {
1080ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                isFramework = true;
1081ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            } else {
1082bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                resolvedResource = mLayoutlibCallback.resolveResourceId(id);
1083ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
1084ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1085ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            if (resolvedResource != null) {
1086bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai                results.add(new AttributeHolder(id, resolvedResource.getSecond(), isFramework));
1087ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            } else {
1088ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                results.add(null);
1089ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
1090ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1091ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1092ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return results;
1093ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1094ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1095ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
1096ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Searches for the attribute referenced by its internal id.
1097ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *
1098ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @param attr An attribute reference given to obtainStyledAttributes such as defStyle.
1099ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @return A (name, isFramework) pair describing the attribute if found. Returns null
1100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *         if nothing is found.
1101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
11025719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private Pair<String, Boolean> searchAttr(int attr) {
1103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Pair<ResourceType, String> info = Bridge.resolveResourceId(attr);
1104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (info != null) {
1105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return Pair.of(info.getSecond(), Boolean.TRUE);
1106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1108b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta        info = mLayoutlibCallback.resolveResourceId(attr);
1109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (info != null) {
1110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return Pair.of(info.getSecond(), Boolean.FALSE);
1111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1113ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1114ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1115ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1116ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getDynamicIdByStyle(StyleResourceValue resValue) {
1117ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (mDynamicIdToStyleMap == null) {
1118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // create the maps.
11195719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            mDynamicIdToStyleMap = new HashMap<>();
11205719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            mStyleToDynamicIdMap = new HashMap<>();
1121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // look for an existing id
1124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Integer id = mStyleToDynamicIdMap.get(resValue);
1125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (id == null) {
1127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // generate a new id
1128d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta            id = ++mDynamicIdGenerator;
1129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            // and add it to the maps.
1131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            mDynamicIdToStyleMap.put(id, resValue);
1132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            mStyleToDynamicIdMap.put(resValue, id);
1133ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1135ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return id;
1136ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1137ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1138ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private StyleResourceValue getStyleByDynamicId(int i) {
1139ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (mDynamicIdToStyleMap != null) {
1140ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return mDynamicIdToStyleMap.get(i);
1141ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1142ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1143ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1144ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1145ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1146ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) {
1147d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta        if (getRenderResources().getFrameworkResource(resType, resName) != null) {
1148d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta            // Bridge.getResourceId creates a new resource id if an existing one isn't found. So,
1149d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta            // we check for the existence of the resource before calling it.
1150d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta            return Bridge.getResourceId(resType, resName);
1151ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1152ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1153ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defValue;
1154ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1155ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getProjectResourceValue(ResourceType resType, String resName, int defValue) {
1157d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta        // getResourceId creates a new resource id if an existing resource id isn't found. So, we
1158d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta        // check for the existence of the resource before calling it.
1159d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta        if (getRenderResources().getProjectResource(resType, resName) != null) {
1160b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta            if (mLayoutlibCallback != null) {
1161b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta                Integer value = mLayoutlibCallback.getResourceId(resType, resName);
1162d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta                if (value != null) {
1163d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta                    return value;
1164d972ff0acb8d3e6f8ce16db8cab5802799d65511Deepanshu Gupta                }
1165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            }
1166ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1168ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return defValue;
1169ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1170ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
11711f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta    public static Context getBaseContext(Context context) {
11721f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta        while (context instanceof ContextWrapper) {
11731f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta            context = ((ContextWrapper) context).getBaseContext();
11741f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta        }
11751f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta        return context;
11761f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta    }
11771f3c4ff2ea92c67fca7b55736b7ffb432b157b65Deepanshu Gupta
1178d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta    public IBinder getBinder() {
1179d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta        if (mBinder == null) {
1180d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta            // create a dummy binder. We only need it be not null.
1181d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta            mBinder = new IBinder() {
1182d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1183d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public String getInterfaceDescriptor() throws RemoteException {
1184d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return null;
1185d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1186d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1187d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1188d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public boolean pingBinder() {
1189d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return false;
1190d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1191d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1192d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1193d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public boolean isBinderAlive() {
1194d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return false;
1195d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1196d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1197d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1198d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public IInterface queryLocalInterface(String descriptor) {
1199d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return null;
1200d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1201d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1202d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1203d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public void dump(FileDescriptor fd, String[] args) throws RemoteException {
1204d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1205d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1206d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1207d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1208d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
1209d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1210d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1211d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1212d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1213d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public boolean transact(int code, Parcel data, Parcel reply, int flags)
1214d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        throws RemoteException {
1215d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return false;
1216d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1217d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1218d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1219d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public void linkToDeath(DeathRecipient recipient, int flags)
1220d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                        throws RemoteException {
1221d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1222d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1223d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1224d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                @Override
1225d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
1226d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                    return false;
1227d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta                }
1228c179bccfd754fc6ee203f2842ceac12194cf9401Ian Pedowitz
1229c179bccfd754fc6ee203f2842ceac12194cf9401Ian Pedowitz                @Override
1230c179bccfd754fc6ee203f2842ceac12194cf9401Ian Pedowitz                public void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
1231f6215420fe3432e2b756251a32c0cf62ad1787a3Dianne Hackborn                  String[] args, ShellCallback shellCallback, ResultReceiver resultReceiver) {
1232c179bccfd754fc6ee203f2842ceac12194cf9401Ian Pedowitz                }
1233d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta            };
1234d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta        }
1235d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta        return mBinder;
1236d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta    }
1237d4b46ab11d7f44dc3eb0ced1a5a0a3f144a1688dDeepanshu Gupta
1238ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    //------------ NOT OVERRIDEN --------------------
1239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean bindService(Intent arg0, ServiceConnection arg1, int arg2) {
1242ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1243ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1244ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1245ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1246ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1247ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkCallingOrSelfPermission(String arg0) {
1248ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1252ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkCallingOrSelfUriPermission(Uri arg0, int arg1) {
1254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1256ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1257ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1258ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1259ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkCallingPermission(String arg0) {
1260ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1261ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1263ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1264ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkCallingUriPermission(Uri arg0, int arg1) {
1266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1267ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1268ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1269ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1270ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1271ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkPermission(String arg0, int arg1, int arg2) {
1272ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1273ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1274ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
12777778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav    public int checkSelfPermission(String arg0) {
12787778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav        // pass
12797778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav        return 0;
12807778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav    }
12817778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav
12827778df5b4f3ebd67626b588e079d5a0e5d95708bSvetoslav    @Override
128342db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    public int checkPermission(String arg0, int arg1, int arg2, IBinder arg3) {
128442db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn        // pass
128542db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn        return 0;
128642db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    }
128742db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn
128842db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    @Override
1289ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3) {
1290ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1291ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1292ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1293ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1294ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
129542db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    public int checkUriPermission(Uri arg0, int arg1, int arg2, int arg3, IBinder arg4) {
129642db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn        // pass
129742db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn        return 0;
129842db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    }
129942db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn
130042db2e87e0bb2836cfd651e258a2b928fb60c823Dianne Hackborn    @Override
1301ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int checkUriPermission(Uri arg0, String arg1, String arg2, int arg3,
1302ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            int arg4, int arg5) {
1303ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1304ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0;
1305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1306ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void clearWallpaper() {
1309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1311ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1312ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1313ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1314ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Context createPackageContext(String arg0, int arg1) {
1315ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1316ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1317ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1318ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1319ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1320ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Context createPackageContextAsUser(String arg0, int arg1, UserHandle user) {
1321ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1322ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1323ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1324ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1325ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1326ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Context createConfigurationContext(Configuration overrideConfiguration) {
1327ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1328ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1329ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1330ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1331ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1332ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Context createDisplayContext(Display display) {
1333ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1334ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1335ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1336ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1337ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
13385c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski    public Context createContextForSplit(String splitName) {
13395c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski        // pass
13405c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski        return null;
13415c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski    }
13425c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski
13435c62f83fa8e6f119cb479016378e5c02789b8cb3Adam Lesinski    @Override
1344ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public String[] databaseList() {
1345ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1346ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1347ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1348ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1349ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
135082fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav    public Context createApplicationContext(ApplicationInfo application, int flags)
135182fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav            throws PackageManager.NameNotFoundException {
135282fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav        return null;
135382fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav    }
135482fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav
135582fdeddf9204e855d32d9db9fa6860e9bc780003Svetoslav    @Override
135607deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public boolean moveDatabaseFrom(Context sourceContext, String name) {
13573055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        // pass
13583055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        return false;
13593055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    }
13603055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey
13613055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    @Override
1362ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean deleteDatabase(String arg0) {
1363ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1364ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1365ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1366ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1367ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1368ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean deleteFile(String arg0) {
1369ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1370ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1371ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1372ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1373ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1374ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceCallingOrSelfPermission(String arg0, String arg1) {
1375ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1376ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1377ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1378ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1379ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1380ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceCallingOrSelfUriPermission(Uri arg0, int arg1,
1381ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String arg2) {
1382ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1383ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1384ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1385ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1386ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1387ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceCallingPermission(String arg0, String arg1) {
1388ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1389ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1390ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1391ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1392ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1393ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceCallingUriPermission(Uri arg0, int arg1, String arg2) {
1394ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1395ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1396ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1397ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1398ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1399ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforcePermission(String arg0, int arg1, int arg2, String arg3) {
1400ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1401ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1402ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1403ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1404ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1405ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceUriPermission(Uri arg0, int arg1, int arg2, int arg3,
1406ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String arg4) {
1407ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1408ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1409ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1410ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1411ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1412ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void enforceUriPermission(Uri arg0, String arg1, String arg2,
1413ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            int arg3, int arg4, int arg5, String arg6) {
1414ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1415ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1416ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1417ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1418ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1419ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public String[] fileList() {
1420ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1421ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1422ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1423ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1424ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1425807ee60dded3034941966f844a5e434473863660Deepanshu Gupta    public BridgeAssetManager getAssets() {
1426807ee60dded3034941966f844a5e434473863660Deepanshu Gupta        return mAssets;
1427ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1428ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1429ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1430ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getCacheDir() {
1431ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1432ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1433ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1434ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1435ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1436a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey    public File getCodeCacheDir() {
1437a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey        // pass
1438a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey        return null;
1439a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey    }
1440a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey
1441a750cc8961da48ceac2e58dacf9fc7107ff57333Jeff Sharkey    @Override
1442ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getExternalCacheDir() {
1443ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1444ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1445ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1446ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1447ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
144858d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov    public File getPreloadsFileCache() {
144958d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov        // pass
145058d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov        return null;
145158d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov    }
145258d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov
145358d2e2867c492598634323346900e0a2fc7c893bFyodor Kupolov    @Override
1454ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ContentResolver getContentResolver() {
1455ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (mContentResolver == null) {
1456ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            mContentResolver = new BridgeContentResolver(this);
1457ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
1458ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mContentResolver;
1459ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1460ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1461ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1462ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getDatabasePath(String arg0) {
1463ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1464ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1465ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1466ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1467ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1468ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getDir(String arg0, int arg1) {
1469ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1470ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1471ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1472ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1473ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1474ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getFileStreamPath(String arg0) {
1475ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1476ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1477ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1478ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1479ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
14804ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey    public File getSharedPreferencesPath(String name) {
14814ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey        // pass
14824ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey        return null;
14834ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey    }
14844ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey
14854ab815a73310595079806f88dbe069111c1f5296Jeff Sharkey    @Override
1486e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey    public File getDataDir() {
1487e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey        // pass
1488e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey        return null;
1489e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey    }
1490e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey
1491e7df8fcf8a3e3729bd5918c20bab27b9f25c17a7Jeff Sharkey    @Override
1492ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getFilesDir() {
1493ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1494ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1495ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1496ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1497ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1498b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate    public File getNoBackupFilesDir() {
1499b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate        // pass
1500b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate        return null;
1501b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate    }
1502b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate
1503b644ac367e0e16582b869f9ba5f3587720160851Christopher Tate    @Override
1504ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getExternalFilesDir(String type) {
1505ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1506ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1507ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1508ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1509ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1510ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public String getPackageCodePath() {
1511ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1512ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1513ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1514ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1515ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1516ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public String getBasePackageName() {
1517ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1518ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1519ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1520ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1521ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
152266692437bd9f73579facc4eae6c59334e1f273a9Kenny Root    public String getOpPackageName() {
152366692437bd9f73579facc4eae6c59334e1f273a9Kenny Root        // pass
152466692437bd9f73579facc4eae6c59334e1f273a9Kenny Root        return null;
152566692437bd9f73579facc4eae6c59334e1f273a9Kenny Root    }
152666692437bd9f73579facc4eae6c59334e1f273a9Kenny Root
152766692437bd9f73579facc4eae6c59334e1f273a9Kenny Root    @Override
1528ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ApplicationInfo getApplicationInfo() {
1529ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mApplicationInfo;
1530ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1531ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1532ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1533ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public String getPackageResourcePath() {
1534ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1535ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1536ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1537ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1538ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1539ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public SharedPreferences getSharedPreferences(String arg0, int arg1) {
1540ef10b6c0edbc4b7f47e7202816c734672789f52cDeepanshu Gupta        if (mSharedPreferences == null) {
1541ef10b6c0edbc4b7f47e7202816c734672789f52cDeepanshu Gupta            mSharedPreferences = new BridgeSharedPreferences();
1542ef10b6c0edbc4b7f47e7202816c734672789f52cDeepanshu Gupta        }
1543ef10b6c0edbc4b7f47e7202816c734672789f52cDeepanshu Gupta        return mSharedPreferences;
1544ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1545ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1546ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
154769cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey    public SharedPreferences getSharedPreferences(File arg0, int arg1) {
154869cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey        if (mSharedPreferences == null) {
154969cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey            mSharedPreferences = new BridgeSharedPreferences();
155069cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey        }
155169cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey        return mSharedPreferences;
155269cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey    }
155369cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey
155469cc25f9017371f3a95b35283637e6d247af9da3Jeff Sharkey    @Override
1555ed15a15a31489930f212ac27b81127f6b729af95Christopher Tate    public void reloadSharedPreferences() {
1556ed15a15a31489930f212ac27b81127f6b729af95Christopher Tate        // intentional noop
1557ed15a15a31489930f212ac27b81127f6b729af95Christopher Tate    }
1558ed15a15a31489930f212ac27b81127f6b729af95Christopher Tate
1559ed15a15a31489930f212ac27b81127f6b729af95Christopher Tate    @Override
156007deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public boolean moveSharedPreferencesFrom(Context sourceContext, String name) {
15613055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        // pass
15623055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        return false;
15633055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    }
15643055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey
15653055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    @Override
15663055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    public boolean deleteSharedPreferences(String name) {
15673055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        // pass
15683055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey        return false;
15693055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    }
15703055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey
15713055137d8134ff0e798768cb8b5b8974a1e588d8Jeff Sharkey    @Override
1572ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Drawable getWallpaper() {
1573ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1574ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1575ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1576ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1577ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1578ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getWallpaperDesiredMinimumWidth() {
1579ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return -1;
1580ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1581ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1582ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1583ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getWallpaperDesiredMinimumHeight() {
1584ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return -1;
1585ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1586ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1587ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1588ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void grantUriPermission(String arg0, Uri arg1, int arg2) {
1589ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1590ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1591ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1592ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1593ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1594ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public FileInputStream openFileInput(String arg0) throws FileNotFoundException {
1595ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1596ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1597ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1598ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1599ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1600ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public FileOutputStream openFileOutput(String arg0, int arg1) throws FileNotFoundException {
1601ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1602ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1603ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1604ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1605ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1606ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1, CursorFactory arg2) {
1607ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1608ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1609ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1610ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1611ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1612ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public SQLiteDatabase openOrCreateDatabase(String arg0, int arg1,
1613ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            CursorFactory arg2, DatabaseErrorHandler arg3) {
1614ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1615ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1616ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1617ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1618ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1619ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Drawable peekWallpaper() {
1620ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1621ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1622ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1623ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1624ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1625ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1) {
1626ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1627ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1628ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1629ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1630ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1631f29d1288bb4b3c339900cbe0318d975f461b4de1Chad Brubaker    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1, int arg2) {
163299d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker        // pass
163399d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker        return null;
163499d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker    }
163599d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker
163699d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker    @Override
1637ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
1638ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String arg2, Handler arg3) {
1639ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1640ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1641ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1642ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1643ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
164499d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker    public Intent registerReceiver(BroadcastReceiver arg0, IntentFilter arg1,
1645f29d1288bb4b3c339900cbe0318d975f461b4de1Chad Brubaker            String arg2, Handler arg3, int arg4) {
164699d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker        // pass
164799d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker        return null;
164899d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker    }
164999d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker
165099d8469f009565d9929e0b023da50ff7513a6e4cChad Brubaker    @Override
1651ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Intent registerReceiverAsUser(BroadcastReceiver arg0, UserHandle arg0p5,
1652ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            IntentFilter arg1, String arg2, Handler arg3) {
1653ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1654ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1655ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1656ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1657ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1658ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void removeStickyBroadcast(Intent arg0) {
1659ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1660ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1661ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1662ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1663ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1664ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void revokeUriPermission(Uri arg0, int arg1) {
1665ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1666ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1667ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1668ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1669ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
16700be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn    public void revokeUriPermission(String arg0, Uri arg1, int arg2) {
16710be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn        // pass
16720be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn
16730be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn    }
16740be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn
16750be80285b6b8cb25fc5ae317d7cbea95b015385aDianne Hackborn    @Override
1676ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendBroadcast(Intent arg0) {
1677ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1678ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1679ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1680ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1681ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1682ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendBroadcast(Intent arg0, String arg1) {
1683ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1684ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1685ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1686ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1687ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1688d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
1689d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov        // pass
1690d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov
1691d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov    }
1692d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov
1693d3943b7bd5394c1a3af08f4d837799247039cedbFyodor Kupolov    @Override
1694febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn    public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
1695febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn            String[] receiverPermissions) {
1696febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn        // pass
1697febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn
1698febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn    }
1699febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn
1700febc4591c06cc8a90a844aaf1be9718299d53d43Tyler Gunn    @Override
17015434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    public void sendBroadcast(Intent arg0, String arg1, Bundle arg2) {
17025434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn        // pass
17035434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn
17045434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    }
17055434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn
17065434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    @Override
1707ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
1708ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1709ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1710ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1711ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1712ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1) {
1713ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1714ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1715ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1716ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1717ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1718ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendOrderedBroadcast(Intent arg0, String arg1,
1719ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
1720ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bundle arg6) {
1721ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1722ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1723ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1724ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1725ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
17265434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    public void sendOrderedBroadcast(Intent arg0, String arg1,
17275434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn            Bundle arg7, BroadcastReceiver arg2, Handler arg3, int arg4, String arg5,
17285434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn            Bundle arg6) {
17295434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn        // pass
17305434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn
17315434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    }
17325434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn
17335434074acbbf76fbed19869fcfd5e3958da2737eDianne Hackborn    @Override
1734ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
1735ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
1736ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String initialData, Bundle initialExtras) {
1737ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1738ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1739ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1740ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1741ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
1742ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1743ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1744ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1745ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1746ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1747ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String receiverPermission) {
1748ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1749ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1750ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1751a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker    @Override
1752a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker    public void sendBroadcastAsUser(Intent intent, UserHandle user,
1753a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker            String receiverPermission, Bundle options) {
1754a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker        // pass
1755a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker    }
1756a77dce7c8a8b203858082e070aa32b2ff0cab4a3Chad Brubaker
1757fe4f4ce73f499edd4b693dede0b8822480248580Svet Ganov    public void sendBroadcastAsUser(Intent intent, UserHandle user,
175838f07397f29ae7b3b5cba4d632c671be0ccd4bedSvet Ganov            String receiverPermission, int appOp) {
1759fe4f4ce73f499edd4b693dede0b8822480248580Svet Ganov        // pass
1760fe4f4ce73f499edd4b693dede0b8822480248580Svet Ganov    }
1761fe4f4ce73f499edd4b693dede0b8822480248580Svet Ganov
1762ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1763ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
1764ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
1765ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            int initialCode, String initialData, Bundle initialExtras) {
1766ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1767ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1768ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1769ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
177001cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
177101cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
177201cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani            Handler scheduler,
17736819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn            int initialCode, String initialData, Bundle initialExtras) {
17746819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn        // pass
17756819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn    }
17766819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn
17776819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn    @Override
17786819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
17796819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn            String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
17806819beb4c223e20964c09a1b2712e45a51e8b46bDianne Hackborn            Handler scheduler,
178101cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani            int initialCode, String initialData, Bundle initialExtras) {
178201cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani        // pass
178301cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani    }
178401cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani
178501cbfeaf2a4ea859547cf9059a760cfa2cb69b59Amith Yamasani    @Override
1786ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendStickyBroadcast(Intent arg0) {
1787ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1788ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1789ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1790ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1791ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1792ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendStickyOrderedBroadcast(Intent intent,
1793ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData,
1794ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski           Bundle initialExtras) {
1795ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1796ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1797ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1798ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1799ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
1800ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1801ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1802ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1803ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
18044234e9b99661b0e10357243762054f9297167217Dianne Hackborn    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user, Bundle options) {
18054234e9b99661b0e10357243762054f9297167217Dianne Hackborn        // pass
18064234e9b99661b0e10357243762054f9297167217Dianne Hackborn    }
18074234e9b99661b0e10357243762054f9297167217Dianne Hackborn
18084234e9b99661b0e10357243762054f9297167217Dianne Hackborn    @Override
1809ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void sendStickyOrderedBroadcastAsUser(Intent intent,
1810ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            UserHandle user, BroadcastReceiver resultReceiver,
1811ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Handler scheduler, int initialCode, String initialData,
1812ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bundle initialExtras) {
1813ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1814ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1815ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1816ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1817ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
1818ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1819ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1820ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1821ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1822ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void setTheme(int arg0) {
1823ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1824ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1825ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1826ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1827ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1828ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void setWallpaper(Bitmap arg0) throws IOException {
1829ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1830ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1831ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1832ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1833ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1834ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void setWallpaper(InputStream arg0) throws IOException {
1835ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1836ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1837ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1838ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1839ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1840ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startActivity(Intent arg0) {
1841ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1842ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1843ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1844ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1845ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startActivity(Intent arg0, Bundle arg1) {
1846ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1847ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1848ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1849ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1850ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startIntentSender(IntentSender intent,
1851ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
1852ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            throws IntentSender.SendIntentException {
1853ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1854ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1855ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1856ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1857ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startIntentSender(IntentSender intent,
1858ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
1859ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bundle options) throws IntentSender.SendIntentException {
1860ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1861ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1862ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1863ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1864ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean startInstrumentation(ComponentName arg0, String arg1,
1865ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bundle arg2) {
1866ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1867ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1868ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1869ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1870ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1871ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ComponentName startService(Intent arg0) {
1872ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1873ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1874ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1875ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1876ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1877754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    public ComponentName startForegroundService(Intent service) {
1878754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate        // pass
1879754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate        return null;
1880754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    }
1881754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate
1882754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    @Override
1883754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    public ComponentName startForegroundServiceAsUser(Intent service, UserHandle user) {
1884754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate        // pass
1885754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate        return null;
1886754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    }
1887754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate
1888754e8e9508c90212cd8b88dcac2066e0903d1563Christopher Tate    @Override
1889ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean stopService(Intent arg0) {
1890ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1891ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1892ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1893ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1894ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1895ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public ComponentName startServiceAsUser(Intent arg0, UserHandle arg1) {
1896ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1897ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1898ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1899ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1900ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1901ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean stopServiceAsUser(Intent arg0, UserHandle arg1) {
1902ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1903ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1904ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1905ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1906ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1907ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void unbindService(ServiceConnection arg0) {
1908ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1909ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1910ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1911ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1912ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1913ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void unregisterReceiver(BroadcastReceiver arg0) {
1914ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1915ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1916ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1917ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1918ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1919ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public Context getApplicationContext() {
1920ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return this;
1921ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1922ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1923ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1924ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startActivities(Intent[] arg0) {
1925ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1926ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1927ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1928ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1929ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1930ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public void startActivities(Intent[] arg0, Bundle arg1) {
1931ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1932ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1933ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1934ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1935ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1936ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public boolean isRestricted() {
1937ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
1938ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1939ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1940ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1941ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File getObbDir() {
1942ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, "OBB not supported", null);
1943ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1944ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1945ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1946ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1947ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public DisplayAdjustments getDisplayAdjustments(int displayId) {
1948ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1949ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return null;
1950ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1951ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1952ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
19531835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski    public Display getDisplay() {
19541835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski        // pass
19551835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski        return null;
19561835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski    }
19571835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski
19581835f6367385080ebcb1c02fe02339c077f0c9cfAdam Lesinski    @Override
1959a43c71f50d43e71ad9ff021cd8a0f895d6b0b22bAndrii Kulian    public void updateDisplay(int displayId) {
1960a43c71f50d43e71ad9ff021cd8a0f895d6b0b22bAndrii Kulian        // pass
1961a43c71f50d43e71ad9ff021cd8a0f895d6b0b22bAndrii Kulian    }
1962a43c71f50d43e71ad9ff021cd8a0f895d6b0b22bAndrii Kulian
1963a43c71f50d43e71ad9ff021cd8a0f895d6b0b22bAndrii Kulian    @Override
1964ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public int getUserId() {
1965ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return 0; // not used
1966ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1967ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1968ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1969ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File[] getExternalFilesDirs(String type) {
1970ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1971ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return new File[0];
1972ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1973ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1974ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1975ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File[] getObbDirs() {
1976ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1977ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return new File[0];
1978ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
1979ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
1980ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @Override
1981ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public File[] getExternalCacheDirs() {
1982ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // pass
1983ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return new File[0];
1984ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
198503f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey
198603f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey    @Override
198703f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey    public File[] getExternalMediaDirs() {
198803f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey        // pass
198903f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey        return new File[0];
199003f13e70bdebcf919bdb526f5506a82ab1961c6dJeff Sharkey    }
1991c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen
1992c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen    public void setScrollYPos(@NonNull View view, int scrollPos) {
1993c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen        mScrollYPos.put(view, scrollPos);
1994c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen    }
1995c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen
1996c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen    public int getScrollYPos(@NonNull View view) {
1997c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen        Integer pos = mScrollYPos.get(view);
1998c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen        return pos != null ? pos : 0;
1999c46c84ee673934f340b27b40366a5a61669a4a1eJens Ole Lauridsen    }
20004b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey
2001777163c3facaed668b43061d726a572fd58f6f60Diego Perez    public void setScrollXPos(@NonNull View view, int scrollPos) {
2002777163c3facaed668b43061d726a572fd58f6f60Diego Perez        mScrollXPos.put(view, scrollPos);
2003777163c3facaed668b43061d726a572fd58f6f60Diego Perez    }
2004777163c3facaed668b43061d726a572fd58f6f60Diego Perez
2005777163c3facaed668b43061d726a572fd58f6f60Diego Perez    public int getScrollXPos(@NonNull View view) {
2006777163c3facaed668b43061d726a572fd58f6f60Diego Perez        Integer pos = mScrollXPos.get(view);
2007777163c3facaed668b43061d726a572fd58f6f60Diego Perez        return pos != null ? pos : 0;
2008777163c3facaed668b43061d726a572fd58f6f60Diego Perez    }
2009777163c3facaed668b43061d726a572fd58f6f60Diego Perez
20104b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    @Override
201107deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public Context createDeviceProtectedStorageContext() {
20124b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        // pass
20134b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        return null;
20144b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    }
20154b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey
20164b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    @Override
201707deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public Context createCredentialProtectedStorageContext() {
20184b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        // pass
20194b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        return null;
20204b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    }
20214b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey
20224b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    @Override
202307deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public boolean isDeviceProtectedStorage() {
20244b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        return false;
20254b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    }
20264b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey
20274b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    @Override
202807deb6cbc9082993040f1288cf964de066e69c96Jeff Sharkey    public boolean isCredentialProtectedStorage() {
20294b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey        return false;
20304b5aa505b91123cb8e9c203b6e3923e81e5e0205Jeff Sharkey    }
20315719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
2032d5c220b9577b09848ed18412bc65e8272e6efb61Seigo Nonaka    @Override
2033d5c220b9577b09848ed18412bc65e8272e6efb61Seigo Nonaka    public boolean canLoadUnsafeResources() {
2034b75a80419e56193c0e8a5a75301ef6c461964ed4Jerome Gaillard        return true;
2035d5c220b9577b09848ed18412bc65e8272e6efb61Seigo Nonaka    }
2036d5c220b9577b09848ed18412bc65e8272e6efb61Seigo Nonaka
2037bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai    private class AttributeHolder {
2038bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        private int resourceId;
2039bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        private String name;
2040bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        private boolean isFramework;
2041bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai
2042bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        private AttributeHolder(int resourceId, String name, boolean isFramework) {
2043bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            this.resourceId = resourceId;
2044bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            this.name = name;
2045bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai            this.isFramework = isFramework;
2046bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai        }
2047bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai    }
2048bc876628ee6b96164b91908ff62fcaefe930f403Charlie Tsai
20495719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    /**
20505719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * The cached value depends on
20515719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * <ol>
20525719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * <li>{@code int[]}: the attributes for which TypedArray is created </li>
20535719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * <li>{@code List<StyleResourceValue>}: the themes set on the context at the time of
20545719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * creation of the TypedArray</li>
20555719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * <li>{@code Integer}: the default style used at the time of creation</li>
20565719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * </ol>
20575719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     *
20585719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * The class is created by using nested maps resolving one dependency at a time.
20595719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * <p/>
20605719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * The final value of the nested maps is a pair of the typed array and a map of properties
20615719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     * that should be added to {@link #mDefaultPropMaps}, if needed.
20625719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta     */
20635719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    private static class TypedArrayCache {
20645719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
20655719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        private Map<int[],
20665719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                Map<List<StyleResourceValue>,
20675719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                        Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>> mCache;
20685719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
2069898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez        private TypedArrayCache() {
20705719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            mCache = new IdentityHashMap<>();
20715719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        }
20725719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
20735719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        public Pair<BridgeTypedArray, PropertiesMap> get(int[] attrs,
20745719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                List<StyleResourceValue> themes, int resId) {
20755719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            Map<List<StyleResourceValue>, Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>
20765719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    cacheFromThemes = mCache.get(attrs);
20775719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            if (cacheFromThemes != null) {
20785719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                Map<Integer, Pair<BridgeTypedArray, PropertiesMap>> cacheFromResId =
20795719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                        cacheFromThemes.get(themes);
20805719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                if (cacheFromResId != null) {
20815719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                    return cacheFromResId.get(resId);
20825719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                }
20835719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            }
20845719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            return null;
20855719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        }
20865719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
20875719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        public void put(int[] attrs, List<StyleResourceValue> themes, int resId,
20885719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta                Pair<BridgeTypedArray, PropertiesMap> value) {
20895719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            Map<List<StyleResourceValue>, Map<Integer, Pair<BridgeTypedArray, PropertiesMap>>>
2090898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                    cacheFromThemes = mCache.computeIfAbsent(attrs, k -> new HashMap<>());
20915719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            Map<Integer, Pair<BridgeTypedArray, PropertiesMap>> cacheFromResId =
2092898b5927b61ae0fcffe01d091a205e2baeaf5446Diego Perez                    cacheFromThemes.computeIfAbsent(themes, k -> new HashMap<>());
20935719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta            cacheFromResId.put(resId, value);
20945719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta        }
20955719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta
20965719b7e97ebbfeb891ec687f796abfe824a3182fDeepanshu Gupta    }
2097ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski}
2098