Merge "Use right theme for drawable inflation." into lmp-dev

This commit is contained in:
Deepanshu Gupta
2014-10-29 00:07:40 +00:00
committed by Android (Google) Code Review
5 changed files with 43 additions and 19 deletions

View File

@ -163,7 +163,7 @@ public final class BridgeResources extends Resources {
Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag); Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
if (value != null) { if (value != null) {
return ResourceHelper.getDrawable(value.getSecond(), mContext); return ResourceHelper.getDrawable(value.getSecond(), mContext, theme);
} }
// id was not found or not resolved. Throw a NotFoundException. // id was not found or not resolved. Throw a NotFoundException.

View File

@ -32,6 +32,7 @@ import com.android.resources.ResourceType;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.content.res.Resources.Theme;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.TypedValue; import android.util.TypedValue;
@ -115,6 +116,13 @@ public final class BridgeTypedArray extends TypedArray {
} }
} }
/**
* Set the theme to be used for inflating drawables.
*/
public void setTheme(Theme theme) {
mTheme = theme;
}
/** /**
* Return the number of values in this array. * Return the number of values in this array.
*/ */
@ -663,7 +671,7 @@ public final class BridgeTypedArray extends TypedArray {
} }
ResourceValue value = mResourceData[index]; ResourceValue value = mResourceData[index];
return ResourceHelper.getDrawable(value, mContext); return ResourceHelper.getDrawable(value, mContext, mTheme);
} }

View File

@ -58,7 +58,8 @@ public class Resources_Theme_Delegate {
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
int[] attrs) { int[] attrs) {
boolean changed = setupResources(thisTheme); boolean changed = setupResources(thisTheme);
TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs); BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs);
ta.setTheme(thisTheme);
restoreResources(changed); restoreResources(changed);
return ta; return ta;
} }
@ -69,7 +70,9 @@ public class Resources_Theme_Delegate {
int resid, int[] attrs) int resid, int[] attrs)
throws NotFoundException { throws NotFoundException {
boolean changed = setupResources(thisTheme); boolean changed = setupResources(thisTheme);
TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs); BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid,
attrs);
ta.setTheme(thisTheme);
restoreResources(changed); restoreResources(changed);
return ta; return ta;
} }
@ -79,8 +82,9 @@ public class Resources_Theme_Delegate {
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
boolean changed = setupResources(thisTheme); boolean changed = setupResources(thisTheme);
TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(set, attrs, BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(set,
defStyleAttr, defStyleRes); attrs, defStyleAttr, defStyleRes);
ta.setTheme(thisTheme);
restoreResources(changed); restoreResources(changed);
return ta; return ta;
} }
@ -91,8 +95,8 @@ public class Resources_Theme_Delegate {
int resid, TypedValue outValue, int resid, TypedValue outValue,
boolean resolveRefs) { boolean resolveRefs) {
boolean changed = setupResources(thisTheme); boolean changed = setupResources(thisTheme);
boolean found = RenderSessionImpl.getCurrentContext().resolveThemeAttribute( boolean found = RenderSessionImpl.getCurrentContext().resolveThemeAttribute(resid,
resid, outValue, resolveRefs); outValue, resolveRefs);
restoreResources(changed); restoreResources(changed);
return found; return found;
} }

View File

