Restrict AVD and VD parsing to the current element instead of the whole document

This CL changes the AVD xml parsing to parsing only within the current
element, which prevents AVD parsing from always skipping to the end of
the doucment. So things that are defined after AVD in the same document
can be picked up by the xml parser.

The same fix has been applied to VD as well.

BUG: 31865175
Test: Manually following comment #1 in the bug above

Change-Id: I4ebdce1eb2e92d6f6e2c37caed9607253d24602f
This commit is contained in:
Doris Liu
2016-10-03 13:57:28 -07:00
parent 20cf00152d
commit 1f859716a8
2 changed files with 10 additions and 2 deletions

View File

@ -455,7 +455,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
int eventType = parser.getEventType(); int eventType = parser.getEventType();
float pathErrorScale = 1; float pathErrorScale = 1;
while (eventType != XmlPullParser.END_DOCUMENT) { final int innerDepth = parser.getDepth() + 1;
// Parse everything until the end of the animated-vector element.
while (eventType != XmlPullParser.END_DOCUMENT
&& (parser.getDepth() >= innerDepth || eventType != XmlPullParser.END_TAG)) {
if (eventType == XmlPullParser.START_TAG) { if (eventType == XmlPullParser.START_TAG) {
final String tagName = parser.getName(); final String tagName = parser.getName();
if (ANIMATED_VECTOR.equals(tagName)) { if (ANIMATED_VECTOR.equals(tagName)) {

View File

@ -710,7 +710,11 @@ public class VectorDrawable extends Drawable {
groupStack.push(state.mRootGroup); groupStack.push(state.mRootGroup);
int eventType = parser.getEventType(); int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) { final int innerDepth = parser.getDepth() + 1;
// Parse everything until the end of the vector element.
while (eventType != XmlPullParser.END_DOCUMENT
&& (parser.getDepth() >= innerDepth || eventType != XmlPullParser.END_TAG)) {
if (eventType == XmlPullParser.START_TAG) { if (eventType == XmlPullParser.START_TAG) {
final String tagName = parser.getName(); final String tagName = parser.getName();
final VGroup currentGroup = groupStack.peek(); final VGroup currentGroup = groupStack.peek();