diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/CircularProgress.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/CircularProgress.kt index c519500d..b62c24c7 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/CircularProgress.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/CircularProgress.kt @@ -21,7 +21,10 @@ fun CircularProgress(modifier: Modifier = Modifier) { Box(modifier = modifier) { CircularProgressIndicator( color = MaterialTheme.colorScheme.border, - modifier = Modifier.align(Alignment.Center), + modifier = + Modifier + .fillMaxSize() + .align(Alignment.Center), ) } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/CollectionFolderGrid.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/CollectionFolderGrid.kt index c916fd59..fa52ff18 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/CollectionFolderGrid.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/CollectionFolderGrid.kt @@ -571,7 +571,7 @@ fun CollectionFolderGrid( backgroundLoading == LoadingState.Loading, modifier = Modifier - .align(Alignment.BottomEnd) + .align(Alignment.Center) .padding(16.dp), ) { CircularProgress( diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/FilterByButton.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/FilterByButton.kt index 662706ed..b6dd6474 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/FilterByButton.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/FilterByButton.kt @@ -78,31 +78,7 @@ fun FilterByButton( nestedDropDown = null }, ) { - filterOptions - .forEach { filterOption -> - val currentValue = remember(current) { filterOption.get(current) } - TvDropdownMenuItem( - leadingIcon = { - if (currentValue != null) { - Icon( - imageVector = Icons.Default.Check, - contentDescription = "Filter active", - ) - } - }, - text = { - Text( - text = stringResource(filterOption.stringRes), - ) - }, - onClick = { - nestedDropDown = filterOption - }, - modifier = Modifier, - ) - } if (filterCount > 0) { - HorizontalDivider() val interactionSource = remember { MutableInteractionSource() } val focused by interactionSource.collectIsFocusedAsState() TvDropdownMenuItem( @@ -126,7 +102,35 @@ fun FilterByButton( interactionSource = interactionSource, modifier = Modifier, ) + HorizontalDivider() } + filterOptions + .forEachIndexed { index, filterOption -> + val focusRequester = remember { FocusRequester() } + if (index == 0) { + LaunchedEffect(Unit) { focusRequester.tryRequestFocus() } + } + val currentValue = remember(current) { filterOption.get(current) } + TvDropdownMenuItem( + leadingIcon = { + if (currentValue != null) { + Icon( + imageVector = Icons.Default.Check, + contentDescription = "Filter active", + ) + } + }, + text = { + Text( + text = stringResource(filterOption.stringRes), + ) + }, + onClick = { + nestedDropDown = filterOption + }, + modifier = Modifier.focusRequester(focusRequester), + ) + } } DropdownMenu( diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/ControllerViewState.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/ControllerViewState.kt index 9053cdd5..aabc2063 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/ControllerViewState.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/ControllerViewState.kt @@ -17,7 +17,7 @@ import kotlinx.coroutines.flow.debounce */ class ControllerViewState internal constructor( @param:IntRange(from = 0) - private val hideMilliseconds: Long, + var hideMilliseconds: Long, val controlsEnabled: Boolean, ) { private val channel = Channel(CONFLATED) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt index b2d192b2..1600cc9f 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackPage.kt @@ -167,17 +167,8 @@ fun PlaybackPage( LaunchedEffect(Unit) { focusRequester.tryRequestFocus() } - val controllerViewState = - remember { - ControllerViewState( - preferences.appPreferences.playbackPreferences.controllerTimeoutMs, - true, - ) - }.also { - LaunchedEffect(it) { - it.observe() - } - } + val controllerViewState = remember { viewModel.controllerViewState } + var skipIndicatorDuration by remember { mutableLongStateOf(0L) } LaunchedEffect(controllerViewState.controlsVisible) { // If controller shows/hides, immediately cancel the skip indicator diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt index 6c9e93ca..aca91ee1 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt @@ -128,6 +128,12 @@ class PlaybackViewModel } internal val mutex = Mutex() + val controllerViewState = + ControllerViewState( + AppPreference.ControllerTimeout.defaultValue, + true, + ) + val loading = MutableLiveData(LoadingState.Loading) val currentMediaInfo = MutableLiveData(CurrentMediaInfo.EMPTY) @@ -153,6 +159,7 @@ class PlaybackViewModel val subtitleSearchLanguage = MutableLiveData(Locale.current.language) init { + viewModelScope.launch(ExceptionHandler()) { controllerViewState.observe() } player.addListener(this) (player as? ExoPlayer)?.addAnalyticsListener(this) addCloseable { player.removeListener(this@PlaybackViewModel) } @@ -178,6 +185,8 @@ class PlaybackViewModel ) { nextUp.value = null this.preferences = preferences + controllerViewState.hideMilliseconds = + preferences.appPreferences.playbackPreferences.controllerTimeoutMs this.deviceProfile = deviceProfile this.forceTranscoding = (destination as? Destination.Playback)?.forceTranscoding ?: false @@ -696,6 +705,9 @@ class PlaybackViewModel Timber.v("Setting next up to ${nextItem?.id}") withContext(Dispatchers.Main) { nextUp.value = nextItem + if (nextItem == null) { + controllerViewState.showControls() + } } } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/InstallUpdatePage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/InstallUpdatePage.kt index 4c608779..4b5de09d 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/setup/InstallUpdatePage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/setup/InstallUpdatePage.kt @@ -360,15 +360,19 @@ fun DownloadDialog( if (progress != null) { CircularProgressIndicator( progress = { progress }, - Modifier - .size(48.dp) - .padding(8.dp), + color = MaterialTheme.colorScheme.border, + modifier = + Modifier + .size(48.dp) + .padding(8.dp), ) } else { CircularProgressIndicator( - Modifier - .size(48.dp) - .padding(8.dp), + color = MaterialTheme.colorScheme.border, + modifier = + Modifier + .size(48.dp) + .padding(8.dp), ) } }