mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 02:29:55 +02:00
feat(config): shared app.properties for app-wide constants
Add a single source of truth (root app.properties) for public app-wide constants, injected at build time on both platforms instead of hardcoding. - Apple: generate-appconfig.sh -> Generated/AppConfig.swift (wired into `make apple-app-config`), consumed as AppConfig.privacyPolicyURL. - KMP: generateAppConfig task -> AppConfig.kt (mirrors DiagnosticsBuildConfig), consumed as AppConfig.PRIVACY_POLICY_URL. Replaces the stale hardcoded privacy-policy URL on both sides with https://vnidrop.sudosy.fr/privacy/. Also fix the Apple release core build: disable release LTO in build-core.sh (Cargo forbids lto in a build-override) to avoid the proc-macro "mis-aligned LINKEDIT string pool" corruption, so release archives are compact instead of shipping the debug core. Update the app icon. Tests: shell test for the generator (escaping, missing/duplicate key), plus XCTest and jvmTest asserting the generated value matches app.properties.
This commit is contained in:
@@ -110,6 +110,55 @@ val generateDiagnosticsBuildConfig by tasks.registering {
|
||||
}
|
||||
}
|
||||
|
||||
// App-wide public constants (privacy policy URL, …) from the shared app.properties,
|
||||
// so Apple and KMP read one source of truth instead of hardcoding values.
|
||||
val appProperties = java.util.Properties().apply {
|
||||
rootProject.file("app.properties").inputStream().use(::load)
|
||||
}
|
||||
val privacyPolicyUrl: String = appProperties.getProperty("PRIVACY_POLICY_URL")?.trim().orEmpty()
|
||||
check(privacyPolicyUrl.isNotEmpty()) { "PRIVACY_POLICY_URL must be set in app.properties" }
|
||||
|
||||
val appConfigDir = layout.buildDirectory.dir("generated/appconfig/commonMain/kotlin")
|
||||
val generateAppConfig by tasks.registering {
|
||||
group = "build"
|
||||
description = "Generates AppConfig from the shared app.properties"
|
||||
val outputDir = appConfigDir
|
||||
val privacy = privacyPolicyUrl
|
||||
inputs.property("PRIVACY_POLICY_URL", privacy)
|
||||
outputs.dir(outputDir)
|
||||
doLast {
|
||||
val packageDir = outputDir.get().asFile.resolve("com/vnidrop/app")
|
||||
packageDir.mkdirs()
|
||||
fun esc(value: String): String = buildString {
|
||||
for (ch in value) {
|
||||
when (ch) {
|
||||
'\\' -> append("\\\\")
|
||||
'"' -> append("\\\"")
|
||||
'\n' -> append("\\n")
|
||||
'\r' -> append("\\r")
|
||||
'\t' -> append("\\t")
|
||||
'$' -> append("\\$")
|
||||
else -> append(ch)
|
||||
}
|
||||
}
|
||||
}
|
||||
packageDir.resolve("AppConfig.kt").writeText(
|
||||
"""
|
||||
|package com.vnidrop.app
|
||||
|
|
||||
|/**
|
||||
| * Generated by shared/build.gradle.kts from the shared app.properties.
|
||||
| * Single source of truth for app-wide public constants (also used by Apple).
|
||||
| */
|
||||
|object AppConfig {
|
||||
| const val PRIVACY_POLICY_URL: String = "${esc(privacy)}"
|
||||
|}
|
||||
|
|
||||
""".trimMargin(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
androidTarget {
|
||||
compilerOptions {
|
||||
@@ -122,6 +171,7 @@ kotlin {
|
||||
sourceSets {
|
||||
commonMain {
|
||||
kotlin.srcDir(files(diagnosticsBuildConfigDir).builtBy(generateDiagnosticsBuildConfig))
|
||||
kotlin.srcDir(files(appConfigDir).builtBy(generateAppConfig))
|
||||
}
|
||||
androidMain.dependencies {
|
||||
implementation(libs.androidx.activity.compose)
|
||||
|
||||
Reference in New Issue
Block a user