diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/UiConstants.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/UiConstants.kt
index beafccb2..319f7092 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/UiConstants.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/UiConstants.kt
@@ -21,18 +21,23 @@ val LocalImageUrlService =
/**
* Colors not associated with the theme
*/
-sealed class AppColors private constructor() {
- companion object {
- val TransparentBlack25 = Color(0x40000000)
- val TransparentBlack50 = Color(0x80000000)
- val TransparentBlack75 = Color(0xBF000000)
+object AppColors {
+ val TransparentBlack25 = Color(0x40000000)
+ val TransparentBlack50 = Color(0x80000000)
+ val TransparentBlack75 = Color(0xBF000000)
- val DarkGreen = Color(0xFF114000)
- val DarkRed = Color(0xFF400000)
- val DarkCyan = Color(0xFF21556E)
- val DarkPurple = Color(0xFF261370)
+ val DarkGreen = Color(0xFF114000)
+ val DarkRed = Color(0xFF400000)
+ val DarkCyan = Color(0xFF21556E)
+ val DarkPurple = Color(0xFF261370)
- val GoldenYellow = Color(0xFFDAB440)
+ val GoldenYellow = Color(0xFFDAB440)
+
+ object Discover {
+ val Blue = Color(37, 99, 235)
+ val Purple = Color(147, 51, 234)
+ val Green = Color(74, 222, 128)
+ val Yellow = Color(234, 179, 8)
}
}
diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/cards/DiscoverItemCard.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/cards/DiscoverItemCard.kt
index 8425e1b6..7794f216 100644
--- a/app/src/main/java/com/github/damontecres/wholphin/ui/cards/DiscoverItemCard.kt
+++ b/app/src/main/java/com/github/damontecres/wholphin/ui/cards/DiscoverItemCard.kt
@@ -2,6 +2,7 @@ package com.github.damontecres.wholphin.ui.cards
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.background
+import androidx.compose.foundation.border
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsFocusedAsState
import androidx.compose.foundation.layout.Arrangement
@@ -24,20 +25,27 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
import androidx.tv.material3.Card
import androidx.tv.material3.CardDefaults
+import androidx.tv.material3.MaterialTheme
import androidx.tv.material3.Text
import com.github.damontecres.wholphin.R
import com.github.damontecres.wholphin.data.model.DiscoverItem
import com.github.damontecres.wholphin.data.model.SeerrAvailability
import com.github.damontecres.wholphin.data.model.SeerrItemType
+import com.github.damontecres.wholphin.ui.AppColors
import com.github.damontecres.wholphin.ui.AspectRatios
import com.github.damontecres.wholphin.ui.Cards
+import com.github.damontecres.wholphin.ui.FontAwesome
+import com.github.damontecres.wholphin.ui.PreviewTvSpec
import com.github.damontecres.wholphin.ui.enableMarquee
+import com.github.damontecres.wholphin.ui.theme.WholphinTheme
import kotlinx.coroutines.delay
@Composable
@@ -106,49 +114,50 @@ fun DiscoverItemCard(
Modifier
.fillMaxSize(),
)
- val availabilityColor =
- when (item?.availability) {
- SeerrAvailability.PENDING,
- SeerrAvailability.PROCESSING,
- -> Color.Yellow
-
- SeerrAvailability.PARTIALLY_AVAILABLE,
- SeerrAvailability.AVAILABLE,
- -> Color.Green
-
- else -> null
+ when (item?.availability) {
+ SeerrAvailability.PENDING,
+ SeerrAvailability.PROCESSING,
+ -> {
+ PendingIndicator(Modifier.align(Alignment.TopEnd))
}
- availabilityColor?.let {
- Box(
- modifier =
- Modifier
- .padding(4.dp)
- .background(
- color = it,
- shape = CircleShape,
- ).size(12.dp)
- .align(Alignment.TopEnd),
- )
+
+ SeerrAvailability.PARTIALLY_AVAILABLE -> {
+ PartiallyAvailableIndicator(Modifier.align(Alignment.TopEnd))
+ }
+
+ SeerrAvailability.AVAILABLE,
+ -> {
+ AvailableIndicator(Modifier.align(Alignment.TopEnd))
+ }
+
+ else -> {}
}
if (showOverlay) {
- // TODO better colors
val color =
- when (item?.type) {
- SeerrItemType.MOVIE -> Color.Blue
- SeerrItemType.TV -> Color.Red
- SeerrItemType.PERSON -> Color.Green
- SeerrItemType.UNKNOWN -> Color.Black
- null -> Color.Black
- }.copy(alpha = .5f)
- when (item?.type) {
- SeerrItemType.MOVIE -> R.string.movies
- SeerrItemType.TV -> R.string.tv_shows
- SeerrItemType.PERSON -> R.string.people
- SeerrItemType.UNKNOWN -> null
- null -> null
- }?.let {
+ remember(item?.type) {
+ when (item?.type) {
+ SeerrItemType.MOVIE -> AppColors.Discover.Blue
+ SeerrItemType.TV -> AppColors.Discover.Purple
+ SeerrItemType.PERSON -> AppColors.Discover.Green
+ SeerrItemType.UNKNOWN -> Color.Black
+ null -> Color.Black
+ }.copy(alpha = .8f)
+ }
+ val text =
+ remember(item?.type) {
+ when (item?.type) {
+ SeerrItemType.MOVIE -> R.plurals.movies
+ SeerrItemType.TV -> R.plurals.tv_shows
+ SeerrItemType.PERSON -> R.plurals.people
+ SeerrItemType.UNKNOWN -> null
+ null -> null
+ }
+ }
+ text?.let {
Text(
- text = stringResource(it),
+ text = pluralStringResource(it, 1),
+ style = MaterialTheme.typography.bodySmall,
+ fontSize = 10.sp,
modifier =
Modifier
.align(Alignment.TopStart)
@@ -192,3 +201,93 @@ fun DiscoverItemCard(
}
}
}
+
+@Composable
+fun PendingIndicator(modifier: Modifier = Modifier) {
+ Box(
+ modifier =
+ modifier
+ .padding(4.dp)
+ .border(
+ width = .5.dp,
+ color = AppColors.Discover.Yellow,
+ shape = CircleShape,
+ ).background(
+ color = Color.White.copy(alpha = .85f),
+ shape = CircleShape,
+ ).size(16.dp),
+ ) {
+ Text(
+ text = stringResource(R.string.fa_bell),
+ fontFamily = FontAwesome,
+ fontSize = 10.sp,
+ color = AppColors.Discover.Yellow,
+ modifier = Modifier.align(Alignment.Center),
+ )
+ }
+}
+
+@Composable
+fun AvailableIndicator(modifier: Modifier = Modifier) {
+ Box(
+ modifier =
+ modifier
+ .padding(4.dp)
+ .border(
+ width = .5.dp,
+ color = Color.White,
+ shape = CircleShape,
+ ).background(
+ color = AppColors.Discover.Green.copy(alpha = .85f),
+ shape = CircleShape,
+ ).size(16.dp),
+ ) {
+ Text(
+ text = stringResource(R.string.fa_check),
+ fontFamily = FontAwesome,
+ fontSize = 10.sp,
+ color = Color.White,
+ modifier = Modifier.align(Alignment.Center),
+ )
+ }
+}
+
+@Composable
+fun PartiallyAvailableIndicator(modifier: Modifier = Modifier) {
+ Box(
+ modifier =
+ modifier
+ .padding(4.dp)
+ .border(
+ width = .5.dp,
+ color = Color.White,
+ shape = CircleShape,
+ ).background(
+ color = AppColors.Discover.Green.copy(alpha = .85f),
+ shape = CircleShape,
+ ).size(16.dp),
+ ) {
+ Box(
+ modifier =
+ Modifier
+ .align(Alignment.Center)
+ .size(width = 10.dp, height = 2.dp)
+ .background(
+ color = Color.White,
+ shape = CircleShape,
+ ),
+ )
+ }
+}
+
+@PreviewTvSpec
+@Composable
+private fun Preview() {
+ WholphinTheme {
+ Column {
+ PendingIndicator()
+ AvailableIndicator()
+ PartiallyAvailableIndicator()
+ }
+ }
+}
diff --git a/app/src/main/res/values/fa_strings.xml b/app/src/main/res/values/fa_strings.xml
index a79bf2b7..d247de8c 100644
--- a/app/src/main/res/values/fa_strings.xml
+++ b/app/src/main/res/values/fa_strings.xml
@@ -47,4 +47,6 @@
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f776b906..3871c809 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -252,6 +252,22 @@
- %d seconds
+
+ - Movies
+ - Movie
+ - Movies
+
+
+ - TV Shows
+ - TV Show
+ - TV Shows
+
+
+ - People
+ - Person
+ - People
+
+
preference.update.threshold
preference.update.lastTimestamp