Throw exception when inset drawable is missing drawable attribute

BUG: 17068252
Change-Id: Id9c9791501ce9d56fdd67236c84775550c89032c
This commit is contained in:
Alan Viverette
2014-08-15 14:28:30 -07:00
parent 4473ec5a5b
commit 0a9614f5fb

View File

@@ -26,10 +26,13 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.Resources.Theme;
import android.graphics.*;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Insets;
import android.graphics.Outline;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import java.io.IOException;
@@ -50,8 +53,6 @@ import java.io.IOException;
* @attr ref android.R.styleable#InsetDrawable_insetBottom
*/
public class InsetDrawable extends Drawable implements Drawable.Callback {
private static final String LOG_TAG = "InsetDrawable";
private final Rect mTmpRect = new Rect();
private InsetState mInsetState;
@@ -86,7 +87,6 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
final TypedArray a = r.obtainAttributes(attrs, R.styleable.InsetDrawable);
super.inflateWithAttributes(r, parser, a, R.styleable.InsetDrawable_visible);
updateStateFromTypedArray(a);
a.recycle();
// Load inner XML elements.
if (mInsetState.mDrawable == null) {
@@ -104,9 +104,19 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
dr.setCallback(this);
}
// Verify state.
if (mInsetState.mDrawable == null) {
Log.w(LOG_TAG, "No drawable specified for <inset>");
verifyRequiredAttributes(a);
a.recycle();
}
private void verifyRequiredAttributes(TypedArray a) throws XmlPullParserException {
// If we're not waiting on a theme, verify required attributes.
if (mInsetState.mThemeAttrs == null) {
if (mInsetState.mThemeAttrs[R.styleable.InsetDrawable_drawable] != 0
&& mInsetState.mDrawable == null) {
throw new XmlPullParserException(a.getPositionDescription() +
": <inset> tag requires a 'drawable' attribute or "
+ "child tag defining a drawable");
}
}
}
@@ -167,6 +177,7 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
final TypedArray a = t.resolveAttributes(state.mThemeAttrs, R.styleable.InsetDrawable);
try {
updateStateFromTypedArray(a);
verifyRequiredAttributes(a);
} catch (XmlPullParserException e) {
throw new RuntimeException(e);
} finally {
@@ -224,12 +235,8 @@ public class InsetDrawable extends Drawable implements Drawable.Callback {
padding.top += mInsetState.mInsetTop;
padding.bottom += mInsetState.mInsetBottom;
if (pad || (mInsetState.mInsetLeft | mInsetState.mInsetRight |
mInsetState.mInsetTop | mInsetState.mInsetBottom) != 0) {
return true;
} else {
return false;
}
return pad || (mInsetState.mInsetLeft | mInsetState.mInsetRight |
mInsetState.mInsetTop | mInsetState.mInsetBottom) != 0;
}
/** @hide */