some small ui fixes

This commit is contained in:
Owen LeJeune
2023-07-14 00:25:52 -04:00
parent 69f6911b72
commit 862dfb2341
11 changed files with 61 additions and 32 deletions

View File

@@ -10,6 +10,9 @@ class DetailPerson(
@SerializedName("biography") val biography: String,
@SerializedName("place_of_birth") val birthplace: String?,
@SerializedName("adult") val isAdult: Boolean,
@SerializedName("also_known_as") val alsoKnownAs: List<String>,
@SerializedName("homepage") val homepage: String?,
@SerializedName("popularity") val popularity: Float,
id: Int,
name: String,
gender: Gender,

View File

@@ -35,11 +35,11 @@ fun StoreRouteButton() {
modifier = Modifier
.combinedClickable(
onClick = {
applicationViewModel.storedRoute.value = applicationViewModel.currentRoute.value
applicationViewModel.setStoredRoute(applicationViewModel.currentRoute.value)
Toast.makeText(context, "Stored route \"${applicationViewModel.storedRoute.value}\"", Toast.LENGTH_SHORT).show()
},
onLongClick = {
applicationViewModel.storedRoute.value = ""
applicationViewModel.setStoredRoute("")
Toast.makeText(context, "Stored route \"\"", Toast.LENGTH_SHORT).show()
}
)

View File

@@ -104,7 +104,7 @@ fun CastCrewListScreen(
MediaResultCard(
appNavController = appNavController,
mediaViewType = type,
mediaViewType = MediaViewType.PERSON,
id = item.id,
backdropPath = null,
posterPath = TmdbUtils.getFullPosterPath(item.profilePath),

View File

@@ -95,7 +95,8 @@ private fun PersonGalleryView(
width = 120.dp,
url = TmdbUtils.getFullPersonImagePath(image.filePath),
placeholder = Icons.Filled.Person,
title = ""
title = "",
modifier = Modifier.padding(5.dp)
)
}
}

View File

@@ -13,6 +13,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -29,6 +30,7 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.MovieCast
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.TvCast
import com.owenlejeune.tvtime.extensions.bringToFront
import com.owenlejeune.tvtime.extensions.getCalendarYear
import com.owenlejeune.tvtime.extensions.unlessEmpty
import com.owenlejeune.tvtime.ui.components.BackButton
import com.owenlejeune.tvtime.ui.components.MediaResultCard
import com.owenlejeune.tvtime.ui.components.PillSegmentedControl
@@ -36,6 +38,7 @@ import com.owenlejeune.tvtime.ui.components.TVTTopAppBar
import com.owenlejeune.tvtime.ui.viewmodel.ApplicationViewModel
import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel
import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.utils.types.MediaViewType
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -46,6 +49,10 @@ fun KnownForScreen(
val mainViewModel = viewModel<MainViewModel>()
val applicationViewModel = viewModel<ApplicationViewModel>()
LaunchedEffect(Unit) {
mainViewModel.getCastAndCrew(id, MediaViewType.PERSON)
}
applicationViewModel.statusBarColor.value = MaterialTheme.colorScheme.background
applicationViewModel.navigationBarColor.value = MaterialTheme.colorScheme.background
@@ -83,7 +90,7 @@ fun KnownForScreen(
) {
item {
Row(
modifier = Modifier.padding(start = 16.dp, top = 12.dp, bottom = 12.dp),
modifier = Modifier.padding(start = 16.dp, top = 12.dp, end = 12.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
val labels = listOf(stringResource(id = R.string.actor_label), stringResource(id = R.string.production_label))
@@ -98,12 +105,12 @@ fun KnownForScreen(
items(items) { item ->
val additionalDetails = emptyList<String>().toMutableList()
when (item) {
is MovieCast -> additionalDetails.add(stringResource(id = R.string.cast_character_template, item.character))
is TvCast -> additionalDetails.add(stringResource(id = R.string.cast_tv_character_template, item.character, item.episodeCount))
is MovieCast -> additionalDetails.add(stringResource(id = R.string.cast_character_template, item.character.unlessEmpty("-")))
is TvCast -> additionalDetails.add(stringResource(id = R.string.cast_tv_character_template, item.character.unlessEmpty("-"), item.episodeCount))
is DetailCrew -> additionalDetails.add(stringResource(id = R.string.crew_template, item.job))
}
val releaseYear = item.releaseDate?.getCalendarYear() ?: ""
val releaseYear = item.releaseDate?.getCalendarYear() ?: stringResource(id = R.string.tba)
MediaResultCard(
appNavController = appNavController,

View File

@@ -729,7 +729,7 @@ private fun CastCard(
}
Text(
text = "See all cast and crew",
text = stringResource(R.string.see_all_cast_and_crew),
fontSize = 12.sp,
color = MaterialTheme.colorScheme.inversePrimary,
modifier = Modifier

View File

@@ -56,20 +56,23 @@ import com.owenlejeune.tvtime.ui.viewmodel.ApplicationViewModel
import com.owenlejeune.tvtime.ui.viewmodel.MainViewModel
import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.utils.types.MediaViewType
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.lang.Integer.min
private const val TAG = "PeopleDetailScreen"
private suspend fun fetchData(
private fun fetchData(
mainViewModel: MainViewModel,
id: Int,
force: Boolean = false
) {
mainViewModel.getById(id, MediaViewType.PERSON, force)
mainViewModel.getExternalIds(id, MediaViewType.PERSON, force)
mainViewModel.getCastAndCrew(id, MediaViewType.PERSON, force)
mainViewModel.getImages(id, MediaViewType.PERSON, force)
val scope = CoroutineScope(Dispatchers.IO)
scope.launch { mainViewModel.getById(id, MediaViewType.PERSON, force) }
scope.launch { mainViewModel.getExternalIds(id, MediaViewType.PERSON, force) }
scope.launch { mainViewModel.getCastAndCrew(id, MediaViewType.PERSON, force) }
scope.launch { mainViewModel.getImages(id, MediaViewType.PERSON, force) }
}
@OptIn(ExperimentalMaterial3Api::class, ExperimentalPagerApi::class, ExperimentalMaterialApi::class)
@@ -78,8 +81,6 @@ fun PersonDetailScreen(
appNavController: NavController,
personId: Int
) {
val scope = rememberCoroutineScope()
val mainViewModel = viewModel<MainViewModel>()
LaunchedEffect(Unit) {
fetchData(mainViewModel, personId)
@@ -100,10 +101,8 @@ fun PersonDetailScreen(
val pullRefreshState = rememberPullRefreshState(
refreshing = isRefreshing.value,
onRefresh = {
scope.launch {
fetchData(mainViewModel, personId, true)
}
}
)
Scaffold(
@@ -191,6 +190,7 @@ private fun CreditsCard(
val creditsMap = remember { mainViewModel.peopleCastMap }
val credits = creditsMap[personId] ?: emptyList()
val sortedCredits = credits.sortedByDescending { it.popularity }
ContentCard(
title = stringResource(R.string.known_for_label)
@@ -205,8 +205,8 @@ private fun CreditsCard(
item {
Spacer(modifier = Modifier.width(8.dp))
}
items(min(credits.size, 15)) { i ->
val content = credits[i]
items(min(sortedCredits.size, 15)) { i ->
val content = sortedCredits[i]
TwoLineImageTextCard(
title = content.title,

View File

@@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
@@ -109,19 +110,21 @@ fun SeasonListScreen(
.verticalScroll(state = rememberScrollState())
) {
val seasonsMap = remember { mainViewModel.tvSeasons }
val seasons = seasonsMap[id] ?: emptyList()
val seasons = seasonsMap[id] ?: emptySet()
seasons.sortedBy { it.seasonNumber }.forEach { season ->
SeasonSection(season = season)
SeasonSection(season = season, singleSeason = isSingleSeason(seasons))
}
Spacer(modifier = Modifier.height(6.dp))
}
}
}
}
@Composable
private fun SeasonSection(season: Season) {
var isExpanded by remember { mutableStateOf(false) }
private fun SeasonSection(season: Season, singleSeason: Boolean) {
var isExpanded by remember { mutableStateOf(singleSeason) }
Row(
modifier = Modifier.padding(horizontal = 12.dp),
@@ -254,3 +257,7 @@ private fun EpisodeItem(episode: Episode) {
}
}
}
private fun isSingleSeason(seasons: Set<Season>): Boolean {
return seasons.size == 1 || (seasons.size == 2 && seasons.any { it.seasonNumber == 0 })
}

View File

@@ -1,5 +1,6 @@
package com.owenlejeune.tvtime.ui.screens
import android.annotation.SuppressLint
import android.app.Activity
import android.os.Build
import android.widget.Toast
@@ -43,6 +44,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -82,6 +84,7 @@ import com.owenlejeune.tvtime.ui.views.HomeTabRecyclerAdapter
import com.owenlejeune.tvtime.ui.views.ItemMoveCallback
import com.owenlejeune.tvtime.utils.SessionManager
import kotlinx.coroutines.launch
import org.koin.java.KoinJavaComponent.get
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -436,7 +439,7 @@ fun SpecialFeaturePreferences() {
}
@Composable
fun DevPreferences() {
fun DevPreferences(preferences: AppPreferences = get(AppPreferences::class.java)) {
if (BuildConfig.DEBUG) {
val settingsViewModel = viewModel<SettingsViewModel>()
@@ -525,6 +528,7 @@ fun DevPreferences() {
Column {
Text(text = "Current stored test route", fontSize = 18.sp)
Text(text = currentStoredRoute.value.unlessEmpty("---"))
Text(text = preferences.storedTestRoute.unlessEmpty("--"))
}
Spacer(modifier = Modifier.weight(1f))
IconButton(
@@ -542,6 +546,7 @@ fun DevPreferences() {
}
}
@SuppressLint("AutoboxingStateValueProperty")
@Composable
private fun WallpaperPicker(
showPopup: MutableState<Boolean>
@@ -551,7 +556,7 @@ private fun WallpaperPicker(
val settingsViewModel = viewModel<SettingsViewModel>()
val wallpaperColors = remember { mutableStateOf<List<Int>>(emptyList()) }
val selectedWallpaperColor = remember { mutableStateOf(0) }
val selectedWallpaperColor = remember { mutableIntStateOf(0) }
LaunchedEffect(true) {
val colors = MonetCompat.getInstance().getAvailableWallpaperColors() ?: emptyList()
if (colors.isEmpty()) {

View File

@@ -1,5 +1,6 @@
package com.owenlejeune.tvtime.ui.viewmodel
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.graphics.Color
import androidx.lifecycle.ViewModel
@@ -11,20 +12,22 @@ class ApplicationViewModel: ViewModel(), KoinComponent {
private val preferences: AppPreferences by inject()
private object Backer {
private object Backer: KoinComponent {
private val preferences: AppPreferences by inject()
val statusBarColor = mutableStateOf(Color.Transparent)
val navigationBarColor = mutableStateOf(Color.Transparent)
val currentRoute = mutableStateOf("")
val storedRoute = mutableStateOf("")
val storedRoute = mutableStateOf(preferences.storedTestRoute)
}
val statusBarColor = Backer.statusBarColor
val navigationBarColor = Backer.navigationBarColor
val currentRoute = Backer.currentRoute
val storedRoute = Backer.storedRoute
val storedRoute: State<String> = Backer.storedRoute
fun setStoredRoute(route: String) {
storedRoute.value = route
Backer.storedRoute.value = route
preferences.storedTestRoute = route
}

View File

@@ -252,5 +252,8 @@
<string name="no_lists_message">You don\'t have any lists yet</string>
<string name="list_count_label">%1$s (%2$d items)</string>
<string name="days_left">%1$d days</string>
<string name="next_in_the_mcu_title">Next in the MCU...</string>
<string name="next_in_the_mcu_title">Next in the MCU</string>
<string name="see_all_cast_and_crew">See all cast and crew</string>
<string name="unreleased">Unreleased</string>
<string name="tba">TBA</string>
</resources>