diff --git a/.github/workflows/gradle-test.yml b/.github/workflows/gradle-test.yml index 051b33efb..dcc35146d 100644 --- a/.github/workflows/gradle-test.yml +++ b/.github/workflows/gradle-test.yml @@ -15,16 +15,16 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Set up JDK 8 - uses: actions/setup-java@v4 + uses: actions/setup-java@v6 with: java-version: '8' distribution: 'temurin' - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@v6 - name: Test and build jar run: ./gradlew test jar - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: ARSCLib path: build/libs diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a91a6b65..f1ba1b3d0 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.14.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlPullParser.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlPullParser.java index aeaaa87e4..25b57bf0b 100644 --- a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlPullParser.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlPullParser.java @@ -209,11 +209,14 @@ private int convertValueToList(String value, String[] options, int defaultValue) private int getAttributeIntValue(ResXmlAttribute xmlAttribute, int defaultValue) { if(xmlAttribute != null) { + ValueType valueType = xmlAttribute.getValueType(); + if(valueType != null && valueType.isReference()) { + return xmlAttribute.getData(); + } int type = xmlAttribute.getType() & 0xff; if(type > 0x10 && type <= 0x1f) { return xmlAttribute.getData(); } - // TODO: resolve if type is REFERENCE } return defaultValue; } diff --git a/src/test/java/com/reandroid/arsc/chunk/xml/ResXmlDocumentTest.java b/src/test/java/com/reandroid/arsc/chunk/xml/ResXmlDocumentTest.java index bfa2aa710..6f1407c24 100644 --- a/src/test/java/com/reandroid/arsc/chunk/xml/ResXmlDocumentTest.java +++ b/src/test/java/com/reandroid/arsc/chunk/xml/ResXmlDocumentTest.java @@ -1,9 +1,11 @@ package com.reandroid.arsc.chunk.xml; +import android.content.res.XmlResourceParser; import com.reandroid.apk.AndroidFrameworks; import com.reandroid.apk.ApkModule; import com.reandroid.arsc.chunk.TableBlock; import com.reandroid.arsc.model.ResourceLibrary; +import com.reandroid.arsc.value.ValueType; import com.reandroid.xml.XMLFactory; import org.junit.Assert; import org.junit.Test; @@ -114,6 +116,22 @@ public void testRemoveAttribute(){ Assert.assertEquals("Attribute count", 0, root.getAttributeCount()); } @Test + public void testAttributeIntValueForReference() throws IOException, XmlPullParserException { + ResXmlDocument document = new ResXmlDocument(); + ResXmlElement manifest = document.getOrCreateElement("manifest"); + ResXmlElement app = manifest.newElement("application"); + ResXmlAttribute icon = app.getOrCreateAndroidAttribute("icon", 0x7f010123); + int resourceId = 0x7f010123; + icon.setTypeAndData(ValueType.REFERENCE, resourceId); + + XmlResourceParser parser = app.getResourceParser(); + Assert.assertEquals(XmlPullParser.START_TAG, parser.next()); + Assert.assertEquals(resourceId, parser.getAttributeIntValue( + ResourceLibrary.URI_ANDROID, + "icon", + -1)); + } + @Test public void testEncodeDecodeXml() throws XmlPullParserException, IOException { ResXmlDocument document = new ResXmlDocument(); document.setApkFile(createEmptyApkModule());