Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -652,10 +652,10 @@ jobs:
COMMIT_AUTHOR: ${{ steps.commit_info.outputs.COMMIT_AUTHOR }}
COMMIT_MSG: ${{ steps.commit_info.outputs.COMMIT_MSG }}
FIREBASE_CONSOLE_URL: ${{ steps.firebase_upload.outputs.FIREBASE_CONSOLE_URL }}
run: |
run: |
BRANCH_NAME="${{ env.BRANCH_NAME }}"
BUILD_TYPE="${{ matrix.build_type }}"

jq -n \
--arg commit_msg "$COMMIT_MSG" \
--arg build_type "$BUILD_TYPE" \
Expand Down Expand Up @@ -739,4 +739,4 @@ jobs:
if: always()
run: |
rm -f app/google-services.json
echo "google-services.json cleaned up successfully"
echo "google-services.json cleaned up successfully"
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,16 @@ tests/test-home
/sample-plugin/build/
/keystore-generator-plugin/build/
/keystore-generator-plugin/.kotlin/
**/build
**/build/
!**/src/**/build/

# Release files
*.zim

# Plugin build artifacts
plugin-api.jar
plugin-artifacts.zip

# Other IDEs
.cursor/
.vscode/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.itsaky.androidide.plugins.build

import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File

class PluginBuilder : Plugin<Project> {

override fun apply(target: Project) {
val extension = target.extensions.create(
"pluginBuilder",
PluginBuilderExtension::class.java
)

target.afterEvaluate {
createDebugTask(target, extension)
createReleaseTask(target, extension)
}
}

private fun createDebugTask(project: Project, extension: PluginBuilderExtension) {
val task = project.tasks.create("assemblePluginDebug")
task.group = "build"
task.description = "Assembles the debug plugin and creates .cgp file"
task.dependsOn("assembleDebug")

task.doLast(object : org.gradle.api.Action<org.gradle.api.Task> {
override fun execute(t: org.gradle.api.Task) {
val pluginName = extension.pluginName.getOrElse(project.name)
val apkDir = File(project.buildDir, "outputs/apk/debug")
val outputDir = File(project.buildDir, "plugin")
outputDir.mkdirs()

project.logger.lifecycle("Looking for APK in: ${apkDir.absolutePath}")

val apkFile = apkDir.listFiles()?.firstOrNull { it.extension == "apk" }
if (apkFile == null) {
project.logger.warn("No APK found in ${apkDir.absolutePath}")
return
}

val outputFile = File(outputDir, "$pluginName-debug.cgp")
apkFile.copyTo(outputFile, overwrite = true)
apkFile.delete()
project.logger.lifecycle("Plugin assembled: ${outputFile.absolutePath}")
}
})
}

private fun createReleaseTask(project: Project, extension: PluginBuilderExtension) {
val task = project.tasks.create("assemblePlugin")
task.group = "build"
task.description = "Assembles the release plugin and creates .cgp file"
task.dependsOn("assembleRelease")

task.doLast(object : org.gradle.api.Action<org.gradle.api.Task> {
override fun execute(t: org.gradle.api.Task) {
val pluginName = extension.pluginName.getOrElse(project.name)
val apkDir = File(project.buildDir, "outputs/apk/release")
val outputDir = File(project.buildDir, "plugin")
outputDir.mkdirs()

project.logger.lifecycle("Looking for APK in: ${apkDir.absolutePath}")

val apkFile = apkDir.listFiles()?.firstOrNull { it.extension == "apk" }
if (apkFile == null) {
project.logger.warn("No APK found in ${apkDir.absolutePath}")
return
}

val outputFile = File(outputDir, "$pluginName.cgp")
apkFile.copyTo(outputFile, overwrite = true)
apkFile.delete()
project.logger.lifecycle("Plugin assembled: ${outputFile.absolutePath}")
}
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.itsaky.androidide.plugins.build

import org.gradle.api.provider.Property

abstract class PluginBuilderExtension {
abstract val pluginName: Property<String>
}