Add support for Android TV 6 & 7.0 (#350)

Adds support for Android TV 6.0 & 7.0 by reduce the min SDK to 23. Going
below 23 isn't practical since new releases of Jetpack libs require 23+.

Also includes some clean up for better gradle syncs & actually use the
datetime APIs available from desugaring on older versions.

Needs more testing before merge

Closes #341
This commit is contained in:
damontecres 2025-11-30 20:26:42 -05:00 committed by GitHub
parent eca3268a7d
commit 258c50a95e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 54 deletions

View file

@ -64,7 +64,7 @@ The first time you attempt an update, the OS should guide you through enabling t
## Compatibility ## Compatibility
Requires Android 7.1+ (or Fire TV OS 6+) and Jellyfin server `10.10.x` (tested on primarily `10.10.7`). Requires Android 6+ (or Fire TV OS 6+) and Jellyfin server `10.10.x` or `10.11.x` (tested on primarily `10.11.3`).
The app is tested on a variety of Android TV/Fire TV OS devices, but if you encounter issues, please file an issue! The app is tested on a variety of Android TV/Fire TV OS devices, but if you encounter issues, please file an issue!

View file

@ -1,7 +1,7 @@
import com.google.protobuf.gradle.id import com.google.protobuf.gradle.id
import com.mikepenz.aboutlibraries.plugin.DuplicateMode import com.mikepenz.aboutlibraries.plugin.DuplicateMode
import com.mikepenz.aboutlibraries.plugin.DuplicateRule import com.mikepenz.aboutlibraries.plugin.DuplicateRule
import java.io.ByteArrayOutputStream import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.util.Base64 import java.util.Base64
import java.util.Properties import java.util.Properties
@ -21,31 +21,17 @@ val isCI = if (System.getenv("CI") != null) System.getenv("CI").toBoolean() else
val shouldSign = isCI && System.getenv("KEY_ALIAS") != null val shouldSign = isCI && System.getenv("KEY_ALIAS") != null
val ffmpegModuleExists = project.file("libs/lib-decoder-ffmpeg-release.aar").exists() val ffmpegModuleExists = project.file("libs/lib-decoder-ffmpeg-release.aar").exists()
fun getVersionCode(): Int { val gitTags =
val stdout = ByteArrayOutputStream() providers
exec { .exec { commandLine("git", "tag", "--list", "v*", "p*") }
commandLine = listOf("git", "tag", "--list", "v*", "p*") .standardOutput.asText
standardOutput = stdout .get()
}
return stdout
.toString()
.trim()
.lines()
.size
}
fun getAppVersion(): String { val gitDescribe =
val stdout = ByteArrayOutputStream() providers
exec { .exec { commandLine("git", "describe", "--tags", "--long", "--match=v*") }
commandLine = listOf("git", "describe", "--tags", "--long", "--match=v*") .standardOutput.asText
standardOutput = stdout .getOrElse("v0.0.0")
}
return stdout
.toString()
.trim()
.removePrefix("v")
.ifBlank { "0.0.0" }
}
android { android {
namespace = "com.github.damontecres.wholphin" namespace = "com.github.damontecres.wholphin"
@ -53,10 +39,10 @@ android {
defaultConfig { defaultConfig {
applicationId = "com.github.damontecres.wholphin" applicationId = "com.github.damontecres.wholphin"
minSdk = 25 minSdk = 23
targetSdk = 36 targetSdk = 36
versionCode = getVersionCode() versionCode = gitTags.trim().lines().size
versionName = getAppVersion() versionName = gitDescribe.trim()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
@ -79,8 +65,11 @@ android {
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11
isCoreLibraryDesugaringEnabled = true isCoreLibraryDesugaringEnabled = true
} }
kotlinOptions { kotlin {
jvmTarget = "11" compilerOptions {
jvmTarget = JvmTarget.JVM_11
javaParameters = true
}
} }
buildFeatures { buildFeatures {
buildConfig = true buildConfig = true

View file

@ -1,6 +1,5 @@
package com.github.damontecres.wholphin.ui package com.github.damontecres.wholphin.ui
import android.os.Build
import androidx.annotation.StringRes import androidx.annotation.StringRes
import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.R
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto
@ -12,33 +11,17 @@ import java.time.format.FormatStyle
import java.util.Locale import java.util.Locale
val TimeFormatter: DateTimeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT) val TimeFormatter: DateTimeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
val DateFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("MMM d, yyyy")
// TODO server returns in UTC, but sdk converts to local time
// eg 2020-02-14T00:00:00.0000000Z => 2020-02-13T17:00:00 PT => Feb 13, 2020
/** /**
* Format a [LocalDateTime] as `Aug 24, 2000` * Format a [LocalDateTime] as `Aug 24, 2000`
*/ */
fun formatDateTime(dateTime: LocalDateTime): String = fun formatDateTime(dateTime: LocalDateTime): String = DateFormatter.format(dateTime)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// TODO server returns in UTC, but sdk converts to local time
// eg 2020-02-14T00:00:00.0000000Z => 2020-02-13T17:00:00 PT => Feb 13, 2020
val formatter = DateTimeFormatter.ofPattern("MMM d, yyyy")
formatter.format(dateTime)
} else if (dateTime.toString().length >= 10) {
dateTime.toString().substring(0, 10)
} else {
dateTime.toString()
}
fun formatDate(dateTime: LocalDate): String = fun formatDate(dateTime: LocalDate): String = DateFormatter.format(dateTime)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// TODO server returns in UTC, but sdk converts to local time
// eg 2020-02-14T00:00:00.0000000Z => 2020-02-13T17:00:00 PT => Feb 13, 2020
val formatter = DateTimeFormatter.ofPattern("MMM d, yyyy")
formatter.format(dateTime)
} else if (dateTime.toString().length >= 10) {
dateTime.toString().substring(0, 10)
} else {
dateTime.toString()
}
/** /**
* If the item has season & episode info, format as `S# E#` * If the item has season & episode info, format as `S# E#`