diff --git a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerScreen.kt b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerScreen.kt index 9cadee12..315e24da 100644 --- a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerScreen.kt +++ b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerScreen.kt @@ -32,6 +32,7 @@ fun MusicPlayerScreen( PlaybackUiEvent.Previous -> previous() PlaybackUiEvent.Repeat -> repeat() is PlaybackUiEvent.Seek -> seekTo(event.position) + PlaybackUiEvent.ToggleShuffle -> toggleShuffle() } } }, diff --git a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerViewer.kt b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerViewer.kt index 7085eb1e..37140e02 100644 --- a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerViewer.kt +++ b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/MusicPlayerViewer.kt @@ -1,13 +1,12 @@ package io.newm.feature.musicplayer -import android.content.Context -import android.content.Intent import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.Spring.StiffnessLow import androidx.compose.animation.core.spring import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -140,7 +139,8 @@ internal fun MusicPlayerViewer( Row( modifier = Modifier .fillMaxWidth() - .padding(vertical = 16.dp) + .padding(vertical = 16.dp), + horizontalArrangement = Arrangement.SpaceBetween ) { IconButton(onClick = onNavigateUp) { Icon( @@ -149,6 +149,11 @@ internal fun MusicPlayerViewer( tint = White ) } + + ShareButton( + songTitle = playbackStatus.track?.title, + songArtist = playbackStatus.track?.artist + ) } Spacer(modifier = Modifier.weight(1f)) Text( @@ -256,15 +261,29 @@ fun PlaybackControlPanel( modifier = Modifier.padding(horizontal = 12.dp), onClick = { onEvent(PlaybackUiEvent.Next) }) Spacer(modifier = Modifier.weight(1f)) - ShareButton( - songTitle = playbackStatus.track?.title, - songArtist = playbackStatus.track?.artist + ShuffleButton( + shuffleMode = playbackStatus.shuffleMode, + onClick = { onEvent(PlaybackUiEvent.ToggleShuffle) } ) } } } } +@Composable +fun ShuffleButton( + onClick: () -> Unit, + shuffleMode: Boolean +) { + IconButton(onClick = onClick) { + Icon( + painter = painterResource(R.drawable.ic_music_player_shuffle), + contentDescription = "Shuffle", + tint = if (shuffleMode) DarkViolet else White + ) + } +} + @Composable private fun PlayOrPauseButton( playbackStatus: PlaybackStatus, diff --git a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/models/PlaybackStatus.kt b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/models/PlaybackStatus.kt index 8f07ede2..990776de 100644 --- a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/models/PlaybackStatus.kt +++ b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/models/PlaybackStatus.kt @@ -5,7 +5,8 @@ data class PlaybackStatus( val track: Track?, val position: Long, val duration: Long, - val repeatMode: PlaybackRepeatMode + val repeatMode: PlaybackRepeatMode, + val shuffleMode: Boolean ) { companion object { val EMPTY: PlaybackStatus = PlaybackStatus( @@ -13,7 +14,8 @@ data class PlaybackStatus( position = 0, duration = 0, track = null, - repeatMode = PlaybackRepeatMode.REPEAT_OFF + repeatMode = PlaybackRepeatMode.REPEAT_OFF, + shuffleMode = false, ) } } diff --git a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/service/MusicPlayer.kt b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/service/MusicPlayer.kt index 052b040d..1265b91c 100644 --- a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/service/MusicPlayer.kt +++ b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/service/MusicPlayer.kt @@ -31,6 +31,7 @@ interface MusicPlayer { fun seekTo(index: Int, position: Long) fun repeat() fun setPlaylist(playlist: Playlist, initialTrackIndex: Int) + fun toggleShuffle() } class MusicPlayerImpl( @@ -85,7 +86,8 @@ class MusicPlayerImpl( position = player.currentPosition, duration = player.duration, track = player.currentMediaItem?.toTrack(), - repeatMode = repeatMode + repeatMode = repeatMode, + shuffleMode = player.shuffleModeEnabled ) } } @@ -162,6 +164,12 @@ class MusicPlayerImpl( }) player.seekTo(initialTrackIndex, 0) } + + override fun toggleShuffle() { + eventLogger.logClickEvent(AppScreens.MusicPlayerScreen.TOGGLE_SHUFFLE_BUTTON) + Log.d("MusicPlayer", "Toggle shuffle") + player.shuffleModeEnabled = !player.shuffleModeEnabled + } } private fun MediaItem.toTrack(): Track { diff --git a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/viewmodel/PlaybackUiEvent.kt b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/viewmodel/PlaybackUiEvent.kt index cea7a24f..9a3262a9 100644 --- a/android/features/music-player/src/main/java/io/newm/feature/musicplayer/viewmodel/PlaybackUiEvent.kt +++ b/android/features/music-player/src/main/java/io/newm/feature/musicplayer/viewmodel/PlaybackUiEvent.kt @@ -9,4 +9,5 @@ sealed interface PlaybackUiEvent { data class Seek(val position: Long): PlaybackUiEvent data object Repeat : PlaybackUiEvent + data object ToggleShuffle : PlaybackUiEvent } diff --git a/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt b/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt index bb837c8f..91df0aa2 100644 --- a/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt +++ b/shared/src/commonMain/kotlin/io.newm.shared/public/analytics/events/AppScreens.kt @@ -64,7 +64,7 @@ object AppScreens { const val STOP_BUTTON: String = "Stop" const val REPEAT_BUTTON: String = "Repeat" const val SEEK_ACTION: String = "Seek Action" - + const val TOGGLE_SHUFFLE_BUTTON: String = "Toggle Shuffle" } object NFTLibraryEmptyWalletScreen : ScreenEvents {