ADD week 5
This commit is contained in:
		| @@ -0,0 +1,459 @@ | ||||
| package androidx.appcompat.widget; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.res.ColorStateList; | ||||
| import android.content.res.Resources; | ||||
| import android.content.res.XmlResourceParser; | ||||
| import android.graphics.PorterDuff; | ||||
| import android.graphics.PorterDuffColorFilter; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.graphics.drawable.LayerDrawable; | ||||
| import android.os.Build; | ||||
| import android.util.AttributeSet; | ||||
| import android.util.Log; | ||||
| import android.util.TypedValue; | ||||
| import android.util.Xml; | ||||
| import androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat; | ||||
| import androidx.appcompat.resources.Compatibility; | ||||
| import androidx.appcompat.resources.R; | ||||
| import androidx.collection.LongSparseArray; | ||||
| import androidx.collection.LruCache; | ||||
| import androidx.collection.SimpleArrayMap; | ||||
| import androidx.collection.SparseArrayCompat; | ||||
| import androidx.core.content.ContextCompat; | ||||
| import androidx.core.graphics.drawable.DrawableCompat; | ||||
| import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat; | ||||
| import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.WeakHashMap; | ||||
| import org.xmlpull.v1.XmlPullParser; | ||||
| import org.xmlpull.v1.XmlPullParserException; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| public final class ResourceManagerInternal { | ||||
|     private static final boolean DEBUG = false; | ||||
|     private static ResourceManagerInternal INSTANCE = null; | ||||
|     private static final String PLATFORM_VD_CLAZZ = "android.graphics.drawable.VectorDrawable"; | ||||
|     private static final String SKIP_DRAWABLE_TAG = "appcompat_skip_skip"; | ||||
|     private static final String TAG = "ResourceManagerInternal"; | ||||
|     private SimpleArrayMap<String, InflateDelegate> mDelegates; | ||||
|     private final WeakHashMap<Context, LongSparseArray<WeakReference<Drawable.ConstantState>>> mDrawableCaches = new WeakHashMap<>(0); | ||||
|     private boolean mHasCheckedVectorDrawableSetup; | ||||
|     private ResourceManagerHooks mHooks; | ||||
|     private SparseArrayCompat<String> mKnownDrawableIdTags; | ||||
|     private WeakHashMap<Context, SparseArrayCompat<ColorStateList>> mTintLists; | ||||
|     private TypedValue mTypedValue; | ||||
|     private static final PorterDuff.Mode DEFAULT_MODE = PorterDuff.Mode.SRC_IN; | ||||
|     private static final ColorFilterLruCache COLOR_FILTER_CACHE = new ColorFilterLruCache(6); | ||||
|  | ||||
|     private interface InflateDelegate { | ||||
|         Drawable createFromXmlInner(Context context, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme); | ||||
|     } | ||||
|  | ||||
|     public interface ResourceManagerHooks { | ||||
|         Drawable createDrawableFor(ResourceManagerInternal resourceManagerInternal, Context context, int i); | ||||
|  | ||||
|         ColorStateList getTintListForDrawableRes(Context context, int i); | ||||
|  | ||||
|         PorterDuff.Mode getTintModeForDrawableRes(int i); | ||||
|  | ||||
|         boolean tintDrawable(Context context, int i, Drawable drawable); | ||||
|  | ||||
|         boolean tintDrawableUsingColorFilter(Context context, int i, Drawable drawable); | ||||
|     } | ||||
|  | ||||
|     public static synchronized ResourceManagerInternal get() { | ||||
|         ResourceManagerInternal resourceManagerInternal; | ||||
|         synchronized (ResourceManagerInternal.class) { | ||||
|             if (INSTANCE == null) { | ||||
|                 ResourceManagerInternal resourceManagerInternal2 = new ResourceManagerInternal(); | ||||
|                 INSTANCE = resourceManagerInternal2; | ||||
|                 installDefaultInflateDelegates(resourceManagerInternal2); | ||||
|             } | ||||
|             resourceManagerInternal = INSTANCE; | ||||
|         } | ||||
|         return resourceManagerInternal; | ||||
|     } | ||||
|  | ||||
|     private static void installDefaultInflateDelegates(ResourceManagerInternal resourceManagerInternal) { | ||||
|         if (Build.VERSION.SDK_INT < 24) { | ||||
|             resourceManagerInternal.addDelegate("vector", new VdcInflateDelegate()); | ||||
|             resourceManagerInternal.addDelegate("animated-vector", new AvdcInflateDelegate()); | ||||
|             resourceManagerInternal.addDelegate("animated-selector", new AsldcInflateDelegate()); | ||||
|             resourceManagerInternal.addDelegate("drawable", new DrawableDelegate()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public synchronized void setHooks(ResourceManagerHooks resourceManagerHooks) { | ||||
|         this.mHooks = resourceManagerHooks; | ||||
|     } | ||||
|  | ||||
|     public synchronized Drawable getDrawable(Context context, int i) { | ||||
|         return getDrawable(context, i, false); | ||||
|     } | ||||
|  | ||||
|     synchronized Drawable getDrawable(Context context, int i, boolean z) { | ||||
|         Drawable loadDrawableFromDelegates; | ||||
|         checkVectorDrawableSetup(context); | ||||
|         loadDrawableFromDelegates = loadDrawableFromDelegates(context, i); | ||||
|         if (loadDrawableFromDelegates == null) { | ||||
|             loadDrawableFromDelegates = createDrawableIfNeeded(context, i); | ||||
|         } | ||||
|         if (loadDrawableFromDelegates == null) { | ||||
|             loadDrawableFromDelegates = ContextCompat.getDrawable(context, i); | ||||
|         } | ||||
|         if (loadDrawableFromDelegates != null) { | ||||
|             loadDrawableFromDelegates = tintDrawable(context, i, z, loadDrawableFromDelegates); | ||||
|         } | ||||
|         if (loadDrawableFromDelegates != null) { | ||||
|             DrawableUtils.fixDrawable(loadDrawableFromDelegates); | ||||
|         } | ||||
|         return loadDrawableFromDelegates; | ||||
|     } | ||||
|  | ||||
|     public synchronized void onConfigurationChanged(Context context) { | ||||
|         LongSparseArray<WeakReference<Drawable.ConstantState>> longSparseArray = this.mDrawableCaches.get(context); | ||||
|         if (longSparseArray != null) { | ||||
|             longSparseArray.clear(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static long createCacheKey(TypedValue typedValue) { | ||||
|         return (typedValue.assetCookie << 32) | typedValue.data; | ||||
|     } | ||||
|  | ||||
|     private Drawable createDrawableIfNeeded(Context context, int i) { | ||||
|         if (this.mTypedValue == null) { | ||||
|             this.mTypedValue = new TypedValue(); | ||||
|         } | ||||
|         TypedValue typedValue = this.mTypedValue; | ||||
|         context.getResources().getValue(i, typedValue, true); | ||||
|         long createCacheKey = createCacheKey(typedValue); | ||||
|         Drawable cachedDrawable = getCachedDrawable(context, createCacheKey); | ||||
|         if (cachedDrawable != null) { | ||||
|             return cachedDrawable; | ||||
|         } | ||||
|         ResourceManagerHooks resourceManagerHooks = this.mHooks; | ||||
|         Drawable createDrawableFor = resourceManagerHooks == null ? null : resourceManagerHooks.createDrawableFor(this, context, i); | ||||
|         if (createDrawableFor != null) { | ||||
|             createDrawableFor.setChangingConfigurations(typedValue.changingConfigurations); | ||||
|             addDrawableToCache(context, createCacheKey, createDrawableFor); | ||||
|         } | ||||
|         return createDrawableFor; | ||||
|     } | ||||
|  | ||||
|     private Drawable tintDrawable(Context context, int i, boolean z, Drawable drawable) { | ||||
|         ColorStateList tintList = getTintList(context, i); | ||||
|         if (tintList != null) { | ||||
|             if (DrawableUtils.canSafelyMutateDrawable(drawable)) { | ||||
|                 drawable = drawable.mutate(); | ||||
|             } | ||||
|             Drawable wrap = DrawableCompat.wrap(drawable); | ||||
|             DrawableCompat.setTintList(wrap, tintList); | ||||
|             PorterDuff.Mode tintMode = getTintMode(i); | ||||
|             if (tintMode == null) { | ||||
|                 return wrap; | ||||
|             } | ||||
|             DrawableCompat.setTintMode(wrap, tintMode); | ||||
|             return wrap; | ||||
|         } | ||||
|         ResourceManagerHooks resourceManagerHooks = this.mHooks; | ||||
|         if ((resourceManagerHooks == null || !resourceManagerHooks.tintDrawable(context, i, drawable)) && !tintDrawableUsingColorFilter(context, i, drawable) && z) { | ||||
|             return null; | ||||
|         } | ||||
|         return drawable; | ||||
|     } | ||||
|  | ||||
|     private Drawable loadDrawableFromDelegates(Context context, int i) { | ||||
|         int next; | ||||
|         SimpleArrayMap<String, InflateDelegate> simpleArrayMap = this.mDelegates; | ||||
|         if (simpleArrayMap == null || simpleArrayMap.isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
|         SparseArrayCompat<String> sparseArrayCompat = this.mKnownDrawableIdTags; | ||||
|         if (sparseArrayCompat != null) { | ||||
|             String str = sparseArrayCompat.get(i); | ||||
|             if (SKIP_DRAWABLE_TAG.equals(str) || (str != null && this.mDelegates.get(str) == null)) { | ||||
|                 return null; | ||||
|             } | ||||
|         } else { | ||||
|             this.mKnownDrawableIdTags = new SparseArrayCompat<>(); | ||||
|         } | ||||
|         if (this.mTypedValue == null) { | ||||
|             this.mTypedValue = new TypedValue(); | ||||
|         } | ||||
|         TypedValue typedValue = this.mTypedValue; | ||||
|         Resources resources = context.getResources(); | ||||
|         resources.getValue(i, typedValue, true); | ||||
|         long createCacheKey = createCacheKey(typedValue); | ||||
|         Drawable cachedDrawable = getCachedDrawable(context, createCacheKey); | ||||
|         if (cachedDrawable != null) { | ||||
|             return cachedDrawable; | ||||
|         } | ||||
|         if (typedValue.string != null && typedValue.string.toString().endsWith(".xml")) { | ||||
|             try { | ||||
|                 XmlResourceParser xml = resources.getXml(i); | ||||
|                 AttributeSet asAttributeSet = Xml.asAttributeSet(xml); | ||||
|                 do { | ||||
|                     next = xml.next(); | ||||
|                     if (next == 2) { | ||||
|                         break; | ||||
|                     } | ||||
|                 } while (next != 1); | ||||
|                 if (next != 2) { | ||||
|                     throw new XmlPullParserException("No start tag found"); | ||||
|                 } | ||||
|                 String name = xml.getName(); | ||||
|                 this.mKnownDrawableIdTags.append(i, name); | ||||
|                 InflateDelegate inflateDelegate = this.mDelegates.get(name); | ||||
|                 if (inflateDelegate != null) { | ||||
|                     cachedDrawable = inflateDelegate.createFromXmlInner(context, xml, asAttributeSet, context.getTheme()); | ||||
|                 } | ||||
|                 if (cachedDrawable != null) { | ||||
|                     cachedDrawable.setChangingConfigurations(typedValue.changingConfigurations); | ||||
|                     addDrawableToCache(context, createCacheKey, cachedDrawable); | ||||
|                 } | ||||
|             } catch (Exception e) { | ||||
|                 Log.e(TAG, "Exception while inflating drawable", e); | ||||
|             } | ||||
|         } | ||||
|         if (cachedDrawable == null) { | ||||
|             this.mKnownDrawableIdTags.append(i, SKIP_DRAWABLE_TAG); | ||||
|         } | ||||
|         return cachedDrawable; | ||||
|     } | ||||
|  | ||||
|     private synchronized Drawable getCachedDrawable(Context context, long j) { | ||||
|         LongSparseArray<WeakReference<Drawable.ConstantState>> longSparseArray = this.mDrawableCaches.get(context); | ||||
|         if (longSparseArray == null) { | ||||
|             return null; | ||||
|         } | ||||
|         WeakReference<Drawable.ConstantState> weakReference = longSparseArray.get(j); | ||||
|         if (weakReference != null) { | ||||
|             Drawable.ConstantState constantState = weakReference.get(); | ||||
|             if (constantState != null) { | ||||
|                 return constantState.newDrawable(context.getResources()); | ||||
|             } | ||||
|             longSparseArray.remove(j); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     private synchronized boolean addDrawableToCache(Context context, long j, Drawable drawable) { | ||||
|         Drawable.ConstantState constantState = drawable.getConstantState(); | ||||
|         if (constantState == null) { | ||||
|             return false; | ||||
|         } | ||||
|         LongSparseArray<WeakReference<Drawable.ConstantState>> longSparseArray = this.mDrawableCaches.get(context); | ||||
|         if (longSparseArray == null) { | ||||
|             longSparseArray = new LongSparseArray<>(); | ||||
|             this.mDrawableCaches.put(context, longSparseArray); | ||||
|         } | ||||
|         longSparseArray.put(j, new WeakReference<>(constantState)); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     synchronized Drawable onDrawableLoadedFromResources(Context context, VectorEnabledTintResources vectorEnabledTintResources, int i) { | ||||
|         Drawable loadDrawableFromDelegates = loadDrawableFromDelegates(context, i); | ||||
|         if (loadDrawableFromDelegates == null) { | ||||
|             loadDrawableFromDelegates = vectorEnabledTintResources.getDrawableCanonical(i); | ||||
|         } | ||||
|         if (loadDrawableFromDelegates == null) { | ||||
|             return null; | ||||
|         } | ||||
|         return tintDrawable(context, i, false, loadDrawableFromDelegates); | ||||
|     } | ||||
|  | ||||
|     boolean tintDrawableUsingColorFilter(Context context, int i, Drawable drawable) { | ||||
|         ResourceManagerHooks resourceManagerHooks = this.mHooks; | ||||
|         return resourceManagerHooks != null && resourceManagerHooks.tintDrawableUsingColorFilter(context, i, drawable); | ||||
|     } | ||||
|  | ||||
|     private void addDelegate(String str, InflateDelegate inflateDelegate) { | ||||
|         if (this.mDelegates == null) { | ||||
|             this.mDelegates = new SimpleArrayMap<>(); | ||||
|         } | ||||
|         this.mDelegates.put(str, inflateDelegate); | ||||
|     } | ||||
|  | ||||
|     PorterDuff.Mode getTintMode(int i) { | ||||
|         ResourceManagerHooks resourceManagerHooks = this.mHooks; | ||||
|         if (resourceManagerHooks == null) { | ||||
|             return null; | ||||
|         } | ||||
|         return resourceManagerHooks.getTintModeForDrawableRes(i); | ||||
|     } | ||||
|  | ||||
|     synchronized ColorStateList getTintList(Context context, int i) { | ||||
|         ColorStateList tintListFromCache; | ||||
|         tintListFromCache = getTintListFromCache(context, i); | ||||
|         if (tintListFromCache == null) { | ||||
|             ResourceManagerHooks resourceManagerHooks = this.mHooks; | ||||
|             tintListFromCache = resourceManagerHooks == null ? null : resourceManagerHooks.getTintListForDrawableRes(context, i); | ||||
|             if (tintListFromCache != null) { | ||||
|                 addTintListToCache(context, i, tintListFromCache); | ||||
|             } | ||||
|         } | ||||
|         return tintListFromCache; | ||||
|     } | ||||
|  | ||||
|     private ColorStateList getTintListFromCache(Context context, int i) { | ||||
|         SparseArrayCompat<ColorStateList> sparseArrayCompat; | ||||
|         WeakHashMap<Context, SparseArrayCompat<ColorStateList>> weakHashMap = this.mTintLists; | ||||
|         if (weakHashMap == null || (sparseArrayCompat = weakHashMap.get(context)) == null) { | ||||
|             return null; | ||||
|         } | ||||
|         return sparseArrayCompat.get(i); | ||||
|     } | ||||
|  | ||||
|     private void addTintListToCache(Context context, int i, ColorStateList colorStateList) { | ||||
|         if (this.mTintLists == null) { | ||||
|             this.mTintLists = new WeakHashMap<>(); | ||||
|         } | ||||
|         SparseArrayCompat<ColorStateList> sparseArrayCompat = this.mTintLists.get(context); | ||||
|         if (sparseArrayCompat == null) { | ||||
|             sparseArrayCompat = new SparseArrayCompat<>(); | ||||
|             this.mTintLists.put(context, sparseArrayCompat); | ||||
|         } | ||||
|         sparseArrayCompat.append(i, colorStateList); | ||||
|     } | ||||
|  | ||||
|     private static class ColorFilterLruCache extends LruCache<Integer, PorterDuffColorFilter> { | ||||
|         public ColorFilterLruCache(int i) { | ||||
|             super(i); | ||||
|         } | ||||
|  | ||||
|         PorterDuffColorFilter get(int i, PorterDuff.Mode mode) { | ||||
|             return get(Integer.valueOf(generateCacheKey(i, mode))); | ||||
|         } | ||||
|  | ||||
|         PorterDuffColorFilter put(int i, PorterDuff.Mode mode, PorterDuffColorFilter porterDuffColorFilter) { | ||||
|             return put(Integer.valueOf(generateCacheKey(i, mode)), porterDuffColorFilter); | ||||
|         } | ||||
|  | ||||
|         private static int generateCacheKey(int i, PorterDuff.Mode mode) { | ||||
|             return ((i + 31) * 31) + mode.hashCode(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static void tintDrawable(Drawable drawable, TintInfo tintInfo, int[] iArr) { | ||||
|         int[] state = drawable.getState(); | ||||
|         if (DrawableUtils.canSafelyMutateDrawable(drawable) && drawable.mutate() != drawable) { | ||||
|             Log.d(TAG, "Mutated drawable is not the same instance as the input."); | ||||
|             return; | ||||
|         } | ||||
|         if ((drawable instanceof LayerDrawable) && drawable.isStateful()) { | ||||
|             drawable.setState(new int[0]); | ||||
|             drawable.setState(state); | ||||
|         } | ||||
|         if (tintInfo.mHasTintList || tintInfo.mHasTintMode) { | ||||
|             drawable.setColorFilter(createTintFilter(tintInfo.mHasTintList ? tintInfo.mTintList : null, tintInfo.mHasTintMode ? tintInfo.mTintMode : DEFAULT_MODE, iArr)); | ||||
|         } else { | ||||
|             drawable.clearColorFilter(); | ||||
|         } | ||||
|         if (Build.VERSION.SDK_INT <= 23) { | ||||
|             drawable.invalidateSelf(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static PorterDuffColorFilter createTintFilter(ColorStateList colorStateList, PorterDuff.Mode mode, int[] iArr) { | ||||
|         if (colorStateList == null || mode == null) { | ||||
|             return null; | ||||
|         } | ||||
|         return getPorterDuffColorFilter(colorStateList.getColorForState(iArr, 0), mode); | ||||
|     } | ||||
|  | ||||
|     public static synchronized PorterDuffColorFilter getPorterDuffColorFilter(int i, PorterDuff.Mode mode) { | ||||
|         PorterDuffColorFilter porterDuffColorFilter; | ||||
|         synchronized (ResourceManagerInternal.class) { | ||||
|             ColorFilterLruCache colorFilterLruCache = COLOR_FILTER_CACHE; | ||||
|             porterDuffColorFilter = colorFilterLruCache.get(i, mode); | ||||
|             if (porterDuffColorFilter == null) { | ||||
|                 porterDuffColorFilter = new PorterDuffColorFilter(i, mode); | ||||
|                 colorFilterLruCache.put(i, mode, porterDuffColorFilter); | ||||
|             } | ||||
|         } | ||||
|         return porterDuffColorFilter; | ||||
|     } | ||||
|  | ||||
|     private void checkVectorDrawableSetup(Context context) { | ||||
|         if (this.mHasCheckedVectorDrawableSetup) { | ||||
|             return; | ||||
|         } | ||||
|         this.mHasCheckedVectorDrawableSetup = true; | ||||
|         Drawable drawable = getDrawable(context, R.drawable.abc_vector_test); | ||||
|         if (drawable == null || !isVectorDrawable(drawable)) { | ||||
|             this.mHasCheckedVectorDrawableSetup = false; | ||||
|             throw new IllegalStateException("This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static boolean isVectorDrawable(Drawable drawable) { | ||||
|         return (drawable instanceof VectorDrawableCompat) || PLATFORM_VD_CLAZZ.equals(drawable.getClass().getName()); | ||||
|     } | ||||
|  | ||||
|     private static class VdcInflateDelegate implements InflateDelegate { | ||||
|         VdcInflateDelegate() { | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.appcompat.widget.ResourceManagerInternal.InflateDelegate | ||||
|         public Drawable createFromXmlInner(Context context, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme) { | ||||
|             try { | ||||
|                 return VectorDrawableCompat.createFromXmlInner(context.getResources(), xmlPullParser, attributeSet, theme); | ||||
|             } catch (Exception e) { | ||||
|                 Log.e("VdcInflateDelegate", "Exception while inflating <vector>", e); | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static class AvdcInflateDelegate implements InflateDelegate { | ||||
|         AvdcInflateDelegate() { | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.appcompat.widget.ResourceManagerInternal.InflateDelegate | ||||
|         public Drawable createFromXmlInner(Context context, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme) { | ||||
|             try { | ||||
|                 return AnimatedVectorDrawableCompat.createFromXmlInner(context, context.getResources(), xmlPullParser, attributeSet, theme); | ||||
|             } catch (Exception e) { | ||||
|                 Log.e("AvdcInflateDelegate", "Exception while inflating <animated-vector>", e); | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class AsldcInflateDelegate implements InflateDelegate { | ||||
|         AsldcInflateDelegate() { | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.appcompat.widget.ResourceManagerInternal.InflateDelegate | ||||
|         public Drawable createFromXmlInner(Context context, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme) { | ||||
|             try { | ||||
|                 return AnimatedStateListDrawableCompat.createFromXmlInner(context, context.getResources(), xmlPullParser, attributeSet, theme); | ||||
|             } catch (Exception e) { | ||||
|                 Log.e("AsldcInflateDelegate", "Exception while inflating <animated-selector>", e); | ||||
|                 return null; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class DrawableDelegate implements InflateDelegate { | ||||
|         DrawableDelegate() { | ||||
|         } | ||||
|  | ||||
|         @Override // androidx.appcompat.widget.ResourceManagerInternal.InflateDelegate | ||||
|         public Drawable createFromXmlInner(Context context, XmlPullParser xmlPullParser, AttributeSet attributeSet, Resources.Theme theme) { | ||||
|             String classAttribute = attributeSet.getClassAttribute(); | ||||
|             if (classAttribute != null) { | ||||
|                 try { | ||||
|                     Drawable drawable = (Drawable) DrawableDelegate.class.getClassLoader().loadClass(classAttribute).asSubclass(Drawable.class).getDeclaredConstructor(new Class[0]).newInstance(new Object[0]); | ||||
|                     Compatibility.Api21Impl.inflate(drawable, context.getResources(), xmlPullParser, attributeSet, theme); | ||||
|                     return drawable; | ||||
|                 } catch (Exception e) { | ||||
|                     Log.e("DrawableDelegate", "Exception while inflating <drawable>", e); | ||||
|                 } | ||||
|             } | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user