Files
vhaudiquet 81da26b955 feat(rhema-code): add the colors setting with four palettes
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.
2026-10-17 04:28:31 +08:00

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")
}