diff options
| author | Alan Viverette <alanv@google.com> | 2014-11-07 22:27:24 +0000 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2014-11-07 22:27:24 +0000 |
| commit | 75d1cbd71b6ac72588b687c8191a0ceded183b39 (patch) | |
| tree | 8b5adf597e2c6406185cd9a1b8c2093bcd643c6a | |
| parent | b23a1b1967fbc7c21a8fd5cf9db157d0837f9a1d (diff) | |
| parent | e37c761e5e850aebb3be56a2eadaa85cc2134547 (diff) | |
| download | frameworks_base-75d1cbd71b6ac72588b687c8191a0ceded183b39.zip frameworks_base-75d1cbd71b6ac72588b687c8191a0ceded183b39.tar.gz frameworks_base-75d1cbd71b6ac72588b687c8191a0ceded183b39.tar.bz2 | |
am e37c761e: am c30a7623: am 48c8cd06: Merge "Support theme attributes in StateListDrawable <item> element" into lmp-mr1-dev
* commit 'e37c761e5e850aebb3be56a2eadaa85cc2134547':
Support theme attributes in StateListDrawable <item> element
| -rw-r--r-- | core/res/res/values/attrs.xml | 7 | ||||
| -rw-r--r-- | graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java | 88 | ||||
| -rw-r--r-- | graphics/java/android/graphics/drawable/StateListDrawable.java | 65 |
3 files changed, 80 insertions, 80 deletions
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 67ba27da..e63fc55 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4804,6 +4804,13 @@ <attr name="autoMirrored"/> </declare-styleable> + <!-- Represents a single state inside a StateListDrawable. --> + <declare-styleable name="StateListDrawableItem"> + <!-- Reference to a drawable resource to use for the state. If not + given, the drawable must be defined by the first child tag. --> + <attr name="drawable" /> + </declare-styleable> + <!-- Transition used to animate between states with keyframe IDs. --> <declare-styleable name="AnimatedStateListDrawableItem"> <!-- Reference to a drawable resource to use for the frame. If not diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java index 5a3a617..84555c6 100644 --- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java @@ -429,43 +429,31 @@ public class AnimatedStateListDrawable extends StateListDrawable { private int parseTransition(@NonNull Resources r, @NonNull XmlPullParser parser, @NonNull AttributeSet attrs, @Nullable Theme theme) throws XmlPullParserException, IOException { - int drawableRes = 0; - int fromId = 0; - int toId = 0; - boolean reversible = false; - - final int numAttrs = attrs.getAttributeCount(); - for (int i = 0; i < numAttrs; i++) { - final int stateResId = attrs.getAttributeNameResource(i); - switch (stateResId) { - case 0: - break; - case R.attr.fromId: - fromId = attrs.getAttributeResourceValue(i, 0); - break; - case R.attr.toId: - toId = attrs.getAttributeResourceValue(i, 0); - break; - case R.attr.drawable: - drawableRes = attrs.getAttributeResourceValue(i, 0); - break; - case R.attr.reversible: - reversible = attrs.getAttributeBooleanValue(i, false); - break; - } - } + // This allows state list drawable item elements to be themed at + // inflation time but does NOT make them work for Zygote preload. + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimatedStateListDrawableTransition); + final int fromId = a.getResourceId( + R.styleable.AnimatedStateListDrawableTransition_fromId, 0); + final int toId = a.getResourceId( + R.styleable.AnimatedStateListDrawableTransition_toId, 0); + final boolean reversible = a.getBoolean( + R.styleable.AnimatedStateListDrawableTransition_reversible, false); + Drawable dr = a.getDrawable( + R.styleable.AnimatedStateListDrawableTransition_drawable); + a.recycle(); - final Drawable dr; - if (drawableRes != 0) { - dr = r.getDrawable(drawableRes, theme); - } else { + // Loading child elements modifies the state of the AttributeSet's + // underlying parser, so it needs to happen after obtaining + // attributes and extracting states. + if (dr == null) { int type; while ((type = parser.next()) == XmlPullParser.TEXT) { } if (type != XmlPullParser.START_TAG) { throw new XmlPullParserException( parser.getPositionDescription() - + ": <item> tag requires a 'drawable' attribute or " + + ": <transition> tag requires a 'drawable' attribute or " + "child tag defining a drawable"); } dr = Drawable.createFromXmlInner(r, parser, attrs, theme); @@ -477,34 +465,20 @@ public class AnimatedStateListDrawable extends StateListDrawable { private int parseItem(@NonNull Resources r, @NonNull XmlPullParser parser, @NonNull AttributeSet attrs, @Nullable Theme theme) throws XmlPullParserException, IOException { - int drawableRes = 0; - int keyframeId = 0; - - int j = 0; - final int numAttrs = attrs.getAttributeCount(); - int[] states = new int[numAttrs]; - for (int i = 0; i < numAttrs; i++) { - final int stateResId = attrs.getAttributeNameResource(i); - switch (stateResId) { - case 0: - break; - case R.attr.id: - keyframeId = attrs.getAttributeResourceValue(i, 0); - break; - case R.attr.drawable: - drawableRes = attrs.getAttributeResourceValue(i, 0); - break; - default: - final boolean hasState = attrs.getAttributeBooleanValue(i, false); - states[j++] = hasState ? stateResId : -stateResId; - } - } - states = StateSet.trimStateSet(states, j); + // This allows state list drawable item elements to be themed at + // inflation time but does NOT make them work for Zygote preload. + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimatedStateListDrawableItem); + final int keyframeId = a.getResourceId(R.styleable.AnimatedStateListDrawableItem_id, 0); + Drawable dr = a.getDrawable(R.styleable.AnimatedStateListDrawableItem_drawable); + a.recycle(); - final Drawable dr; - if (drawableRes != 0) { - dr = r.getDrawable(drawableRes, theme); - } else { + final int[] states = extractStateSet(attrs); + + // Loading child elements modifies the state of the AttributeSet's + // underlying parser, so it needs to happen after obtaining + // attributes and extracting states. + if (dr == null) { int type; while ((type = parser.next()) == XmlPullParser.TEXT) { } diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java index 963943b..e7a8233 100644 --- a/graphics/java/android/graphics/drawable/StateListDrawable.java +++ b/graphics/java/android/graphics/drawable/StateListDrawable.java @@ -173,29 +173,19 @@ public class StateListDrawable extends DrawableContainer { continue; } - int drawableRes = 0; - - int i; - int j = 0; - final int numAttrs = attrs.getAttributeCount(); - int[] states = new int[numAttrs]; - for (i = 0; i < numAttrs; i++) { - final int stateResId = attrs.getAttributeNameResource(i); - if (stateResId == 0) break; - if (stateResId == R.attr.drawable) { - drawableRes = attrs.getAttributeResourceValue(i, 0); - } else { - states[j++] = attrs.getAttributeBooleanValue(i, false) - ? stateResId - : -stateResId; - } - } - states = StateSet.trimStateSet(states, j); - - final Drawable dr; - if (drawableRes != 0) { - dr = r.getDrawable(drawableRes, theme); - } else { + // This allows state list drawable item elements to be themed at + // inflation time but does NOT make them work for Zygote preload. + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.StateListDrawableItem); + Drawable dr = a.getDrawable(R.styleable.StateListDrawableItem_drawable); + a.recycle(); + + final int[] states = extractStateSet(attrs); + + // Loading child elements modifies the state of the AttributeSet's + // underlying parser, so it needs to happen after obtaining + // attributes and extracting states. + if (dr == null) { while ((type = parser.next()) == XmlPullParser.TEXT) { } if (type != XmlPullParser.START_TAG) { @@ -211,6 +201,35 @@ public class StateListDrawable extends DrawableContainer { } } + /** + * Extracts state_ attributes from an attribute set. + * + * @param attrs The attribute set. + * @return An array of state_ attributes. + */ + int[] extractStateSet(AttributeSet attrs) { + int j = 0; + final int numAttrs = attrs.getAttributeCount(); + int[] states = new int[numAttrs]; + for (int i = 0; i < numAttrs; i++) { + final int stateResId = attrs.getAttributeNameResource(i); + switch (stateResId) { + case 0: + break; + case R.attr.drawable: + case R.attr.id: + // Ignore attributes from StateListDrawableItem and + // AnimatedStateListDrawableItem. + continue; + default: + states[j++] = attrs.getAttributeBooleanValue(i, false) + ? stateResId : -stateResId; + } + } + states = StateSet.trimStateSet(states, j); + return states; + } + StateListState getStateListState() { return mStateListState; } |
