diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2ca3897f..1199060a 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,3 +1,3 @@
plugins {
- alias(libs.plugins.convention.androidAppPlugin)
+ alias(libs.plugins.convention.applicationPlugin)
}
diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts
index 8317f235..2aa5859b 100644
--- a/build-logic/convention/build.gradle.kts
+++ b/build-logic/convention/build.gradle.kts
@@ -24,25 +24,25 @@ group = "com.rtbishop.look4sat.build_logic.convention"
gradlePlugin {
plugins {
- register("androidAppPlugin") {
- id = libs.plugins.convention.androidAppPlugin.get().pluginId
- implementationClass = "com.rtbishop.look4sat.convention.AndroidAppPlugin"
+ register("applicationPlugin") {
+ id = libs.plugins.convention.applicationPlugin.get().pluginId
+ implementationClass = "com.rtbishop.look4sat.convention.ApplicationPlugin"
}
- register("androidLibraryPlugin") {
- id = libs.plugins.convention.androidLibraryPlugin.get().pluginId
- implementationClass = "com.rtbishop.look4sat.convention.AndroidLibraryPlugin"
+ register("coreDataPlugin") {
+ id = libs.plugins.convention.coreDataPlugin.get().pluginId
+ implementationClass = "com.rtbishop.look4sat.convention.CoreDataPlugin"
}
- register("composeFeaturePlugin") {
- id = libs.plugins.convention.composeFeaturePlugin.get().pluginId
- implementationClass = "com.rtbishop.look4sat.convention.ComposeFeaturePlugin"
+ register("coreDomainPlugin") {
+ id = libs.plugins.convention.coreDomainPlugin.get().pluginId
+ implementationClass = "com.rtbishop.look4sat.convention.CoreDomainPlugin"
}
- register("composeLibraryPlugin") {
- id = libs.plugins.convention.composeLibraryPlugin.get().pluginId
- implementationClass = "com.rtbishop.look4sat.convention.ComposeLibraryPlugin"
+ register("corePresentationPlugin") {
+ id = libs.plugins.convention.corePresentationPlugin.get().pluginId
+ implementationClass = "com.rtbishop.look4sat.convention.CorePresentationPlugin"
}
- register("kotlinLibraryPlugin") {
- id = libs.plugins.convention.kotlinLibraryPlugin.get().pluginId
- implementationClass = "com.rtbishop.look4sat.convention.KotlinLibraryPlugin"
+ register("featurePlugin") {
+ id = libs.plugins.convention.featurePlugin.get().pluginId
+ implementationClass = "com.rtbishop.look4sat.convention.FeaturePlugin"
}
}
}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidAppPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidAppPlugin.kt
deleted file mode 100644
index b26e1a1e..00000000
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidAppPlugin.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Look4Sat. Amateur radio satellite tracker and pass predictor.
- * Copyright (C) 2019-2026 Arty Bishop and contributors.
- *
- * This program 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.
- *
- * This program 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 this program. If not, see .
- */
-package com.rtbishop.look4sat.convention
-
-import org.gradle.api.Plugin
-import org.gradle.api.Project
-import org.gradle.kotlin.dsl.dependencies
-
-@Suppress("Unused")
-internal class AndroidAppPlugin : Plugin {
- override fun apply(target: Project) {
- with(target) {
- setupAndroidApplication()
- setupComposeFeature()
- setupKotlinToolchain()
- setupAndroidTestDependencies()
- setupTestDependencies()
- dependencies {
- IMPLEMENTATION(project(":core:data"))
- IMPLEMENTATION(project(":core:domain"))
- IMPLEMENTATION(project(":core:presentation"))
- IMPLEMENTATION(project(":feature:map"))
- IMPLEMENTATION(project(":feature:passes"))
- IMPLEMENTATION(project(":feature:radar"))
- IMPLEMENTATION(project(":feature:satellites"))
- IMPLEMENTATION(project(":feature:settings"))
- IMPLEMENTATION(libs.androidx.core.splashscreen)
- }
- }
- }
-}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidLibraryPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt
similarity index 54%
rename from build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidLibraryPlugin.kt
rename to build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt
index 76f0c479..a75c2018 100644
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/AndroidLibraryPlugin.kt
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ApplicationPlugin.kt
@@ -22,25 +22,22 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
@Suppress("Unused")
-internal class AndroidLibraryPlugin : Plugin {
- override fun apply(target: Project) {
- with(target) {
- with(pluginManager) {
- alias(libs.plugins.google.ksp)
- }
- setupCommonLibrary()
- setupKotlinToolchain()
- setupAndroidTestDependencies()
- setupTestDependencies()
- dependencies {
- IMPLEMENTATION(project(":core:domain"))
- IMPLEMENTATION(libs.androidx.core.ktx)
- IMPLEMENTATION(libs.androidx.room.asProvider())
- IMPLEMENTATION(libs.androidx.room.runtime)
- KSP(libs.androidx.room.compiler)
- IMPLEMENTATION(libs.other.coroutines)
- IMPLEMENTATION(libs.other.okhttp)
- }
+internal class ApplicationPlugin : Plugin {
+ override fun apply(target: Project) = with(target) {
+ setupAndroidApp()
+ setupCompose()
+ setupKotlin()
+ dependencies {
+ implementation(project(":core:data"))
+ implementation(project(":core:domain"))
+ implementation(project(":core:presentation"))
+ implementation(project(":feature:map"))
+ implementation(project(":feature:passes"))
+ implementation(project(":feature:radar"))
+ implementation(project(":feature:satellites"))
+ implementation(project(":feature:settings"))
+ implementation(libs.androidx.core.splashscreen)
+ androidTestImplementation(libs.bundles.androidTest)
}
}
}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDataPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDataPlugin.kt
new file mode 100644
index 00000000..4cdf9deb
--- /dev/null
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDataPlugin.kt
@@ -0,0 +1,40 @@
+/*
+ * Look4Sat. Amateur radio satellite tracker and pass predictor.
+ * Copyright (C) 2019-2026 Arty Bishop and contributors.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see .
+ */
+package com.rtbishop.look4sat.convention
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.dependencies
+
+@Suppress("Unused")
+internal class CoreDataPlugin : Plugin {
+ override fun apply(target: Project) = with(target) {
+ applyPlugin(libs.plugins.google.ksp)
+ setupAndroidLib()
+ setupKotlin()
+ dependencies {
+ implementation(project(":core:domain"))
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.room)
+ implementation(libs.androidx.room.runtime)
+ ksp(libs.androidx.room.compiler)
+ implementation(libs.other.coroutines)
+ implementation(libs.other.okhttp)
+ }
+ }
+}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/KotlinLibraryPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDomainPlugin.kt
similarity index 69%
rename from build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/KotlinLibraryPlugin.kt
rename to build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDomainPlugin.kt
index c33b6d7a..228bd935 100644
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/KotlinLibraryPlugin.kt
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CoreDomainPlugin.kt
@@ -22,18 +22,13 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
@Suppress("Unused")
-internal class KotlinLibraryPlugin : Plugin {
- override fun apply(target: Project) {
- with(target) {
- with(pluginManager) {
- alias(libs.plugins.kotlin.jvm)
- }
- setupKotlinToolchain()
- setupTestDependencies()
- dependencies {
- IMPLEMENTATION(libs.other.coroutines)
- IMPLEMENTATION(libs.other.json)
- }
+internal class CoreDomainPlugin : Plugin {
+ override fun apply(target: Project) = with(target) {
+ applyPlugin(libs.plugins.kotlin.jvm)
+ setupKotlin()
+ dependencies {
+ implementation(libs.other.coroutines)
+ implementation(libs.other.json)
}
}
}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeFeaturePlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CorePresentationPlugin.kt
similarity index 67%
rename from build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeFeaturePlugin.kt
rename to build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CorePresentationPlugin.kt
index ada90e06..7eb5ed5b 100644
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeFeaturePlugin.kt
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/CorePresentationPlugin.kt
@@ -22,18 +22,14 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
@Suppress("Unused")
-internal class ComposeFeaturePlugin : Plugin {
- override fun apply(target: Project) {
- with(target) {
- setupCommonLibrary()
- setupComposeFeature()
- setupKotlinToolchain()
- setupAndroidTestDependencies()
- setupTestDependencies()
- dependencies {
- IMPLEMENTATION(project(":core:domain"))
- IMPLEMENTATION(project(":core:presentation"))
- }
+internal class CorePresentationPlugin : Plugin {
+ override fun apply(target: Project) = with(target) {
+ setupAndroidLib()
+ setupCompose()
+ setupKotlin()
+ dependencies {
+ implementation(project(":core:domain"))
+ implementation(libs.androidx.core.splashscreen)
}
}
}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeLibraryPlugin.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/FeaturePlugin.kt
similarity index 67%
rename from build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeLibraryPlugin.kt
rename to build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/FeaturePlugin.kt
index 8faf4a2b..6cd74092 100644
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/ComposeLibraryPlugin.kt
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/FeaturePlugin.kt
@@ -22,18 +22,14 @@ import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
@Suppress("Unused")
-internal class ComposeLibraryPlugin : Plugin {
- override fun apply(target: Project) {
- with(target) {
- setupCommonLibrary()
- setupComposeFeature()
- setupKotlinToolchain()
- setupAndroidTestDependencies()
- setupTestDependencies()
- dependencies {
- IMPLEMENTATION(project(":core:domain"))
- IMPLEMENTATION(libs.androidx.core.splashscreen)
- }
+internal class FeaturePlugin : Plugin {
+ override fun apply(target: Project) = with(target) {
+ setupAndroidLib()
+ setupCompose()
+ setupKotlin()
+ dependencies {
+ implementation(project(":core:domain"))
+ implementation(project(":core:presentation"))
}
}
}
diff --git a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/PluginSetupUtils.kt b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/PluginSetupUtils.kt
index 6c2e919d..284cbd59 100644
--- a/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/PluginSetupUtils.kt
+++ b/build-logic/convention/src/main/java/com/rtbishop/look4sat/convention/PluginSetupUtils.kt
@@ -21,7 +21,7 @@ import com.android.build.api.dsl.ApplicationExtension
import com.android.build.api.dsl.CommonExtension
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project
-import org.gradle.api.plugins.PluginManager
+import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.provider.Provider
import org.gradle.kotlin.dsl.accessors.runtime.extensionOf
import org.gradle.kotlin.dsl.configure
@@ -29,23 +29,30 @@ import org.gradle.kotlin.dsl.dependencies
import org.gradle.plugin.use.PluginDependency
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
-internal const val ANDROID_TEST_IMPLEMENTATION = "androidTestImplementation"
-internal const val DEBUG_IMPLEMENTATION = "debugImplementation"
-internal const val IMPLEMENTATION = "implementation"
-internal const val KSP = "ksp"
-internal const val TEST_IMPLEMENTATION = "testImplementation"
-
internal val Project.libs
get(): LibrariesForLibs = extensionOf(this, "libs") as LibrariesForLibs
-internal fun PluginManager.alias(notation: Provider) {
- apply(notation.get().pluginId)
+internal fun Project.applyPlugin(notation: Provider) {
+ pluginManager.apply(notation.get().pluginId)
}
-internal fun Project.setupAndroidApplication() {
- with(pluginManager) {
- alias(libs.plugins.android.application)
- }
+internal fun DependencyHandler.implementation(dependencyNotation: Any) =
+ add("implementation", dependencyNotation)
+
+internal fun DependencyHandler.debugImplementation(dependencyNotation: Any) =
+ add("debugImplementation", dependencyNotation)
+
+internal fun DependencyHandler.testImplementation(dependencyNotation: Any) =
+ add("testImplementation", dependencyNotation)
+
+internal fun DependencyHandler.androidTestImplementation(dependencyNotation: Any) =
+ add("androidTestImplementation", dependencyNotation)
+
+internal fun DependencyHandler.ksp(dependencyNotation: Any) =
+ add("ksp", dependencyNotation)
+
+internal fun Project.setupAndroidApp() {
+ applyPlugin(libs.plugins.android.application)
extensions.configure {
namespace = libs.versions.packageName.get()
compileSdk = libs.versions.compileSdk.get().toInt()
@@ -55,9 +62,6 @@ internal fun Project.setupAndroidApplication() {
versionCode = libs.versions.appVersionCode.get().toInt()
versionName = libs.versions.appVersionName.get()
}
- buildFeatures {
- compose = true
- }
buildTypes {
debug {
applicationIdSuffix = ".debug"
@@ -76,43 +80,32 @@ internal fun Project.setupAndroidApplication() {
}
}
-internal fun Project.setupCommonLibrary() {
- with(pluginManager) {
- alias(libs.plugins.android.library)
- }
+internal fun Project.setupAndroidLib() {
+ applyPlugin(libs.plugins.android.library)
extensions.configure {
compileSdk = libs.versions.compileSdk.get().toInt()
defaultConfig.minSdk = libs.versions.minSdk.get().toInt()
}
+ dependencies {
+ androidTestImplementation(libs.bundles.androidTest)
+ }
}
-internal fun Project.setupComposeFeature() {
- with(pluginManager) {
- alias(libs.plugins.compose.compiler)
- }
+internal fun Project.setupCompose() {
+ applyPlugin(libs.plugins.compose.compiler)
extensions.configure {
buildFeatures.compose = true
}
dependencies {
- IMPLEMENTATION(platform(libs.compose.bom))
- IMPLEMENTATION(libs.bundles.composeAll)
- DEBUG_IMPLEMENTATION(libs.bundles.composeDebug)
+ implementation(platform(libs.compose.bom))
+ implementation(libs.bundles.composeAll)
+ debugImplementation(libs.bundles.composeDebug)
}
}
-internal fun Project.setupKotlinToolchain() {
+internal fun Project.setupKotlin() {
kotlinExtension.jvmToolchain(libs.versions.jdkVersion.get().toInt())
-}
-
-internal fun Project.setupAndroidTestDependencies() {
dependencies {
- ANDROID_TEST_IMPLEMENTATION(libs.bundles.androidTest)
- }
-}
-
-internal fun Project.setupTestDependencies() {
- dependencies {
- TEST_IMPLEMENTATION(libs.test.coroutines)
- TEST_IMPLEMENTATION(libs.test.junit4)
+ testImplementation(libs.bundles.unitTest)
}
}
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
index 1f3b0475..50e6afee 100644
--- a/core/data/build.gradle.kts
+++ b/core/data/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.androidLibraryPlugin)
+ alias(libs.plugins.convention.coreDataPlugin)
}
android {
diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts
index 956b727a..841c9857 100644
--- a/core/domain/build.gradle.kts
+++ b/core/domain/build.gradle.kts
@@ -1,3 +1,3 @@
plugins {
- alias(libs.plugins.convention.kotlinLibraryPlugin)
+ alias(libs.plugins.convention.coreDomainPlugin)
}
diff --git a/core/presentation/build.gradle.kts b/core/presentation/build.gradle.kts
index 4e592650..a0b957b4 100644
--- a/core/presentation/build.gradle.kts
+++ b/core/presentation/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeLibraryPlugin)
+ alias(libs.plugins.convention.corePresentationPlugin)
}
android {
diff --git a/feature/map/build.gradle.kts b/feature/map/build.gradle.kts
index 597cd31b..f03d8d9c 100644
--- a/feature/map/build.gradle.kts
+++ b/feature/map/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeFeaturePlugin)
+ alias(libs.plugins.convention.featurePlugin)
}
android {
diff --git a/feature/passes/build.gradle.kts b/feature/passes/build.gradle.kts
index 83e6873e..ef54347f 100644
--- a/feature/passes/build.gradle.kts
+++ b/feature/passes/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeFeaturePlugin)
+ alias(libs.plugins.convention.featurePlugin)
}
android {
diff --git a/feature/radar/build.gradle.kts b/feature/radar/build.gradle.kts
index a0da429f..5e837094 100644
--- a/feature/radar/build.gradle.kts
+++ b/feature/radar/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeFeaturePlugin)
+ alias(libs.plugins.convention.featurePlugin)
}
android {
diff --git a/feature/satellites/build.gradle.kts b/feature/satellites/build.gradle.kts
index 898e2b0d..c4d62217 100644
--- a/feature/satellites/build.gradle.kts
+++ b/feature/satellites/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeFeaturePlugin)
+ alias(libs.plugins.convention.featurePlugin)
}
android {
diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts
index e855ac0b..a0e10483 100644
--- a/feature/settings/build.gradle.kts
+++ b/feature/settings/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- alias(libs.plugins.convention.composeFeaturePlugin)
+ alias(libs.plugins.convention.featurePlugin)
}
android {
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index c3eeb703..65dc7fe6 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -12,7 +12,7 @@ jdkVersion = "17"
#noinspection UnusedVersionCatalogEntry
packageName = "com.rtbishop.look4sat"
-android-gradle-plugin = "9.0.1"
+android-gradle-plugin = "9.1.0"
google-ksp = "2.3.6"
kotlin = "2.3.20"
@@ -20,7 +20,7 @@ androidx-core-ktx = "1.18.0"
androidx-core-splashscreen = "1.2.0"
androidx-room = "2.8.4"
-compose-bom = "2026.03.00"
+compose-bom = "2026.03.01"
compose-activity = "1.13.0"
compose-lifecycle = "2.10.0"
compose-navigation = "2.9.7"
@@ -88,11 +88,11 @@ compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "
google-ksp = { id = "com.google.devtools.ksp", version.ref = "google-ksp" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
# plugins defined by this project
-convention-androidAppPlugin = { id = "com.rtbishop.look4sat.convention.androidAppPlugin" }
-convention-androidLibraryPlugin = { id = "com.rtbishop.look4sat.convention.androidLibraryPlugin" }
-convention-composeFeaturePlugin = { id = "com.rtbishop.look4sat.convention.composeFeaturePlugin" }
-convention-composeLibraryPlugin = { id = "com.rtbishop.look4sat.convention.composeLibraryPlugin" }
-convention-kotlinLibraryPlugin = { id = "com.rtbishop.look4sat.convention.kotlinLibraryPlugin" }
+convention-applicationPlugin = { id = "com.rtbishop.look4sat.convention.applicationPlugin" }
+convention-coreDataPlugin = { id = "com.rtbishop.look4sat.convention.coreDataPlugin" }
+convention-coreDomainPlugin = { id = "com.rtbishop.look4sat.convention.coreDomainPlugin" }
+convention-corePresentationPlugin = { id = "com.rtbishop.look4sat.convention.corePresentationPlugin" }
+convention-featurePlugin = { id = "com.rtbishop.look4sat.convention.featurePlugin" }
[bundles]
#noinspection UnusedVersionCatalogEntry