Skip to content

Commit 4f9312a

Browse files
committed
chore(build-logic): add missing dependencies to version catalog and complete build logic setup
1 parent a98b87a commit 4f9312a

File tree

52 files changed

+259
-58
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+259
-58
lines changed

build-logic/convention/build.gradle.kts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ dependencies {
2929
compileOnly(libs.ktlint.gradlePlugin)
3030
compileOnly(libs.spotless.gradlePlugin)
3131
implementation(libs.truth)
32+
33+
compileOnly(libs.firebase.crashlytics.gradlePlugin)
34+
compileOnly(libs.firebase.performance.gradlePlugin)
3235
}
3336

3437
tasks {
@@ -54,6 +57,16 @@ gradlePlugin {
5457
implementationClass = "AndroidApplicationFlavorsConventionPlugin"
5558
}
5659

60+
register("androidFirebase") {
61+
id = "org.convention.android.application.firebase"
62+
implementationClass = "AndroidApplicationFirebaseConventionPlugin"
63+
}
64+
65+
register("androidLint") {
66+
id = "org.convention.android.application.lint"
67+
implementationClass = "AndroidLintConventionPlugin"
68+
}
69+
5770
// This can removed after migration
5871
register("androidLibrary") {
5972
id = "mifos.android.library"
@@ -94,17 +107,19 @@ gradlePlugin {
94107
}
95108

96109
// KMP & CMP Plugins
97-
register("kmpLibrary") {
98-
id = "mifos.kmp.library"
99-
implementationClass = "KMPLibraryConventionPlugin"
100-
}
101110
register("cmpFeature") {
102-
id = "mifos.cmp.feature"
111+
id = "org.convention.cmp.feature"
103112
implementationClass = "CMPFeatureConventionPlugin"
104113
}
114+
105115
register("kmpKoin") {
106-
id = "mifos.kmp.koin"
116+
id = "org.convention.kmp.koin"
107117
implementationClass = "KMPKoinConventionPlugin"
108118
}
119+
120+
register("kmpLibrary") {
121+
id = "org.convention.kmp.library"
122+
implementationClass = "KMPLibraryConventionPlugin"
123+
}
109124
}
110125
}

build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class AndroidApplicationConventionPlugin : Plugin<Project> {
2020
apply("mifos.detekt.plugin")
2121
apply("mifos.spotless.plugin")
2222
apply("mifos.git.hooks")
23+
apply("org.convention.android.application.lint")
24+
apply("org.convention.android.application.firebase")
25+
2326
}
2427

