Skip to content

Commit

Permalink
Merge pull request #5686 from aneesh1122/Artist-page-changes
Browse files Browse the repository at this point in the history
adding buttons inside the artist songs list and fixing the playAtIndex
  • Loading branch information
fast4x authored Feb 14, 2025
2 parents 3c1603e + f8ff5f6 commit 0284089
Show file tree
Hide file tree
Showing 5 changed files with 753 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2073,3 +2073,247 @@ fun AddToPlaylistItemMenu(
}
}
}

@ExperimentalTextApi
@SuppressLint("SuspiciousIndentation")
@UnstableApi
@ExperimentalAnimationApi
@Composable
fun AddToPlaylistArtistSongsMenu(
navController: NavController,
onDismiss: () -> Unit,
onAddToPlaylist: ((PlaylistPreview) -> Unit),
onGoToPlaylist: ((Long) -> Unit)? = null,
) {
var isCreatingNewPlaylist by rememberSaveable {
mutableStateOf(false)
}
val context = LocalContext.current
val configuration = LocalConfiguration.current

val screenHeight = configuration.screenHeightDp.dp

if (isCreatingNewPlaylist) {
InputTextDialog(
onDismiss = { isCreatingNewPlaylist = false },
title = stringResource(R.string.enter_the_playlist_name),
value = "",
placeholder = stringResource(R.string.enter_the_playlist_name),
setValue = { text ->
onDismiss()
Database.asyncTransaction {
val playlistId = insert(Playlist(name = text))
onAddToPlaylist(
PlaylistPreview(
Playlist(
id = playlistId,
name = text
), 0
)
)
}
}
)
}
val sortBy by rememberPreference(playlistSortByKey, PlaylistSortBy.DateAdded)
val sortOrder by rememberPreference(playlistSortOrderKey, SortOrder.Descending)
val playlistPreviews by remember {
Database.playlistPreviews(sortBy, sortOrder)
}.collectAsState(initial = emptyList(), context = Dispatchers.IO)

val pinnedPlaylists = playlistPreviews.filter {
it.playlist.name.startsWith(PINNED_PREFIX, 0, true)
&& if (isNetworkConnected(context)) !(it.playlist.isYoutubePlaylist && !it.playlist.isEditable) else !it.playlist.isYoutubePlaylist
}

val youtubePlaylists = playlistPreviews.filter { it.playlist.isEditable && it.playlist.isYoutubePlaylist && !it.playlist.name.startsWith(PINNED_PREFIX) }

val unpinnedPlaylists = playlistPreviews.filter {
!it.playlist.name.startsWith(PINNED_PREFIX, 0, true) &&
!it.playlist.name.startsWith(MONTHLY_PREFIX, 0, true) &&
!it.playlist.isYoutubePlaylist
}

Menu(
modifier = Modifier
.requiredHeight(0.75*screenHeight)
) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.padding(horizontal = 16.dp, vertical = 8.dp)
.fillMaxWidth()
) {
IconButton(
onClick = onDismiss,
icon = R.drawable.chevron_back,
color = colorPalette().textSecondary,
modifier = Modifier
.padding(all = 4.dp)
.size(20.dp)
)

SecondaryTextButton(
text = stringResource(R.string.new_playlist),
onClick = { isCreatingNewPlaylist = true },
alternative = true
)
}

if (pinnedPlaylists.isNotEmpty()) {
BasicText(
text = stringResource(R.string.pinned_playlists),
style = typography().m.semiBold,
modifier = Modifier.padding(start = 20.dp, top = 5.dp)
)

onAddToPlaylist.let { onAddToPlaylist ->
pinnedPlaylists.forEach { playlistPreview ->
MenuEntry(
icon = R.drawable.add_in_playlist,
text = cleanPrefix(playlistPreview.playlist.name),
secondaryText = "${playlistPreview.songCount} " + stringResource(R.string.songs),
onClick = {
onDismiss()
onAddToPlaylist(
PlaylistPreview(
playlistPreview.playlist,
playlistPreview.songCount
)
)
},
trailingContent = {
if (playlistPreview.playlist.name.startsWith(PIPED_PREFIX, 0, true))
Image(
painter = painterResource(R.drawable.piped_logo),
contentDescription = null,
colorFilter = ColorFilter.tint(colorPalette().red),
modifier = Modifier
.size(18.dp)
)
if (playlistPreview.playlist.isYoutubePlaylist) {
Image(
painter = painterResource(R.drawable.ytmusic),
contentDescription = null,
colorFilter = ColorFilter.tint(
Color.Red.copy(0.75f).compositeOver(Color.White)
),
modifier = Modifier
.size(18.dp)
)
}
IconButton(
icon = R.drawable.open,
color = colorPalette().text,
onClick = {
if (onGoToPlaylist != null) {
onGoToPlaylist(playlistPreview.playlist.id)
onDismiss()
}
navController.navigate(route = "${NavRoutes.localPlaylist.name}/${playlistPreview.playlist.id}")
},
modifier = Modifier
.size(24.dp)
)
}
)
}
}
}

