while (defStyleAttribute.isStyleReference()) { AttributeResource other = themeStyleSet.getAttrValue(defStyleAttribute.getStyleReference()); if (other == null) { throw new RuntimeException("couldn't dereference " + defStyleAttribute); if (defStyleAttribute.isResourceReference()) { ResName defStyleResName = defStyleAttribute.getResourceReference(); defStyleFromAttr = resolveStyle(defStyleResName, themeStyleSet); + " in " + themeStyleSet); if (attrValue.isResourceReference()) { styleAttributeResName = attrValue.getResourceReference(); } else if (attrValue.isStyleReference()) { styleAttributeResName = attrValue.getStyleReference(); while (attribute != null && attribute.isStyleReference()) { ResName otherAttrName = attribute.getStyleReference(); if (attribute.resName.equals(otherAttrName)) { Logger.info("huh... circular reference for %s?", attribute.resName.getFullyQualifiedName()); attribute = null; } else { attribute = new AttributeResource(resName, otherAttr.value, otherAttr.contextPackageName); if (attribute == null || attribute.isNull()) { return null; } else {
private void convertAndFill(AttributeResource attribute, TypedValue outValue, ResTable_config config, boolean resolveRefs) { if (attribute.isNull()) { outValue.type = TypedValue.TYPE_NULL; outValue.data = TypedValue.DATA_NULL_UNDEFINED; return; } else if (attribute.isEmpty()) { outValue.type = TypedValue.TYPE_NULL; outValue.data = TypedValue.DATA_NULL_EMPTY; if (attribute.isStyleReference()) { return; while (attribute.isResourceReference()) { Integer resourceId; ResName resName = attribute.getResourceReference(); if (attribute.getReferenceResId() != null) { resourceId = attribute.getReferenceResId(); } else { resourceId = resourceTable.getResourceId(resName); return; } else if (dereferencedRef.getData() instanceof String) { attribute = new AttributeResource(attribute.resName, dereferencedRef.asString(), resName.packageName); if (attribute.isResourceReference()) { continue; if (attribute.isNull()) { outValue.type = TypedValue.TYPE_NULL; return;
private ResName dereferenceAttr(AttributeResource attr) { if (attr.isResourceReference()) { return attr.getResourceReference(); } else if (attr.isStyleReference()) { return attr.getStyleReference(); } throw new RuntimeException("Found a " + attr + " but can't cast it :("); }
public static @Nonnull ResName getResourceReference(String value, String defPackage, String defType) { if (!isResourceReference(value)) throw new IllegalArgumentException("not a resource reference: " + value); return ResName.qualifyResName(deref(value).replace("+", ""), defPackage, defType); }
@Nullable public static ResType inferType(String itemString) { ResType itemResType = ResType.inferFromValue(itemString); if (itemResType == ResType.CHAR_SEQUENCE) { if (AttributeResource.isStyleReference(itemString)) { itemResType = ResType.STYLE; } else if (itemString.equals("@null")) { itemResType = ResType.NULL; } else if (AttributeResource.isResourceReference(itemString)) { // This is a reference; no type info needed. itemResType = null; } } return itemResType; }
private TypedResource resolveResourceValue(TypedResource value, ResTable_config config, ResName resName) { while (value != null && value.isReference()) { String s = value.asString(); if (AttributeResource.isNull(s) || AttributeResource.isEmpty(s)) { value = null; } else { String refStr = s.substring(1).replace("+", ""); resName = ResName.qualifyResName(refStr, resName); value = resourceTable.getValue(resName, config); } } return value; }
private static PermissionGroupInfo createPermissionGroupInfo(Package owner, PermissionGroupItemData itemData) { PermissionGroupInfo permissionGroupInfo = new PermissionGroupInfo(); populatePackageItemInfo(permissionGroupInfo, owner, itemData); permissionGroupInfo.metaData = metaDataToBundle(itemData.getMetaData().getValueMap()); String descriptionRef = itemData.getDescription(); if (descriptionRef != null) { ResName descResName = AttributeResource.getResourceReference(descriptionRef, owner.packageName, "string"); permissionGroupInfo.descriptionRes = RuntimeEnvironment.getAppResourceTable().getResourceId(descResName); } String labelRefOrString = itemData.getLabel(); if (labelRefOrString != null) { if (AttributeResource.isResourceReference(labelRefOrString)) { ResName labelResName = AttributeResource.getResourceReference(labelRefOrString, owner.packageName, "string"); permissionGroupInfo.labelRes = RuntimeEnvironment.getAppResourceTable().getResourceId(labelResName); } else { permissionGroupInfo.nonLocalizedLabel = labelRefOrString; } } return permissionGroupInfo; }
private TypedValue parse(Integer attrId, ResName attrResName, String value, String packageName) { AttributeResource attribute = new AttributeResource(attrResName, value, packageName); TypedValue outValue = new TypedValue(); if (attribute.isResourceReference()) { ResName resourceReference = attribute.getResourceReference(); int id = resourceResolver.getIdentifier(resourceReference.name, resourceReference.type, resourceReference.packageName); if (id == 0) { throw new IllegalArgumentException("couldn't resolve " + attribute); } outValue.type = Res_value.TYPE_REFERENCE; outValue.data = id; outValue.resourceId = id; outValue.string = "@" + id; } else { resourceResolver.parseValue(attrId, attrResName, attribute, outValue); } return outValue; } }
ResName resName = ResName.qualifyResName(attributeSet.getAttributeName(i), defaultPackageName, "attr"); Integer referenceResId = null; if (AttributeResource.isResourceReference(attributeValue)) { referenceResId = attributeSet.getAttributeResourceValue(i, -1); return new AttributeResource(resName, attributeValue, "fixme!!!", referenceResId);
@HiddenApi @Implementation(minSdk = LOLLIPOP) public boolean getThemeValue(long themePtr, int ident, TypedValue outValue, boolean resolveRefs) { ResName resName = resourceTable.getResName(ident); ThemeStyleSet themeStyleSet = getNativeTheme(themePtr).themeStyleSet; AttributeResource attrValue = themeStyleSet.getAttrValue(resName); while(attrValue != null && attrValue.isStyleReference()) { ResName attrResName = attrValue.getStyleReference(); if (attrValue.resName.equals(attrResName)) { Logger.info("huh... circular reference for %s?", attrResName.getFullyQualifiedName()); return false; } attrValue = themeStyleSet.getAttrValue(attrResName); } if (attrValue != null) { convertAndFill(attrValue, outValue, config, resolveRefs); return true; } return false; }
ResName refResName = AttributeResource.getResourceReference(reference, typedResource.getXmlContext().getPackageName(), null); typedValue.resourceId = resourceTable.getResourceId(refResName); final ResName attrResName = AttributeResource.getStyleReference(reference, typedResource.getXmlContext().getPackageName(), "attr"); typedValue.data = resourceTable.getResourceId(attrResName);
@Override public AttributeResource getAttrValue(ResName resName) { AttributeResource attributeResource = items.get(resName); // This hack allows us to look up attributes from downstream dependencies, see comment in // org.robolectric.shadows.ShadowThemeTest.obtainTypedArrayFromDependencyLibrary() // for an explanation. TODO(jongerrish): Make Robolectric use a more realistic resource merging // scheme. if (attributeResource == null && !"android".equals(resName.packageName) && !"android".equals(packageName)) { attributeResource = items.get(resName.withPackageName(packageName)); if (attributeResource != null && (!"android".equals(attributeResource.contextPackageName))) { attributeResource = new AttributeResource(resName, attributeResource.value, resName.packageName); } } return attributeResource; }
public static boolean isResourceReference(String value) { return IS_RESOURCE_REFERENCE.matcher(value).find() && !isNull(value); }
public boolean isStyleReference() { return isStyleReference(trimmedValue); }
public boolean isResourceReference() { return isResourceReference(trimmedValue); }
public String qualify(String value) { if (value == null) return null; if (AttributeResource.isResourceReference(value)) { return "@" + ResName.qualifyResourceName(value.trim().substring(1).replace("+", ""), packageName, "attr"); } else if (AttributeResource.isStyleReference(value)) { return "?" + ResName.qualifyResourceName(value.trim().substring(1), packageName, "attr"); } else { return StringResources.processStringResources(value); } }
private ResName resolveResource(TypedResource value, ResTable_config config, ResName resName) { while (value != null && value.isReference()) { String s = value.asString(); if (AttributeResource.isNull(s) || AttributeResource.isEmpty(s)) { value = null; } else { String refStr = s.substring(1).replace("+", ""); resName = ResName.qualifyResName(refStr, resName); value = resourceTable.getValue(resName, config); } } return resName; }
private static PermissionInfo createPermissionInfo(Package owner, PermissionItemData itemData) { PermissionInfo permissionInfo = new PermissionInfo(); populatePackageItemInfo(permissionInfo, owner, itemData); permissionInfo.group = itemData.getPermissionGroup(); permissionInfo.protectionLevel = decodeProtectionLevel(itemData.getProtectionLevel()); permissionInfo.metaData = metaDataToBundle(itemData.getMetaData().getValueMap()); String descriptionRef = itemData.getDescription(); if (descriptionRef != null) { ResName descResName = AttributeResource.getResourceReference(descriptionRef, owner.packageName, "string"); permissionInfo.descriptionRes = RuntimeEnvironment.getAppResourceTable().getResourceId(descResName); } String labelRefOrString = itemData.getLabel(); if (labelRefOrString != null) { if (AttributeResource.isResourceReference(labelRefOrString)) { ResName labelResName = AttributeResource.getResourceReference(labelRefOrString, owner.packageName, "string"); permissionInfo.labelRes = RuntimeEnvironment.getAppResourceTable().getResourceId(labelResName); } else { permissionInfo.nonLocalizedLabel = labelRefOrString; } } return permissionInfo; }
private TypedValue parse(Integer attrId, ResName attrResName, String value, String packageName) { AttributeResource attribute = new AttributeResource(attrResName, value, packageName); TypedValue outValue = new TypedValue(); if (attribute.isResourceReference()) { ResName resourceReference = attribute.getResourceReference(); int id = resourceResolver.getIdentifier(resourceReference.name, resourceReference.type, resourceReference.packageName); if (id == 0) { throw new IllegalArgumentException("couldn't resolve " + attribute); } outValue.type = Res_value.TYPE_REFERENCE; outValue.data = id; outValue.resourceId = id; outValue.string = "@" + id; } else { resourceResolver.parseValue(attrId, attrResName, attribute, outValue); } return outValue; } }
ResName resName = ResName.qualifyResName(attributeSet.getAttributeName(i), defaultPackageName, "attr"); Integer referenceResId = null; if (AttributeResource.isResourceReference(attributeSet.getAttributeValue(i))) { referenceResId = attributeSet.getAttributeResourceValue(i, -1); return new AttributeResource(resName, attributeSet.getAttributeValue(i), "fixme!!!", referenceResId);