diff --git a/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt b/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt index e8f046fa..48cc9fff 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/MainActivity.kt @@ -325,8 +325,8 @@ class MainActivity : AppCompatActivity() { // ?: Destination.Home(), // TODO undo ?: Destination.MediaItem( - itemId = "011ef0c7-ca45-684f-2cd9-dd3b020ca5f6".toUUID(), - type = BaseItemKind.MUSIC_ALBUM, + itemId = "bbc3e562-6045-5521-dfda-7effa56e14f2".toUUID(), + type = BaseItemKind.MUSIC_ARTIST, ), navigationManager = navigationManager, preferences = preferences, 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 451a8f18..e17e6bbf 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 @@ -208,9 +208,10 @@ data class MusicServiceState( val currentIndex: Int, val currentItemId: UUID?, val isPlaying: Boolean, + val currentItemTitle: String?, ) { companion object { - val EMPTY = MusicServiceState(0, 0, null, false) + val EMPTY = MusicServiceState(0, 0, null, false, null) } } @@ -263,9 +264,12 @@ private class MusicPlayerListener( state.update { state -> player.currentMediaItemIndex.takeIf { it >= 0 }?.let { currentMediaItemIndex -> if (currentMediaItemIndex in (0.. Timber.v("MusicService updated") - if (it.isPlaying) { + if (music.isPlaying) { _state.update { - it.copy(nowPlayingEnabled = true) + it.copy( + nowPlayingEnabled = true, + nowPlayingTitle = music.currentItemTitle, + ) } } else { // Don't immediately remove the now playing // TODO need better now playing state to distinguish between paused & stopped delay(30_000) _state.update { - it.copy(nowPlayingEnabled = false) + it.copy( + nowPlayingEnabled = false, + nowPlayingTitle = null, + ) } } } @@ -203,9 +209,10 @@ data class NavDrawerItemState( val moreItems: List, val discoverEnabled: Boolean, val nowPlayingEnabled: Boolean, + val nowPlayingTitle: String?, ) { companion object { - val EMPTY = NavDrawerItemState(emptyList(), emptyList(), false, false) + val EMPTY = NavDrawerItemState(emptyList(), emptyList(), false, false, null) } } 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 9aca6b58..fce887b8 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 @@ -75,6 +75,7 @@ import kotlinx.coroutines.launch import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.extensions.itemsApi import org.jellyfin.sdk.api.client.extensions.userLibraryApi +import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.ImageType import org.jellyfin.sdk.model.api.ItemSortBy import org.jellyfin.sdk.model.api.request.GetItemsRequest @@ -122,6 +123,7 @@ class AlbumViewModel val request = GetItemsRequest( parentId = itemId, + includeItemTypes = listOf(BaseItemKind.AUDIO), fields = DefaultItemFields, sortBy = listOf( @@ -196,11 +198,7 @@ class AlbumViewModel viewModelScope.launchIO { val songs = state.value.songs as ApiRequestPager<*> if (itemId == this@AlbumViewModel.itemId) { - songs.indices.forEach { - songs.getBlocking(it)?.let { - musicService.addToQueue(it) - } - } + musicService.addAllToQueue(songs, 0) } else { songs.getBlocking(index)?.let { musicService.addToQueue(it) diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt index c2641474..eda7ad2c 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/nav/NavDrawer.kt @@ -2,9 +2,12 @@ package com.github.damontecres.wholphin.ui.nav import android.content.Context import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.VisibilityThreshold import androidx.compose.animation.core.animateIntOffsetAsState import androidx.compose.animation.core.spring +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.focusGroup import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsFocusedAsState @@ -337,6 +340,31 @@ fun NavDrawer( }, modifier = Modifier, ) + AnimatedVisibility( + visible = state.nowPlayingEnabled, + enter = expandVertically(expandFrom = Alignment.Top), + exit = shrinkVertically(shrinkTowards = Alignment.Top), + ) { + val interactionSource = remember { MutableInteractionSource() } + IconNavItem( + text = stringResource(R.string.now_playing), + subtext = state.nowPlayingTitle, + icon = Icons.Default.PlayArrow, + selected = selectedIndex == NOW_PLAYING_INDEX, + drawerOpen = isOpen, + interactionSource = interactionSource, + onClick = { + viewModel.setIndex(NOW_PLAYING_INDEX) + viewModel.navigationManager.navigateToFromDrawer(Destination.NowPlaying) + }, + modifier = + Modifier + .ifElse( + selectedIndex == NOW_PLAYING_INDEX, + Modifier.focusRequester(focusRequester), + ), + ) + } LazyColumn( state = navDrawerListState, contentPadding = PaddingValues(0.dp), @@ -376,28 +404,6 @@ fun NavDrawer( ), ) } - if (state.nowPlayingEnabled) { - item { - val interactionSource = remember { MutableInteractionSource() } - IconNavItem( - text = stringResource(R.string.now_playing), - icon = Icons.Default.PlayArrow, - selected = selectedIndex == NOW_PLAYING_INDEX, - drawerOpen = isOpen, - interactionSource = interactionSource, - onClick = { - viewModel.setIndex(NOW_PLAYING_INDEX) - viewModel.navigationManager.navigateToFromDrawer(Destination.NowPlaying) - }, - modifier = - Modifier - .ifElse( - selectedIndex == NOW_PLAYING_INDEX, - Modifier.focusRequester(focusRequester), - ).animateItem(), - ) - } - } item { val interactionSource = remember { MutableInteractionSource() } IconNavItem(