Skip to content

Commit

Permalink
feat(online playlist): multi-select
Browse files Browse the repository at this point in the history
  • Loading branch information
z-huang committed Aug 27, 2024
1 parent 4ef6df2 commit e6e8e4a
Show file tree
Hide file tree
Showing 5 changed files with 247 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.zionhuang.music.ui.menu

import android.annotation.SuppressLint
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
Expand Down Expand Up @@ -37,7 +36,6 @@ import com.zionhuang.music.ui.component.GridMenu
import com.zionhuang.music.ui.component.GridMenuItem
import java.time.LocalDateTime

@SuppressLint("MutableCollectionMutableState")
@Composable
fun SongSelectionMenu(
selection: List<Song>,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package com.zionhuang.music.ui.menu

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.systemBars
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.unit.dp
import com.zionhuang.innertube.models.SongItem
import com.zionhuang.music.LocalDatabase
import com.zionhuang.music.LocalPlayerConnection
import com.zionhuang.music.R
import com.zionhuang.music.extensions.toMediaItem
import com.zionhuang.music.models.toMediaMetadata
import com.zionhuang.music.playback.queues.ListQueue
import com.zionhuang.music.ui.component.GridMenu
import com.zionhuang.music.ui.component.GridMenuItem

@Composable
fun YouTubeSongSelectionMenu(
selection: List<SongItem>,
onDismiss: () -> Unit,
onExitSelectionMode: () -> Unit,
) {
val database = LocalDatabase.current
val playerConnection = LocalPlayerConnection.current ?: return

var showChoosePlaylistDialog by rememberSaveable {
mutableStateOf(false)
}

AddToPlaylistDialog(
isVisible = showChoosePlaylistDialog,
onGetSong = {
val mediaMetadatas = selection.map {
it.toMediaMetadata()
}
database.transaction {
mediaMetadatas.forEach(::insert)
}
selection.map { it.id }
},
onDismiss = { showChoosePlaylistDialog = false },
)

GridMenu(
contentPadding =
PaddingValues(
start = 8.dp,
top = 8.dp,
end = 8.dp,
bottom = 8.dp + WindowInsets.systemBars.asPaddingValues().calculateBottomPadding(),
),
) {
GridMenuItem(
icon = R.drawable.play,
title = R.string.play,
) {
onDismiss()
playerConnection.playQueue(
ListQueue(
items = selection.map { it.toMediaItem() },
),
)
onExitSelectionMode()
}

GridMenuItem(
icon = R.drawable.shuffle,
title = R.string.shuffle,
) {
onDismiss()
playerConnection.playQueue(
ListQueue(
items = selection.shuffled().map { it.toMediaItem() },
),
)
onExitSelectionMode()
}

GridMenuItem(
icon = R.drawable.queue_music,
title = R.string.add_to_queue,
) {
onDismiss()
playerConnection.addToQueue(selection.map { it.toMediaItem() })
onExitSelectionMode()
}

GridMenuItem(
icon = R.drawable.playlist_add,
title = R.string.add_to_playlist,
) {
showChoosePlaylistDialog = true
}
}
}
4 changes: 4 additions & 0 deletions app/src/main/java/com/zionhuang/music/ui/player/Queue.kt
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
Expand Down Expand Up @@ -115,6 +117,7 @@ fun Queue(
navController: NavController,
modifier: Modifier = Modifier,
) {
val haptic = LocalHapticFeedback.current
val menuState = LocalMenuState.current

val playerConnection = LocalPlayerConnection.current ?: return
Expand Down Expand Up @@ -408,6 +411,7 @@ fun Queue(
},
onLongClick = {
if (!inSelectMode) {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
inSelectMode = true
onCheckedChange(true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,10 @@ import androidx.compose.runtime.toMutableStateList
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
Expand Down Expand Up @@ -130,10 +132,12 @@ fun LocalPlaylistScreen(
scrollBehavior: TopAppBarScrollBehavior,
viewModel: LocalPlaylistViewModel = hiltViewModel(),
) {
val haptic = LocalHapticFeedback.current
val context = LocalContext.current
val menuState = LocalMenuState.current
val database = LocalDatabase.current
val playerConnection = LocalPlayerConnection.current ?: return

val isPlaying by playerConnection.isPlaying.collectAsState()
val mediaMetadata by playerConnection.mediaMetadata.collectAsState()

Expand Down Expand Up @@ -441,6 +445,7 @@ fun LocalPlaylistScreen(
},
onLongClick = {
if (!inSelectMode) {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
inSelectMode = true
onCheckedChange(true)
}
Expand Down
Loading

0 comments on commit e6e8e4a

Please sign in to comment.