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