From 3fd81baeafee829169aaad1980a2da65560ea803 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 22 Aug 2023 22:13:49 +0200 Subject: [PATCH] AssetManager: fix loading without merge use cookie values to find correct StringPool --- .../android/content/res/AssetManager.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/api-impl/android/content/res/AssetManager.java b/src/api-impl/android/content/res/AssetManager.java index d9e2819c..e4513762 100644 --- a/src/api-impl/android/content/res/AssetManager.java +++ b/src/api-impl/android/content/res/AssetManager.java @@ -277,7 +277,7 @@ public final class AssetManager { * @param id Resource id of the string array */ /*package*/ final CharSequence[] getResourceTextArray(final int id) { - ResValueMap children[] = tableBlock.search(id).pickOne().getResValueMapArray().getChildes(); + ResValueMap children[] = tableBlockSearch(id).pickOne().getResValueMapArray().getChildes(); CharSequence values[] = new CharSequence[children.length]; for (int i = 0; i < children.length; i++) { StringItem stringItem = children[i].getDataAsPoolString(); @@ -288,7 +288,7 @@ public final class AssetManager { public Map loadStyle(int resId) { Map map = new HashMap<>(); - EntryGroup entryGroup = tableBlock.search(resId); + EntryGroup entryGroup = tableBlockSearch(resId); while (entryGroup != null) { Entry entry = entryGroup.pickOne(); ResValueMapArray array = entry.getResValueMapArray(); @@ -296,7 +296,7 @@ public final class AssetManager { map.putIfAbsent(array.get(i).getName(), array.get(i)); } int parent_id = ((EntryHeaderMap)entry.getHeader()).getParentId(); - entryGroup = tableBlock.search(parent_id); + entryGroup = tableBlockSearch(parent_id); } return map; } @@ -304,7 +304,7 @@ public final class AssetManager { /*package*/ final boolean getThemeValue(int theme, int ident, TypedValue outValue, boolean resolveRefs) { Map style = loadStyle(theme); - EntryGroup entryGroup = tableBlock.search(ident); + EntryGroup entryGroup = tableBlockSearch(ident); if (entryGroup == null) return false; Entry entry = entryGroup.pickOne(); @@ -315,7 +315,7 @@ public final class AssetManager { valueItem = style.get(ident); if (valueItem != null && valueItem.getValueType() == ValueType.ATTRIBUTE) { ident = valueItem.getData(); - entryGroup = tableBlock.search(ident); + entryGroup = tableBlockSearch(ident); if (entryGroup == null) { break; } @@ -365,7 +365,8 @@ public final class AssetManager { // System.out.println("Get pooled: block=" + block // + ", id=#" + Integer.toHexString(id) // + ", blocks=" + mStringBlocks); - return tableBlock.getStringPool().get(id).get(); + TableString string = tableBlocks.get(block).getStringPool().get(id); + return string != null ? string.get() : null; } /** @@ -819,11 +820,11 @@ public final class AssetManager { } /*package*/ /*native*/ final String getResourceName(int resid) { - return tableBlock.search(resid).pickOne().getName(); + return tableBlockSearch(resid).pickOne().getName(); } /*package*/ native final String getResourcePackageName(int resid); /*package*/ /*native*/ final String getResourceTypeName(int resid) { - return tableBlock.search(resid).pickOne().getTypeName(); + return tableBlockSearch(resid).pickOne().getTypeName(); } /*package*/ native final String getResourceEntryName(int resid); @@ -848,6 +849,14 @@ public final class AssetManager { */ private native final int loadResourceValue(int ident, short density, TypedValue outValue, boolean resolve); + + private int getCookie(ValueItem valueItem) { + for (int i=0; i