Skip to content

Commit

Permalink
Merge pull request #59 from swingmx/artist-info
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericgacoki authored Dec 20, 2024
2 parents a3b07c6 + c5d270b commit a837288
Show file tree
Hide file tree
Showing 14 changed files with 762 additions and 382 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE" />

<application
android:name=".app.SwingMusicApp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ class MainActivity : ComponentActivity() {
label = "Spacer Height"
)

var folderClickCounter by remember { mutableIntStateOf(0) }
SwingMusicTheme {
Scaffold(
modifier = Modifier.fillMaxSize(),
Expand All @@ -179,7 +178,9 @@ class MainActivity : ComponentActivity() {
"player/${ViewAllScreenDestination.route}",
"folder/${ViewAllScreenDestination.route}",
"album/${ViewAllScreenDestination.route}",
"artist/${ViewAllScreenDestination.route}"
"artist/${ViewAllScreenDestination.route}",

"folder/${QueueScreenDestination.route}",
))
) {
MiniPlayer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ object NavGraphs {
FoldersAndTracksScreenDestination,
AlbumWithInfoScreenDestination,
ArtistInfoScreenDestination,
QueueScreenDestination,
NowPlayingScreenDestination,
ViewAllScreenDestination
).routedIn(this).associateBy { it.route }
Expand Down Expand Up @@ -83,6 +84,7 @@ object NavGraphs {
AlbumWithInfoScreenDestination,
ViewAllScreenDestination,
NowPlayingScreenDestination,
QueueScreenDestination,
FoldersAndTracksScreenDestination
).routedIn(this).associateBy { it.route }
}
Expand All @@ -99,6 +101,7 @@ object NavGraphs {
ArtistInfoScreenDestination,
ViewAllScreenDestination,
NowPlayingScreenDestination,
QueueScreenDestination,
FoldersAndTracksScreenDestination
).routedIn(this).associateBy { it.route }
}
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.android.swingmusic.artist.presentation.screen

import android.annotation.SuppressLint
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -15,19 +16,23 @@ import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.swingmusic.artist.presentation.viewmodel.ArtistInfoViewModel
import com.android.swingmusic.common.presentation.navigator.CommonNavigator
import com.android.swingmusic.core.domain.model.Album
Expand All @@ -43,8 +48,8 @@ import com.android.swingmusic.uicomponent.presentation.component.AlbumItem
import com.android.swingmusic.uicomponent.presentation.component.CustomTrackBottomSheet
import com.android.swingmusic.uicomponent.presentation.component.TrackItem
import com.android.swingmusic.uicomponent.presentation.theme.SwingMusicTheme
import com.android.swingmusic.uicomponent.presentation.theme.SwingMusicTheme_Preview
import com.ramcosta.composedestinations.annotation.Destination
import kotlinx.coroutines.launch

