@Override public String toString() { return "ResName{" + getFullyQualifiedName() + "}"; }
public void mustBe(String expectedType) { if (!type.equals(expectedType)) { throw new RuntimeException("expected " + getFullyQualifiedName() + " to be a " + expectedType + ", is a " + type); } }
public boolean grep(Pattern pattern) { for (ResName resName : items.keySet()) { if (pattern.matcher(resName.getFullyQualifiedName()).find()) { return true; } } return false; }
public AttributeResource(@Nonnull ResName resName, @Nonnull String value, @Nonnull String contextPackageName, Integer referenceResId) { this.referenceResId = referenceResId; if (!resName.type.equals("attr")) throw new IllegalStateException("\"" + resName.getFullyQualifiedName() + "\" unexpected"); this.resName = resName; this.value = value; this.trimmedValue = value.trim(); this.contextPackageName = contextPackageName; }
/** * @return null if the resource could not be qualified. */ public static String qualifyResourceName(@Nonnull String possiblyQualifiedResourceName, String defaultPackageName, String defaultType) { ResName resName = qualifyResName(possiblyQualifiedResourceName, defaultPackageName, defaultType); return resName != null ? resName.getFullyQualifiedName() : null; }
@Override public String getResourceName(Integer attrId) { return resourceTable.getResName(attrId).getFullyQualifiedName(); }
@Override public void visit(AttributeResource attributeResource) { attrs.put(attributeResource.resName.getFullyQualifiedName(), attributeResource.value); } });
@Implementation protected String getResourceName(int resid) { return getResName(resid).getFullyQualifiedName(); }
@Override public void visit(ResName key, Iterable<TypedResource> values) { List<TypedResource> v = new ArrayList<>(); for (TypedResource value : values) { v.add(value); } map.put(key.getFullyQualifiedName(), v); } });
private Resources.NotFoundException newNotFoundException(int id) { ResourceTable resourceTable = legacyShadowOf(realResources.getAssets()).getResourceTable(); ResName resName = resourceTable.getResName(id); if (resName == null) { return new Resources.NotFoundException("resource ID #0x" + Integer.toHexString(id)); } else { return new Resources.NotFoundException(resName.getFullyQualifiedName()); } }
private void arscParse(Integer attrId, ResName attrResName, AttributeResource attribute, TypedValue outValue) { String format = ShadowArscAssetManager.getResourceBagValue(attrId, ATTR_TYPE, resTable); Map<String, Integer> map = ShadowArscAssetManager.getResourceBagValues(attrId, resTable); ArrayList<Pair> pairs = new ArrayList<>(); for (Entry<String, Integer> e : map.entrySet()) { pairs.add(new Pair(e.getKey(), Integer.toString(e.getValue()))); } int formatFlags = Integer.parseInt(format); TreeSet<flag_entry> sortedFlags = new TreeSet<>( (a, b) -> ATTRIBUTE_TYPE_PRECIDENCE.compare(a.name, b.name)); Collections.addAll(sortedFlags, org.robolectric.res.android.ResourceTable.gFormatFlags); for (flag_entry flag : sortedFlags) { if ((formatFlags & flag.value) != 0) { if ("reference".equals(flag.name)) { continue; } AttrData attrData = new AttrData(attrResName.getFullyQualifiedName(), flag.name, pairs); Converter2 converter = Converter2.getConverterFor(attrData, flag.name); if (converter.fillTypedValue(attribute.value, outValue, true)) { break; } } } } }
protected XmlResourceParser loadXmlResourceParser(int resId, String type) throws Resources.NotFoundException { ResName resName = getResName(resId); ResName resolvedResName = resolveResName(resName, config); if (resolvedResName == null) { throw new RuntimeException("couldn't resolve " + resName.getFullyQualifiedName()); } resName = resolvedResName; XmlBlock block = resourceTable.getXml(resName, config); if (block == null) { throw new Resources.NotFoundException(resName.getFullyQualifiedName()); } ResourceTable resourceProvider = ResourceIds.isFrameworkResource(resId) ? RuntimeEnvironment.getSystemResourceTable() : RuntimeEnvironment.getCompileTimeResourceTable(); return getXmlResourceParser(resourceProvider, block, resName.packageName); }
private Resources.NotFoundException newNotFoundException(int id) { ResourceTable resourceTable = legacyShadowOf(realResourcesImpl.getAssets()).getResourceTable(); ResName resName = resourceTable.getResName(id); if (resName == null) { return new Resources.NotFoundException("resource ID #0x" + Integer.toHexString(id)); } else { return new Resources.NotFoundException(resName.getFullyQualifiedName()); } }
private Resources.NotFoundException newNotFoundException(int id) { ResourceTable resourceTable = legacyShadowOf(realResourcesImpl.getAssets()).getResourceTable(); ResName resName = resourceTable.getResName(id); if (resName == null) { return new Resources.NotFoundException("resource ID #0x" + Integer.toHexString(id)); } else { return new Resources.NotFoundException(resName.getFullyQualifiedName()); } }
@Test public void shouldRetainPackageNameForFullyQualifiedQueries() throws Exception { assertThat(systemResourceTable.getResName(android.R.id.text1).getFullyQualifiedName()).isEqualTo("android:id/text1"); assertThat(appResourceTable.getResName(R.id.burritos).getFullyQualifiedName()).isEqualTo("org.robolectric:id/burritos"); } }
@Test public void qualifyFromFilePathShouldExtractResourceTypeAndNameFromQualifiedPath() { final ResName actual = ResName.qualifyFromFilePath("some.package", "./res/drawable-hdpi/icon.png"); assertThat(actual.getFullyQualifiedName()).isEqualTo("some.package:drawable/icon"); }
public TypedResource pick(ResName resName, ResTable_config toMatch) { List<TypedResource> values = map.get(resName); if (values == null || values.size() == 0) return null; TypedResource bestMatchSoFar = null; for (TypedResource candidate : values) { ResTable_config candidateConfig = candidate.getConfig(); if (candidateConfig.match(toMatch)) { if (bestMatchSoFar == null || candidateConfig.isBetterThan(bestMatchSoFar.getConfig(), toMatch)) { bestMatchSoFar = candidate; } } } if (Logger.loggingEnabled()) { Logger.debug("Picked '%s' for %s for qualifiers '%s' (%d candidates)", bestMatchSoFar == null ? "<none>" : bestMatchSoFar.getXmlContext().getQualifiers().toString(), resName.getFullyQualifiedName(), toMatch, values.size()); } return bestMatchSoFar; }
@Test public void qualifyFromFilePathShouldExtractResourceTypeAndNameFromUnqualifiedPath() { final ResName actual = ResName.qualifyFromFilePath("some.package", "./res/drawable/icon.png"); assertThat(actual.getFullyQualifiedName()).isEqualTo("some.package:drawable/icon"); }
private int getResourceId(String possiblyQualifiedResourceName, String defaultPackageName, String defaultType) { if (AttributeResource.isNull(possiblyQualifiedResourceName)) return 0; if (AttributeResource.isStyleReference(possiblyQualifiedResourceName)) { ResName styleReference = AttributeResource.getStyleReference(possiblyQualifiedResourceName, defaultPackageName, "attr"); Integer resourceId = resourceTable.getResourceId(styleReference); if (resourceId == null) { throw new Resources.NotFoundException(styleReference.getFullyQualifiedName()); } return resourceId; } if (AttributeResource.isResourceReference(possiblyQualifiedResourceName)) { ResName resourceReference = AttributeResource.getResourceReference(possiblyQualifiedResourceName, defaultPackageName, defaultType); Integer resourceId = resourceTable.getResourceId(resourceReference); if (resourceId == null) { throw new Resources.NotFoundException(resourceReference.getFullyQualifiedName()); } return resourceId; } possiblyQualifiedResourceName = removeLeadingSpecialCharsIfAny(possiblyQualifiedResourceName); ResName resName = ResName.qualifyResName(possiblyQualifiedResourceName, defaultPackageName, defaultType); Integer resourceId = resourceTable.getResourceId(resName); return resourceId == null ? 0 : resourceId; }
@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; }