From f3292a76f2ef5c773453820018e99568291817ba Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Fri, 9 Feb 2024 16:04:40 +0100 Subject: [PATCH] AssetManager: special handling for style and array types These are complex and can't be loaded into a TypedArray --- src/api-impl/android/content/res/AssetManager.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/api-impl/android/content/res/AssetManager.java b/src/api-impl/android/content/res/AssetManager.java index d13d4c10..3923a555 100644 --- a/src/api-impl/android/content/res/AssetManager.java +++ b/src/api-impl/android/content/res/AssetManager.java @@ -804,7 +804,7 @@ public final class AssetManager { ValueItem valueItem = parser.getResXmlAttributeAt(xmlCache.get(resId)); value.type = valueItem.getType(); value.data = valueItem.getData(); - value.resourceId = resId; + value.resourceId = 0; value.assetCookie = -1; if (value.type != TypedValue.TYPE_ATTRIBUTE) found = true; @@ -820,6 +820,14 @@ public final class AssetManager { found = true; } } + if (value.type == TypedValue.TYPE_REFERENCE && value.data != 0) { + String typeName = getResourceTypeName(value.data); + if ("style".equals(typeName) || "array".equals(typeName)) { + // style and array are complex types, which can't be stored in a TypedArray + value.resourceId = value.data; + break; + } + } if ((value.type == TypedValue.TYPE_REFERENCE || value.type == TypedValue.TYPE_ATTRIBUTE) && value.data != resId) { resId = value.data; } else {