public static void convertAndFill( Attribute attribute, TypedValue outValue, ResourceLoader resourceLoader, String qualifiers, boolean resolveRefs) { if (attribute == null || attribute.isNull() || attribute.isEmpty()) { outValue.type = TypedValue.TYPE_NULL; if (attribute != null && attribute.isEmpty()) { outValue.data = TypedValue.DATA_NULL_EMPTY; } else { outValue.data = TypedValue.DATA_NULL_UNDEFINED; } return; } TypedResource attrTypeData = resourceLoader.getValue(attribute.resName, qualifiers); if (attrTypeData == null) { return; } AttrData attrData = (AttrData) attrTypeData.getData(); convertAndFill(attribute, outValue, resourceLoader, qualifiers, attrData, resolveRefs); }
public static void convertAndFill( Attribute attribute, TypedValue outValue, ResourceLoader resourceLoader, String qualifiers, AttrData attrData, boolean resolveRefs) { // short-circuit Android caching of loaded resources cuz our string positions don't remain // stable... outValue.assetCookie = getNextStringCookie(); // TODO: Handle resource and style references if (attribute.isStyleReference()) { return; } ResourceIndex resourceIndex = resourceLoader.getResourceIndex(); while (attribute.isResourceReference()) { ResName resName = attribute.getResourceReference(); Integer resourceId = resourceIndex.getResourceId(resName); if (resourceId == null) { throw new Resources.NotFoundException("unknown resource " + resName); } outValue.type = TypedValue.TYPE_REFERENCE; outValue.resourceId = resourceId; TypedResource dereferencedRef = resourceLoader.getValue(resName, qualifiers); if (dereferencedRef == null) { if (resName.type.equals("id")) { return; } else if (resName.type.equals("layout")) { return; // resourceId is good enough, right? } else if (resName.type.equals("dimen")) { return; } else if (resName.type.equals("transition")) { return; } else if (resName.type.equals("interpolator")) { return; } else if (resName.type.equals("menu")) { return; } else if (resName.type.equals("raw")) { return; } else if (DrawableResourceLoader.isStillHandledHere(resName)) { // wtf. color and drawable references reference are all kinds of stupid. DrawableNode drawableNode = resourceLoader.getDrawableNode(resName, qualifiers); if (drawableNode == null) { throw new Resources.NotFoundException("can't find file for " + resName); } else { outValue.type = TypedValue.TYPE_STRING; outValue.data = 0; outValue.assetCookie = getNextStringCookie(); outValue.string = drawableNode.getFsFile().getPath(); return; } } else { throw new RuntimeException("huh? " + resName); } } else { if (dereferencedRef.isFile()) { outValue.type = TypedValue.TYPE_STRING; outValue.data = 0; outValue.assetCookie = getNextStringCookie(); outValue.string = dereferencedRef.asString(); return; } else if (dereferencedRef.getData() instanceof String) { attribute = new Attribute(attribute.resName, dereferencedRef.asString(), resName.packageName); if (attribute.isResourceReference()) { continue; } if (resolveRefs) { getConverter(dereferencedRef.getResType()).fillTypedValue(attribute.value, outValue); return; } } } break; } if (attribute.isNull()) { outValue.type = TypedValue.TYPE_NULL; return; } String format = attrData.getFormat(); String[] types = format.split("\\|"); for (String type : types) { if ("reference".equals(type)) continue; // already handled above Converter converter = getConverterFor(attrData, type); if (converter != null) { if (converter.fillTypedValue(attribute.value, outValue)) { return; } } } }