From f3351d18679bee4cd1102f8dc0c995401d6e2335 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Mon, 28 Aug 2023 22:53:03 +0530 Subject: [PATCH] fix: generate sources for selected variant when XML files change --- .../actions/build/QuickRunAction.kt | 15 +------ resources/src/main/res/values/strings.xml | 5 +-- .../androidide/projects/ProjectManagerImpl.kt | 43 +++++++++++-------- .../androidide/projects/api/AndroidModule.kt | 24 +++++++++++ 4 files changed, 51 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunAction.kt b/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunAction.kt index 52c0993c9..38b194b92 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunAction.kt @@ -57,20 +57,9 @@ class QuickRunAction(context: Context) : BaseBuildAction() { val activity = data.requireActivity() val projectManager = IProjectManager.getInstance() - val info = projectManager.androidBuildVariants[module.path] - if (info == null) { - log.error( - "Cannnot run application. Failed to find selected build variant for module: '${module.path}'") - activity.flashError(activity.getString(R.string.err_no_selected_variant, module.path)) - return@chooseApplication - } - - val variant = module.getVariant(info.selectedVariant) - if (variant == null) { - log.error( - "Cannot run application. Build variant with name '${info.selectedVariant}' not found.") + val variant = module.getSelectedVariant() ?: run { activity.flashError( - activity.getString(R.string.err_selected_variant_not_found, info.selectedVariant)) + activity.getString(R.string.err_selected_variant_not_found)) return@chooseApplication } diff --git a/resources/src/main/res/values/strings.xml b/resources/src/main/res/values/strings.xml index 6feff41c0..9daff196b 100644 --- a/resources/src/main/res/values/strings.xml +++ b/resources/src/main/res/values/strings.xml @@ -599,8 +599,5 @@ Discard Failed to fetch build variants Choose application - Failed to find selected build variant for module: %1$s - - - Build variant with name \'%1$s\' not found. + Selected build variant not found diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt index 18d211a0f..6469e868e 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt @@ -46,6 +46,7 @@ import org.greenrobot.eventbus.ThreadMode import java.io.File import java.nio.file.Files import java.nio.file.Path +import java.util.Locale import kotlin.io.path.extension import kotlin.io.path.isDirectory import kotlin.io.path.pathString @@ -184,33 +185,37 @@ class ProjectManagerImpl : IProjectManager, EventReceiver { return } - val debug = app!!.getVariant("debug") - if (debug == null) { - log.warn("No debug variant found in application project ${app!!.name}") - return + val tasks = getAndroidModules().flatMap { module -> + val variant = module.getSelectedVariant() + if (variant == null) { + log.error( + "Selected build variant for project '${module.path}' not found") + return@flatMap emptyList() + } + + val mainArtifact = variant.mainArtifact + val variantNameCapitalized = variant.name.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() + } + + return@flatMap listOf( + mainArtifact.resGenTaskName, + mainArtifact.sourceGenTaskName, + if(module.viewBindingOptions.isEnabled) "dataBindingGenBaseClasses$variantNameCapitalized" else null, + "process${variantNameCapitalized}Resources" + ).mapNotNull { it?.let { "${module.path}:${it}" } } } - val mainArtifact = debug.mainArtifact - val genResourcesTask = mainArtifact.resGenTaskName - val genSourcesTask = mainArtifact.sourceGenTaskName - val genDataBinding = // If view binding is enabled, generate the view binding classes too - if (app!!.viewBindingOptions.isEnabled) { - "dataBindingGenBaseClassesDebug" - } else { - "" - } + builder .executeProjectTasks( app!!.path, - genResourcesTask ?: "", - genSourcesTask, - "processDebugResources", - genDataBinding + *tasks.toTypedArray() ) .whenComplete { result, taskErr -> - if (taskErr != null || !result.isSuccessful) { + if (result == null || !result.isSuccessful || taskErr != null) { log.warn( - "Execution for tasks '$genResourcesTask' and '$genSourcesTask' failed.", + "Execution for tasks failed: $tasks", taskErr ?: "" ) } else { diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt index 8aae06c46..cef368f44 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt @@ -465,5 +465,29 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. return ResourceTableRegistry.getInstance().getFeatures(getPlatformDir() ?: return emptyList()) } + /** + * Returns the build variant that is selected by the user. This may return `null` in + * some misconfiguration scenarios. + */ + fun getSelectedVariant(): BasicAndroidVariantMetadata? { + val projectManager = IProjectManager.getInstance() + + val info = projectManager.androidBuildVariants[this.path] + if (info == null) { + log.error( + "Failed to find selected build variant for module: '${this.path}'") + return null + } + + val variant = this.getVariant(info.selectedVariant) + if (variant == null) { + log.error( + "Build variant with name '${info.selectedVariant}' not found.") + return null + } + + return variant + } + private fun getPlatformDir() = bootClassPaths.firstOrNull { it.name == "android.jar" }?.parentFile }