private boolean getValueAt(int index, TypedValue outValue) { final int[] data = mData; final int type = data[index + AssetManager.STYLE_TYPE]; if (type == TypedValue.TYPE_NULL) { return false; } outValue.type = type; outValue.data = data[index + AssetManager.STYLE_DATA]; outValue.assetCookie = data[index + AssetManager.STYLE_ASSET_COOKIE]; outValue.resourceId = data[index + AssetManager.STYLE_RESOURCE_ID]; outValue.changingConfigurations = data[index + AssetManager.STYLE_CHANGING_CONFIGURATIONS]; outValue.density = data[index + AssetManager.STYLE_DENSITY]; outValue.string = (type == TypedValue.TYPE_STRING) ? loadStringValueAt(index) : null; return true; }
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; } } } }