diff --git a/app/build.gradle b/app/build.gradle index e0341bf82..7eafa6235 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,6 +133,7 @@ dependencies { // Local projects here implementation project (':build-tools:aaptcompiler') + implementation project (':build-tools:xml-utils') implementation project (':eventbus-android') implementation project (':eventbus-events') implementation project (':build-tools:projects') diff --git a/build-tools/projects/build.gradle b/build-tools/projects/build.gradle index 776c1f6e3..b3d012c1f 100644 --- a/build-tools/projects/build.gradle +++ b/build-tools/projects/build.gradle @@ -52,6 +52,7 @@ dependencies { implementation project (path: ':shared') implementation project (path: ':logger') implementation project (path: ':build-tools:javac-services') + implementation project (path: ':build-tools:xml-utils') implementation common.io implementation google.guava diff --git a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt index e557b0d01..eeca01d59 100644 --- a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt +++ b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt @@ -16,7 +16,6 @@ */ package com.itsaky.androidide.projects -import android.content.Context import com.itsaky.androidide.eventbus.events.EventReceiver import com.itsaky.androidide.eventbus.events.file.FileCreationEvent import com.itsaky.androidide.eventbus.events.file.FileDeletionEvent @@ -30,6 +29,7 @@ import com.itsaky.androidide.projects.builder.BuildService import com.itsaky.androidide.projects.util.ProjectTransformer import com.itsaky.androidide.tooling.api.IProject import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.xml.res.ResourceTableRegistry import java.io.File import java.nio.file.Path import org.greenrobot.eventbus.EventBus @@ -56,7 +56,13 @@ object ProjectManager : EventReceiver { this.rootProject!! .subModules .filterIsInstance(ModuleProject::class.java) - .forEach(ModuleProject::indexSourcesAndClasspaths) + .forEach { + it.indexSourcesAndClasspaths() + + if (it is AndroidModule) { + it.readResources() + } + } } } @@ -202,7 +208,7 @@ object ProjectManager : EventReceiver { if (!isResource(file)) { return } - + generateSources(builder) } diff --git a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt index be2f67ffd..9e9adf22d 100644 --- a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt +++ b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt @@ -34,6 +34,7 @@ import com.itsaky.androidide.tooling.api.messages.result.SimpleVariantData import com.itsaky.androidide.tooling.api.model.AndroidModule.Companion.FD_INTERMEDIATES import com.itsaky.androidide.tooling.api.model.GradleTask import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.xml.res.ResourceTableRegistry import java.io.File /** @@ -232,4 +233,15 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. return result } + + /** + * Reads the resource files are creates the [com.android.aaptcompiler.ResourceTable] instances for + * the corresponding resource directories. + */ + fun readResources() { + val registry = ResourceTableRegistry.getInstance() + for (resourceDirectory in getResourceDirectories()) { + registry.forResourceDir(resourceDirectory) + } + } } diff --git a/build-tools/xml-utils/build.gradle b/build-tools/xml-utils/build.gradle index 5ad5d184c..c1139edfd 100644 --- a/build-tools/xml-utils/build.gradle +++ b/build-tools/xml-utils/build.gradle @@ -21,7 +21,7 @@ plugins { } android { - namespace "com.itsaky.androidide.aaptcompiler" + namespace "com.itsaky.androidide.xml" compileSdkVersion rootProject.ext.compileSdk buildToolsVersion rootProject.ext.buildTools diff --git a/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/ResourceTableRegistry.kt b/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/ResourceTableRegistry.kt index fe3e83c13..319a16577 100644 --- a/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/ResourceTableRegistry.kt +++ b/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/ResourceTableRegistry.kt @@ -29,9 +29,7 @@ import java.io.File interface ResourceTableRegistry { companion object { - private val instance = DefaultResourceTableRegistry() - - @JvmStatic fun getInstance(): ResourceTableRegistry = instance + @JvmStatic fun getInstance(): ResourceTableRegistry = DefaultResourceTableRegistry } /** diff --git a/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/internal/DefaultResourceTableRegistry.kt b/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/internal/DefaultResourceTableRegistry.kt index ac53b90b5..89ce747a7 100644 --- a/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/internal/DefaultResourceTableRegistry.kt +++ b/build-tools/xml-utils/src/main/java/com/itsaky/androidide/xml/res/internal/DefaultResourceTableRegistry.kt @@ -34,7 +34,7 @@ import java.util.concurrent.ConcurrentHashMap * * @author Akash Yadav */ -internal class DefaultResourceTableRegistry : ResourceTableRegistry { +internal object DefaultResourceTableRegistry : ResourceTableRegistry { private val log = ILogger.newInstance(javaClass.simpleName) @@ -52,6 +52,7 @@ internal class DefaultResourceTableRegistry : ResourceTableRegistry { } private fun createTable(resDir: File): ResourceTable? { + log.info("Creating resource table for resource directory $resDir") val values = File(resDir, "values") if (!values.exists()) { return null @@ -61,9 +62,7 @@ internal class DefaultResourceTableRegistry : ResourceTableRegistry { val table = ResourceTable() val options = TableExtractorOptions(translatable = true, errorOnPositionalArgs = false, visibility = PUBLIC) - values - .listFiles { file -> file.isFile && file.extension == "xml" } - ?.forEach { updateFromFile(it = it, table = table, options = options, logger = logger) } + updateFromDirectory(values, table, options, logger) return table } diff --git a/build-tools/xml-utils/src/test/java/com/itsaky/androidide/xml/res/ResourceTableRegistryTest.kt b/build-tools/xml-utils/src/test/java/com/itsaky/androidide/xml/res/ResourceTableRegistryTest.kt index 7e6206fd3..76438a144 100644 --- a/build-tools/xml-utils/src/test/java/com/itsaky/androidide/xml/res/ResourceTableRegistryTest.kt +++ b/build-tools/xml-utils/src/test/java/com/itsaky/androidide/xml/res/ResourceTableRegistryTest.kt @@ -14,7 +14,6 @@ * You should have received a copy of the GNU General Public License * along with AndroidIDE. If not, see . */ - package com.itsaky.androidide.xml.res import android.graphics.Color @@ -26,10 +25,10 @@ import com.android.aaptcompiler.ResourceName import com.android.aaptcompiler.android.ResValue.DataType import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.xml.res.internal.DefaultResourceTableRegistry -import java.io.File import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import java.io.File /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) @@ -45,15 +44,17 @@ class ResourceTableRegistryTest { fun `test with simple framework resource parsing`() { val androidJar = findAndroidJar() val registry = ResourceTableRegistry.getInstance() - val resourceTable = registry.forResourceDir(File(androidJar.parentFile, "data/res")) + val resDir = File(androidJar.parentFile, "data/res") + val resourceTable = registry.forResourceDir(resDir) assertThat(resourceTable).isNotNull() - + + // Should return same instance unless updated + assertThat(registry.forResourceDir(resDir)).isEqualTo(resourceTable) + resourceTable.apply { assertThat(this!!.packages).hasSize(1) - this.packages.first().apply { - assertThat(this.name).isEqualTo("") - } + this.packages.first().apply { assertThat(this.name).isEqualTo("") } } resourceTable!!.findResource(ResourceName(pck = "", type = STRING, entry = "ok")).apply { diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar index 8dc8ec55c..6f38f985d 100644 Binary files a/tests/test-home/.androidide/init/model.jar and b/tests/test-home/.androidide/init/model.jar differ