Skip to content

Commit 8c366df

Browse files
committed
feat: add 'Add to Queue' functionality across multiple screens, fixed #333
1 parent cb33e0d commit 8c366df

10 files changed

Lines changed: 273 additions & 101 deletions

File tree

app/src/main/java/com/maxrave/simpmusic/ui/component/FullWidthItems.kt

Lines changed: 182 additions & 101 deletions
Large diffs are not rendered by default.

app/src/main/java/com/maxrave/simpmusic/ui/component/LibraryItem.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,18 @@ import com.maxrave.simpmusic.ui.navigation.destination.list.PlaylistDestination
7474
import com.maxrave.simpmusic.ui.navigation.destination.list.PodcastDestination
7575
import com.maxrave.simpmusic.ui.theme.typo
7676
import com.maxrave.simpmusic.viewModel.LibraryViewModel
77+
import com.maxrave.simpmusic.viewModel.SharedViewModel
7778
import kotlinx.coroutines.launch
7879
import org.koin.androidx.compose.koinViewModel
80+
import org.koin.compose.koinInject
7981

8082
@OptIn(ExperimentalMaterial3Api::class)
8183
@Composable
8284
@UnstableApi
8385
fun LibraryItem(
8486
state: LibraryItemState,
8587
viewModel: LibraryViewModel = koinViewModel(),
88+
sharedViewModel: SharedViewModel = koinInject(),
8689
navController: NavController,
8790
) {
8891
val context = LocalContext.current
@@ -209,6 +212,11 @@ fun LibraryItem(
209212
index = 0,
210213
)
211214
},
215+
onAddToQueue = { videoId ->
216+
sharedViewModel.addListToQueue(
217+
arrayListOf(item.toTrack()),
218+
)
219+
},
212220
)
213221
}
214222
RecentlyType.Type.ARTIST -> {

app/src/main/java/com/maxrave/simpmusic/ui/component/ModalBottomSheet.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ import com.maxrave.simpmusic.data.repository.MainRepository
134134
import com.maxrave.simpmusic.extension.connectArtists
135135
import com.maxrave.simpmusic.extension.greyScale
136136
import com.maxrave.simpmusic.extension.toListName
137+
import com.maxrave.simpmusic.extension.toTrack
137138
import com.maxrave.simpmusic.service.SimpleMediaServiceHandler
138139
import com.maxrave.simpmusic.service.StateSource
139140
import com.maxrave.simpmusic.ui.navigation.destination.list.AlbumDestination
@@ -868,6 +869,13 @@ fun QueueBottomSheet(
868869
SongFullWidthItems(
869870
songEntity = songEntity,
870871
isPlaying = false,
872+
onAddToQueue = {
873+
songEntity?.toTrack()?.let {
874+
sharedViewModel.addListToQueue(
875+
arrayListOf(it),
876+
)
877+
}
878+
},
871879
modifier =
872880
Modifier
873881
.fillMaxWidth()
@@ -973,6 +981,11 @@ fun QueueBottomSheet(
973981
onMoreClickListener = {
974982
showQueueItemBottomSheet(index)
975983
},
984+
onAddToQueue = {
985+
sharedViewModel.addListToQueue(
986+
arrayListOf(track),
987+
)
988+
},
976989
)
977990
}
978991
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/home/RecentlySongsScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ fun RecentlySongsScreen(
124124
0,
125125
)
126126
},
127+
onAddToQueue = {
128+
sharedViewModel.addListToQueue(
129+
arrayListOf(item.toTrack()),
130+
)
131+
},
127132
modifier = Modifier.animateItem(),
128133
)
129134
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/library/LibraryDynamicPlaylistScreen.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import androidx.navigation.NavController
4343
import com.maxrave.simpmusic.R
4444
import com.maxrave.simpmusic.data.db.entities.ArtistEntity
4545
import com.maxrave.simpmusic.data.db.entities.SongEntity
46+
import com.maxrave.simpmusic.extension.toTrack
4647
import com.maxrave.simpmusic.ui.component.ArtistFullWidthItems
4748
import com.maxrave.simpmusic.ui.component.EndOfPage
4849
import com.maxrave.simpmusic.ui.component.NowPlayingBottomSheet
@@ -51,12 +52,14 @@ import com.maxrave.simpmusic.ui.component.SongFullWidthItems
5152
import com.maxrave.simpmusic.ui.navigation.destination.list.ArtistDestination
5253
import com.maxrave.simpmusic.ui.theme.typo
5354
import com.maxrave.simpmusic.viewModel.LibraryDynamicPlaylistViewModel
55+
import com.maxrave.simpmusic.viewModel.SharedViewModel
5456
import dev.chrisbanes.haze.hazeEffect
5557
import dev.chrisbanes.haze.hazeSource
5658
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
5759
import dev.chrisbanes.haze.materials.HazeMaterials
5860
import dev.chrisbanes.haze.rememberHazeState
5961
import org.koin.androidx.compose.koinViewModel
62+
import org.koin.compose.koinInject
6063

