diff --git a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt index 9eef4af8b..ef5eca20b 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt @@ -80,9 +80,6 @@ abstract class BaseBuildAction : EditorActivityAction() { } activity.saveAll() - activity.runOnUiThread { - activity.appendBuildOutput("Executing tasks: " + TextUtils.join(", ", tasks)) - } buildService.executeTasks(tasks = tasks).whenComplete { result, err -> if (result == null || err != null) { diff --git a/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt b/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt index 3a210f7ea..581be17cf 100644 --- a/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt +++ b/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt @@ -17,10 +17,12 @@ package com.itsaky.androidide.handlers +import com.itsaky.androidide.R import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.preferences.internal.isFirstBuild import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.services.builder.GradleBuildService +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.tooling.events.configuration.ProjectConfigurationStartEvent import com.itsaky.androidide.tooling.events.task.TaskStartEvent @@ -38,7 +40,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener { this.activityReference = WeakReference(activity) } - override fun prepareBuild() { + override fun prepareBuild(buildInfo: BuildInfo) { val isFirstBuild = isFirstBuild activity() .setStatus( @@ -51,6 +53,11 @@ class EditorBuildEventListener : GradleBuildService.EventListener { activity().viewModel.isBuildInProgress = true activity().binding.bottomSheet.clearBuildOutput() + + if (buildInfo.tasks.isNotEmpty()) { + activity().binding.bottomSheet.appendBuildOut( + activity().getString(R.string.title_run_tasks) + " : " + buildInfo.tasks) + } } override fun onBuildSuccessful(tasks: MutableList) { diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java index 5e8c562c2..6319691d3 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java @@ -59,6 +59,7 @@ import com.itsaky.androidide.tooling.api.IToolingApiServer; import com.itsaky.androidide.tooling.api.messages.InitializeProjectMessage; import com.itsaky.androidide.tooling.api.messages.TaskExecutionMessage; import com.itsaky.androidide.tooling.api.messages.result.BuildCancellationRequestResult; +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo; import com.itsaky.androidide.tooling.api.messages.result.BuildResult; import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult; import com.itsaky.androidide.tooling.api.messages.result.InitializeResult; @@ -250,10 +251,10 @@ public class GradleBuildService extends Service implements BuildService, IToolin } @Override - public void prepareBuild() { + public void prepareBuild(@NotNull BuildInfo buildInfo) { updateNotification(getString(R.string.build_status_in_progress), true); if (eventListener != null) { - eventListener.prepareBuild(); + eventListener.prepareBuild(buildInfo); } } @@ -509,8 +510,8 @@ public class GradleBuildService extends Service implements BuildService, IToolin @SuppressWarnings("ConstantConditions") @Override - public void prepareBuild() { - ThreadUtils.runOnUiThread(listener::prepareBuild); + public void prepareBuild(@NonNull BuildInfo buildInfo) { + ThreadUtils.runOnUiThread(() -> listener.prepareBuild(buildInfo)); } @SuppressWarnings("ConstantConditions") @@ -555,9 +556,10 @@ public class GradleBuildService extends Service implements BuildService, IToolin /** * Called just before a build is started. * - * @see IToolingApiClient#prepareBuild() + * @param buildInfo The information about the build to be executed. + * @see IToolingApiClient#prepareBuild(BuildInfo) */ - void prepareBuild(); + void prepareBuild(@NonNull BuildInfo buildInfo); /** * Called when a build is successful. diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt index 9cde92cfa..922741ecd 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt @@ -24,6 +24,7 @@ import com.itsaky.androidide.tooling.api.messages.InitializeProjectMessage import com.itsaky.androidide.tooling.api.messages.TaskExecutionMessage import com.itsaky.androidide.tooling.api.messages.result.BuildCancellationRequestResult import com.itsaky.androidide.tooling.api.messages.result.BuildCancellationRequestResult.Reason.CANCELLATION_ERROR +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.InitializeResult import com.itsaky.androidide.tooling.api.messages.result.TaskExecutionResult @@ -69,7 +70,6 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa private var buildCancellationToken: CancellationTokenSource? = null private val log = ILogger.newInstance(javaClass.simpleName) - @Suppress("UnstableApiUsage") override fun initialize(params: InitializeProjectMessage): CompletableFuture { forwardingProject.projectPath = params.directory return CompletableFutures.computeAsync { @@ -100,7 +100,7 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa ) } - notifyBeforeBuild() + notifyBeforeBuild(BuildInfo(emptyList())) val connection = this.connector!!.connect() stopWatch.lapFromLast("Project connection established") @@ -172,7 +172,7 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa this.buildCancellationToken = GradleConnector.newCancellationTokenSource() builder.withCancellationToken(this.buildCancellationToken!!.token()) - notifyBeforeBuild() + notifyBeforeBuild(BuildInfo(message.tasks)) try { builder.run() @@ -190,17 +190,18 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa connector: GradleConnector, gradleDistribution: String? ) { - if (gradleDistribution != null && gradleDistribution.isNotBlank()) { - val file = File(gradleDistribution) - if (file.exists() && file.isDirectory) { - log.info("Using Gradle installation:", file.canonicalPath) - connector.useInstallation(file) - } else { - log.error("Specified Gradle installation does not exist:", gradleDistribution) - } - } else { + if (gradleDistribution.isNullOrBlank()) { log.info("Using Gradle wrapper for build...") + return } + val file = File(gradleDistribution) + if (!file.exists() || !file.isDirectory) { + log.error("Specified Gradle installation does not exist:", gradleDistribution) + return + } + + log.info("Using Gradle installation:", file.canonicalPath) + connector.useInstallation(file) } private fun notifyBuildFailure(tasks: List) { @@ -215,9 +216,9 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa } } - private fun notifyBeforeBuild() { + private fun notifyBeforeBuild(buildInfo: BuildInfo) { if (client != null) { - client!!.prepareBuild() + client!!.prepareBuild(buildInfo) } } @@ -242,7 +243,6 @@ internal class ToolingApiServerImpl(private val forwardingProject: InternalForwa } } - @Suppress("UnstableApiUsage") override fun shutdown(): CompletableFuture { return CompletableFuture.runAsync { connector?.disconnect() diff --git a/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt b/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt index 164d18389..215eceb7b 100644 --- a/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt +++ b/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt @@ -21,6 +21,7 @@ import com.itsaky.androidide.models.LogLine import com.itsaky.androidide.tooling.api.IProject import com.itsaky.androidide.tooling.api.IToolingApiClient import com.itsaky.androidide.tooling.api.IToolingApiServer +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult import com.itsaky.androidide.tooling.api.util.ToolingApiLauncher @@ -128,7 +129,7 @@ class ToolingApiTestLauncher { log.debug(line.trim()) } - override fun prepareBuild() { + override fun prepareBuild(buildInfo: BuildInfo) { log.debug("---------- PREPARE BUILD ----------") log.debug("AGP Version : ${this.agpVersion}") log.debug("Gradle Version : ${this.gradleVersion}") diff --git a/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/ForwardingToolingApiClient.kt b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/ForwardingToolingApiClient.kt index 443284a23..d426b33b6 100644 --- a/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/ForwardingToolingApiClient.kt +++ b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/ForwardingToolingApiClient.kt @@ -18,6 +18,7 @@ package com.itsaky.androidide.tooling.api import com.itsaky.androidide.models.LogLine +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult import com.itsaky.androidide.tooling.events.ProgressEvent @@ -38,8 +39,8 @@ class ForwardingToolingApiClient(var client: IToolingApiClient?) : IToolingApiCl client?.logOutput(line) } - override fun prepareBuild() { - client?.prepareBuild() + override fun prepareBuild(buildInfo: BuildInfo) { + client?.prepareBuild(buildInfo) } override fun onBuildSuccessful(result: BuildResult) { diff --git a/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/IToolingApiClient.kt b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/IToolingApiClient.kt index a171cac38..78b272ae3 100644 --- a/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/IToolingApiClient.kt +++ b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/IToolingApiClient.kt @@ -18,6 +18,7 @@ package com.itsaky.androidide.tooling.api import com.itsaky.androidide.models.LogLine +import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult import com.itsaky.androidide.tooling.events.ProgressEvent @@ -49,7 +50,7 @@ interface IToolingApiClient { @JsonNotification fun logOutput(line: String) /** Called just before a build is started. */ - @JsonNotification fun prepareBuild() + @JsonNotification fun prepareBuild(buildInfo: BuildInfo) /** * Called when a build is successful. diff --git a/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/messages/result/BuildInfo.kt b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/messages/result/BuildInfo.kt new file mode 100644 index 000000000..34f9bcef3 --- /dev/null +++ b/subprojects/tooling-api/src/main/java/com/itsaky/androidide/tooling/api/messages/result/BuildInfo.kt @@ -0,0 +1,26 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.tooling.api.messages.result + +/** + * Information about a build sent to the client before the build is executed. + * + * @property tasks The tasks that will be executed. + * @author Akash Yadav + */ +data class BuildInfo(val tasks: List)