OSDN Git Service

Throw exception when inset drawable is missing drawable attribute
authorAlan Viverette <alanv@google.com>
Fri, 15 Aug 2014 21:28:30 +0000 (14:28 -0700)
committerAlan Viverette <alanv@google.com>
Fri, 15 Aug 2014 21:28:30 +0000 (14:28 -0700)
BUG: 17068252
Change-Id: Id9c9791501ce9d56fdd67236c84775550c89032c

graphics/java/android/graphics/drawable/InsetDrawable.java

index 588e776..3359ebc 100644 (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 */