diff --git a/app/android/build.gradle.kts b/app/android/build.gradle.kts index 68ec6ec..cbdb984 100644 --- a/app/android/build.gradle.kts +++ b/app/android/build.gradle.kts @@ -62,8 +62,8 @@ extensions.configure { applicationId = "ru.fromchat" minSdk = 24 targetSdk = 37 - versionCode = 1 - versionName = "1.0" + versionCode = rootProject.extra["versionCode"] as Int + versionName = rootProject.extra["versionName"] as String ndk { abiFilters += listOf("arm64-v8a", "x86_64") diff --git a/app/shared/build.gradle.kts b/app/shared/build.gradle.kts index 1900d00..7f21a91 100644 --- a/app/shared/build.gradle.kts +++ b/app/shared/build.gradle.kts @@ -1,5 +1,12 @@ @file:Suppress("TaskMissingDescription") +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.compose.multiplatform) @@ -9,6 +16,54 @@ plugins { alias(libs.plugins.sqldelight) } +abstract class GenerateAppBuildInfoTask : DefaultTask() { + @get:Input + abstract val versionName: Property + + @get:Input + abstract val versionCode: Property + + @get:Input + abstract val debugBuild: Property + + @get:OutputDirectory + abstract val outputDirectory: DirectoryProperty + + @TaskAction + fun generate() { + val outRoot = outputDirectory.get().asFile + check(outRoot.invariantSeparatorsPath.contains("/generated/")) { + "AppBuildInfo must be written under a generated/ directory, got: $outRoot" + } + outRoot.deleteRecursively() + outRoot.resolve("ru/fromchat").apply { mkdirs() }.resolve("AppBuildInfo.kt").writeText( + """ + |package ru.fromchat + | + |/** Injected by Gradle into generated sources (not under src/). */ + |object AppBuildInfo { + | const val version = "${versionName.get()}" + | const val versionCode = ${versionCode.get()} + | const val isDebug = ${debugBuild.get()} + |} + | + """.trimMargin() + ) + } +} + +val generateAppBuildInfo = tasks.register("generateAppBuildInfo") { + versionName.set(rootProject.extra["versionName"] as String) + versionCode.set(rootProject.extra["versionCode"] as Int) + debugBuild.set( + gradle.startParameter.taskNames.let { names -> + !names.any { it.contains("Release", ignoreCase = true) } || + names.any { it.contains("Debug", ignoreCase = true) } + }, + ) + outputDirectory.set(layout.buildDirectory.dir("generated/sources/appBuildInfo/kotlin")) +} + kotlin { android { namespace = "ru.fromchat.shared" @@ -38,6 +93,10 @@ kotlin { } } + commonMain { + kotlin.srcDir(generateAppBuildInfo.map { it.outputDirectory }) + } + commonMain.dependencies { implementation(libs.compose.runtime) implementation(libs.compose.foundation) @@ -124,6 +183,7 @@ compose.resources { tasks.matching { it.name == "compileAndroidMain" || it.name == "compileKotlinIosArm64" }.configureEach { dependsOn("generateResourceAccessorsForCommonMain") + dependsOn(generateAppBuildInfo) } tasks.register("generateResourceAccessors") { @@ -135,4 +195,4 @@ tasks.register("generateResourceAccessors") { }.toTypedArray() ) ) -} \ No newline at end of file +} diff --git a/app/shared/src/commonMain/composeResources/values-ru/strings.xml b/app/shared/src/commonMain/composeResources/values-ru/strings.xml index 0cce815..f4708aa 100644 --- a/app/shared/src/commonMain/composeResources/values-ru/strings.xml +++ b/app/shared/src/commonMain/composeResources/values-ru/strings.xml @@ -5,7 +5,7 @@ Настройки Главная О приложении - Версия 1.0 + Версия %1$s Telegram MAX Сайт diff --git a/app/shared/src/commonMain/composeResources/values/strings.xml b/app/shared/src/commonMain/composeResources/values/strings.xml index 9f356c1..3041ff8 100644 --- a/app/shared/src/commonMain/composeResources/values/strings.xml +++ b/app/shared/src/commonMain/composeResources/values/strings.xml @@ -8,7 +8,7 @@ Settings Home About - Version 1.0 + Version %1$s Telegram MAX Website diff --git a/app/shared/src/commonMain/kotlin/ru/fromchat/ui/main/settings/AboutScreen.kt b/app/shared/src/commonMain/kotlin/ru/fromchat/ui/main/settings/AboutScreen.kt index 93691ef..c3af0b0 100644 --- a/app/shared/src/commonMain/kotlin/ru/fromchat/ui/main/settings/AboutScreen.kt +++ b/app/shared/src/commonMain/kotlin/ru/fromchat/ui/main/settings/AboutScreen.kt @@ -37,6 +37,7 @@ import com.pr0gramm3r101.components.ListItem import com.pr0gramm3r101.ui.Website import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource +import ru.fromchat.AppBuildInfo import ru.fromchat.Res import ru.fromchat.about import ru.fromchat.about_link_max @@ -111,7 +112,10 @@ fun AboutScreen() { BrandTitle(Modifier.padding(bottom = 4.dp)) Text( - text = stringResource(Res.string.about_version), + text = stringResource( + Res.string.about_version, + AppBuildInfo.version + if (AppBuildInfo.isDebug) "-beta" else "", + ), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(bottom = 16.dp) diff --git a/build.gradle.kts b/build.gradle.kts index 2bef730..25a11f8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,6 +8,10 @@ plugins { alias(libs.plugins.google.services) apply false } +/** Single source of truth for app version (APK + generated [AppBuildInfo]). */ +extra["versionName"] = "1.1.3" +extra["versionCode"] = 113 + buildscript { repositories { google()