2528
extensions.configure<ApplicationExtension> {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
2+
3+
import com.android.build.api.dsl.ApplicationExtension
4+
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.apply
8+
import org.gradle.kotlin.dsl.configure
9+
import org.gradle.kotlin.dsl.dependencies
10+
import org.mifos.mobile.libs
11+
12+
class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
13+
override fun apply(target: Project) {
14+
with(target) {
15+
apply(plugin = "com.google.gms.google-services")
16+
apply(plugin = "com.google.firebase.crashlytics")
17+
18+
dependencies {
19+
val bom = libs.findLibrary("firebase-bom").get()
20+
"implementation"(platform(bom))
21+
"implementation"(libs.findLibrary("firebase.analytics").get())
22+
"implementation"(libs.findLibrary("firebase.crashlytics").get())
23+
}
24+
25+
extensions.configure<ApplicationExtension> {
26+
buildTypes.configureEach {
27+
// Disable the Crashlytics mapping file upload. This feature should only be
28+
// enabled if a Firebase backend is available and configured in
29+
// google-services.json.
30+
configure<CrashlyticsExtension> {
31+
mappingFileUploadEnabled = true
32+
}
33+
}
34+
}
35+
}
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
import com.android.build.api.dsl.ApplicationExtension
3+
import com.android.build.api.dsl.LibraryExtension
4+
import com.android.build.api.dsl.Lint
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.apply
8+
import org.gradle.kotlin.dsl.configure
9+
10+
class AndroidLintConventionPlugin : Plugin<Project> {
11+
override fun apply(target: Project) {
12+
with(target) {
13+
when {
14+
pluginManager.hasPlugin("com.android.application") ->
15+
configure<ApplicationExtension> { lint(Lint::configure) }
16+
17+
pluginManager.hasPlugin("com.android.library") ->
18+
configure<LibraryExtension> { lint(Lint::configure) }
19+
20+
else -> {
21+
apply(plugin = "com.android.lint")
22+
configure<Lint>(Lint::configure)
23+
}
24+
}
25+
}
26+
}
27+
}
28+
29+
private fun Lint.configure() {
30+
xmlReport = true
31+
sarifReport = true
32+
checkDependencies = true
33+
disable += "GradleDependency"
34+
}

build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ class CMPFeatureConventionPlugin : Plugin<Project> {
88
override fun apply(target: Project) {
99
with(target) {
1010
with(pluginManager) {
11-
apply("mifos.kmp.library")
12-
apply("mifos.kmp.koin")
11+
apply("org.convention.kmp.library")
12+
apply("org.convention.kmp.koin")
1313
apply("org.jetbrains.kotlin.plugin.compose")
1414
apply("org.jetbrains.compose")
1515
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import com.android.build.api.instrumentation.AsmClassVisitorFactory
2+
import com.android.build.api.instrumentation.ClassContext
3+
import com.android.build.api.instrumentation.ClassData
4+
import com.android.build.api.instrumentation.InstrumentationParameters
5+
import org.gradle.api.provider.SetProperty
6+
import org.gradle.api.tasks.Input
7+
import org.objectweb.asm.ClassVisitor
8+
import org.objectweb.asm.FieldVisitor
9+
10+
class FieldSkippingClassVisitor(
11+
apiVersion: Int,
12+
nextClassVisitor: ClassVisitor,
13+
) : ClassVisitor(apiVersion, nextClassVisitor) {
14+
15+
// Returning null from this method will cause the ClassVisitor to strip all fields from the class.
16+
override fun visitField(
17+
access: Int,
18+
name: String?,
19+
descriptor: String?,
20+
signature: String?,
21+
value: Any?
22+
): FieldVisitor? = null
23+
24+
abstract class Factory : AsmClassVisitorFactory<Parameters> {
25+
26+
private val excludedClasses
27+
get() = parameters.get().classes.get()
28+
29+
override fun isInstrumentable(classData: ClassData): Boolean =
30+
classData.className in excludedClasses
31+
32+
override fun createClassVisitor(
33+
classContext: ClassContext,
34+
nextClassVisitor: ClassVisitor,
35+
): ClassVisitor {
36+
return FieldSkippingClassVisitor(
37+
apiVersion = instrumentationContext.apiVersion.get(),
38+
nextClassVisitor = nextClassVisitor,
39+
)
40+
}
41+
}
42+
43+
abstract class Parameters : InstrumentationParameters {
44+
@get:Input
45+
abstract val classes: SetProperty<String>
46+
}
47+
}

build-logic/convention/src/main/kotlin/KMPLibraryConventionPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class KMPLibraryConventionPlugin : Plugin<Project> {
1515
with(pluginManager) {
1616
apply("com.android.library")
1717
apply("org.jetbrains.kotlin.multiplatform")
18-
apply("mifos.kmp.koin")
18+
apply("org.convention.kmp.koin")
1919
apply("mifos.detekt.plugin")
2020
apply("mifos.spotless.plugin")
2121
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.mifos.mobile
2+
3+
4+
import com.android.build.api.dsl.CommonExtension
5+
import com.android.build.api.dsl.ManagedVirtualDevice
6+
import org.gradle.kotlin.dsl.get
7+
import org.gradle.kotlin.dsl.invoke
8+
9+
/**
10+
* Configure project for Gradle managed devices
11+
*/
12+
internal fun configureGradleManagedDevices(
13+
commonExtension: CommonExtension<*, *, *, *, *, *>,
14+
) {
15+
val pixel4 = DeviceConfig("Pixel 4", 30, "aosp-atd")
16+
val pixel6 = DeviceConfig("Pixel 6", 31, "aosp")
17+
val pixelC = DeviceConfig("Pixel C", 30, "aosp-atd")
18+
19+
val localDevices = listOf(pixel4, pixel6, pixelC)
20+
val ciDevices = listOf(pixel4, pixelC)
21+
22+
commonExtension.testOptions {
23+
managedDevices {
24+
allDevices {
25+
localDevices.forEach { deviceConfig ->
26+
maybeCreate(deviceConfig.taskName, ManagedVirtualDevice::class.java).apply {
27+
device = deviceConfig.device
28+
apiLevel = deviceConfig.apiLevel
29+
systemImageSource = deviceConfig.systemImageSource
30+
}
31+
}
32+
}
33+
groups {
34+
maybeCreate("ci").apply {
35+
ciDevices.forEach { deviceConfig ->
36+
targetDevices.add(allDevices[deviceConfig.taskName])
37+
}
38+
}
39+
}
40+
}
41+
}
42+
}
43+
44+
private data class DeviceConfig(
45+
val device: String,
46+
val apiLevel: Int,
47+
val systemImageSource: String,
48+
) {
49+
val taskName = buildString {
50+
append(device.lowercase().replace(" ", ""))
51+
append("api")
52+
append(apiLevel.toString())
53+
append(systemImageSource.replace("-", ""))
54+
}
55+
}

cmp-navigation/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
*/
1010

1111
plugins {
12-
alias(libs.plugins.mifos.kmp.library)
13-
alias(libs.plugins.mifos.cmp.feature)
14-
alias(libs.plugins.mifos.kmp.koin)
12+
alias(libs.plugins.kmp.library.convention)
13+
alias(libs.plugins.cmp.feature.convention)
14+
alias(libs.plugins.kmp.koin.convention)
1515
alias(libs.plugins.kotlin.serialization)
1616
}
1717

cmp-shared/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
*/
1010

1111
plugins {
12-
alias(libs.plugins.mifos.kmp.library)
13-
alias(libs.plugins.mifos.cmp.feature)
12+
alias(libs.plugins.kmp.library.convention)
13+
alias(libs.plugins.cmp.feature.convention)
1414
alias(libs.plugins.android.library)
1515
alias(libs.plugins.compose.compiler)
1616
alias(libs.plugins.jetbrainsCompose)

0 commit comments

Comments
 (0)