Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e0f7118 authored by Xavier Ducrohet's avatar Xavier Ducrohet Committed by Android Git Automerger
Browse files

am 8ee28811: Merge changes Idbb70f53,I10426a3f into honeycomb-mr2

* commit '8ee28811':
  Merge 06942bc4 from hc-mr1.
  Merge 988eeeb5 from hc-mr1.
parents 3aabdeac 8ee28811
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -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.
@@ -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());
@@ -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);
@@ -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;
@@ -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();
        }
@@ -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
@@ -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) {
@@ -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;
@@ -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;
+5 −3
Original line number Diff line number Diff line
@@ -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) {
@@ -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.
+22 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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];
    }
@@ -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.