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