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
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
Expand Down Expand Up @@ -52,7 +52,7 @@ private fun Content(
windowInsets = WindowInsets.navigationBars,
navigationIcon = {
IconButton(onClick = { actions.onBack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = null)
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Provide an explicit content description for accessibility.

Passing null silences accessibility tools. Supply a short, localised string such as "Back" (or reuse an MR string) so TalkBack/VoiceOver can announce the action.

-Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
+Icon(
+    Icons.AutoMirrored.Filled.ArrowBack,
+    contentDescription = kmpStringResource(MR.strings.back_cd)
+)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
Icon(
Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = kmpStringResource(MR.strings.back_cd)
)
🤖 Prompt for AI Agents
In
androidApp/src/main/kotlin/app/futured/kmptemplate/android/ui/screen/ThirdScreenUi.kt
at line 55, the Icon composable has a null contentDescription which disables
accessibility announcements. Replace the null with a meaningful, localized
string such as "Back" or use a string resource from the MR strings to provide an
explicit content description for screen readers.

}
},
)
Expand Down
46 changes: 21 additions & 25 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,44 +1,43 @@
[versions]
agp = "8.11.0"
agp = "8.11.1"
Copy link

@github-actions github-actions bot Aug 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ A newer version of com.android.application than 8.11.1 is available: 8.12.2

Copy link

@github-actions github-actions bot Aug 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ A newer version of com.android.library than 8.11.1 is available: 8.12.2

Copy link

@github-actions github-actions bot Aug 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ A newer version of com.android.test than 8.11.1 is available: 8.12.2

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Consider AGP 8.12.2 once toolchain compatibility is confirmed.

Danger notes a newer AGP. Validate Gradle and Kotlin plugin compatibility before bumping.


🌐 Web query:

What are the Kotlin (2.1.20) and Gradle compatibility requirements for Android Gradle Plugin 8.12.2?

💡 Result:

Short answer: Kotlin 2.1.20 is not compatible with AGP 8.12.2.

Details:

  • Kotlin 2.1.20 (KGP 2.1.20) supports Gradle 7.6.3–8.11 and AGP 7.4.2–8.7.2. [1][2]
  • Android Gradle Plugin 8.12.x requires Gradle 8.13 (AGP 8.12 → Gradle 8.13). [3]

So AGP 8.12.2 (which requires Gradle 8.13) lies outside the AGP/Gradle ranges officially supported by Kotlin 2.1.20. [1][3]

Sources:
[1] Kotlin compatibility table / docs for 2.1.20.
[2] Kotlin “what’s new” (Kotlin 2.1.20) — Gradle compatibility note.
[3] Android Gradle Plugin release notes / compatibility table (AGP 8.12 → Gradle 8.13).


Hold AGP upgrade to 8.12.2
Kotlin 2.1.20 supports AGP only up to 8.7.2 and Gradle up to 8.11, whereas AGP 8.12.2 requires Gradle 8.13 (unsupported by Kotlin 2.1.20). Delay the bump until the Kotlin plugin adds Gradle 8.13 support.

🤖 Prompt for AI Agents
In gradle/libs.versions.toml around line 2, do not upgrade AGP to 8.12.2; keep
the agp version at the current supported value (leave as "8.11.1" or revert to
the previous repo value) because Kotlin 2.1.20 does not support the Gradle 8.13
requirement of AGP 8.12.2; hold the bump until the Kotlin plugin adds Gradle
8.13 support and optionally add a short inline comment noting the compatibility
constraint.

kotlin = "2.1.20"
ksp = "2.1.20-1.0.32" # Must be compatible with: `kotlin`
desugarLibs = "2.1.5"
Comment on lines 3 to 5
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Version compatibility sanity check (Kotlin 2.1.20 ⇄ KSP, Coroutines, Serialization).
These triples often have tight matrix constraints; please confirm published compat notes.

If any mismatch is reported, bump/downgrade to the nearest compatible set.

Also applies to: 14-16, 24-24


🌐 Web query:

Are KSP 1.0.32, kotlinx-coroutines 1.10.2, and kotlinx-serialization 1.8.0 compatible with Kotlin 2.1.20?

💡 Result:

