diff options
12 files changed, 101 insertions, 71 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 7b3dde4262f4..42344a27bc5f 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -2421,75 +2421,93 @@ public class Resources { @Nullable Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException { - if (TRACE_FOR_PRELOAD) { - // Log only framework resources - if ((id >>> 24) == 0x1) { - final String name = getResourceName(id); - if (name != null) { - Log.d("PreloadDrawable", name); + try { + if (TRACE_FOR_PRELOAD) { + // Log only framework resources + if ((id >>> 24) == 0x1) { + final String name = getResourceName(id); + if (name != null) { + Log.d("PreloadDrawable", name); + } } } - } - final boolean isColorDrawable; - final DrawableCache caches; - final long key; - if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT - && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { - isColorDrawable = true; - caches = mColorDrawableCache; - key = value.data; - } else { - isColorDrawable = false; - caches = mDrawableCache; - key = (((long) value.assetCookie) << 32) | value.data; - } + final boolean isColorDrawable; + final DrawableCache caches; + final long key; + if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT + && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { + isColorDrawable = true; + caches = mColorDrawableCache; + key = value.data; + } else { + isColorDrawable = false; + caches = mDrawableCache; + key = (((long) value.assetCookie) << 32) | value.data; + } - // First, check whether we have a cached version of this drawable - // that was inflated against the specified theme. - if (!mPreloading) { - final Drawable cachedDrawable = caches.getInstance(key, theme); - if (cachedDrawable != null) { - return cachedDrawable; + // First, check whether we have a cached version of this drawable + // that was inflated against the specified theme. + if (!mPreloading) { + final Drawable cachedDrawable = caches.getInstance(key, theme); + if (cachedDrawable != null) { + return cachedDrawable; + } } - } - // Next, check preloaded drawables. These may contain unresolved theme - // attributes. - final ConstantState cs; - if (isColorDrawable) { - cs = sPreloadedColorDrawables.get(key); - } else { - cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key); - } + // Next, check preloaded drawables. These may contain unresolved theme + // attributes. + final ConstantState cs; + if (isColorDrawable) { + cs = sPreloadedColorDrawables.get(key); + } else { + cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key); + } - Drawable dr; - if (cs != null) { - dr = cs.newDrawable(this); - } else if (isColorDrawable) { - dr = new ColorDrawable(value.data); - } else { - dr = loadDrawableForCookie(value, id, null); - } + Drawable dr; + if (cs != null) { + dr = cs.newDrawable(this); + } else if (isColorDrawable) { + dr = new ColorDrawable(value.data); + } else { + dr = loadDrawableForCookie(value, id, null); + } - // Determine if the drawable has unresolved theme attributes. If it - // does, we'll need to apply a theme and store it in a theme-specific - // cache. - final boolean canApplyTheme = dr != null && dr.canApplyTheme(); - if (canApplyTheme && theme != null) { - dr = dr.mutate(); - dr.applyTheme(theme); - dr.clearMutated(); - } + // Determine if the drawable has unresolved theme attributes. If it + // does, we'll need to apply a theme and store it in a theme-specific + // cache. + final boolean canApplyTheme = dr != null && dr.canApplyTheme(); + if (canApplyTheme && theme != null) { + dr = dr.mutate(); + dr.applyTheme(theme); + dr.clearMutated(); + } - // If we were able to obtain a drawable, store it in the appropriate - // cache: preload, not themed, null theme, or theme-specific. - if (dr != null) { - dr.setChangingConfigurations(value.changingConfigurations); - cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr); - } + // If we were able to obtain a drawable, store it in the appropriate + // cache: preload, not themed, null theme, or theme-specific. + if (dr != null) { + dr.setChangingConfigurations(value.changingConfigurations); + cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr); + } - return dr; + return dr; + } catch (Exception e) { + String name; + try { + name = getResourceName(id); + } catch (NotFoundException e2) { + name = "(missing name)"; + } + + // The target drawable might fail to load for any number of + // reasons, but we always want to include the resource name. + // Since the client already expects this method to throw a + // NotFoundException, just throw one of those. + final NotFoundException nfe = new NotFoundException("Drawable " + name + + " with resource ID #0x" + Integer.toHexString(id), e); + nfe.setStackTrace(new StackTraceElement[0]); + throw nfe; + } } private void cacheDrawable(TypedValue value, boolean isColorDrawable, DrawableCache caches, diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java index 971a3a295ca2..d714ca830976 100644 --- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java @@ -153,7 +153,7 @@ public class AnimatedRotateDrawable extends DrawableWrapper implements Animatabl updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 4d2037bf04a5..daf25815d1ac 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -829,7 +829,7 @@ public class BitmapDrawable extends Drawable { try { updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/ClipDrawable.java b/graphics/java/android/graphics/drawable/ClipDrawable.java index cdd336dded0a..d925b6b95c66 100644 --- a/graphics/java/android/graphics/drawable/ClipDrawable.java +++ b/graphics/java/android/graphics/drawable/ClipDrawable.java @@ -111,7 +111,7 @@ public class ClipDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 0ee877e28c2c..3d8437d66848 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -1430,6 +1430,20 @@ public abstract class Drawable { } /** + * Re-throws an exception as a {@link RuntimeException} with an empty stack + * trace to avoid cluttering the log. The original exception's stack trace + * will still be included. + * + * @param cause the exception to re-throw + * @throws RuntimeException + */ + static void rethrowAsRuntimeException(Exception cause) throws RuntimeException { + final RuntimeException e = new RuntimeException(cause); + e.setStackTrace(new StackTraceElement[0]); + throw e; + } + + /** * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode * attribute's enum value. * diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 719297a7668c..f9208cd6c256 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -23,7 +23,6 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.content.res.TypedArray; -import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; @@ -1268,7 +1267,7 @@ public class GradientDrawable extends Drawable { try { updateGradientDrawableGradient(t.getResources(), a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java index 36d4272166af..d47cb561a116 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -124,7 +124,7 @@ public class InsetDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 4d51d63fa603..bfbdfa5f5255 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -510,7 +510,7 @@ public class NinePatchDrawable extends Drawable { try { updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index aaab5290bec5..5213e10332c4 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -40,7 +40,6 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Shader; import android.util.AttributeSet; -import android.util.DisplayMetrics; import java.io.IOException; import java.util.Arrays; @@ -505,7 +504,7 @@ public class RippleDrawable extends LayerDrawable { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/RotateDrawable.java b/graphics/java/android/graphics/drawable/RotateDrawable.java index 1531ba2380fb..78424e3663de 100644 --- a/graphics/java/android/graphics/drawable/RotateDrawable.java +++ b/graphics/java/android/graphics/drawable/RotateDrawable.java @@ -92,7 +92,7 @@ public class RotateDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java index 330266fe1fb4..51e143baeac4 100644 --- a/graphics/java/android/graphics/drawable/ScaleDrawable.java +++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java @@ -125,7 +125,7 @@ public class ScaleDrawable extends DrawableWrapper { updateStateFromTypedArray(a); verifyRequiredAttributes(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index f630055e2a48..3761a99759c1 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -511,7 +511,7 @@ public class VectorDrawable extends Drawable { state.mCacheDirty = true; updateStateFromTypedArray(a); } catch (XmlPullParserException e) { - throw new RuntimeException(e); + rethrowAsRuntimeException(e); } finally { a.recycle(); } |