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

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

Bring in more layout lib changes from hc-mr1.

fe051bb2 : Change the way the layoutlib instantiate its XmlPullParser.

A lot of the init code was duplicated so I made a ParserFactory class.

Also created an extension of the KXmlPullParser to override toString().
This allows easier debugging when dealing with multiple parsers (which
is always the case).

Also added some (disabled) debugging printf to deal with parser stack
as it can be tricky figuring out which parsers are in the stack at
which point.

8969147c : Fix case where the int[] attrs doesn't directly match a styleable.

In the case of the FastScroller the int[] is a custom mix of attr
instead of a int[] that exists as R.styleable.foo.

This makes our reflection based mechanism used to find the styleable
fail, so instead we search for each attribute separately (like
we probably should have done from the beginning).

0c264b35: Fix various cases of getDimension to report error if unit is missing.

if getDimention###() is called for a string that has no unit,
then an error is output through LayoutLog, but the rendering keeps
going by using dp as a default.

0beb7eea: Make (Bridge)TypedArray.getInteger() call out to getInt()

Only getInt() resolved attribute flags/enum and I'm not sure why
there's two to begin with.

Change-Id: I015111263d2a2bee76834978ae71eef79defdae3
parent d6465e10
Loading
Loading
Loading
Loading
+23 −19
Original line number Diff line number Diff line
@@ -25,11 +25,11 @@ import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.rendering.api.StyleResourceValue;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.BridgeConstants;
import com.android.layoutlib.bridge.impl.ParserFactory;
import com.android.layoutlib.bridge.impl.Stack;
import com.android.resources.ResourceType;
import com.android.util.Pair;

import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