if (youtubePlaylists.isNotEmpty() && isNetworkConnected(context)) {
BasicText(
text = stringResource(R.string.ytm_playlists),
style = typography().m.semiBold,
modifier = Modifier.padding(start = 20.dp, top = 5.dp)
)

onAddToPlaylist.let { onAddToPlaylist ->
youtubePlaylists.forEach { playlistPreview ->
MenuEntry(
icon = R.drawable.add_in_playlist,
text = cleanPrefix(playlistPreview.playlist.name),
secondaryText = "${playlistPreview.songCount} " + stringResource(R.string.songs),
onClick = {
onDismiss()
onAddToPlaylist(
PlaylistPreview(
playlistPreview.playlist,
playlistPreview.songCount
)
)
},
trailingContent = {
IconButton(
icon = R.drawable.open,
color = colorPalette().text,
onClick = {
if (onGoToPlaylist != null) {
onGoToPlaylist(playlistPreview.playlist.id)
onDismiss()
}
navController.navigate(route = "${NavRoutes.localPlaylist.name}/${playlistPreview.playlist.id}")
},
modifier = Modifier
.size(24.dp)
)
}
)
}
}
}

if (unpinnedPlaylists.isNotEmpty()) {
BasicText(
text = stringResource(R.string.playlists),
style = typography().m.semiBold,
modifier = Modifier.padding(start = 20.dp, top = 5.dp)
)

onAddToPlaylist.let { onAddToPlaylist ->
unpinnedPlaylists.forEach { playlistPreview ->
MenuEntry(
icon = R.drawable.add_in_playlist,
text = cleanPrefix(playlistPreview.playlist.name),
secondaryText = "${playlistPreview.songCount} " + stringResource(R.string.songs),
onClick = {
onDismiss()
onAddToPlaylist(
PlaylistPreview(
playlistPreview.playlist,
playlistPreview.songCount
)
)
},
trailingContent = {
if (playlistPreview.playlist.name.startsWith(PIPED_PREFIX, 0, true))
Image(
painter = painterResource(R.drawable.piped_logo),
contentDescription = null,
colorFilter = ColorFilter.tint(colorPalette().red),
modifier = Modifier
.size(18.dp)
)

IconButton(
icon = R.drawable.open,
color = colorPalette().text,
onClick = {
if (onGoToPlaylist != null) {
onGoToPlaylist(playlistPreview.playlist.id)
onDismiss()
}
navController.navigate(route = "${NavRoutes.localPlaylist.name}/${playlistPreview.playlist.id}")
},
modifier = Modifier
.size(24.dp)
)

}
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
Expand All @@ -31,6 +32,7 @@ import it.fast4x.rimusic.ui.screens.settings.isYouTubeSyncEnabled
import it.fast4x.rimusic.utils.addSongToYtPlaylist
import it.fast4x.rimusic.utils.addToPipedPlaylist
import it.fast4x.rimusic.utils.addToYtLikedSong
import it.fast4x.rimusic.utils.addToYtPlaylist
import it.fast4x.rimusic.utils.asMediaItem
import it.fast4x.rimusic.utils.forcePlay
import it.fast4x.rimusic.utils.getPipedSession
Expand Down Expand Up @@ -324,4 +326,63 @@ fun AddToPlaylistPlayerMenu(
},
onDismiss = onDismiss,
)
}

@ExperimentalTextApi
@ExperimentalAnimationApi
@UnstableApi
@Composable
fun AddToPlaylistArtistSongs(
navController: NavController,
mediaItems: List<MediaItem>,
onDismiss: () -> Unit,
onClosePlayer: () -> Unit,
) {
val isPipedEnabled by rememberPreference(isPipedEnabledKey, false)
val pipedSession = getPipedSession()
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()
var position by remember {
mutableIntStateOf(0)
}
AddToPlaylistArtistSongsMenu(
navController = navController,
onGoToPlaylist = {
onClosePlayer()
},
onAddToPlaylist = { playlistPreview ->
position = playlistPreview.songCount.minus(1)
if (position > 0) position++ else position = 0
mediaItems.forEachIndexed { index, mediaItem ->
if (!isYouTubeSyncEnabled() || !playlistPreview.playlist.isYoutubePlaylist){
Database.asyncTransaction {
insert(mediaItem)
insert(
SongPlaylistMap(
songId = mediaItem.mediaId,
playlistId = playlistPreview.playlist.id,
position = position + index
).default()
)
}
} else {
CoroutineScope(Dispatchers.IO).launch {
addToYtPlaylist(playlistPreview.playlist.id, position, playlistPreview.playlist.browseId ?: "", mediaItems)
}
}
if (playlistPreview.playlist.name.startsWith(PIPED_PREFIX) && isPipedEnabled && pipedSession.token.isNotEmpty()) {
Timber.d("BaseMediaItemMenu onAddToPlaylist mediaItem ${mediaItem.mediaId}")
addToPipedPlaylist(
context = context,
coroutineScope = coroutineScope,
pipedSession = pipedSession.toApiSession(),
id = UUID.fromString(playlistPreview.playlist.browseId),
videos = listOf(mediaItem.mediaId)
)
}
}
onDismiss()
},
onDismiss = onDismiss,
)
}
Loading

0 comments on commit 0284089

Please sign in to comment.