Loading tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +31 −12 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ import java.util.IdentityHashMap; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; /** * Custom implementation of Context/Activity to handle non compiled resources. Loading Loading @@ -299,12 +301,17 @@ public final class BridgeContext extends Activity { public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent, boolean attachToRoot, boolean skipCallbackParser) { String layoutName = resource.getName(); boolean isPlatformLayout = resource.isFramework(); if (isPlatformLayout == false && skipCallbackParser == false) { // check if the project callback can provide us with a custom parser. ILayoutPullParser parser = mProjectCallback.getParser(layoutName); ILayoutPullParser parser; if (resource instanceof ResourceValue) { parser = mProjectCallback.getParser((ResourceValue) resource); } else { parser = mProjectCallback.getParser(resource.getName()); } if (parser != null) { BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser, this, resource.isFramework()); Loading Loading @@ -372,7 +379,7 @@ public final class BridgeContext extends Activity { } else { Bridge.getLog().error(LayoutLog.TAG_BROKEN, String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "", layoutName), null); resource.getName()), null); } return Pair.of(null, false); Loading Loading @@ -507,11 +514,12 @@ public final class BridgeContext extends Activity { return null; } boolean[] frameworkAttributes = new boolean[1]; TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes); AtomicBoolean frameworkAttributes = new AtomicBoolean(); AtomicReference<String> attrName = new AtomicReference<String>(); TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes, attrName); BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, isPlatformFile); isPlatformFile, frameworkAttributes.get(), attrName.get()); // look for a custom style. String customStyle = null; Loading Loading @@ -602,7 +610,7 @@ public final class BridgeContext extends Activity { } String namespace = BridgeConstants.NS_RESOURCES; if (frameworkAttributes[0] == false) { if (frameworkAttributes.get() == false) { // need to use the application namespace namespace = mProjectCallback.getNamespace(); } Loading Loading @@ -679,10 +687,12 @@ public final class BridgeContext extends Activity { */ private BridgeTypedArray createStyleBasedTypedArray(StyleResourceValue style, int[] attrs) throws Resources.NotFoundException { TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, null); AtomicBoolean frameworkAttributes = new AtomicBoolean(); AtomicReference<String> attrName = new AtomicReference<String>(); TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes, attrName); BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, false /* platformResourceFlag */); style.isFramework(), frameworkAttributes.get(), attrName.get()); // loop through all the values in the style map, and init the TypedArray with // the style we got from the dynamic id Loading Loading @@ -714,10 +724,13 @@ public final class BridgeContext extends Activity { * that is used to reference the attribute later in the TypedArray. * * @param attrs An attribute array reference given to obtainStyledAttributes. * @param outFrameworkFlag out value indicating if the attr array is a framework value * @param outAttrName out value for the resolved attr name. * @return A sorted map Attribute-Value to Attribute-Name for all attributes declared by the * attribute array. Returns null if nothing is found. */ private TreeMap<Integer,String> searchAttrs(int[] attrs, boolean[] outFrameworkFlag) { private TreeMap<Integer,String> searchAttrs(int[] attrs, AtomicBoolean outFrameworkFlag, AtomicReference<String> outAttrName) { // get the name of the array from the framework resources String arrayName = Bridge.resolveResourceId(attrs); if (arrayName != null) { Loading @@ -734,7 +747,10 @@ public final class BridgeContext extends Activity { } if (outFrameworkFlag != null) { outFrameworkFlag[0] = true; outFrameworkFlag.set(true); } if (outAttrName != null) { outAttrName.set(arrayName); } return attributes; Loading @@ -756,7 +772,10 @@ public final class BridgeContext extends Activity { } if (outFrameworkFlag != null) { outFrameworkFlag[0] = false; outFrameworkFlag.set(false); } if (outAttrName != null) { outAttrName.set(arrayName); } return attributes; Loading tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java +5 −3 Original line number Diff line number Diff line Loading @@ -125,8 +125,10 @@ public final class BridgeResources extends Resources { mProjectCallback = projectCallback; } public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) { return new BridgeTypedArray(this, mContext, numEntries, platformFile); public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile, boolean platformStyleable, String styleableName) { return new BridgeTypedArray(this, mContext, numEntries, platformFile, platformStyleable, styleableName); } private ResourceValue getResourceValue(int id, boolean[] platformResFlag_out) { Loading Loading @@ -232,7 +234,7 @@ public final class BridgeResources extends Resources { try { // check if the current parser can provide us with a custom parser. if (mPlatformResourceFlag[0] == false) { parser = mProjectCallback.getParser(value.getName()); parser = mProjectCallback.getParser(value); } // create a new one manually if needed. Loading tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java +22 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.android; import com.android.ide.common.rendering.api.DeclareStyleableResourceValue; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; Loading Loading @@ -49,18 +50,23 @@ import java.util.Map; */ public final class BridgeTypedArray extends TypedArray { private BridgeResources mBridgeResources; private BridgeContext mContext; private final BridgeResources mBridgeResources; private final BridgeContext mContext; private final boolean mPlatformFile; private final boolean mPlatformStyleable; private final String mStyleableName; private ResourceValue[] mResourceData; private String[] mNames; private final boolean mPlatformFile; public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len, boolean platformFile) { boolean platformFile, boolean platformStyleable, String styleableName) { super(null, null, null, 0); mBridgeResources = resources; mContext = context; mPlatformFile = platformFile; mPlatformStyleable = platformStyleable; mStyleableName = styleableName; mResourceData = new ResourceValue[len]; mNames = new String[len]; } Loading Loading @@ -202,7 +208,18 @@ public final class BridgeTypedArray extends TypedArray { // Field is not null and is not an integer. // Check for possible constants and try to find them. // Get the map of attribute-constant -> IntegerValue Map<String, Integer> map = Bridge.getEnumValues(mNames[index]); Map<String, Integer> map = null; if (mPlatformStyleable) { map = Bridge.getEnumValues(mNames[index]); } else { // get the styleable matching the resolved name RenderResources res = mContext.getRenderResources(); ResourceValue styleable = res.getProjectResource(ResourceType.DECLARE_STYLEABLE, mStyleableName); if (styleable instanceof DeclareStyleableResourceValue) { map = ((DeclareStyleableResourceValue) styleable).getAttributeValues(mNames[index]); } } if (map != null) { // accumulator to store the value of the 1+ constants. Loading Loading
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +31 −12 Original line number Diff line number Diff line Loading @@ -78,6 +78,8 @@ import java.util.IdentityHashMap; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; /** * Custom implementation of Context/Activity to handle non compiled resources. Loading Loading @@ -299,12 +301,17 @@ public final class BridgeContext extends Activity { public Pair<View, Boolean> inflateView(ResourceReference resource, ViewGroup parent, boolean attachToRoot, boolean skipCallbackParser) { String layoutName = resource.getName(); boolean isPlatformLayout = resource.isFramework(); if (isPlatformLayout == false && skipCallbackParser == false) { // check if the project callback can provide us with a custom parser. ILayoutPullParser parser = mProjectCallback.getParser(layoutName); ILayoutPullParser parser; if (resource instanceof ResourceValue) { parser = mProjectCallback.getParser((ResourceValue) resource); } else { parser = mProjectCallback.getParser(resource.getName()); } if (parser != null) { BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(parser, this, resource.isFramework()); Loading Loading @@ -372,7 +379,7 @@ public final class BridgeContext extends Activity { } else { Bridge.getLog().error(LayoutLog.TAG_BROKEN, String.format("Layout %s%s does not exist.", isPlatformLayout ? "android:" : "", layoutName), null); resource.getName()), null); } return Pair.of(null, false); Loading Loading @@ -507,11 +514,12 @@ public final class BridgeContext extends Activity { return null; } boolean[] frameworkAttributes = new boolean[1]; TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes); AtomicBoolean frameworkAttributes = new AtomicBoolean(); AtomicReference<String> attrName = new AtomicReference<String>(); TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes, attrName); BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, isPlatformFile); isPlatformFile, frameworkAttributes.get(), attrName.get()); // look for a custom style. String customStyle = null; Loading Loading @@ -602,7 +610,7 @@ public final class BridgeContext extends Activity { } String namespace = BridgeConstants.NS_RESOURCES; if (frameworkAttributes[0] == false) { if (frameworkAttributes.get() == false) { // need to use the application namespace namespace = mProjectCallback.getNamespace(); } Loading Loading @@ -679,10 +687,12 @@ public final class BridgeContext extends Activity { */ private BridgeTypedArray createStyleBasedTypedArray(StyleResourceValue style, int[] attrs) throws Resources.NotFoundException { TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, null); AtomicBoolean frameworkAttributes = new AtomicBoolean(); AtomicReference<String> attrName = new AtomicReference<String>(); TreeMap<Integer, String> styleNameMap = searchAttrs(attrs, frameworkAttributes, attrName); BridgeTypedArray ta = ((BridgeResources) mSystemResources).newTypeArray(attrs.length, false /* platformResourceFlag */); style.isFramework(), frameworkAttributes.get(), attrName.get()); // loop through all the values in the style map, and init the TypedArray with // the style we got from the dynamic id Loading Loading @@ -714,10 +724,13 @@ public final class BridgeContext extends Activity { * that is used to reference the attribute later in the TypedArray. * * @param attrs An attribute array reference given to obtainStyledAttributes. * @param outFrameworkFlag out value indicating if the attr array is a framework value * @param outAttrName out value for the resolved attr name. * @return A sorted map Attribute-Value to Attribute-Name for all attributes declared by the * attribute array. Returns null if nothing is found. */ private TreeMap<Integer,String> searchAttrs(int[] attrs, boolean[] outFrameworkFlag) { private TreeMap<Integer,String> searchAttrs(int[] attrs, AtomicBoolean outFrameworkFlag, AtomicReference<String> outAttrName) { // get the name of the array from the framework resources String arrayName = Bridge.resolveResourceId(attrs); if (arrayName != null) { Loading @@ -734,7 +747,10 @@ public final class BridgeContext extends Activity { } if (outFrameworkFlag != null) { outFrameworkFlag[0] = true; outFrameworkFlag.set(true); } if (outAttrName != null) { outAttrName.set(arrayName); } return attributes; Loading @@ -756,7 +772,10 @@ public final class BridgeContext extends Activity { } if (outFrameworkFlag != null) { outFrameworkFlag[0] = false; outFrameworkFlag.set(false); } if (outAttrName != null) { outAttrName.set(arrayName); } return attributes; Loading
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeResources.java +5 −3 Original line number Diff line number Diff line Loading @@ -125,8 +125,10 @@ public final class BridgeResources extends Resources { mProjectCallback = projectCallback; } public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile) { return new BridgeTypedArray(this, mContext, numEntries, platformFile); public BridgeTypedArray newTypeArray(int numEntries, boolean platformFile, boolean platformStyleable, String styleableName) { return new BridgeTypedArray(this, mContext, numEntries, platformFile, platformStyleable, styleableName); } private ResourceValue getResourceValue(int id, boolean[] platformResFlag_out) { Loading Loading @@ -232,7 +234,7 @@ public final class BridgeResources extends Resources { try { // check if the current parser can provide us with a custom parser. if (mPlatformResourceFlag[0] == false) { parser = mProjectCallback.getParser(value.getName()); parser = mProjectCallback.getParser(value); } // create a new one manually if needed. Loading
tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java +22 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.android; import com.android.ide.common.rendering.api.DeclareStyleableResourceValue; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; Loading Loading @@ -49,18 +50,23 @@ import java.util.Map; */ public final class BridgeTypedArray extends TypedArray { private BridgeResources mBridgeResources; private BridgeContext mContext; private final BridgeResources mBridgeResources; private final BridgeContext mContext; private final boolean mPlatformFile; private final boolean mPlatformStyleable; private final String mStyleableName; private ResourceValue[] mResourceData; private String[] mNames; private final boolean mPlatformFile; public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len, boolean platformFile) { boolean platformFile, boolean platformStyleable, String styleableName) { super(null, null, null, 0); mBridgeResources = resources; mContext = context; mPlatformFile = platformFile; mPlatformStyleable = platformStyleable; mStyleableName = styleableName; mResourceData = new ResourceValue[len]; mNames = new String[len]; } Loading Loading @@ -202,7 +208,18 @@ public final class BridgeTypedArray extends TypedArray { // Field is not null and is not an integer. // Check for possible constants and try to find them. // Get the map of attribute-constant -> IntegerValue Map<String, Integer> map = Bridge.getEnumValues(mNames[index]); Map<String, Integer> map = null; if (mPlatformStyleable) { map = Bridge.getEnumValues(mNames[index]); } else { // get the styleable matching the resolved name RenderResources res = mContext.getRenderResources(); ResourceValue styleable = res.getProjectResource(ResourceType.DECLARE_STYLEABLE, mStyleableName); if (styleable instanceof DeclareStyleableResourceValue) { map = ((DeclareStyleableResourceValue) styleable).getAttributeValues(mNames[index]); } } if (map != null) { // accumulator to store the value of the 1+ constants. Loading