diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/common/components/FastScroller.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/common/components/FastScroller.kt index 0b2dcb328..a28dd2f60 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/common/components/FastScroller.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/common/components/FastScroller.kt @@ -297,6 +297,9 @@ fun DefaultPopup( @Composable fun NoPopup(index: Int) = Unit +/** Pass this to the getPopupText parameter in FastScroller when using [NoPopup]. */ +fun noPopupText(index: Int): String? = null + @Preview(showBackground = true) @Composable private fun FastScrollPreview() { diff --git a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/library/playlists/PlaylistList.kt b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/library/playlists/PlaylistList.kt index 73fcb64e5..d9b062b01 100644 --- a/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/library/playlists/PlaylistList.kt +++ b/android/app/src/main/java/com/simplecityapps/shuttle/ui/screens/library/playlists/PlaylistList.kt @@ -1,5 +1,6 @@ package com.simplecityapps.shuttle.ui.screens.library.playlists +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -7,6 +8,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -17,8 +19,13 @@ import com.simplecityapps.shuttle.R import com.simplecityapps.shuttle.model.Playlist import com.simplecityapps.shuttle.model.SmartPlaylist import com.simplecityapps.shuttle.ui.common.components.CircularLoadingState +import com.simplecityapps.shuttle.ui.common.components.FastScroller import com.simplecityapps.shuttle.ui.common.components.HorizontalLoadingView import com.simplecityapps.shuttle.ui.common.components.LoadingStatusIndicator +import com.simplecityapps.shuttle.ui.common.components.NoPopup +import com.simplecityapps.shuttle.ui.common.components.noPopupText +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList @Composable fun PlaylistList( @@ -65,49 +72,89 @@ fun PlaylistList( } PlaylistListUiState.LoadingState.Ready -> { - LazyColumn( - modifier = modifier.fillMaxWidth(), - contentPadding = PaddingValues(vertical = 8.dp), - ) { - if (uiState.smartPlaylists.isNotEmpty()) { - item { - Text( - text = stringResource(R.string.playlists_title_smart_playlists), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onBackground, - modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) - ) - } - items(uiState.smartPlaylists) { smartPlaylist -> - SmartPlaylistListItem( - smartPlaylist = smartPlaylist, - onSmartPlaylistClick = onSmartPlaylistClick, - ) - } + PlaylistList( + smartPlaylists = uiState.smartPlaylists.toImmutableList(), + playlists = uiState.playlists.toImmutableList(), + onSmartPlaylistClick = onSmartPlaylistClick, + onPlaylistClick = onPlaylistClick, + onPlay = onPlay, + onAddToQueue = onAddToQueue, + onPlayNext = onPlayNext, + onDelete = onDelete, + onClear = onClear, + onRename = onRename, + modifier = modifier, + ) + } + } +} + +@Composable +private fun PlaylistList( + smartPlaylists: ImmutableList, + playlists: ImmutableList, + onSmartPlaylistClick: (SmartPlaylist) -> Unit, + onPlaylistClick: (Playlist) -> Unit, + onPlay: (Playlist) -> Unit, + onAddToQueue: (Playlist) -> Unit, + onPlayNext: (Playlist) -> Unit, + onDelete: (Playlist) -> Unit, + onClear: (Playlist) -> Unit, + onRename: (Playlist) -> Unit, + modifier: Modifier = Modifier, +) { + val state = rememberLazyListState() + + Box(modifier = modifier.fillMaxSize()) { + LazyColumn( + modifier = Modifier.fillMaxWidth(), + contentPadding = PaddingValues(vertical = 8.dp), + state = state, + ) { + if (smartPlaylists.isNotEmpty()) { + item { + Text( + text = stringResource(R.string.playlists_title_smart_playlists), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) + ) + } + items(smartPlaylists) { smartPlaylist -> + SmartPlaylistListItem( + smartPlaylist = smartPlaylist, + onSmartPlaylistClick = onSmartPlaylistClick, + ) + } + } + if (playlists.isNotEmpty()) { + item { + Text( + text = stringResource(R.string.playlists_title_playlists), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) + ) } - if (uiState.playlists.isNotEmpty()) { - item { - Text( - text = stringResource(R.string.playlists_title_playlists), - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onBackground, - modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp, bottom = 8.dp) - ) - } - items(uiState.playlists) { playlist -> - PlaylistListItem( - playlist = playlist, - onPlaylistClick = onPlaylistClick, - onPlay = onPlay, - onAddToQueue = onAddToQueue, - onPlayNext = onPlayNext, - onDelete = onDelete, - onClear = onClear, - onRename = onRename, - ) - } + items(playlists) { playlist -> + PlaylistListItem( + playlist = playlist, + onPlaylistClick = onPlaylistClick, + onPlay = onPlay, + onAddToQueue = onAddToQueue, + onPlayNext = onPlayNext, + onDelete = onDelete, + onClear = onClear, + onRename = onRename, + ) } } } + FastScroller( + modifier = Modifier.fillMaxSize().padding(vertical = 8.dp), + state = state, + popup = ::NoPopup, + getPopupText = ::noPopupText, + ) } }