From c3fdcdd53bc54e9b7b9f4f8758068b6e1e9fb127 Mon Sep 17 00:00:00 2001 From: Ax333l Date: Sun, 16 Apr 2023 20:05:41 +0200 Subject: [PATCH] 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();