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