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

Commit 7dae72a6 authored by Xavier Ducrohet's avatar Xavier Ducrohet Committed by Android (Google) Code Review
Browse files

Merge "LayoutLib: fix some issue with resource resolution." into honeycomb

parents d126d724 eb87b3bb
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -48,6 +48,8 @@ public class BridgeConstants {

    public final static String PREFIX_ANDROID = "android:";

    public final static String RES_ANIM = "anim";
    public final static String RES_ANIMATOR = "animator";
    public final static String RES_STYLE = "style";
    public final static String RES_ATTR = "attr";
    public final static String RES_DIMEN = "dimen";
+17 −17
Original line number Diff line number Diff line
@@ -493,12 +493,12 @@ public final class BridgeContext extends Activity {
    /**
     * Resolves the value of a resource, if the value references a theme or resource value.
     * <p/>
     * This method ensures that it returns a {@link IResourceValue} object that does not
     * This method ensures that it returns a {@link ResourceValue} object that does not
     * reference another resource.
     * If the resource cannot be resolved, it returns <code>null</code>.
     * <p/>
     * If a value that does not need to be resolved is given, the method will return a new
     * instance of IResourceValue that contains the input value.
     * instance of {@link ResourceValue} that contains the input value.
     *
     * @param type the type of the resource
     * @param name the name of the attribute containing this value.
@@ -510,11 +510,11 @@ public final class BridgeContext extends Activity {
            return null;
        }

        // get the IResourceValue referenced by this value
        // get the ResourceValue referenced by this value
        ResourceValue resValue = findResValue(value, false /*forceFrameworkOnly*/);

        // if resValue is null, but value is not null, this means it was not a reference.
        // we return the name/value wrapper in a IResourceValue. the isFramework flag doesn't
        // we return the name/value wrapper in a ResourceValue. the isFramework flag doesn't
        // matter.
        if (resValue == null) {
            return new ResourceValue(type, name, value, false /*isFramework*/);
@@ -525,9 +525,9 @@ public final class BridgeContext extends Activity {
    }

    /**
     * Returns the {@link IResourceValue} referenced by the value of <var>value</var>.
     * Returns the {@link ResourceValue} referenced by the value of <var>value</var>.
     * <p/>
     * This method ensures that it returns a {@link IResourceValue} object that does not
     * This method ensures that it returns a {@link ResourceValue} object that does not
     * reference another resource.
     * If the resource cannot be resolved, it returns <code>null</code>.
     * <p/>
@@ -535,7 +535,7 @@ public final class BridgeContext extends Activity {
     * value.
     *
     * @param value the value containing the reference to resolve.
     * @return a {@link IResourceValue} object or <code>null</code>
     * @return a {@link ResourceValue} object or <code>null</code>
     */
    public ResourceValue resolveResValue(ResourceValue value) {
        if (value == null) {
@@ -547,7 +547,7 @@ public final class BridgeContext extends Activity {
            return value;
        }

        // else attempt to find another IResourceValue referenced by this one.
        // else attempt to find another ResourceValue referenced by this one.
        ResourceValue resolvedValue = findResValue(value.getValue(), value.isFramework());

        // if the value did not reference anything, then we simply return the input value
@@ -560,7 +560,7 @@ public final class BridgeContext extends Activity {
    }

    /**
     * Searches for, and returns a {@link IResourceValue} by its reference.
     * Searches for, and returns a {@link ResourceValue} by its reference.
     * <p/>
     * The reference format can be:
     * <pre>@resType/resName</pre>
@@ -577,7 +577,7 @@ public final class BridgeContext extends Activity {
     * @param reference the resource reference to search for.
     * @param forceFrameworkOnly if true all references are considered to be toward framework
     *      resource even if the reference does not include the android: prefix.
     * @return a {@link IResourceValue} or <code>null</code>.
     * @return a {@link ResourceValue} or <code>null</code>.
     */
    ResourceValue findResValue(String reference, boolean forceFrameworkOnly) {
        if (reference == null) {
@@ -670,7 +670,7 @@ public final class BridgeContext extends Activity {
    }

    /**
     * Searches for, and returns a {@link IResourceValue} by its name, and type.
     * Searches for, and returns a {@link ResourceValue} by its name, and type.
     * @param resType the type of the resource
     * @param resName  the name of the resource
     * @param frameworkOnly if <code>true</code>, the method does not search in the
@@ -746,11 +746,11 @@ public final class BridgeContext extends Activity {
    }

    /**
     * Returns the {@link IResourceValue} matching a given name in a given style. If the
     * Returns the {@link ResourceValue} matching a given name in a given style. If the
     * item is not directly available in the style, the method looks in its parent style.
     * @param style the style to search in
     * @param itemName the name of the item to search for.
     * @return the {@link IResourceValue} object or <code>null</code>
     * @return the {@link ResourceValue} object or <code>null</code>
     */
    public ResourceValue findItemInStyle(StyleResourceValue style, String itemName) {
        ResourceValue item = style.findValue(itemName);
@@ -878,8 +878,8 @@ public final class BridgeContext extends Activity {
        return null;
    }

    int getFrameworkIdValue(String idName, int defValue) {
        Integer value = Bridge.getResourceValue(BridgeConstants.RES_ID, idName);
    int getFrameworkResourceValue(String resType, String resName, int defValue) {
        Integer value = Bridge.getResourceValue(resType, resName);
        if (value != null) {
            return value.intValue();
        }
@@ -887,9 +887,9 @@ public final class BridgeContext extends Activity {
        return defValue;
    }

    int getProjectIdValue(String idName, int defValue) {
    int getProjectResourceValue(String resType, String resName, int defValue) {
        if (mProjectCallback != null) {
            Integer value = mProjectCallback.getResourceValue(BridgeConstants.RES_ID, idName);
            Integer value = mProjectCallback.getResourceValue(resType, resName);
            if (value != null) {
                return value.intValue();
            }
+0 −1
Original line number Diff line number Diff line
@@ -294,7 +294,6 @@ public final class BridgeResources extends Resources {
        return null;
    }


    @Override
    public TypedArray obtainAttributes(AttributeSet set, int[] attrs) {
        return mContext.obtainStyledAttributes(set, attrs);
+10 −8
Original line number Diff line number Diff line
@@ -577,19 +577,21 @@ public final class BridgeTypedArray extends TypedArray {
            return mContext.getDynamicIdByStyle((StyleResourceValue)resValue);
        }

        // if the attribute was a reference to an id, and not a declaration of an id (@+id), then
        // the xml attribute value was "resolved" which leads us to a ResourceValue with
        // getType() returning "id" and getName() returning the id name
        // if the attribute was a reference to a resource, and not a declaration of an id (@+id),
        // then the xml attribute value was "resolved" which leads us to a ResourceValue with a
        // valid getType() and getName() returning a resource name.
        // (and getValue() returning null!). We need to handle this!
        if (resValue.getType() != null && resValue.getType().equals(BridgeConstants.RES_ID)) {
        if (resValue.getType() != null && resValue.getType().startsWith("@+") == false) {
            // if this is a framework id
            if (mPlatformFile || resValue.isFramework()) {
                // look for idName in the android R classes
                return mContext.getFrameworkIdValue(resValue.getName(), defValue);
                return mContext.getFrameworkResourceValue(
                        resValue.getType(), resValue.getName(), defValue);
            }

            // look for idName in the project R class.
            return mContext.getProjectIdValue(resValue.getName(), defValue);
            return mContext.getProjectResourceValue(
                    resValue.getType(), resValue.getName(), defValue);
        }

        // else, try to get the value, and resolve it somehow.
@@ -626,11 +628,11 @@ public final class BridgeTypedArray extends TypedArray {
            // if this is a framework id
            if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) {
                // look for idName in the android R classes
                return mContext.getFrameworkIdValue(idName, defValue);
                return mContext.getFrameworkResourceValue(BridgeConstants.RES_ID, idName, defValue);
            }

            // look for idName in the project R class.
            return mContext.getProjectIdValue(idName, defValue);
            return mContext.getProjectResourceValue(BridgeConstants.RES_ID, idName, defValue);
        }

        // not a direct id valid reference? resolve it
+8 −4
Original line number Diff line number Diff line
@@ -505,14 +505,18 @@ public class RenderSessionImpl {
        ResourceValue animationResource = null;
        int animationId = 0;
        if (isFrameworkAnimation) {
            animationResource = mContext.getFrameworkResource("anim", animationName);
            animationResource = mContext.getFrameworkResource(BridgeConstants.RES_ANIM,
                    animationName);
            if (animationResource != null) {
                animationId = Bridge.getResourceValue("anim", animationName);
                animationId = Bridge.getResourceValue(BridgeConstants.RES_ANIM,
                        animationName);
            }
        } else {
            animationResource = mContext.getProjectResource("anim", animationName);
            animationResource = mContext.getProjectResource(BridgeConstants.RES_ANIM,
                    animationName);
            if (animationResource != null) {
                animationId = mContext.getProjectCallback().getResourceValue("anim", animationName);
                animationId = mContext.getProjectCallback().getResourceValue(
                        BridgeConstants.RES_ANIM, animationName);
            }
        }