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

Commit beb5fb62 authored by Xavier Ducrohet's avatar Xavier Ducrohet
Browse files

Merge 988eeeb5 from hc-mr1.

Support for custom declare-styleable attr with enum/flag in layoutlib.

Change-Id: I10426a3f2c76bed207c03fab7885b4269337a70f
parent cea03df2
Loading
Loading
Loading
Loading
+23 −9
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.
@@ -507,11 +509,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 +605,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 +682,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 +719,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 +742,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 +767,10 @@ public final class BridgeContext extends Activity {
            }

            if (outFrameworkFlag != null) {
                outFrameworkFlag[0] = false;
                outFrameworkFlag.set(false);
            }
            if (outAttrName != null) {
                outAttrName.set(arrayName);
            }

            return attributes;
+4 −2
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) {
+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.