Short answer — mostly yes, with one recommended upgrade:

  • KSP 1.0.32: compatible — there are KSP 1.0.32 artifacts published for Kotlin 2.1.20 (e.g. symbol-processing-aa-embeddable 2.1.20-1.0.32). [1]

  • kotlinx-coroutines 1.10.2: compatible — 1.10.2 was released in Apr 2025 and is published to work with recent Kotlin 2.1.x toolchain (used in dependency coordinates). Use the 1.10.2 artifacts that match your JVM/JS/Native targets. [2][3]

  • kotlinx-serialization 1.8.0: not officially targeted at Kotlin 2.1.20. v1.8.0 used Kotlin 2.1.0 by default (supports up to 2.1.10 per its release notes); the project published v1.8.1 to update support to Kotlin 2.1.20. Recommendation: upgrade serialization to 1.8.1 when using Kotlin 2.1.20. [4][5]

Sources:

  1. Maven listing for KSP 1.0.32 artifact (symbol-processing-aa-embeddable 2.1.20-1.0.32). [turn2search2]
  2. kotlinx.coroutines 1.10.2 release notes. [turn3search1]
  3. kotlinx.coroutines Maven coordinates (1.10.2). [turn3search2]
  4. kotlinx.serialization releases (1.8.0 / 1.8.1 notes). [turn0search2]
  5. kotlinx.serialization README / setup page (plugin/library versioning guidance). [turn0search1]

Upgrade kotlinx-serialization to 1.8.1 for full Kotlin 2.1.20 support
KSP 2.1.20-1.0.32 and kotlinx-coroutines 1.10.2 are already compatible with Kotlin 2.1.20, but kotlinx-serialization 1.8.0 only targets up to Kotlin 2.1.10—bump it to 1.8.1.

🤖 Prompt for AI Agents
In gradle/libs.versions.toml around lines 3 to 5, the project currently uses
kotlinx-serialization 1.8.0 which only targets up to Kotlin 2.1.10; update the
kotlinx-serialization version to 1.8.1 to ensure full compatibility with Kotlin
2.1.20 — locate the kotlinx-serialization entry (or add it if missing) and set
its value to "1.8.1", then run a quick dependency refresh/build to verify there
are no resolution conflicts.

androidxLifecycle = "2.8.6"
androidxComposeBom = "2024.10.00"
jetbrainsComposeRuntime = "1.7.0" # Needs to align with version in Compose BOM as closely as possible
androidxActivity = "1.9.2"
decompose = "3.1.0"
essenty = "2.1.0"
androidxLifecycle = "2.9.1"
androidxComposeBom = "2025.06.01"
jetbrainsComposeRuntime = "1.8.2" # Needs to align with version in Compose BOM as closely as possible
androidxActivity = "1.10.1"
decompose = "3.3.0"
Comment on lines +6 to +10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Possible mismatch between Compose BOM (2025.06.01) and runtime (1.8.2).

The comment says the JetBrains runtime “needs to align with” the BOM, but these numbers look far apart and may trigger runtime/ABI conflicts at compile time.

Consider either:
• dropping an explicit version for jetbrains-compose-runtime and letting the BOM control it, or
• updating it to the 2025.x artifact line if it exists.

🤖 Prompt for AI Agents
In gradle/libs.versions.toml around lines 6 to 10, the version of
jetbrainsComposeRuntime (1.8.2) does not align with the androidxComposeBom
version (2025.06.01), risking runtime or ABI conflicts. To fix this, either
remove the explicit version for jetbrainsComposeRuntime so it inherits the
version from the BOM, or update jetbrainsComposeRuntime to a version that
matches the 2025.x artifact line if available.

