Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011TdkZRTCV92L7gbQX2Z5Ay
203 lines
6.3 KiB
Text
203 lines
6.3 KiB
Text
plugins {
|
|
alias(libs.plugins.aboutlibraries)
|
|
alias(libs.plugins.android.application)
|
|
alias(libs.plugins.kotlin.compose)
|
|
alias(libs.plugins.kotlin.serialization)
|
|
}
|
|
|
|
android {
|
|
namespace = "org.jellyfin.androidtv"
|
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
|
|
|
defaultConfig {
|
|
minSdk = libs.versions.android.minSdk.get().toInt()
|
|
targetSdk = libs.versions.android.targetSdk.get().toInt()
|
|
|
|
// Smithflix: own application id so it installs alongside the official Jellyfin app
|
|
applicationId = "us.smithflix.tv"
|
|
versionName = project.getVersionName()
|
|
versionCode = getVersionCode(versionName!!)
|
|
|
|
// Smithflix: the server offered on first launch, and its address on the home network
|
|
buildConfigField("String", "SMITHFLIX_SERVER_URL", "\"https://media.smithflix.us\"")
|
|
buildConfigField("String", "SMITHFLIX_HOME_URL", "\"http://192.168.86.121:8096\"")
|
|
// Smithflix Hub: requests and "Not on Smithflix yet" suggestions
|
|
buildConfigField("String", "SMITHFLIX_HUB_URL", "\"https://app.smithflix.us\"")
|
|
|
|
// Smithflix: where the app looks for updates (published by the build workflow)
|
|
buildConfigField(
|
|
"String",
|
|
"UPDATE_URL",
|
|
"\"https://github.com/TySmittie52/smithflix-releases/releases/latest/download/version.json\"",
|
|
)
|
|
}
|
|
|
|
buildFeatures {
|
|
buildConfig = true
|
|
viewBinding = true
|
|
compose = true
|
|
resValues = true
|
|
}
|
|
|
|
compileOptions {
|
|
isCoreLibraryDesugaringEnabled = true
|
|
}
|
|
|
|
signingConfigs {
|
|
val keystoreFile = getProperty("keystore.file")
|
|
val keystorePassword = getProperty("keystore.password")
|
|
val signingKeyAlias = getProperty("signing.key.alias")
|
|
val signingKeyPassword = getProperty("signing.key.password")
|
|
|
|
if (keystoreFile != null && keystorePassword != null && signingKeyAlias != null && signingKeyPassword != null) {
|
|
create("release") {
|
|
storeFile = file(keystoreFile)
|
|
storePassword = keystorePassword
|
|
keyAlias = signingKeyAlias
|
|
keyPassword = signingKeyPassword
|
|
}
|
|
}
|
|
}
|
|
|
|
dependenciesInfo {
|
|
includeInBundle = false
|
|
includeInApk = false
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
isMinifyEnabled = true
|
|
isShrinkResources = true
|
|
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
|
|
|
// Set package names used in various XML files
|
|
resValue("string", "app_id", "us.smithflix.tv")
|
|
resValue("string", "app_search_suggest_authority", "us.smithflix.tv.content")
|
|
resValue("string", "app_search_suggest_intent_data", "content://us.smithflix.tv.content/intent")
|
|
|
|
// Set flavored application name
|
|
resValue("string", "app_name", "@string/app_name_release")
|
|
|
|
buildConfigField("boolean", "DEVELOPMENT", "false")
|
|
|
|
signingConfig = signingConfigs.findByName("release")
|
|
}
|
|
|
|
debug {
|
|
// Use different application id to run release and debug at the same time
|
|
applicationIdSuffix = ".debug"
|
|
|
|
// Set package names used in various XML files
|
|
resValue("string", "app_id", "us.smithflix.tv" + applicationIdSuffix)
|
|
resValue("string", "app_search_suggest_authority", "us.smithflix.tv${applicationIdSuffix}.content")
|
|
resValue("string", "app_search_suggest_intent_data", "content://us.smithflix.tv${applicationIdSuffix}.content/intent")
|
|
|
|
// Set flavored application name
|
|
resValue("string", "app_name", "@string/app_name_debug")
|
|
|
|
buildConfigField("boolean", "DEVELOPMENT", (defaultConfig.versionCode!! < 100).toString())
|
|
}
|
|
}
|
|
|
|
lint {
|
|
lintConfig = file("$rootDir/android-lint.xml")
|
|
abortOnError = false
|
|
checkDependencies = true
|
|
}
|
|
|
|
testOptions.unitTests.all {
|
|
it.useJUnitPlatform()
|
|
}
|
|
}
|
|
|
|
base.archivesName.set("smithflix-v${project.getVersionName()}")
|
|
|
|
tasks.register("versionTxt") {
|
|
val path = layout.buildDirectory.asFile.get().resolve("version.txt")
|
|
|
|
doLast {
|
|
val versionString = "v${android.defaultConfig.versionName}=${android.defaultConfig.versionCode}"
|
|
logger.info("Writing [$versionString] to $path")
|
|
path.writeText("$versionString\n")
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
// Jellyfin
|
|
implementation(projects.design)
|
|
implementation(projects.playback.core)
|
|
implementation(projects.playback.jellyfin)
|
|
implementation(projects.playback.media3.exoplayer)
|
|
implementation(projects.playback.media3.session)
|
|
implementation(projects.preference)
|
|
implementation(libs.jellyfin.sdk) {
|
|
// Change version if desired
|
|
val sdkVersion = findProperty("sdk.version")?.toString()
|
|
when (sdkVersion) {
|
|
"local" -> version { strictly("latest-SNAPSHOT") }
|
|
"snapshot" -> version { strictly("master-SNAPSHOT") }
|
|
"unstable-snapshot" -> version { strictly("openapi-unstable-SNAPSHOT") }
|
|
}
|
|
}
|
|
|
|
// Kotlin
|
|
implementation(libs.kotlinx.coroutines)
|
|
implementation(libs.kotlinx.serialization.json)
|
|
|
|
// Android(x)
|
|
implementation(libs.androidx.core)
|
|
implementation(libs.androidx.activity)
|
|
implementation(libs.androidx.activity.compose)
|
|
implementation(libs.androidx.fragment)
|
|
implementation(libs.androidx.fragment.compose)
|
|
implementation(libs.androidx.leanback.core)
|
|
implementation(libs.androidx.leanback.preference)
|
|
implementation(libs.androidx.navigation3.ui)
|
|
implementation(libs.androidx.preference)
|
|
implementation(libs.androidx.appcompat)
|
|
implementation(libs.androidx.tvprovider)
|
|
implementation(libs.androidx.constraintlayout)
|
|
implementation(libs.androidx.recyclerview)
|
|
implementation(libs.androidx.work.runtime)
|
|
implementation(libs.bundles.androidx.lifecycle)
|
|
implementation(libs.androidx.window)
|
|
implementation(libs.androidx.cardview)
|
|
implementation(libs.androidx.startup)
|
|
implementation(libs.bundles.androidx.compose)
|
|
implementation(libs.accompanist.permissions)
|
|
|
|
// Dependency Injection
|
|
implementation(libs.bundles.koin)
|
|
|
|
// Media players
|
|
implementation(libs.androidx.media3.exoplayer)
|
|
implementation(libs.androidx.media3.datasource.okhttp)
|
|
implementation(libs.androidx.media3.exoplayer.hls)
|
|
implementation(libs.androidx.media3.ui)
|
|
implementation(libs.jellyfin.androidx.media3.ffmpeg.decoder)
|
|
implementation(libs.libass.media3)
|
|
|
|
// Markdown
|
|
implementation(libs.bundles.markwon)
|
|
|
|
// Image utility
|
|
implementation(libs.bundles.coil)
|
|
|
|
// Crash Reporting
|
|
implementation(libs.bundles.acra)
|
|
|
|
// Licenses
|
|
implementation(libs.aboutlibraries)
|
|
|
|
// Logging
|
|
implementation(libs.timber)
|
|
implementation(libs.slf4j.timber)
|
|
|
|
// Compatibility (desugaring)
|
|
coreLibraryDesugaring(libs.android.desugar)
|
|
|
|
// Testing
|
|
testImplementation(libs.kotest.runner.junit5)
|
|
testImplementation(libs.kotest.assertions)
|
|
testImplementation(libs.mockk)
|
|
}
|