@@ -201,6 +201,9 @@ public final class BridgeContext extends Activity {
     * @param parser the parser to add.
     */
    public void pushParser(BridgeXmlBlockParser parser) {
        if (ParserFactory.LOG_PARSER) {
            System.out.println("PUSH " + parser.getParser().toString());
        }
        mParserStack.push(parser);
    }

@@ -208,7 +211,10 @@ public final class BridgeContext extends Activity {
     * Removes the parser at the top of the stack
     */
    public void popParser() {
        mParserStack.pop();
        BridgeXmlBlockParser parser = mParserStack.pop();
        if (ParserFactory.LOG_PARSER) {
            System.out.println("POPD " + parser.getParser().toString());
        }
    }

    /**
@@ -341,9 +347,7 @@ public final class BridgeContext extends Activity {
                // we need to create a pull parser around the layout XML file, and then
                // give that to our XmlBlockParser
                try {
                    KXmlParser parser = new KXmlParser();
                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                    parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
                    XmlPullParser parser = ParserFactory.create(xml);

                    // set the resource ref to have correct view cookies
                    mBridgeInflater.setResourceReference(resource);
@@ -682,25 +686,25 @@ public final class BridgeContext extends Activity {
     */
    private BridgeTypedArray createStyleBasedTypedArray(StyleResourceValue style, int[] attrs)
            throws Resources.NotFoundException {
        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,
                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
        for (Entry<Integer, String> styleAttribute : styleNameMap.entrySet()) {
            int index = styleAttribute.getKey().intValue();
                false, true, null);

            String name = styleAttribute.getValue();

            // get the value from the style, or its parent styles.
            ResourceValue resValue = mRenderResources.findItemInStyle(style, name);
        // for each attribute, get its name so that we can search it in the style
        for (int i = 0 ; i < attrs.length ; i++) {
            Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attrs[i]);
            if (resolvedResource != null) {
                String attrName = resolvedResource.getSecond();
                // look for the value in the given style
                ResourceValue resValue = mRenderResources.findItemInStyle(style, attrName);

                if (resValue != null) {
                    // resolve it to make sure there are no references left.
            ta.bridgeSetValue(index, name, mRenderResources.resolveResValue(resValue));
                    ta.bridgeSetValue(i, attrName, mRenderResources.resolveResValue(resValue));

                    resValue = mRenderResources.resolveResValue(resValue);
                }
            }
        }

        ta.sealArray();
+2 −5
Original line number Diff line number Diff line
@@ -22,10 +22,10 @@ import com.android.ide.common.rendering.api.MergeCookie;
import com.android.ide.common.rendering.api.ResourceReference;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.ParserFactory;
import com.android.resources.ResourceType;
import com.android.util.Pair;

import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;

import android.content.Context;
@@ -36,7 +36,6 @@ import android.view.View;
import android.view.ViewGroup;

import java.io.File;
import java.io.FileInputStream;

/**
 * Custom implementation of {@link LayoutInflater} to handle custom views.
@@ -175,9 +174,7 @@ public final class BridgeInflater extends LayoutInflater {
                File f = new File(value.getValue());
                if (f.isFile()) {
                    try {
                        KXmlParser parser = new KXmlParser();
                        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                        parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$
                        XmlPullParser parser = ParserFactory.create(f);

                        BridgeXmlBlockParser bridgeParser = new BridgeXmlBlockParser(
                                parser, bridgeContext, false);
+56 −53
Original line number Diff line number Diff line
@@ -21,12 +21,12 @@ import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.BridgeConstants;
import com.android.layoutlib.bridge.impl.ParserFactory;
import com.android.layoutlib.bridge.impl.ResourceHelper;
import com.android.ninepatch.NinePatch;
import com.android.resources.ResourceType;
import com.android.util.Pair;

import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

@@ -131,14 +131,16 @@ public final class BridgeResources extends Resources {
                platformStyleable, styleableName);
    }

    private ResourceValue getResourceValue(int id, boolean[] platformResFlag_out) {
    private Pair<String, ResourceValue> getResourceValue(int id, boolean[] platformResFlag_out) {
        // first get the String related to this id in the framework
        Pair<ResourceType, String> resourceInfo = Bridge.resolveResourceId(id);

        if (resourceInfo != null) {
            platformResFlag_out[0] = true;
            return mContext.getRenderResources().getFrameworkResource(
                    resourceInfo.getFirst(), resourceInfo.getSecond());
            String attributeName = resourceInfo.getSecond();

            return Pair.of(attributeName, mContext.getRenderResources().getFrameworkResource(
                    resourceInfo.getFirst(), attributeName));
        }

        // didn't find a match in the framework? look in the project.
@@ -147,8 +149,10 @@ public final class BridgeResources extends Resources {

            if (resourceInfo != null) {
                platformResFlag_out[0] = false;
                return mContext.getRenderResources().getProjectResource(
                        resourceInfo.getFirst(), resourceInfo.getSecond());
                String attributeName = resourceInfo.getSecond();

                return Pair.of(attributeName, mContext.getRenderResources().getProjectResource(
                        resourceInfo.getFirst(), attributeName));
            }
        }

@@ -157,10 +161,10 @@ public final class BridgeResources extends Resources {

    @Override
    public Drawable getDrawable(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            return ResourceHelper.getDrawable(value, mContext);
            return ResourceHelper.getDrawable(value.getSecond(), mContext);
        }

        // id was not found or not resolved. Throw a NotFoundException.
@@ -172,11 +176,11 @@ public final class BridgeResources extends Resources {

    @Override
    public int getColor(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            try {
                return ResourceHelper.getColor(value.getValue());
                return ResourceHelper.getColor(value.getSecond().getValue());
            } catch (NumberFormatException e) {
                Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e,
                        null /*data*/);
@@ -193,10 +197,11 @@ public final class BridgeResources extends Resources {

    @Override
    public ColorStateList getColorStateList(int id) throws NotFoundException {
        ResourceValue resValue = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> resValue = getResourceValue(id, mPlatformResourceFlag);

        if (resValue != null) {
            ColorStateList stateList = ResourceHelper.getColorStateList(resValue, mContext);
            ColorStateList stateList = ResourceHelper.getColorStateList(resValue.getSecond(),
                    mContext);
            if (stateList != null) {
                return stateList;
            }
@@ -211,10 +216,10 @@ public final class BridgeResources extends Resources {

    @Override
    public CharSequence getText(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            return value.getValue();
            return value.getSecond().getValue();
        }

        // id was not found or not resolved. Throw a NotFoundException.
@@ -226,9 +231,10 @@ public final class BridgeResources extends Resources {

    @Override
    public XmlResourceParser getLayout(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
        if (v != null) {
            ResourceValue value = v.getSecond();
            XmlPullParser parser = null;

            try {
@@ -243,9 +249,7 @@ public final class BridgeResources extends Resources {
                    if (xml.isFile()) {
                        // we need to create a pull parser around the layout XML file, and then
                        // give that to our XmlBlockParser
                        parser = new KXmlParser();
                        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                        parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
                        parser = ParserFactory.create(xml);
                    }
                }

@@ -271,9 +275,10 @@ public final class BridgeResources extends Resources {

    @Override
    public XmlResourceParser getAnimation(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> v = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
        if (v != null) {
            ResourceValue value = v.getSecond();
            XmlPullParser parser = null;

            try {
@@ -281,9 +286,7 @@ public final class BridgeResources extends Resources {
                if (xml.isFile()) {
                    // we need to create a pull parser around the layout XML file, and then
                    // give that to our XmlBlockParser
                    parser = new KXmlParser();
                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                    parser.setInput(new FileInputStream(xml), "UTF-8"); //$NON-NLS-1$);
                    parser = ParserFactory.create(xml);

                    return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
                }
@@ -317,10 +320,10 @@ public final class BridgeResources extends Resources {

    @Override
    public float getDimension(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String v = value.getValue();
            String v = value.getSecond().getValue();

            if (v != null) {
                if (v.equals(BridgeConstants.MATCH_PARENT) ||
@@ -330,7 +333,8 @@ public final class BridgeResources extends Resources {
                    return LayoutParams.WRAP_CONTENT;
                }

                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
                if (ResourceHelper.parseFloatAttribute(
                        value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
                    return mTmpValue.getDimension(mMetrics);
                }
@@ -346,13 +350,14 @@ public final class BridgeResources extends Resources {

    @Override
    public int getDimensionPixelOffset(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String v = value.getValue();
            String v = value.getSecond().getValue();

            if (v != null) {
                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
                if (ResourceHelper.parseFloatAttribute(
                        value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
                    return TypedValue.complexToDimensionPixelOffset(mTmpValue.data, mMetrics);
                }
@@ -368,13 +373,14 @@ public final class BridgeResources extends Resources {

    @Override
    public int getDimensionPixelSize(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String v = value.getValue();
            String v = value.getSecond().getValue();

            if (v != null) {
                if (ResourceHelper.stringToFloat(v, mTmpValue) &&
                if (ResourceHelper.parseFloatAttribute(
                        value.getFirst(), v, mTmpValue, true /*requireUnit*/) &&
                        mTmpValue.type == TypedValue.TYPE_DIMENSION) {
                    return TypedValue.complexToDimensionPixelSize(mTmpValue.data, mMetrics);
                }
@@ -390,10 +396,10 @@ public final class BridgeResources extends Resources {

    @Override
    public int getInteger(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null && value.getValue() != null) {
            String v = value.getValue();
        if (value != null && value.getSecond().getValue() != null) {
            String v = value.getSecond().getValue();
            int radix = 10;
            if (v.startsWith("0x")) {
                v = v.substring(2);
@@ -445,10 +451,10 @@ public final class BridgeResources extends Resources {

    @Override
    public String getString(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null && value.getValue() != null) {
            return value.getValue();
        if (value != null && value.getSecond().getValue() != null) {
            return value.getSecond().getValue();
        }

        // id was not found or not resolved. Throw a NotFoundException.
@@ -461,13 +467,14 @@ public final class BridgeResources extends Resources {
    @Override
    public void getValue(int id, TypedValue outValue, boolean resolveRefs)
            throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String v = value.getValue();
            String v = value.getSecond().getValue();

            if (v != null) {
                if (ResourceHelper.stringToFloat(v, outValue)) {
                if (ResourceHelper.parseFloatAttribute(value.getFirst(), v, outValue,
                        false /*requireUnit*/)) {
                    return;
                }

@@ -490,19 +497,17 @@ public final class BridgeResources extends Resources {

    @Override
    public XmlResourceParser getXml(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String v = value.getValue();
            String v = value.getSecond().getValue();

            if (v != null) {
                // check this is a file
                File f = new File(value.getValue());
                File f = new File(v);
                if (f.isFile()) {
                    try {
                        KXmlParser parser = new KXmlParser();
                        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                        parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
                        XmlPullParser parser = ParserFactory.create(f);

                        return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
                    } catch (XmlPullParserException e) {
@@ -535,9 +540,7 @@ public final class BridgeResources extends Resources {

        File f = new File(file);
        try {
            KXmlParser parser = new KXmlParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
            parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
            XmlPullParser parser = ParserFactory.create(f);

            return new BridgeXmlBlockParser(parser, mContext, mPlatformResourceFlag[0]);
        } catch (XmlPullParserException e) {
@@ -554,10 +557,10 @@ public final class BridgeResources extends Resources {

    @Override
    public InputStream openRawResource(int id) throws NotFoundException {
        ResourceValue value = getResourceValue(id, mPlatformResourceFlag);
        Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);

        if (value != null) {
            String path = value.getValue();
            String path = value.getSecond().getValue();

            if (path != null) {
                // check this is a file
+11 −31
Original line number Diff line number Diff line
@@ -24,10 +24,10 @@ import com.android.ide.common.rendering.api.StyleResourceValue;
import com.android.internal.util.XmlUtils;
import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.BridgeConstants;
import com.android.layoutlib.bridge.impl.ParserFactory;
import com.android.layoutlib.bridge.impl.ResourceHelper;
import com.android.resources.ResourceType;

import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

@@ -41,7 +41,6 @@ import android.view.LayoutInflater_Delegate;
import android.view.ViewGroup.LayoutParams;

import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.Map;

@@ -211,7 +210,7 @@ public final class BridgeTypedArray extends TypedArray {
        Map<String, Integer> map = null;
        if (mPlatformStyleable) {
            map = Bridge.getEnumValues(mNames[index]);
        } else {
        } else if (mStyleableName != null) {
            // get the styleable matching the resolved name
            RenderResources res = mContext.getRenderResources();
            ResourceValue styleable = res.getProjectResource(ResourceType.DECLARE_STYLEABLE,
@@ -331,9 +330,7 @@ public final class BridgeTypedArray extends TypedArray {
        File f = new File(value);
        if (f.isFile()) {
            try {
                KXmlParser parser = new KXmlParser();
                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
                parser.setInput(new FileInputStream(f), "UTF-8"); //$NON-NLS-1$);
                XmlPullParser parser = ParserFactory.create(f);

                BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
                        parser, mContext, resValue.isFramework());
@@ -377,26 +374,7 @@ public final class BridgeTypedArray extends TypedArray {
     */
    @Override
    public int getInteger(int index, int defValue) {
        if (mResourceData[index] == null) {
            return defValue;
        }

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

        if (s != null) {
            try {
                return Integer.parseInt(s);
            } catch (NumberFormatException e) {
                Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
                        String.format(
                            "\"%s\" in attribute \"%2$s\" cannont be converted to an integer.",
                            s, mNames[index]), null /*data*/);

                // The default value is returned below.
            }
        }

        return defValue;
        return getInt(index, defValue);
    }

    /**
@@ -434,7 +412,7 @@ public final class BridgeTypedArray extends TypedArray {
            return defValue;
        }

        if (ResourceHelper.stringToFloat(s, mValue)) {
        if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) {
            return mValue.getDimension(mBridgeResources.mMetrics);
        }

@@ -561,7 +539,7 @@ public final class BridgeTypedArray extends TypedArray {
            throw new RuntimeException();
        }

        if (ResourceHelper.stringToFloat(s, mValue)) {
        if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true /*requireUnit*/)) {
            float f = mValue.getDimension(mBridgeResources.mMetrics);

            final int res = (int)(f+0.5f);
@@ -599,14 +577,15 @@ public final class BridgeTypedArray extends TypedArray {
            return defValue;
        }

        if (ResourceHelper.stringToFloat(value, mValue)) {
        if (ResourceHelper.parseFloatAttribute(mNames[index], value, mValue,
                false /*requireUnit*/)) {
            return mValue.getFraction(base, pbase);
        }

        // looks like we were unable to resolve the fraction value
        Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
                String.format(
                    "\"%1$s\" in attribute \"%2$s\" cannont be converted to a fraction.",
                    "\"%1$s\" in attribute \"%2$s\" cannot be converted to a fraction.",
                    value, mNames[index]), null /*data*/);

        return defValue;
@@ -803,7 +782,8 @@ public final class BridgeTypedArray extends TypedArray {

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

        return ResourceHelper.stringToFloat(s, outValue);
        return ResourceHelper.parseFloatAttribute(mNames[index], s, outValue,
                false /*requireUnit*/);
    }

    /**
+54 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.layoutlib.bridge.android;


import com.android.ide.common.rendering.api.ILayoutPullParser;
import com.android.layoutlib.bridge.impl.ParserFactory;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -54,6 +55,10 @@ public class BridgeXmlBlockParser implements XmlResourceParser {
     * @param platformFile Indicates whether the the file is a platform file or not.
     */
    public BridgeXmlBlockParser(XmlPullParser parser, BridgeContext context, boolean platformFile) {
        if (ParserFactory.LOG_PARSER) {
            System.out.println("CRTE " + parser.toString());
        }

        mParser = parser;
        mContext = context;
        mPlatformFile = platformFile;
@@ -65,6 +70,10 @@ public class BridgeXmlBlockParser implements XmlResourceParser {
        }
    }

    public XmlPullParser getParser() {
        return mParser;
    }

    public boolean isPlatformFile() {
        return mPlatformFile;
    }
@@ -247,18 +256,63 @@ public class BridgeXmlBlockParser implements XmlResourceParser {
    public int next() throws XmlPullParserException, IOException {
        if (!mStarted) {
            mStarted = true;

            if (ParserFactory.LOG_PARSER) {
                System.out.println("STRT " + mParser.toString());
            }

            return START_DOCUMENT;
        }

        int ev = mParser.next();

        if (ParserFactory.LOG_PARSER) {
            System.out.println("NEXT " + mParser.toString() + " " +
                    eventTypeToString(mEventType) + " -> " + eventTypeToString(ev));
        }

        if (ev == END_TAG && mParser.getDepth() == 1) {
            // done with parser remove it from the context stack.
            ensurePopped();

            if (ParserFactory.LOG_PARSER) {
                System.out.println("");
            }
        }

        mEventType = ev;
        return ev;
    }

    public static String eventTypeToString(int eventType) {
        switch (eventType) {
            case START_DOCUMENT:
                return "START_DOC";
            case END_DOCUMENT:
                return "END_DOC";
            case START_TAG:
                return "START_TAG";
            case END_TAG:
                return "END_TAG";
            case TEXT:
                return "TEXT";
            case CDSECT:
                return "CDSECT";
            case ENTITY_REF:
                return "ENTITY_REF";
            case IGNORABLE_WHITESPACE:
                return "IGNORABLE_WHITESPACE";
            case PROCESSING_INSTRUCTION:
                return "PROCESSING_INSTRUCTION";
            case COMMENT:
                return "COMMENT";
            case DOCDECL:
                return "DOCDECL";
        }

        return "????";
    }

    public void require(int type, String namespace, String name)
            throws XmlPullParserException {
        if (type != getEventType()
Loading