summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2014-06-20 14:45:11 -0700
committerAlan Viverette <alanv@google.com>2014-06-20 14:45:11 -0700
commit9cd14fc710cf81cc6d1c47d599abe349d3aa87dc (patch)
treef2943d2af65b3fed26c0ee32ac445d96782eb863
parenta427fcf2cb6cc49e4f137e2853e3b6f51af940c5 (diff)
downloadframeworks_base-9cd14fc710cf81cc6d1c47d599abe349d3aa87dc.zip
frameworks_base-9cd14fc710cf81cc6d1c47d599abe349d3aa87dc.tar.gz
frameworks_base-9cd14fc710cf81cc6d1c47d599abe349d3aa87dc.tar.bz2
Add support for tint attribute in VectorDrawable
Fixes NPE from previous change. Also fixes docs reference in TypedArray. BUG: 15375203 Change-Id: Icf3b5759780276b0875a4fb70b29522ab7c8cb90
-rw-r--r--core/java/android/content/res/TypedArray.java6
-rw-r--r--core/res/res/values/attrs.xml10
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java51
3 files changed, 49 insertions, 18 deletions
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 20dcf83..d2146ac 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -885,9 +885,9 @@ public class TypedArray {
/**
* Extracts theme attributes from a typed array for later resolution using
- * {@link Theme#resolveAttributes(int[], int[])}. Removes the entries from
- * the typed array so that subsequent calls to typed getters will return the
- * default value without crashing.
+ * {@link android.content.res.Resources.Theme#resolveAttributes(int[], int[])}.
+ * Removes the entries from the typed array so that subsequent calls to typed
+ * getters will return the default value without crashing.
*
* @return an array of length {@link #getIndexCount()} populated with theme
* attributes, or null if there are no theme attributes in the typed
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index d3e4790..390da2c 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4978,6 +4978,16 @@
<!-- ========================== -->
<eat-comment />
+ <!-- Drawable used to draw vector paths. -->
+ <declare-styleable name="VectorDrawable">
+ <!-- If set, specifies the color to apply to the drawable as a tint. By default,
+ no tint is applied. May be a color state list. -->
+ <attr name="tint" />
+ <!-- When a tint color is set, specifies its Porter-Duff blending mode. The
+ default value is src_in, which treats the drawable as an alpha mask. -->
+ <attr name="tintMode" />
+ </declare-styleable>
+
<!-- Define the virtual size of the drawing surface paths will draw to. -->
<declare-styleable name="VectorDrawableViewport">
<!-- The width of the canvas the drawing is on. -->
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index b4d1fdc..60177af8f 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -286,13 +286,6 @@ public class VectorDrawable extends Drawable {
}
@Override
- public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
- throws XmlPullParserException, IOException {
- final VPathRenderer p = inflateInternal(res, parser, attrs, theme);
- setPathRenderer(p);
- }
-
- @Override
public boolean canApplyTheme() {
return super.canApplyTheme() || mVectorState != null && mVectorState.canApplyTheme();
}
@@ -335,13 +328,44 @@ public class VectorDrawable extends Drawable {
return color;
}
- private VPathRenderer inflateInternal(Resources res, XmlPullParser parser, AttributeSet attrs,
- Theme theme) throws XmlPullParserException, IOException {
+
+ @Override
+ public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
+ throws XmlPullParserException, IOException {
+ final TypedArray a = obtainAttributes(res, theme, attrs,R.styleable.VectorDrawable);
+ updateStateFromTypedArray(a);
+ a.recycle();
+
+ final VectorDrawableState state = mVectorState;
+ state.mVPathRenderer = inflateInternal(res, parser, attrs, theme);
+
+ mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ state.mVPathRenderer.setColorFilter(mTintFilter);
+ }
+
+ private void updateStateFromTypedArray(TypedArray a) {
+ final VectorDrawableState state = mVectorState;
+
+ // Extract the theme attributes, if any.
+ state.mThemeAttrs = a.extractThemeAttrs();
+
+ final int tintMode = a.getInt(R.styleable.VectorDrawable_tintMode, -1);
+ if (tintMode != -1) {
+ state.mTintMode = Drawable.parseTintMode(tintMode, Mode.SRC_IN);
+ }
+
+ final ColorStateList tint = a.getColorStateList(R.styleable.VectorDrawable_tint);
+ if (tint != null) {
+ state.mTint = tint;
+ }
+ }
+
+ private VPathRenderer inflateInternal(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
+ throws XmlPullParserException, IOException {
final VPathRenderer pathRenderer = new VPathRenderer();
boolean noSizeTag = true;
boolean noViewportTag = true;
- boolean noGroupTag = true;
boolean noPathTag = true;
// Use a stack to help to build the group tree.
@@ -377,7 +401,6 @@ public class VectorDrawable extends Drawable {
if (newChildGroup.getGroupName() != null) {
mVGTargetsMap.put(newChildGroup.getGroupName(), newChildGroup);
}
- noGroupTag = false;
}
} else if (eventType == XmlPullParser.END_TAG) {
final String tagName = parser.getName();
@@ -435,11 +458,8 @@ public class VectorDrawable extends Drawable {
}
}
- private void setPathRenderer(VPathRenderer pathRenderer) {
- mVectorState.mVPathRenderer = pathRenderer;
- }
-
private static class VectorDrawableState extends ConstantState {
+ int[] mThemeAttrs;
int mChangingConfigurations;
VPathRenderer mVPathRenderer;
Rect mPadding;
@@ -448,6 +468,7 @@ public class VectorDrawable extends Drawable {
public VectorDrawableState(VectorDrawableState copy) {
if (copy != null) {
+ mThemeAttrs = copy.mThemeAttrs;
mChangingConfigurations = copy.mChangingConfigurations;
// TODO: Make sure the constant state are handled correctly.
mVPathRenderer = new VPathRenderer(copy.mVPathRenderer);