public TypedResource getAttrTypeData(ResName resName) { return resourceTable.getValue(resName, config); }
private TypedResource getAndResolve(int resId, ResTable_config config, boolean resolveRefs) { TypedResource value = resourceTable.getValue(resId, config); if (resolveRefs) { value = resolve(value, config, resId); } return value; }
protected ResName resolveResName(ResName resName, ResTable_config config) { TypedResource value = resourceTable.getValue(resName, config); return resolveResource(value, config, resName); }
private StyleData getParent(StyleData style) { String parent = getParentStyleName(style); if (parent == null) return null; if (parent.startsWith("@")) parent = parent.substring(1); ResName styleRef = ResName.qualifyResName(parent, style.getPackageName(), "style"); styleRef = dereferenceResName(styleRef); // TODO: Refactor this to a ResourceLoaderChooser ResourceTable resourceProvider = "android".equals(styleRef.packageName) ? systemResourceTable : appResourceTable; TypedResource typedResource = resourceProvider.getValue(styleRef, config); if (typedResource == null) { StringBuilder builder = new StringBuilder("Could not find any resource") .append(" from reference ").append(styleRef) .append(" from ").append(style) .append(" with ").append(theme); throw new RuntimeException(builder.toString()); } Object data = typedResource.getData(); if (data instanceof StyleData) { return (StyleData) data; } else { StringBuilder builder = new StringBuilder(styleRef.toString()) .append(" does not resolve to a Style.") .append(" got ").append(data).append(" instead. ") .append(" from ").append(style) .append(" with ").append(theme); throw new RuntimeException(builder.toString()); } }
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 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; }
case VALUE: TypedResource<?> typedRes = resourceTable.getValue(resName, new ResTable_config());
private Style resolveStyle(@Nonnull ResName themeStyleName, Style themeStyleSet) { TypedResource themeStyleResource = resourceTable.getValue(themeStyleName, config); if (themeStyleResource == null) return null; StyleData themeStyleData = (StyleData) themeStyleResource.getData(); if (themeStyleSet == null) { themeStyleSet = new ThemeStyleSet(); } return new StyleResolver(resourceTable, legacyShadowOf(AssetManager.getSystem()).getResourceTable(), themeStyleData, themeStyleSet, themeStyleName, config); }
@Test public void whenIdItemsHaveStringContent_shouldLoadIdResourcesDefinedByItemTag() { TypedResource value = resourceTable.getValue( new ResName("org.robolectric", "id", "id_with_string_value"), config); assertThat(value.asString()).isEmpty(); } }
@HiddenApi @Implementation public final InputStream openNonAsset(int cookie, String fileName, int accessMode) throws IOException { final ResName resName = qualifyFromNonAssetFileName(fileName); final FileTypedResource typedResource = (FileTypedResource) resourceTable.getValue(resName, config); if (typedResource == null) { throw new IOException("Unable to find resource for " + fileName); } InputStream stream; if (accessMode == AssetManager.ACCESS_STREAMING) { stream = Fs.getInputStream(typedResource.getPath()); } else { stream = new ByteArrayInputStream(Fs.getBytes(typedResource.getPath())); } if (RuntimeEnvironment.getApiLevel() >= P) { Asset asset = Asset.newFileAsset(typedResource); long assetPtr = Registries.NATIVE_ASSET_REGISTRY.register(asset); // Camouflage the InputStream as an AssetInputStream so subsequent instanceof checks pass. stream = ShadowAssetInputStream.createAssetInputStream(stream, assetPtr, realObject); } return stream; }
@Test public void shouldLoadDrawableXmlResources() { TypedResource value = resourceTable.getValue(new ResName("org.robolectric", "drawable", "rainbow"), config); assertThat(value).isNotNull(); assertThat(value.getResType()).isEqualTo(ResType.DRAWABLE); assertThat(value.isFile()).isTrue(); assertThat((String) value.getData()).contains("rainbow.xml"); }
@Test public void shouldLoadDrawableBitmapResources() { TypedResource value = resourceTable.getValue(new ResName("org.robolectric", "drawable", "an_image"), config); assertThat(value).isNotNull(); assertThat(value.getResType()).isEqualTo(ResType.DRAWABLE); assertThat(value.isFile()).isTrue(); assertThat((String) value.getData()).contains("an_image.png"); }
@Test public void shouldLoadDrawableBitmapResourcesDefinedByItemTag() { TypedResource value = resourceTable.getValue(new ResName("org.robolectric", "drawable", "example_item_drawable"), config); assertThat(value).isNotNull(); assertThat(value.getResType()).isEqualTo(ResType.DRAWABLE); assertThat(value.isReference()).isTrue(); assertThat((String) value.getData()).isEqualTo("@drawable/an_image"); }
@Test public void shouldLoadIdResourcesDefinedByItemTag() { TypedResource value = resourceTable.getValue(new ResName("org.robolectric", "id", "id_declared_in_item_tag"), config); assertThat(value).isNotNull(); assertThat(value.getResType()).isEqualTo(ResType.CHAR_SEQUENCE); assertThat(value.isReference()).isFalse(); assertThat(value.asString()).isEmpty(); assertThat((String) value.getData()).isEmpty(); }
@Implementation protected String getQuantityString(int resId, int quantity) throws Resources.NotFoundException { if (isLegacyAssetManager()) { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResources.getAssets()); TypedResource typedResource = shadowAssetManager.getResourceTable() .getValue(resId, shadowAssetManager.config); if (typedResource != null && typedResource instanceof PluralRules) { PluralRules pluralRules = (PluralRules) typedResource; Plural plural = pluralRules.find(quantity); if (plural == null) { return null; } TypedResource<?> resolvedTypedResource = shadowAssetManager.resolve( new TypedResource<>(plural.getString(), ResType.CHAR_SEQUENCE, pluralRules.getXmlContext()), shadowAssetManager.config, resId); return resolvedTypedResource == null ? null : resolvedTypedResource.asString(); } else { return null; } } else { return directlyOn(realResources, Resources.class).getQuantityString(resId, quantity); } }
@Implementation(maxSdk = M) public String getQuantityString(int resId, int quantity) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); TypedResource typedResource = shadowAssetManager.getResourceTable().getValue(resId, shadowAssetManager.config); if (typedResource != null && typedResource instanceof PluralRules) { PluralRules pluralRules = (PluralRules) typedResource; Plural plural = pluralRules.find(quantity); if (plural == null) { return null; } TypedResource<?> resolvedTypedResource = shadowAssetManager.resolve( new TypedResource<>(plural.getString(), ResType.CHAR_SEQUENCE, pluralRules.getXmlContext()), shadowAssetManager.config, resId); return resolvedTypedResource == null ? null : resolvedTypedResource.asString(); } else { return null; } }
@Implementation(maxSdk = M) public String getQuantityString(int resId, int quantity) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); TypedResource typedResource = shadowAssetManager.getResourceTable().getValue(resId, shadowAssetManager.config); if (typedResource != null && typedResource instanceof PluralRules) { PluralRules pluralRules = (PluralRules) typedResource; Plural plural = pluralRules.find(quantity); if (plural == null) { return null; } TypedResource<?> resolvedTypedResource = shadowAssetManager.resolve( new TypedResource<>(plural.getString(), ResType.CHAR_SEQUENCE, pluralRules.getXmlContext()), shadowAssetManager.config, resId); return resolvedTypedResource == null ? null : resolvedTypedResource.asString(); } else { return null; } }
TypedResource dereferencedRef = resourceTable.getValue(resName, config); if (dereferencedRef == null) { Logger.strict("couldn't resolve %s from %s", resName.getFullyQualifiedName(), attribute);
private TypedResource getAndResolve(int resId, String qualifiers, boolean resolveRefs) { TypedResource value = resourceTable.getValue(resId, qualifiers); if (resolveRefs) { value = resolve(value, qualifiers, resId); } return 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; }