From 2fac1b223529e6aa7538fd1364eadb36adc77664 Mon Sep 17 00:00:00 2001 From: Ax333l Date: Sun, 16 Apr 2023 20:03:39 +0200 Subject: [PATCH 1/2] convenient attribute methods for style bags --- .../reandroid/arsc/value/style/StyleBag.java | 3 ++ .../arsc/value/style/StyleBagItem.java | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/com/reandroid/arsc/value/style/StyleBag.java b/src/main/java/com/reandroid/arsc/value/style/StyleBag.java index 8704a74..752749b 100644 --- a/src/main/java/com/reandroid/arsc/value/style/StyleBag.java +++ b/src/main/java/com/reandroid/arsc/value/style/StyleBag.java @@ -40,6 +40,9 @@ public int getParentId() { return getTableEntry().getParentId(); } + public void setParentId(int id) { + getTableEntry().setParentId(id); + } public int getResourceId() { com.reandroid.arsc.value.Entry entry = getEntry(); diff --git a/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java b/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java index 12d98c0..996533e 100644 --- a/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java @@ -18,10 +18,13 @@ import com.reandroid.arsc.decoder.ValueDecoder; import com.reandroid.arsc.item.StringItem; import com.reandroid.arsc.item.TableString; + import com.reandroid.arsc.value.attribute.AttributeBag; + import com.reandroid.arsc.value.attribute.AttributeBagItem; import com.reandroid.arsc.value.bag.BagItem; import com.reandroid.arsc.value.Entry; import com.reandroid.arsc.value.ResValueMap; import com.reandroid.arsc.value.ValueType; + import com.reandroid.common.EntryStore; public class StyleBagItem extends BagItem { private StyleBagItem(ResValueMap bagItem) { @@ -47,6 +50,12 @@ char prefix = 0; return block.buildResourceName(mBagItem.getName(), prefix, false); } + public Entry getAttributeEntry(EntryStore entryStore) { + if (mBagItem == null) { + return null; + } + return entryStore.getEntryGroup(mBagItem.getName()).pickOne(); + } public int getNameId() { if (mBagItem == null) { @@ -58,6 +67,10 @@ public boolean hasAttributeValue() { return getValueType() == ValueType.ATTRIBUTE; } + public boolean hasIntValue() { + ValueType valueType = getValueType(); + return valueType == ValueType.INT_DEC || valueType == ValueType.INT_HEX; + } public String getValueAsReference() { ValueType valueType = getValueType(); @@ -77,6 +90,18 @@ int id = getValue(); return entry.buildResourceName(id, prefix, includeType); } + public String decodeAttributeValue(AttributeBag attr, EntryStore entryStore) { + if (!hasIntValue()) { + return null; + } + return attr.decodeAttributeValue(entryStore, getValue()); + } + public AttributeBagItem[] getFlagsOrEnum(AttributeBag attr) { + if (!hasIntValue()) { + return null; + } + return attr.searchValue(getValue()); + } @Override public String toString() { @@ -158,4 +183,7 @@ public static StyleBagItem createFloat(float n) { return new StyleBagItem(ValueType.FLOAT, Float.floatToIntBits(n)); } + public static StyleBagItem enumOrFlag(AttributeBag attr, String valueString) { + return encoded(attr.encodeEnumOrFlagValue(valueString)); + } } From c3fdcdd53bc54e9b7b9f4f8758068b6e1e9fb127 Mon Sep 17 00:00:00 2001 From: Ax333l Date: Sun, 16 Apr 2023 20:05:41 +0200 Subject: [PATCH 2/2] resolve string refs in plurals --- .../arsc/value/plurals/PluralsBag.java | 8 +++- .../arsc/value/plurals/PluralsBagItem.java | 44 ++++++++++++++++--- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java index 50d2774..4c03194 100644 --- a/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java +++ b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java @@ -15,6 +15,7 @@ */ package com.reandroid.arsc.value.plurals; + import com.reandroid.arsc.value.ResConfig; import com.reandroid.arsc.value.ResValueMap; import com.reandroid.arsc.value.ValueType; import com.reandroid.arsc.value.bag.MapBag; @@ -50,12 +51,15 @@ return PluralsQuantity.valueOf(valueMap); } - public String getQuantityString(PluralsQuantity quantity) { + public String getQuantityString(PluralsQuantity quantity, ResConfig resConfig) { PluralsBagItem item = get(quantity); if (item == null) { return null; } - return item.getQualityString(); + return item.getQualityString(resConfig); + } + public String getQuantityString(PluralsQuantity quantity) { + return getQuantityString(quantity, null); } public void setQuantityString(PluralsQuantity quantity, String str) { diff --git a/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java index 8b72d0b..a895c9c 100644 --- a/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java @@ -15,12 +15,14 @@ */ package com.reandroid.arsc.value.plurals; + import com.reandroid.arsc.chunk.TableBlock; import com.reandroid.arsc.item.StringItem; import com.reandroid.arsc.item.TableString; - import com.reandroid.arsc.value.ResValueMap; - import com.reandroid.arsc.value.ValueType; + import com.reandroid.arsc.value.*; import com.reandroid.arsc.value.bag.BagItem; + import java.util.List; + public class PluralsBagItem extends BagItem { private PluralsBagItem(ResValueMap bagItem) { super(bagItem); @@ -41,17 +43,49 @@ return PluralsQuantity.valueOf(mBagItem); } - public String getQualityString() { + public String getQualityString(ResConfig resConfig) { switch (getValueType()) { case STRING: return getStringValue(); case REFERENCE: - // TODO: resolve string reference based on language + Entry entry = null; + if (mBagItem != null) { + entry = mBagItem.getEntry(); + } + if (entry == null) { + return null; + } + + if (resConfig == null) { + resConfig = entry.getResConfig(); + } + + Entry stringRes = null; + if (resConfig != null) { + TableBlock tableBlock = entry.getPackageBlock().getTableBlock(); + List resolvedList = tableBlock.resolveReferenceWithConfig(getValue(), resConfig); + if (resolvedList.size() > 0) { + stringRes = resolvedList.get(0); + } + } + + if (stringRes == null) { + return null; + } + ResValue resValue = stringRes.getResValue(); + if (resValue == null || resValue.getValueType() != ValueType.STRING) { + throw new IllegalArgumentException("Not a STR reference: " + formattedRefValue()); + } + return resValue.getValueAsString(); default: throw new IllegalArgumentException("Not STR/REFERENCE ValueType=" + getValueType()); } } + private String formattedRefValue() { + return String.format("@0x%08x", getValue()); + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -61,7 +95,7 @@ if (hasStringValue()) { builder.append(getStringValue()); } else { - builder.append(String.format("@0x%08x", getValue())); + builder.append(formattedRefValue()); } builder.append(""); return builder.toString();