summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2014-11-07 22:27:24 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-11-07 22:27:24 +0000
commit75d1cbd71b6ac72588b687c8191a0ceded183b39 (patch)
tree8b5adf597e2c6406185cd9a1b8c2093bcd643c6a
parentb23a1b1967fbc7c21a8fd5cf9db157d0837f9a1d (diff)
parente37c761e5e850aebb3be56a2eadaa85cc2134547 (diff)
downloadframeworks_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.xml7
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java88
-rw-r--r--graphics/java/android/graphics/drawable/StateListDrawable.java65
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;
}