@ -115,7 +115,7 @@ public final class BridgeContext extends Context {
private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
// cache for TypedArray generated from IStyleResourceValue object // cache for TypedArray generated from IStyleResourceValue object
private Map<int[], Map<Integer, TypedArray>> mTypedArrayCache; private Map<int[], Map<Integer, BridgeTypedArray>> mTypedArrayCache;
private BridgeInflater mBridgeInflater; private BridgeInflater mBridgeInflater;
private BridgeContentResolver mContentResolver; private BridgeContentResolver mContentResolver;
@ -467,7 +467,7 @@ public final class BridgeContext extends Context {
@Override @Override
public final TypedArray obtainStyledAttributes(int[] attrs) { public final BridgeTypedArray obtainStyledAttributes(int[] attrs) {
// No style is specified here, so create the typed array based on the default theme // No style is specified here, so create the typed array based on the default theme
// and the styles already applied to it. A null value of style indicates that the default // and the styles already applied to it. A null value of style indicates that the default
// theme should be used. // theme should be used.
@ -475,7 +475,7 @@ public final class BridgeContext extends Context {
} }
@Override @Override
public final TypedArray obtainStyledAttributes(int resid, int[] attrs) public final BridgeTypedArray obtainStyledAttributes(int resid, int[] attrs)
throws Resources.NotFoundException { throws Resources.NotFoundException {
// get the StyleResourceValue based on the resId; // get the StyleResourceValue based on the resId;
StyleResourceValue style = getStyleByDynamicId(resid); StyleResourceValue style = getStyleByDynamicId(resid);
@ -485,9 +485,9 @@ public final class BridgeContext extends Context {
} }
if (mTypedArrayCache == null) { if (mTypedArrayCache == null) {
mTypedArrayCache = new HashMap<int[], Map<Integer,TypedArray>>(); mTypedArrayCache = new HashMap<int[], Map<Integer,BridgeTypedArray>>();
Map<Integer, TypedArray> map = new HashMap<Integer, TypedArray>(); Map<Integer, BridgeTypedArray> map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map); mTypedArrayCache.put(attrs, map);
BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs); BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs);
@ -497,14 +497,14 @@ public final class BridgeContext extends Context {
} }
// get the 2nd map // get the 2nd map
Map<Integer, TypedArray> map = mTypedArrayCache.get(attrs); Map<Integer, BridgeTypedArray> map = mTypedArrayCache.get(attrs);
if (map == null) { if (map == null) {
map = new HashMap<Integer, TypedArray>(); map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map); mTypedArrayCache.put(attrs, map);
} }
// get the array from the 2nd map // get the array from the 2nd map
TypedArray ta = map.get(resid); BridgeTypedArray ta = map.get(resid);
if (ta == null) { if (ta == null) {
ta = createStyleBasedTypedArray(style, attrs); ta = createStyleBasedTypedArray(style, attrs);
@ -515,12 +515,12 @@ public final class BridgeContext extends Context {
} }
@Override @Override
public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) { public final BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
return obtainStyledAttributes(set, attrs, 0, 0); return obtainStyledAttributes(set, attrs, 0, 0);
} }
@Override @Override
public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, public BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
int defStyleAttr, int defStyleRes) { int defStyleAttr, int defStyleRes) {
Map<String, String> defaultPropMap = null; Map<String, String> defaultPropMap = null;

View File

@ -32,6 +32,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.Resources.Theme;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Bitmap_Delegate; import android.graphics.Bitmap_Delegate;
import android.graphics.NinePatch_Delegate; import android.graphics.NinePatch_Delegate;
@ -166,6 +167,17 @@ public final class ResourceHelper {
* @param context the current context * @param context the current context
*/ */
public static Drawable getDrawable(ResourceValue value, BridgeContext context) { public static Drawable getDrawable(ResourceValue value, BridgeContext context) {
return getDrawable(value, context, null);
}
/**
* Returns a drawable from the given value.
* @param value The value that contains a path to a 9 patch, a bitmap or a xml based drawable,
* or an hexadecimal color
* @param context the current context
* @param theme the theme to be used to inflate the drawable.
*/
public static Drawable getDrawable(ResourceValue value, BridgeContext context, Theme theme) {
if (value == null) { if (value == null) {
return null; return null;
} }
@ -209,7 +221,7 @@ public final class ResourceHelper {
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser( BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
parser, context, value.isFramework()); parser, context, value.isFramework());
try { try {
return Drawable.createFromXml(context.getResources(), blockParser); return Drawable.createFromXml(context.getResources(), blockParser, theme);
} finally { } finally {
blockParser.ensurePopped(); blockParser.ensurePopped();
} }