1e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta/*
2e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * Copyright (C) 2015 The Android Open Source Project
3e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta *
4e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License");
5e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * you may not use this file except in compliance with the License.
6e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * You may obtain a copy of the License at
7e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta *
8e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta *      http://www.apache.org/licenses/LICENSE-2.0
9e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta *
10e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * Unless required by applicable law or agreed to in writing, software
11e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS,
12e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * See the License for the specific language governing permissions and
14e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * limitations under the License.
15e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta */
16e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
17e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptapackage com.android.layoutlib.bridge.impl;
18e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
19e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport org.xmlpull.v1.XmlPullParser;
20e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport org.xmlpull.v1.XmlPullParserException;
21e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
22e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport android.annotation.Nullable;
23e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
24e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.io.IOException;
25e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.io.InputStream;
26e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.io.Reader;
27e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.util.ArrayList;
28e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.util.Collections;
29e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptaimport java.util.List;
30e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
31e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta/**
32e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * A wrapper around XmlPullParser that can peek forward to inspect if the file is a data-binding
33e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta * layout and some parts need to be stripped.
34e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta */
35e91096c03dda225240b1487f019bf3d082854587Deepanshu Guptapublic class LayoutParserWrapper implements XmlPullParser {
36e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
37e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    // Data binding constants.
38e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private static final String TAG_LAYOUT = "layout";
39e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private static final String TAG_DATA = "data";
40e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private static final String DEFAULT = "default=";
41e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
42e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private final XmlPullParser mDelegate;
43e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
44e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    // Storage for peeked values.
45e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private boolean mPeeked;
46e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private int mEventType;
47e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private int mDepth;
48e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private int mNext;
49e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private List<Attribute> mAttributes;
50e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private String mText;
51e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private String mName;
52e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
53e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    // Used to end the document before the actual parser ends.
54e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private int mFinalDepth = -1;
55e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private boolean mEndNow;
56e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
57e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public LayoutParserWrapper(XmlPullParser delegate) {
58e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDelegate = delegate;
59e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
60e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
61e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public LayoutParserWrapper peekTillLayoutStart() throws IOException, XmlPullParserException {
62e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        final int STATE_LAYOUT_NOT_STARTED = 0;  // <layout> tag not encountered yet.
63e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        final int STATE_ROOT_NOT_STARTED = 1;    // the main view root not found yet.
64e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        final int STATE_INSIDE_DATA = 2;         // START_TAG for <data> found, but not END_TAG.
65e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
66e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        int state = STATE_LAYOUT_NOT_STARTED;
67e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        int dataDepth = -1;    // depth of the <data> tag. Should be two.
68e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        while (true) {
69e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            int peekNext = peekNext();
70e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            switch (peekNext) {
71e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                case START_TAG:
72e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    if (state == STATE_LAYOUT_NOT_STARTED) {
73e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        if (mName.equals(TAG_LAYOUT)) {
74e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            state = STATE_ROOT_NOT_STARTED;
75e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        } else {
76e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            return this; // no layout tag in the file.
77e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        }
78e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    } else if (state == STATE_ROOT_NOT_STARTED) {
79e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        if (mName.equals(TAG_DATA)) {
80e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            state = STATE_INSIDE_DATA;
81e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            dataDepth = mDepth;
82e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        } else {
83e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            mFinalDepth = mDepth;
84e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            return this;
85e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        }
86e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    }
87e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    break;
88e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                case END_TAG:
89e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    if (state == STATE_INSIDE_DATA) {
90e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        if (mDepth <= dataDepth) {
91e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            state = STATE_ROOT_NOT_STARTED;
92e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        }
93e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    }
94e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    break;
95e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                case END_DOCUMENT:
96e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    // No layout start found.
97e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    return this;
98e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            }
99e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            // consume the peeked tag.
100e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            next();
101e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
102e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
103e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
104e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private int peekNext() throws IOException, XmlPullParserException {
105e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (mPeeked) {
106e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            return mNext;
107e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
108e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mEventType = mDelegate.getEventType();
109e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mNext = mDelegate.next();
110e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (mEventType == START_TAG) {
111e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            int count = mDelegate.getAttributeCount();
112e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            mAttributes = count > 0 ? new ArrayList<Attribute>(count) :
113e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    Collections.<Attribute>emptyList();
114e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            for (int i = 0; i < count; i++) {
115e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                mAttributes.add(new Attribute(mDelegate.getAttributeNamespace(i),
116e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        mDelegate.getAttributeName(i), mDelegate.getAttributeValue(i)));
117e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            }
118e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
119e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDepth = mDelegate.getDepth();
120e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mText = mDelegate.getText();
121e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mName = mDelegate.getName();
122e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mPeeked = true;
123e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mNext;
124e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
125e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
126e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private void reset() {
127e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mAttributes = null;
128e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mText = null;
129e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mName = null;
130e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mPeeked = false;
131e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
132e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
133e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
134e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int next() throws XmlPullParserException, IOException {
135e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        int returnValue;
136e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        int depth;
137e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (mPeeked) {
138e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            returnValue = mNext;
139e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            depth = mDepth;
140e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            reset();
141e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        } else if (mEndNow) {
142e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            return END_DOCUMENT;
143e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        } else {
144e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            returnValue = mDelegate.next();
145e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            depth = getDepth();
146e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
147e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (returnValue == END_TAG && depth <= mFinalDepth) {
148e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            mEndNow = true;
149e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
150e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return returnValue;
151e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
152e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
153e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
154e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getEventType() throws XmlPullParserException {
155e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mPeeked ? mEventType : mDelegate.getEventType();
156e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
157e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
158e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
159e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getDepth() {
160e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mPeeked ? mDepth : mDelegate.getDepth();
161e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
162e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
163e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
164e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getName() {
165e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mPeeked ? mName : mDelegate.getName();
166e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
167e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
168e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
169e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getText() {
170e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mPeeked ? mText : mDelegate.getText();
171e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
172e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
173e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
174e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributeValue(@Nullable String namespace, String name) {
175e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        String returnValue = null;
176e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (mPeeked) {
177e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            if (mAttributes == null) {
178e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                if (mEventType != START_TAG) {
1791bd276f6f7ddce7959dc2e9e6f480d9be1e26fefDeepanshu Gupta                    throw new IndexOutOfBoundsException("getAttributeValue() called when not at START_TAG.");
180e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                } else {
181e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    return null;
182e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                }
183e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            } else {
184e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                for (Attribute attribute : mAttributes) {
185e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    //noinspection StringEquality for nullness check.
186e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    if (attribute.name.equals(name) && (attribute.namespace == namespace ||
187e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                            attribute.namespace != null && attribute.namespace.equals(namespace))) {
188e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        returnValue = attribute.value;
189e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                        break;
190e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    }
191e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                }
192e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            }
193e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        } else {
194e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            returnValue = mDelegate.getAttributeValue(namespace, name);
195e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
196e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        // Check if the value is bound via data-binding, if yes get the default value.
197e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        if (returnValue != null && mFinalDepth >= 0 && returnValue.startsWith("@{")) {
198e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            // TODO: Improve the detection of default keyword.
199e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            int i = returnValue.lastIndexOf(DEFAULT);
200e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            return i > 0 ? returnValue.substring(i + DEFAULT.length(), returnValue.length() - 1)
201e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta                    : null;
202e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
203e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return returnValue;
204e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
205e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
206e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    private static class Attribute {
207e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        @Nullable
208e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        public final String namespace;
209e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        public final String name;
210e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        public final String value;
211e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
212e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        public Attribute(@Nullable String namespace, String name, String value) {
213e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            this.namespace = namespace;
214e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            this.name = name;
215e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta            this.value = value;
216e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        }
217e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
218e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
219e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    // Not affected by peeking.
220e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
221e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
222e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void setFeature(String s, boolean b) throws XmlPullParserException {
223e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDelegate.setFeature(s, b);
224e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
225e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
226e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
227e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void setProperty(String s, Object o) throws XmlPullParserException {
228e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDelegate.setProperty(s, o);
229e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
230e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
231e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
232e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void setInput(InputStream inputStream, String s) throws XmlPullParserException {
233e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDelegate.setInput(inputStream, s);
234e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
235e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
236e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
237e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void setInput(Reader reader) throws XmlPullParserException {
238e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        mDelegate.setInput(reader);
239e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
240e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
241e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
242e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getInputEncoding() {
243e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getInputEncoding();
244e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
245e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
246e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
247e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getNamespace(String s) {
248e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getNamespace(s);
249e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
250e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
251e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
252e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getPositionDescription() {
253e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getPositionDescription();
254e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
255e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
256e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
257e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getLineNumber() {
258e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getLineNumber();
259e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
260e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
261e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
262e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getNamespace() {
263e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getNamespace();
264e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
265e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
266e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
267e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getColumnNumber() {
268e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        return mDelegate.getColumnNumber();
269e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
270e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
271e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    // -- We don't care much about the methods that follow.
272e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
273e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
274e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void require(int i, String s, String s1) throws XmlPullParserException, IOException {
275e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
276e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
277e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
278e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
279e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public boolean getFeature(String s) {
280e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
281e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
282e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
283e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
284e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public void defineEntityReplacementText(String s, String s1) throws XmlPullParserException {
285e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
286e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
287e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
288e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
289e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public Object getProperty(String s) {
290e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
291e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
292e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
293e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
294e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int nextToken() throws XmlPullParserException, IOException {
295e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
296e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
297e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
298e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
299e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getNamespaceCount(int i) throws XmlPullParserException {
300e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
301e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
302e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
303e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
304e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getNamespacePrefix(int i) throws XmlPullParserException {
305e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
306e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
307e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
308e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
309e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getNamespaceUri(int i) throws XmlPullParserException {
310e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
311e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
312e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
313e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
314e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public boolean isWhitespace() throws XmlPullParserException {
315e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
316e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
317e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
318e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
319e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public char[] getTextCharacters(int[] ints) {
320e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
321e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
322e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
323e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
324e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getPrefix() {
325e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
326e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
327e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
328e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
329e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public boolean isEmptyElementTag() throws XmlPullParserException {
330e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
331e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
332e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
333e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
334e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int getAttributeCount() {
335e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
336e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
337e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
338e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
339e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributeNamespace(int i) {
340e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
341e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
342e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
343e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
344e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributeName(int i) {
345e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
346e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
347e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
348e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
349e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributePrefix(int i) {
350e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
351e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
352e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
353e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
354e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributeType(int i) {
355e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
356e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
357e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
358e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
359e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public boolean isAttributeDefault(int i) {
360e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
361e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
362e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
363e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
364e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String getAttributeValue(int i) {
365e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
366e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
367e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
368e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
369e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public String nextText() throws XmlPullParserException, IOException {
370e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
371e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
372e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta
373e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    @Override
374e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    public int nextTag() throws XmlPullParserException, IOException {
375e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta        throw new UnsupportedOperationException("Only few parser methods are supported.");
376e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta    }
377e91096c03dda225240b1487f019bf3d082854587Deepanshu Gupta}
378