@OptIn(ExperimentalMaterial3Api::class)
@Composable
Expand All @@ -58,6 +63,7 @@ private fun ViewAll(
allTracks: List<Track>?,
allAlbumsToShow: List<Album>?,
onClickArtistTrack: (queue: List<Track>, index: Int) -> Unit,
onToggleTrackFavorite: (isFavorite: Boolean, trackHash: String) -> Unit,
onClickAlbum: (hash: String) -> Unit,
onGetSheetAction: (track: Track, sheetAction: BottomSheetAction) -> Unit,
onGotoArtist: (hash: String) -> Unit
Expand Down Expand Up @@ -142,6 +148,9 @@ private fun ViewAll(
},
onChooseArtist = { hash ->
onGotoArtist(hash)
},
onToggleTrackFavorite = { isFavorite, trackHash ->
onToggleTrackFavorite(isFavorite, trackHash)
}
)
}
Expand Down Expand Up @@ -209,6 +218,7 @@ private fun ViewAll(
}
}

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Destination
@Composable
fun ViewAllScreen(
Expand All @@ -233,55 +243,107 @@ fun ViewAllScreen(
else -> null
}

val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()

val snackbarEvent by mediaControllerViewModel.snackbarEvent.collectAsStateWithLifecycle()

SideEffect {
mediaControllerViewModel.onQueueEvent(QueueEvent.HideSnackbar)
}

SwingMusicTheme {
ViewAll(
title = viewAllType,
artistName = artistData?.artist?.name ?: artistName,
baseUrl = baseUrl,
artistHash = artistHash,
playingTrackHash = playerUiState.value.nowPlayingTrack?.trackHash ?: "",
playbackState = playerUiState.value.playbackState,
allTracks = tracks,
allAlbumsToShow = albumsToShow,
onClickArtistTrack = { queue, index ->
mediaControllerViewModel.onQueueEvent(
QueueEvent.RecreateQueue(
source = QueueSource.ARTIST(artistHash = artistHash, name = artistName),
clickedTrackIndex = index,
queue = queue
)
Scaffold(
snackbarHost = {
SnackbarHost(
hostState = snackbarHostState,
modifier = Modifier.padding(bottom = 24.dp)
)
},
onClickAlbum = {
commonNavigator.gotoAlbumWithInfo(it)
},
onGetSheetAction = { track, sheetAction ->
when (sheetAction) {
is BottomSheetAction.GotoAlbum -> {
commonNavigator.gotoAlbumWithInfo(track.albumHash)
}
) {
ViewAll(
title = viewAllType,
artistName = artistData?.artist?.name ?: artistName,
baseUrl = baseUrl,
artistHash = artistHash,
playingTrackHash = playerUiState.value.nowPlayingTrack?.trackHash ?: "",
playbackState = playerUiState.value.playbackState,
allTracks = tracks,
allAlbumsToShow = albumsToShow,
onClickArtistTrack = { queue, index ->
mediaControllerViewModel.onQueueEvent(
QueueEvent.RecreateQueue(
source = QueueSource.ARTIST(artistHash = artistHash, name = artistName),
clickedTrackIndex = index,
queue = queue
)
)
},
onClickAlbum = {
commonNavigator.gotoAlbumWithInfo(it)
},
onGetSheetAction = { track, sheetAction ->
when (sheetAction) {
is BottomSheetAction.GotoAlbum -> {
commonNavigator.gotoAlbumWithInfo(track.albumHash)
}

is BottomSheetAction.GotoFolder -> {
commonNavigator.gotoSourceFolder(
sheetAction.name,
sheetAction.path
)
}

is BottomSheetAction.PlayNext -> {
mediaControllerViewModel.onQueueEvent(QueueEvent.PlayNext(track))
}

is BottomSheetAction.AddToQueue -> {
mediaControllerViewModel.onQueueEvent(QueueEvent.AddToQueue(track))

mediaControllerViewModel.onQueueEvent(
QueueEvent.ShowSnackbar(
msg = "Track added to playing queue",
actionLabel = "View Queue"
)
)
}

else -> {}
}
},
onGotoArtist = { hash ->
commonNavigator.gotoArtistInfo(hash)
},
onToggleTrackFavorite = { isFavorite, trackHash ->
// TODO: Call ViewAll Track fav toggle
}
)

is BottomSheetAction.GotoFolder -> {
commonNavigator.gotoSourceFolder(
sheetAction.name,
sheetAction.path
LaunchedEffect(snackbarEvent) {
snackbarEvent?.let { event ->
scope.launch {
val result = snackbarHostState.showSnackbar(
message = event.message,
actionLabel = event.actionLabel,
duration = event.duration
)
}

is BottomSheetAction.PlayNext -> {
mediaControllerViewModel.onQueueEvent(QueueEvent.PlayNext(track))
}
when (result) {
SnackbarResult.ActionPerformed -> {
commonNavigator.gotoQueueScreen()
}

is BottomSheetAction.AddToQueue -> {
mediaControllerViewModel.onQueueEvent(QueueEvent.AddToQueue(track))
}
SnackbarResult.Dismissed -> {}

else -> {}
else -> {}
}

mediaControllerViewModel.onQueueEvent(QueueEvent.HideSnackbar)
}
}
},
onGotoArtist = { hash ->
commonNavigator.gotoArtistInfo(hash)
}
)
}
}
}
Loading

0 comments on commit a837288

Please sign in to comment.