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

Commit 4c1e73b6 authored by Xavier Ducrohet's avatar Xavier Ducrohet
Browse files

Merge e57aa434 from honeycomb-mr1. do not merge.

LayoutLib: Fix issue where <include> with no layout params wouldn't display.

The issue is that the layout params from the root element of the included
layout should be used but this failed because loading the layout params
from the <include> tag didn't throw a RuntimeException in our modified
code (BridgeTypedArray).

Because we don't want to throw exception in general we only throw it
when reading the layout params of an include node which is pretty crappy,
but works for now.

Change-Id: I83ccf956e8b476f34dfc9a70aebae2288d53746e
parent f791863f
Loading
Loading
Loading
Loading
+14 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,8 @@ import java.io.IOException;
 */
 */
public class LayoutInflater_Delegate {
public class LayoutInflater_Delegate {


    public static boolean sIsInInclude = false;

    @LayoutlibDelegate
    @LayoutlibDelegate
    /*package*/ static void parseInclude(LayoutInflater thisInflater,
    /*package*/ static void parseInclude(LayoutInflater thisInflater,
            XmlPullParser parser, View parent, AttributeSet attrs)
            XmlPullParser parser, View parent, AttributeSet attrs)
@@ -109,10 +111,22 @@ public class LayoutInflater_Delegate {
                        // false means we need to rely on the included layout params.
                        // false means we need to rely on the included layout params.
                        ViewGroup.LayoutParams params = null;
                        ViewGroup.LayoutParams params = null;
                        try {
                        try {
                            // ---- START CHANGES
                            sIsInInclude = true;
                            // ---- END CHANGES

                            params = group.generateLayoutParams(attrs);
                            params = group.generateLayoutParams(attrs);
                        } catch (RuntimeException e) {
                        } catch (RuntimeException e) {
                            // ---- START CHANGES
                            sIsInInclude = false;
                            // ---- END CHANGES

                            params = group.generateLayoutParams(childAttrs);
                            params = group.generateLayoutParams(childAttrs);
                        } finally {
                        } finally {
                            // ---- START CHANGES
                            sIsInInclude = false;
                            // ---- END CHANGES

                            if (params != null) {
                            if (params != null) {
                                view.setLayoutParams(params);
                                view.setLayoutParams(params);
                            }
                            }
+58 −31
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.LayoutInflater_Delegate;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.LayoutParams;


import java.io.File;
import java.io.File;
@@ -471,41 +472,24 @@ public final class BridgeTypedArray extends TypedArray {
     */
     */
    @Override
    @Override
    public int getDimensionPixelSize(int index, int defValue) {
    public int getDimensionPixelSize(int index, int defValue) {
        if (mResourceData[index] == null) {
        try {
            return defValue;
            return getDimension(index);
        }
        } catch (RuntimeException e) {

            if (mResourceData[index] != null) {
                String s = mResourceData[index].getValue();
                String s = mResourceData[index].getValue();


        if (s == null) {
                if (s != null) {
            return defValue;
        } else if (s.equals(BridgeConstants.MATCH_PARENT) ||
                s.equals(BridgeConstants.FILL_PARENT)) {
            return LayoutParams.MATCH_PARENT;
        } else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
            return LayoutParams.WRAP_CONTENT;
        } else if (RenderResources.REFERENCE_NULL.equals(s)) {
            return defValue;
        }

        if (ResourceHelper.stringToFloat(s, mValue)) {
            float f = mValue.getDimension(mBridgeResources.mMetrics);

            final int res = (int)(f+0.5f);
            if (res != 0) return res;
            if (f == 0) return 0;
            if (f > 0) return 1;
            return defValue; // this is basically unreachable.
        }

                    // looks like we were unable to resolve the dimension value
                    // looks like we were unable to resolve the dimension value
                    Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
                    Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
                            String.format(
                            String.format(
                                "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
                                "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
                                s, mNames[index]), null /*data*/);
                                s, mNames[index]), null /*data*/);
                }
            }


            return defValue;
            return defValue;
        }
        }
    }


    /**
    /**
     * Special version of {@link #getDimensionPixelSize} for retrieving
     * Special version of {@link #getDimensionPixelSize} for retrieving
@@ -521,7 +505,20 @@ public final class BridgeTypedArray extends TypedArray {
     */
     */
    @Override
    @Override
    public int getLayoutDimension(int index, String name) {
    public int getLayoutDimension(int index, String name) {
        return getDimensionPixelSize(index, 0);
        try {
            // this will throw an exception
            return getDimension(index);
        } catch (RuntimeException e) {

            if (LayoutInflater_Delegate.sIsInInclude) {
                throw new RuntimeException();
            }

            Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
                    "You must supply a " + name + " attribute.", null);

            return 0;
        }
    }
    }


    @Override
    @Override
@@ -529,6 +526,36 @@ public final class BridgeTypedArray extends TypedArray {
        return getDimensionPixelSize(index, defValue);
        return getDimensionPixelSize(index, defValue);
    }
    }


    private int getDimension(int index) {
        if (mResourceData[index] == null) {
            throw new RuntimeException();
        }

        String s = mResourceData[index].getValue();

        if (s == null) {
            throw new RuntimeException();
        } else if (s.equals(BridgeConstants.MATCH_PARENT) ||
                s.equals(BridgeConstants.FILL_PARENT)) {
            return LayoutParams.MATCH_PARENT;
        } else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
            return LayoutParams.WRAP_CONTENT;
        } else if (RenderResources.REFERENCE_NULL.equals(s)) {
            throw new RuntimeException();
        }

        if (ResourceHelper.stringToFloat(s, mValue)) {
            float f = mValue.getDimension(mBridgeResources.mMetrics);

            final int res = (int)(f+0.5f);
            if (res != 0) return res;
            if (f == 0) return 0;
            if (f > 0) return 1;
        }

        throw new RuntimeException();
    }

    /**
    /**
     * Retrieve a fractional unit attribute at <var>index</var>.
     * Retrieve a fractional unit attribute at <var>index</var>.
     *
     *
+0 −1
Original line number Original line Diff line number Diff line
@@ -102,7 +102,6 @@ public final class CreateInfo implements ICreateInfo {
        "android.view.LayoutInflater#parseInclude",
        "android.view.LayoutInflater#parseInclude",
        "android.view.View#isInEditMode",
        "android.view.View#isInEditMode",
        "com.android.internal.util.XmlUtils#convertValueToInt",
        "com.android.internal.util.XmlUtils#convertValueToInt",
        // TODO: comment out once DelegateClass is working
    };
    };


    /**
    /**