From 2879cd477c0e905e5508a4bce62292ac7c3feb4d Mon Sep 17 00:00:00 2001 From: Damontecres Date: Wed, 4 Mar 2026 16:03:40 -0500 Subject: [PATCH] Various fixes --- .../wholphin/services/MusicService.kt | 4 +-- .../ui/components/RecommendedContent.kt | 4 ++- .../ui/components/RecommendedMusic.kt | 33 ++++++++++++++----- .../ui/detail/CollectionFolderMusic.kt | 27 +++++++++++++-- .../ui/detail/music/AlbumDetailsPage.kt | 7 ++-- .../ui/detail/music/ArtistDetailsPage.kt | 5 ++- .../ui/detail/music/MusicExpandableButtons.kt | 14 +++++--- 7 files changed, 72 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt b/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt index 65043595..d8a43a7a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt @@ -149,15 +149,15 @@ class MusicService shuffled: Boolean, ) { Timber.d("setQueue: %s items, shuffled=%s", items.size, shuffled) - start() val mediaItems = items .filter { it.type == BaseItemKind.AUDIO } .map(::convert) withContext(Dispatchers.Main) { - updateQueueSize() player.setMediaItems(mediaItems) player.shuffleModeEnabled = shuffled + updateQueueSize() + start() } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedContent.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedContent.kt index 908574e3..3690e86a 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedContent.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedContent.kt @@ -19,6 +19,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.data.model.BaseItem +import com.github.damontecres.wholphin.data.model.HomeRowViewOptions import com.github.damontecres.wholphin.preferences.UserPreferences import com.github.damontecres.wholphin.services.BackdropService import com.github.damontecres.wholphin.services.FavoriteWatchManager @@ -105,13 +106,14 @@ abstract class RecommendedViewModel( fun update( @StringRes title: Int, + viewOptions: HomeRowViewOptions = HomeRowViewOptions(), block: suspend () -> List, ): Deferred = viewModelScope.async(Dispatchers.IO) { val titleStr = context.getString(title) val row = try { - HomeRowLoadingState.Success(titleStr, block.invoke()) + HomeRowLoadingState.Success(titleStr, block.invoke(), viewOptions) } catch (ex: Exception) { HomeRowLoadingState.Error(titleStr, null, ex) } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedMusic.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedMusic.kt index e24f9f1b..007e46e5 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedMusic.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/RecommendedMusic.kt @@ -9,6 +9,7 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.viewModelScope import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.data.ServerRepository +import com.github.damontecres.wholphin.data.model.HomeRowViewOptions import com.github.damontecres.wholphin.preferences.AppPreference import com.github.damontecres.wholphin.preferences.AppPreferences import com.github.damontecres.wholphin.preferences.UserPreferences @@ -18,6 +19,8 @@ import com.github.damontecres.wholphin.services.MediaReportService import com.github.damontecres.wholphin.services.NavigationManager import com.github.damontecres.wholphin.services.SuggestionService import com.github.damontecres.wholphin.services.SuggestionsResource +import com.github.damontecres.wholphin.ui.AspectRatio +import com.github.damontecres.wholphin.ui.Cards import com.github.damontecres.wholphin.ui.SlimItemFields import com.github.damontecres.wholphin.ui.data.RowColumn import com.github.damontecres.wholphin.ui.setValueOnMain @@ -31,6 +34,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.firstOrNull @@ -88,7 +92,15 @@ class RecommendedMusicViewModel ?.maxItemsPerRow ?: AppPreference.HomePageItems.defaultValue.toInt() - update(R.string.recently_released) { + val jobs = mutableListOf>() + val viewOptions = + HomeRowViewOptions( + aspectRatio = AspectRatio.SQUARE, + heightDp = Cards.HEIGHT_EPISODE, + showTitles = true, + ) + + update(R.string.recently_released, viewOptions) { val request = GetItemsRequest( parentId = parentId, @@ -103,9 +115,9 @@ class RecommendedMusicViewModel enableTotalRecordCount = false, ) GetItemsRequestHandler.execute(api, request).toBaseItems(api, false) - } + }.also(jobs::add) - update(R.string.recently_added) { + update(R.string.recently_added, viewOptions) { val request = GetItemsRequest( parentId = parentId, @@ -120,9 +132,9 @@ class RecommendedMusicViewModel enableTotalRecordCount = false, ) GetItemsRequestHandler.execute(api, request).toBaseItems(api, false) - } + }.also(jobs::add) - update(R.string.top_unwatched) { + update(R.string.top_unwatched, viewOptions) { val request = GetItemsRequest( parentId = parentId, @@ -138,7 +150,7 @@ class RecommendedMusicViewModel enableTotalRecordCount = false, ) GetItemsRequestHandler.execute(api, request).toBaseItems(api, false) - } + }.also(jobs::add) viewModelScope.launch(Dispatchers.IO) { try { @@ -181,8 +193,13 @@ class RecommendedMusicViewModel } } - if (loading.value == LoadingState.Loading || loading.value == LoadingState.Pending) { - loading.setValueOnMain(LoadingState.Success) + for (i in 0.. { GenreCardGrid( itemId = destination.itemId, - includeItemTypes = listOf(BaseItemKind.MUSIC_ALBUM, BaseItemKind.AUDIO), + includeItemTypes = listOf(BaseItemKind.MUSIC_ALBUM), modifier = Modifier .fillMaxSize() @@ -187,7 +210,7 @@ fun CollectionFolderMusic( CollectionFolderGrid( preferences = preferences, onClickItem = { _, item -> - preferencesViewModel.navigationManager.navigateTo(item.destination()) + viewModel.play(item) }, itemId = destination.itemId, viewModelKey = "${destination.itemId}_songs", diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/AlbumDetailsPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/AlbumDetailsPage.kt index 68d7151b..17a3a8ca 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/AlbumDetailsPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/AlbumDetailsPage.kt @@ -370,6 +370,9 @@ fun AlbumDetailsPage( ) }, favorite = album.favorite, + buttonOnFocusChanged = { + if (it.isFocused) scope.launch { bringIntoViewRequester.bringIntoView() } + }, modifier = Modifier .onFocusChanged { @@ -389,7 +392,7 @@ fun AlbumDetailsPage( itemsIndexed(state.songs) { index, song -> Box( modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center, + contentAlignment = Alignment.TopStart, ) { SongListItem( song = song, @@ -415,9 +418,7 @@ fun AlbumDetailsPage( isPlaying = song != null && currentMusic.currentItemId == song.id, modifier = Modifier -// .padding(horizontal = 16.dp) .fillMaxWidth(.75f) - .align(Alignment.Center) .ifElse( index == 0, Modifier diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/ArtistDetailsPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/ArtistDetailsPage.kt index b5cd0522..69f640ae 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/ArtistDetailsPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/ArtistDetailsPage.kt @@ -377,6 +377,9 @@ fun ArtistDetailsPage( ) }, favorite = artist.favorite, + buttonOnFocusChanged = { + if (it.isFocused) scope.launch { bringIntoViewRequester.bringIntoView() } + }, modifier = Modifier .onFocusChanged { @@ -415,7 +418,7 @@ fun ArtistDetailsPage( ) } }, - modifier = Modifier.padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth(.75f), showArtist = false, isPlaying = song != null && currentMusic.currentItemId == song.id, ) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicExpandableButtons.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicExpandableButtons.kt index c78b3dc4..78a5603b 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicExpandableButtons.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicExpandableButtons.kt @@ -11,8 +11,10 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.FocusState import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRestorer +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.github.damontecres.wholphin.R @@ -24,6 +26,7 @@ import kotlin.time.Duration fun MusicExpandableButtons( actions: MusicButtonActions, favorite: Boolean, + buttonOnFocusChanged: (FocusState) -> Unit, modifier: Modifier = Modifier, ) { val firstFocus = remember { FocusRequester() } @@ -43,7 +46,8 @@ fun MusicExpandableButtons( onClick = { actions.onClickPlay.invoke(false) }, modifier = Modifier - .focusRequester(firstFocus), + .focusRequester(firstFocus) + .onFocusChanged(buttonOnFocusChanged), ) } item("shuffle") { @@ -51,7 +55,7 @@ fun MusicExpandableButtons( title = R.string.shuffle, iconStringRes = R.string.fa_shuffle, onClick = { actions.onClickPlay.invoke(true) }, - modifier = Modifier, + modifier = Modifier.onFocusChanged(buttonOnFocusChanged), ) } item("instant_mix") { @@ -59,7 +63,7 @@ fun MusicExpandableButtons( title = R.string.instant_mix, iconStringRes = R.string.fa_compass, onClick = actions.onClickInstantMix, - modifier = Modifier, + modifier = Modifier.onFocusChanged(buttonOnFocusChanged), ) } item("favorite") { @@ -68,7 +72,7 @@ fun MusicExpandableButtons( iconStringRes = R.string.fa_heart, onClick = actions.onClickFavorite, iconColor = if (favorite) Color.Red else Color.Unspecified, - modifier = Modifier, + modifier = Modifier.onFocusChanged(buttonOnFocusChanged), ) } item("more") { @@ -77,7 +81,7 @@ fun MusicExpandableButtons( resume = Duration.ZERO, icon = Icons.Default.MoreVert, onClick = { actions.onClickMore.invoke() }, - modifier = Modifier, + modifier = Modifier.onFocusChanged(buttonOnFocusChanged), ) } }