From 9f16a8df0899fd7b665264f21b51996662342995 Mon Sep 17 00:00:00 2001 From: Nathan Martinez Date: Tue, 6 Oct 2026 17:11:04 -0600 Subject: [PATCH] fix(tv): add playlist deletion confirmation --- .../music/ui/elements/dialogs/tv/Dialogs.kt | 15 ++--- .../ui/elements/dialogs/tv/PlaylistDialogs.kt | 60 +++++++++++++++++++ .../music/ui/screens/tv/TvPlaylistScreen.kt | 24 +++++++- 3 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/PlaylistDialogs.kt diff --git a/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/Dialogs.kt b/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/Dialogs.kt index 3be63c3c..9edfb3fa 100644 --- a/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/Dialogs.kt +++ b/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/Dialogs.kt @@ -55,7 +55,7 @@ fun GenericListDialog( Text( text = stringResource(titleRes), color = MaterialTheme.colorScheme.onSurface, - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge ) }, text = { @@ -78,10 +78,10 @@ fun GenericListDialog( state = lazyColumnState, modifier = Modifier .verticalFadingEdges( - FadingEdgesContentType.Dynamic.Lazy.List( - FadingEdgesScrollConfig.Dynamic(), lazyColumnState - ), FadingEdgesGravity.All, 64.dp - ), + FadingEdgesContentType.Dynamic.Lazy.List( + FadingEdgesScrollConfig.Dynamic(), lazyColumnState + ), FadingEdgesGravity.All, 64.dp + ), verticalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(8.dp) ) { @@ -132,7 +132,7 @@ fun GenericCheckDialog( Text( text = stringResource(titleRes), color = MaterialTheme.colorScheme.onSurface, - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge ) }, text = { @@ -181,4 +181,5 @@ fun GenericCheckDialog( } } ) -} \ No newline at end of file +} + diff --git a/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/PlaylistDialogs.kt b/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/PlaylistDialogs.kt new file mode 100644 index 00000000..cd545b70 --- /dev/null +++ b/app/src/main/java/com/craftworks/music/ui/elements/dialogs/tv/PlaylistDialogs.kt @@ -0,0 +1,60 @@ +package com.craftworks.music.ui.elements.dialogs.tv + +import androidx.compose.foundation.focusable +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.AlertDialog +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.tv.material3.Button +import androidx.tv.material3.MaterialTheme +import androidx.tv.material3.OutlinedButton +import androidx.tv.material3.Text +import com.craftworks.music.R +import com.craftworks.music.ui.elements.dialogs.playlistToDelete +import com.craftworks.music.ui.viewmodels.PlaylistScreenViewModel + + +@Composable +fun PlaylistDeletionConfirmationDialog( + setShowDialog: (Boolean) -> Unit, + viewModel: PlaylistScreenViewModel = hiltViewModel() +) { + AlertDialog( + onDismissRequest = { setShowDialog(false) }, + containerColor = MaterialTheme.colorScheme.surface, + title = { + Box( + modifier = Modifier.focusable() + ) { + Text( + text = stringResource(R.string.delete_playlist_are_you_sure), + color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.titleLarge + ) + } + }, + confirmButton = { + Button( + onClick = { + viewModel.deletePlaylist(playlistToDelete.value) + setShowDialog(false) + } + ) { + Text( + stringResource(R.string.playlist_delete_playlist) + ) + } + }, + dismissButton = { + OutlinedButton(onClick = { + setShowDialog(false) + }) { + Text( + stringResource(R.string.action_close) + ) + } + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/craftworks/music/ui/screens/tv/TvPlaylistScreen.kt b/app/src/main/java/com/craftworks/music/ui/screens/tv/TvPlaylistScreen.kt index 639beddd..0aa51b37 100644 --- a/app/src/main/java/com/craftworks/music/ui/screens/tv/TvPlaylistScreen.kt +++ b/app/src/main/java/com/craftworks/music/ui/screens/tv/TvPlaylistScreen.kt @@ -28,6 +28,9 @@ import androidx.navigation.compose.rememberNavController import com.craftworks.music.R import com.craftworks.music.data.model.Screen import com.craftworks.music.data.model.id +import com.craftworks.music.ui.elements.dialogs.playlistToDelete +import com.craftworks.music.ui.elements.dialogs.showDeletePlaylistDialog +import com.craftworks.music.ui.elements.dialogs.tv.PlaylistDeletionConfirmationDialog import com.craftworks.music.ui.elements.tv.TvPlaylistCard import com.craftworks.music.ui.viewmodels.PlaylistScreenViewModel @@ -65,17 +68,32 @@ fun TvPlaylistScreen( verticalArrangement = Arrangement.spacedBy(24.dp), ) { items(playlists) { playlist -> - TvPlaylistCard ( + TvPlaylistCard( playlist = playlist, onClick = { - navHostController.navigate(Screen.PlaylistDetails(playlist.mediaMetadata.id?:"", playlist.mediaMetadata.artworkUri.toString())) { + navHostController.navigate( + Screen.PlaylistDetails( + playlist.mediaMetadata.id ?: "", + playlist.mediaMetadata.artworkUri.toString() + ) + ) { launchSingleTop = true } }, onLongClick = { - playlist.mediaMetadata.id?.let { viewModel.deletePlaylist(it) } + playlist.mediaMetadata.id?.let { + playlistToDelete.value = it + showDeletePlaylistDialog.value = true + } } ) } } + + if (showDeletePlaylistDialog.value) + PlaylistDeletionConfirmationDialog( + setShowDialog = { showDeletePlaylistDialog.value = it }, + viewModel + ) + }