The stored `colors` key names a palette — rhema (the default, Jadeite), aquamarine, black-and-white, or dracula — and the Appearance page of /settings cycles it live, like the theme and icon toggles beside it. Each palette carries a dark and a light appearance under the existing `theme` key; dracula's light side is derived, the official palette ships only dark. The appearance decision moves off token comparison: Theme now answers is_dark() from the ground/text luminance, so palettes beyond the original two get the right per-profile fallback tones.
99 lines
3.6 KiB
Kotlin
99 lines
3.6 KiB
Kotlin
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
|
|
|
plugins {
|
|
id("com.android.application")
|
|
id("org.jetbrains.kotlin.android")
|
|
id("org.jetbrains.kotlin.plugin.compose")
|
|
id("org.jetbrains.kotlin.plugin.serialization")
|
|
}
|
|
|
|
android {
|
|
namespace = "rs.rhema.phone"
|
|
compileSdk = 36
|
|
|
|
defaultConfig {
|
|
applicationId = "rs.rhema.phone"
|
|
minSdk = 26
|
|
targetSdk = 36
|
|
versionCode = 1
|
|
versionName = "0.1.0"
|
|
}
|
|
|
|
signingConfigs {
|
|
// Debug builds must install over each other, so the signing key
|
|
// may not depend on the machine that ran the build: CI artifacts
|
|
// share the identity of every local build via the committed
|
|
// android/debug.keystore. A debug key guards nothing — this is
|
|
// the conventional Android Debug identity, password "android" —
|
|
// while a stable signature is what makes the artifacts updatable.
|
|
getByName("debug") {
|
|
storeFile = rootProject.file("debug.keystore")
|
|
storePassword = "android"
|
|
keyAlias = "androiddebugkey"
|
|
keyPassword = "android"
|
|
}
|
|
|
|
// The release key anchors the future edge channel: whatever is
|
|
// signed with it can silently update an install that trusts the
|
|
// channel, so it must not travel with the source. It exists only
|
|
// as a CI secret (see .gitea/workflows/android.yml); blank
|
|
// environment — local builds, fork PRs — leaves release unsigned.
|
|
create("release") {
|
|
storeFile = System.getenv("ANDROID_RELEASE_KEYSTORE")
|
|
?.takeIf { it.isNotBlank() }?.let { rootProject.file(it) }
|
|
storePassword = System.getenv("ANDROID_RELEASE_KEYSTORE_PASSWORD")
|
|
?.takeIf { it.isNotBlank() }
|
|
keyAlias = "rhema-release"
|
|
keyPassword = storePassword
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
isMinifyEnabled = false
|
|
// Signed only where the release credentials exist; the
|
|
// unsigned artifact is a build check, never a deliverable.
|
|
if (!System.getenv("ANDROID_RELEASE_KEYSTORE")
|
|
.isNullOrBlank()
|
|
) {
|
|
signingConfig = signingConfigs.getByName("release")
|
|
}
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
|
|
kotlin {
|
|
compilerOptions {
|
|
jvmTarget.set(JvmTarget.JVM_17)
|
|
}
|
|
}
|
|
|
|
buildFeatures {
|
|
compose = true
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation(platform("androidx.compose:compose-bom:2025.12.01"))
|
|
implementation("androidx.compose.ui:ui")
|
|
implementation("androidx.compose.foundation:foundation")
|
|
implementation("androidx.compose.material3:material3")
|
|
implementation("androidx.compose.material:material-icons-core")
|
|
implementation("androidx.activity:activity-compose:1.12.4")
|
|
implementation("androidx.core:core-ktx:1.17.0")
|
|
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
|
|
implementation("androidx.datastore:datastore-preferences:1.1.7")
|
|
implementation("androidx.work:work-runtime-ktx:2.12.0")
|
|
implementation("com.squareup.okhttp3:okhttp:4.12.0")
|
|
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
|
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")
|
|
// 0.42+ declares minCompileSdk 37 in its AAR metadata; the project's
|
|
// AGP tops out at 36. Revisit when AGP moves.
|
|
implementation("com.mikepenz:multiplatform-markdown-renderer:0.41.0")
|
|
implementation("com.mikepenz:multiplatform-markdown-renderer-m3:0.41.0")
|
|
}
|