essenty = "2.5.0"
koin = "4.1.0"
koinAnnotations = "2.1.0" # Must be compatible with: `ksp`
kotlinx-coroutines = "1.8.1"
kotlinx-immutableCollections = "0.3.8"
kotlinx-dateTime = "0.6.1"
ktlintGradlePlugin = "12.2.0"
ktlint = "1.5.0"
kotlinx-coroutines = "1.10.2"
kotlinx-immutableCollections = "0.4.0"
kotlinx-dateTime = "0.6.2"
ktlintGradlePlugin = "12.3.0"
ktlint = "1.6.0"
detektGradlePlugin = "1.23.8"
composeLint = "1.3.1"
apollo = "4.0.0"
composeLint = "1.4.2"
apollo = "4.3.1"
ktorfit = "2.4.0" # Must be compatible with: `ksp`
ktor = "3.1.0" # Must be compatible with: `ktorfit`
kotlinx-serialization = "1.8.0" # Must be compatible with: `kotlin`
timber = "5.0.1"
kermit = "2.0.2"
kermit = "2.0.4"
skie = "0.10.2" # Must be compatible with: `kotlin`
buildkonfig = "0.15.2"
buildkonfig = "0.17.1"
nsExceptionKt = "1.0.0-BETA-7"
datastore = "1.1.1"
moko-resources = "0.24.5"
baselineProfile = "1.3.0"
baselineProfile = "1.3.4"
junit = "1.2.1"
espressoCore = "3.6.1"
uiautomator = "2.3.0"
benchmarkMacroJunit4 = "1.2.4"
profileinstaller = "1.3.1"
dokkaVersion = "1.9.20"
benchmarkMacroJunit4 = "1.3.4"
profileinstaller = "1.4.1"
google-servicesPlugin = "4.4.2"
google-firebaseAppDistributionPlugin = "5.0.0"
poet = "2.0.0"
google-firebaseAppDistributionPlugin = "5.1.1"
poet = "2.2.0"

# Android Namespaces
project-android-namespace = "app.futured.kmptemplate.android"
Expand Down Expand Up @@ -129,7 +128,6 @@ network-apollo-normalizedCache-sqlite = { group = "com.apollographql.apollo", na
network-ktorfit-ksp = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-ksp", version.ref = "ktorfit" }
network-ktorfit-lib = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-lib", version.ref = "ktorfit" }
network-ktorfit-converters = { group = "de.jensklingenberg.ktorfit", name = "ktorfit-converters-response", version.ref = "ktorfit" }
network-ktor-client-serialization = { group = "io.ktor", name = "ktor-client-serialization", version.ref = "ktor" }
network-ktor-client-contentNegotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
network-ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" }
network-ktor-client-engine-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
Expand Down Expand Up @@ -160,7 +158,6 @@ skie = { id = "co.touchlab.skie", version.ref = "skie" }
buildkonfig = { id = "com.codingfeline.buildkonfig", version.ref = "buildkonfig" }
moko-resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko-resources" }
androidx-baselineprofile = { id = "androidx.baselineprofile", version.ref = "baselineProfile" }
dokka = { id = "org.jetbrains.dokka", version.ref = "dokkaVersion" }
google-services = { id = "com.google.gms.google-services", version.ref = "google-servicesPlugin" }
firebase-distribution = { id = "com.google.firebase.appdistribution", version.ref = "google-firebaseAppDistributionPlugin" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detektGradlePlugin" }
Expand Down Expand Up @@ -190,7 +187,6 @@ ktorfit = [
"network-ktorfit-lib",
"network-ktorfit-converters",
"network-ktor-client-contentNegotiation",
"network-ktor-client-serialization",
"network-ktor-client-logging",
"network-ktor-serialization-kotlinx-json",
]
21 changes: 0 additions & 21 deletions shared/feature/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import app.futured.kmptemplate.gradle.configuration.ProjectSettings
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.dokka)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove also from libs.versions.toml


id(libs.plugins.conventions.lint.get().pluginId)
id(libs.plugins.conventions.annotationProcessing.get().pluginId)
Expand Down Expand Up @@ -84,22 +82,3 @@ android {
compose = true
}
}

tasks.withType<DokkaTask>().configureEach {
dokkaSourceSets.configureEach {
outputDirectory.set(layout.projectDirectory.dir("../../doc/documentation/html"))

val dokkaBaseConfiguration = """
{
"customStyleSheets": ["${file("../../assets/docs-style.css")}"],
"footerMessage": "(c) 2024 Futured - KMP Template"
}
"""
pluginsMapConfiguration.set(
mapOf(
// fully qualified plugin name to json configuration
"org.jetbrains.dokka.base.DokkaBase" to dokkaBaseConfiguration,
),
)
}
}
Loading