6164
@OptIn(ExperimentalHazeMaterialsApi::class)
6265
@Composable
@@ -67,6 +70,7 @@ fun LibraryDynamicPlaylistScreen(
6770
navController: NavController,
6871
type: String,
6972
viewModel: LibraryDynamicPlaylistViewModel = koinViewModel(),
73+
sharedViewModel: SharedViewModel = koinInject(),
7074
) {
7175
val nowPlayingVideoId by viewModel.nowPlayingVideoId.collectAsStateWithLifecycle()
7276

@@ -169,6 +173,11 @@ fun LibraryDynamicPlaylistScreen(
169173
onClickListener = { videoId ->
170174
viewModel.playSong(videoId, type = type)
171175
},
176+
onAddToQueue = {
177+
sharedViewModel.addListToQueue(
178+
arrayListOf(song.toTrack()),
179+
)
180+
},
172181
)
173182
}
174183
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/library/LocalPlaylistScreen.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ import com.maxrave.simpmusic.data.db.entities.LocalPlaylistEntity
106106
import com.maxrave.simpmusic.data.db.entities.SongEntity
107107
import com.maxrave.simpmusic.extension.angledGradientBackground
108108
import com.maxrave.simpmusic.extension.getColorFromPalette
109+
import com.maxrave.simpmusic.extension.toTrack
109110
import com.maxrave.simpmusic.ui.component.CenterLoadingBox
110111
import com.maxrave.simpmusic.ui.component.EndOfPage
111112
import com.maxrave.simpmusic.ui.component.LoadingDialog
@@ -776,6 +777,11 @@ fun LocalPlaylistScreen(
776777
Log.w("PlaylistScreen", "index: $index")
777778
onPlaylistItemClick(it)
778779
},
780+
onAddToQueue = {
781+
sharedViewModel.addListToQueue(
782+
arrayListOf(item.toTrack()),
783+
)
784+
},
779785
modifier = Modifier.animateItem(),
780786
)
781787
} else {
@@ -787,6 +793,11 @@ fun LocalPlaylistScreen(
787793
Log.w("PlaylistScreen", "index: $index")
788794
onPlaylistItemClick(it)
789795
},
796+
onAddToQueue = {
797+
sharedViewModel.addListToQueue(
798+
arrayListOf(item.toTrack()),
799+
)
800+
},
790801
modifier = Modifier.animateItem(),
791802
)
792803
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/other/AlbumScreen.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,11 @@ import com.maxrave.simpmusic.ui.theme.md_theme_dark_background
9393
import com.maxrave.simpmusic.ui.theme.typo
9494
import com.maxrave.simpmusic.viewModel.AlbumViewModel
9595
import com.maxrave.simpmusic.viewModel.LocalPlaylistState
96+
import com.maxrave.simpmusic.viewModel.SharedViewModel
9697
import kotlinx.coroutines.flow.collectLatest
9798
import kotlinx.coroutines.flow.distinctUntilChanged
9899
import org.koin.androidx.compose.koinViewModel
100+
import org.koin.compose.koinInject
99101

