From 84cd92001e6fffd9d8bc738b2fbb8817553dda06 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Sat, 5 Nov 2022 09:53:28 +0530 Subject: [PATCH] Implemented integer value parser --- tests/test-home/.androidide/init/model.jar | Bin 65261 -> 65261 bytes .../app/src/main/res/values/integers.xml | 6 ++ .../inflater/internal/utils/parseUtils.kt | 53 ++++++++++++++++-- .../androidide/inflater/ValueParsersTest.kt | 22 ++++++++ 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 tests/test-project/app/src/main/res/values/integers.xml diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar index 38d5c9b9a7c103662c283e6e209297269526a44d..1799175c8887e2a0efc317cf3336952718f22fc8 100644 GIT binary patch delta 31 ncmaF+m-+2qW}X0VW)?061`ZB}MSdH3{N6Jy^4lEqej+~rvD*tB delta 31 ncmaF+m-+2qW}X0VW)?061`ZB}Yu+1q{N6KN^WGfuej+~rwdM + 1 + 0 + @integer/test_integer_1 + @integer/test_integer_0 + diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/parseUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/parseUtils.kt index b41ce7c60..dee711a6f 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/parseUtils.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/parseUtils.kt @@ -29,9 +29,11 @@ import android.util.TypedValue.COMPLEX_UNIT_PX import android.util.TypedValue.COMPLEX_UNIT_SP import android.util.TypedValue.applyDimension import android.view.ViewGroup.LayoutParams +import androidx.core.text.isDigitsOnly import com.android.aaptcompiler.AaptResourceType import com.android.aaptcompiler.AaptResourceType.BOOL import com.android.aaptcompiler.AaptResourceType.DIMEN +import com.android.aaptcompiler.AaptResourceType.INTEGER import com.android.aaptcompiler.BinaryPrimitive import com.android.aaptcompiler.ConfigDescription import com.android.aaptcompiler.Reference @@ -62,6 +64,44 @@ fun endParse() { currentModule = null } +@JvmOverloads +fun parseInteger(value: String, def: Int = 0): Int { + if (value.isDigitsOnly()) { + return value.toInt() + } + + if (value[0] == '@') { + val (pck, type, name) = parseResourceReference(value) + if (type != "integer") { + throwInvalidResType(INTEGER, value) + } + val integerResolver: (Value?) -> Int? = { + if (it is BinaryPrimitive) { + it.resValue.data + } else def + } + return if (pck == null) { + resolveUnqualifiedResourceReference( + type = INTEGER, + name = name, + value = value, + def = def, + resolver = integerResolver + ) + } else { + resolveQualifiedResourceReference( + pck = pck, + type = INTEGER, + name = name, + def = def, + resolver = integerResolver + ) + } + } + + return def +} + @JvmOverloads fun parseBoolean(value: String, def: Boolean = false): Boolean { when (value) { @@ -72,7 +112,7 @@ fun parseBoolean(value: String, def: Boolean = false): Boolean { if (value[0] == '@') { val (pck, type, name) = parseResourceReference(value) if (type != "bool") { - throw IllegalArgumentException("Value must be a reference to a boolean resource. '$value'") + throwInvalidResType(BOOL, value) } val booleanResolver: (Value?) -> Boolean? = fun(resValue): Boolean { @@ -159,7 +199,7 @@ fun parseDimension( } else if (c == '@') { val (pck, type, name) = parseResourceReference(value) if (type != "dimen") { - throw IllegalArgumentException("Value must be a dimension resource reference '$value'") + throwInvalidResType(DIMEN, value) } val resolver: (Value?) -> Int? = { if (it is BinaryPrimitive) { @@ -224,8 +264,7 @@ fun resolveUnqualifiedResourceReference( def: T, resolver: (Value?) -> T? ): T { - val (table, _, pack, entry) = - lookupUnqualifedResource(type, name, value) ?: return def + val (table, _, pack, entry) = lookupUnqualifedResource(type, name, value) ?: return def return resolveResourceReference( table = table, pck = pack, @@ -324,3 +363,9 @@ private fun parseResourceReference(value: String): Triple(null, "", "") } + +private fun throwInvalidResType(type: AaptResourceType, value: String) { + throw IllegalArgumentException( + "Value must be a reference to a ${type.tagName} resource type. '$value'" + ) +} diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt index bf61b9414..527fe2d98 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt @@ -24,6 +24,7 @@ import com.itsaky.androidide.inflater.internal.utils.endParse import com.itsaky.androidide.inflater.internal.utils.parseBoolean import com.itsaky.androidide.inflater.internal.utils.parseDimension import com.itsaky.androidide.inflater.internal.utils.parseDrawable +import com.itsaky.androidide.inflater.internal.utils.parseInteger import com.itsaky.androidide.inflater.internal.utils.startParse import org.junit.Test import org.junit.runner.RunWith @@ -98,4 +99,25 @@ class ValueParsersTest { } } } + + @Test + fun `integer parser test`() { + inflaterTest { module -> + requiresActivity { activity -> + startParse(module) + assertThat(parseInteger("0", def = 1)).isEqualTo(0) + assertThat(parseInteger("10")).isEqualTo(10) + assertThat(parseInteger("110")).isEqualTo(110) + assertThat(parseInteger("@android:integer/button_pressed_animation_duration")).isEqualTo(100) + assertThat(parseInteger("@android:integer/dock_enter_exit_duration")).isEqualTo(250) + assertThat(parseInteger("@android:integer/kg_carousel_angle")).isEqualTo(75) + assertThat(parseInteger("@android:integer/date_picker_mode")).isEqualTo(1) + assertThat(parseInteger("@integer/test_integer_1")).isEqualTo(1) + assertThat(parseInteger("@integer/test_integer_1_ref")).isEqualTo(1) + assertThat(parseInteger("@integer/test_integer_0", def = 1)).isEqualTo(0) + assertThat(parseInteger("@integer/test_integer_0_ref", def = 1)).isEqualTo(0) + endParse() + } + } + } }