am dd21212f: am eb26f5ce: LayoutLib: Fix typedArray caching.

* commit 'dd21212fa1a9c907d5d2f80f3de2413f6c14da7a':
  LayoutLib: Fix typedArray caching.
This commit is contained in:
Deepanshu Gupta
2015-09-01 23:59:10 +00:00
committed by Android Git Automerger

View File

@@ -36,8 +36,8 @@ import com.android.util.Pair;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.annotation.Nullable;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -136,8 +136,9 @@ public final class BridgeContext extends Context {
private Map<StyleResourceValue, Integer> mStyleToDynamicIdMap;
private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
// cache for TypedArray generated from IStyleResourceValue object
private Map<int[], Map<Integer, BridgeTypedArray>> mTypedArrayCache;
// cache for TypedArray generated from StyleResourceValue object
private Map<int[], Map<List<StyleResourceValue>, Map<Integer, BridgeTypedArray>>>
mTypedArrayCache;
private BridgeInflater mBridgeInflater;
private BridgeContentResolver mContentResolver;
@@ -588,31 +589,38 @@ public final class BridgeContext extends Context {
}
}
// The map is from
// attrs (int[]) -> context's current themes (List<StyleRV>) -> resid (int) -> typed array.
if (mTypedArrayCache == null) {
mTypedArrayCache = new HashMap<int[], Map<Integer,BridgeTypedArray>>();
Map<Integer, BridgeTypedArray> map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map);
BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs);
map.put(resid, ta);
return ta;
mTypedArrayCache = new IdentityHashMap<int[],
Map<List<StyleResourceValue>, Map<Integer, BridgeTypedArray>>>();
}
// get the 2nd map
Map<Integer, BridgeTypedArray> map = mTypedArrayCache.get(attrs);
if (map == null) {
map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map);
Map<List<StyleResourceValue>, Map<Integer, BridgeTypedArray>> map2 =
mTypedArrayCache.get(attrs);
if (map2 == null) {
map2 = new HashMap<List<StyleResourceValue>, Map<Integer, BridgeTypedArray>>();
mTypedArrayCache.put(attrs, map2);
}
// get the array from the 2nd map
BridgeTypedArray ta = map.get(resid);
// get the 3rd map
List<StyleResourceValue> currentThemes = mRenderResources.getAllThemes();
Map<Integer, BridgeTypedArray> map3 = map2.get(currentThemes);
if (map3 == null) {
map3 = new HashMap<Integer, BridgeTypedArray>();
// Create a copy of the list before adding it to the map. This allows reusing the
// existing list.
currentThemes = new ArrayList<StyleResourceValue>(currentThemes);
map2.put(currentThemes, map3);
}
// get the array from the 3rd map
BridgeTypedArray ta = map3.get(resid);
if (ta == null) {
ta = createStyleBasedTypedArray(style, attrs);
map.put(resid, ta);
map3.put(resid, ta);
}
return ta;