100102
@OptIn(ExperimentalMaterial3Api::class)
101103
@Composable
@@ -104,6 +106,7 @@ fun AlbumScreen(
104106
browseId: String,
105107
navController: NavController,
106108
viewModel: AlbumViewModel = koinViewModel(),
109+
sharedViewModel: SharedViewModel = koinInject(),
107110
) {
108111
val context = LocalContext.current
109112
val uriHandler = LocalUriHandler.current
@@ -442,6 +445,11 @@ fun AlbumScreen(
442445
onClickListener = {
443446
viewModel.playTrack(item)
444447
},
448+
onAddToQueue = {
449+
sharedViewModel.addListToQueue(
450+
arrayListOf(item),
451+
)
452+
},
445453
modifier = Modifier.animateItem(),
446454
)
447455
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/other/ArtistScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ fun ArtistScreen(
353353
type = Config.SONG_CLICK,
354354
)
355355
},
356+
onAddToQueue = {
357+
sharedViewModel.addListToQueue(
358+
arrayListOf(song),
359+
)
360+
},
356361
)
357362
}
358363
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/other/PlaylistScreen.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,11 @@ fun PlaylistScreen(
577577
Log.w("PlaylistScreen", "index: $index")
578578
onPlaylistItemClick(it)
579579
},
580+
onAddToQueue = {
581+
sharedViewModel.addListToQueue(
582+
arrayListOf(item),
583+
)
584+
},
580585
modifier = Modifier.animateItem(),
581586
)
582587
} else {
@@ -588,6 +593,11 @@ fun PlaylistScreen(
588593
Log.w("PlaylistScreen", "index: $index")
589594
onPlaylistItemClick(it)
590595
},
596+
onAddToQueue = {
597+
sharedViewModel.addListToQueue(
598+
arrayListOf(item),
599+
)
600+
},
591601
modifier = Modifier.animateItem(),
592602
)
593603
}

app/src/main/java/com/maxrave/simpmusic/ui/screen/other/SearchScreen.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ import com.maxrave.simpmusic.ui.theme.typo
102102
import com.maxrave.simpmusic.viewModel.SearchScreenUIState
103103
import com.maxrave.simpmusic.viewModel.SearchType
104104
import com.maxrave.simpmusic.viewModel.SearchViewModel
105+
import com.maxrave.simpmusic.viewModel.SharedViewModel
105106
import com.maxrave.simpmusic.viewModel.toStringRes
106107
import org.koin.compose.koinInject
107108

@@ -110,6 +111,7 @@ import org.koin.compose.koinInject
110111
@UnstableApi
111112
fun SearchScreen(
112113
searchViewModel: SearchViewModel = koinInject(),
114+
sharedViewModel: SharedViewModel = koinInject(),
113115
navController: NavController,
114116
) {
115117
val context = LocalContext.current
@@ -610,6 +612,11 @@ fun SearchScreen(
610612
)
611613
searchViewModel.loadMediaItem(firstTrack, Config.SONG_CLICK)
612614
},
615+
onAddToQueue = {
616+
sharedViewModel.addListToQueue(
617+
arrayListOf(result.toTrack()),
618+
)
619+
},
613620
)
614621

615622
is VideosResult ->
@@ -635,6 +642,11 @@ fun SearchScreen(
635642
)
636643
searchViewModel.loadMediaItem(firstTrack, Config.VIDEO_CLICK)
637644
},
645+
onAddToQueue = {
646+
sharedViewModel.addListToQueue(
647+
arrayListOf(result.toTrack()),
648+
)
649+
},
638650
)
639651

640652
is SongItem ->
@@ -660,6 +672,11 @@ fun SearchScreen(
660672
)
661673
searchViewModel.loadMediaItem(firstTrack, Config.SONG_CLICK)
662674
},
675+
onAddToQueue = {
676+
sharedViewModel.addListToQueue(
677+
arrayListOf(result.toTrack()),
678+
)
679+
},
663680
)
664681

665682
is VideoItem ->
@@ -685,6 +702,11 @@ fun SearchScreen(
685702
)
686703
searchViewModel.loadMediaItem(firstTrack, Config.VIDEO_CLICK)
687704
},
705+
onAddToQueue = {
706+
sharedViewModel.addListToQueue(
707+
arrayListOf(result.toTrack()),
708+
)
709+
},
688710
)
689711

690712
is AlbumsResult ->

0 commit comments

Comments
 (0)