private ShadowLegacyAssetManager getShadowAssetManager() { return legacyShadowOf(getResources().getAssets()); }
@Implementation public TypedArray obtainStyledAttributes(Resources.Theme wrapper, AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { Resources resources = wrapper.getResources(); AssetManager assets = resources.getAssets(); return legacyShadowOf(assets) .attrsToTypedArray(resources, set, attrs, defStyleAttr, getNativePtr(), defStyleRes); }
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()); } }
@Implementation protected TypedArray obtainAttributes(AttributeSet set, int[] attrs) { if (isLegacyAssetManager()) { return legacyShadowOf(realResources.getAssets()) .attrsToTypedArray(realResources, set, attrs, 0, 0, 0); } else { return directlyOn(realResources, Resources.class).obtainAttributes(set, attrs); } }
@HiddenApi @Implementation(maxSdk = M) public XmlResourceParser loadXmlResourceParser(int resId, String type) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); return shadowAssetManager.loadXmlResourceParser(resId, type); }
@Implementation protected InputStream openRawResource(int id) throws Resources.NotFoundException { if (isLegacyAssetManager()) { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResources.getAssets()); ResourceTable resourceTable = shadowAssetManager.getResourceTable(); InputStream inputStream = resourceTable.getRawValue(id, shadowAssetManager.config); if (inputStream == null) { throw newNotFoundException(id); } else { return inputStream; } } else { return directlyOn(realResources, Resources.class).openRawResource(id); } }
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()); } }
@Implementation protected TypedArray obtainTypedArray(int id) throws Resources.NotFoundException { if (isLegacyAssetManager()) { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResources.getAssets()); TypedArray typedArray = shadowAssetManager.getTypedArrayResource(realResources, id); if (typedArray != null) { return typedArray; } else { throw newNotFoundException(id); } } else { return directlyOn(realResources, Resources.class).obtainTypedArray(id); } }
@Implementation(maxSdk = M) public InputStream openRawResource(int id) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); ResourceTable resourceTable = shadowAssetManager.getResourceTable(); InputStream inputStream = resourceTable.getRawValue(id, shadowAssetManager.config); if (inputStream == null) { throw newNotFoundException(id); } else { return inputStream; } }
@HiddenApi @Implementation protected XmlResourceParser loadXmlResourceParser(int resId, String type) throws Resources.NotFoundException { if (isLegacyAssetManager()) { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResources.getAssets()); return shadowAssetManager.loadXmlResourceParser(resId, type); } else { return directlyOn(realResources, Resources.class, "loadXmlResourceParser", ClassParameter.from(int.class, resId), ClassParameter.from(String.class, type)); } }
@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; } }
@Test public void whenStyleAttrResolutionFails_attrsToTypedArray_returnsNiceErrorMessage() throws Exception { if (!useLegacy()) return; expectedException.expect(RuntimeException.class); expectedException.expectMessage( "no value for org.robolectric:attr/styleNotSpecifiedInAnyTheme " + "in theme with applied styles: [Style org.robolectric:Theme.Robolectric (and parents)]"); Resources.Theme theme = resources.newTheme(); theme.applyStyle(R.style.Theme_Robolectric, false); legacyShadowOf(assetManager) .attrsToTypedArray( resources, Robolectric.buildAttributeSet() .setStyleAttribute("?attr/styleNotSpecifiedInAnyTheme") .build(), new int[] {R.attr.string1}, 0, ((ShadowLegacyTheme) Shadow.extract(theme)).getNativePtr(), 0); }
@Implementation protected TypedArray obtainAttributes(AttributeSet set, int[] attrs) { if (isLegacyAssetManager()) { return legacyShadowOf(realResources.getAssets()) .attrsToTypedArray(realResources, set, attrs, 0, 0, 0); } else { return directlyOn(realResources, Resources.class).obtainAttributes(set, attrs); } }
@HiddenApi @Implementation(maxSdk = M) public XmlResourceParser loadXmlResourceParser(int resId, String type) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); return shadowAssetManager.loadXmlResourceParser(resId, type); }
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()); } }
@Implementation(maxSdk = M) public InputStream openRawResource(int id) throws Resources.NotFoundException { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResourcesImpl.getAssets()); ResourceTable resourceTable = shadowAssetManager.getResourceTable(); InputStream inputStream = resourceTable.getRawValue(id, shadowAssetManager.config); if (inputStream == null) { throw newNotFoundException(id); } else { return inputStream; } }
@HiddenApi @Implementation protected XmlResourceParser loadXmlResourceParser(int resId, String type) throws Resources.NotFoundException { if (isLegacyAssetManager()) { ShadowLegacyAssetManager shadowAssetManager = legacyShadowOf(realResources.getAssets()); return shadowAssetManager.loadXmlResourceParser(resId, type); } else { return directlyOn(realResources, Resources.class, "loadXmlResourceParser", ClassParameter.from(int.class, resId), ClassParameter.from(String.class, type)); } }