Skip to content

Commit

Permalink
Merge pull request #547 from 07jasjeet/main
Browse files Browse the repository at this point in the history
Bug fixes
  • Loading branch information
07jasjeet authored Feb 3, 2025
2 parents bec07e6 + 19e3448 commit 0a77c80
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 42 deletions.
11 changes: 10 additions & 1 deletion app/src/main/java/org/listenbrainz/android/model/Playable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,16 @@ data class Playable(
var songs: List<Song> = emptyList(),
var currentSongIndex : Int,
var seekTo: Long = 0L
)
) {
companion object {
val EMPTY_PLAYABLE = Playable(
PlayableType.SONG,
-1L,
emptyList(),
0
)
}
}

enum class PlayableType{
SONG,
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/org/listenbrainz/android/model/Song.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ data class Song (
)
)

/** @return whether this track is nothing or not.
* @see [org.listenbrainz.android.service.NOTHING_PLAYING]
*/
fun isNothing() = mediaID == 0L && duration == 0L

companion object {
val emptySong = Song(
mediaID = 0L,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.first
import org.listenbrainz.android.model.Playable
import org.listenbrainz.android.model.Playable.Companion.EMPTY_PLAYABLE
import org.listenbrainz.android.model.PlayableType
import org.listenbrainz.android.repository.brainzplayer.BPAlbumRepository
import org.listenbrainz.android.repository.preferences.AppPreferences
Expand Down Expand Up @@ -159,16 +160,19 @@ class BrainzPlayerService : MediaBrowserServiceCompat() {
playNow: Boolean
) {
serviceScope.launch(Dispatchers.Main) {
val songs = appPreferences.currentPlayable?.songs?.map {
val playable = appPreferences.currentPlayable ?: EMPTY_PLAYABLE
val songs = playable.songs.map {
it.toMediaMetadataCompat
}?.toMutableList() ?: mutableListOf()
}.toMutableList()
localMusicSource.setMediaSource(songs)
val currentSongIndex = appPreferences.currentPlayable?.currentSongIndex ?: 0
val currentSongIndex = playable.currentSongIndex
exoPlayer.setMediaItems(localMusicSource.asMediaSource())
exoPlayer.prepare()
exoPlayer.seekTo(currentSongIndex,appPreferences.currentPlayable?.seekTo ?: 0L)
exoPlayer.seekTo(currentSongIndex, playable.seekTo)
exoPlayer.playWhenReady = playNow
brainzPlayerNotificationManager.showNotification(exoPlayer)
if (playable != EMPTY_PLAYABLE) {
brainzPlayerNotificationManager.showNotification(exoPlayer)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class BrainzPlayerServiceConnection(
private var previousPlaybackState: Boolean = false
private val mediaBrowserConnectionCallback = MediaBrowserConnectionCallback(context)

lateinit var mediaController: MediaControllerCompat
var mediaController: MediaControllerCompat? = null

private val mediaBrowser = MediaBrowserCompat(
context,
Expand All @@ -69,8 +69,8 @@ class BrainzPlayerServiceConnection(
}

//To skip, pause, resume etc in player
val transportControls: MediaControllerCompat.TransportControls
get() = mediaController.transportControls
val transportControls: MediaControllerCompat.TransportControls?
get() = mediaController?.transportControls

//subscribe and unsubscribe will be called from ViewModel to subscribe and unsubscribe from a mediaID to get access of mediaItems from local
fun subscribe(parentId: String, callback: MediaBrowserCompat.SubscriptionCallback) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
package org.listenbrainz.android.ui.navigation

import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.NavType
Expand All @@ -16,6 +25,7 @@ import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import androidx.navigation.navigation
import kotlinx.coroutines.flow.first
import okhttp3.Route
import org.listenbrainz.android.model.AppNavigationItem
import org.listenbrainz.android.ui.screens.album.AlbumScreen
import org.listenbrainz.android.ui.screens.artist.ArtistScreen
Expand Down Expand Up @@ -67,21 +77,21 @@ fun AppNavigation(
modifier = Modifier.fillMaxSize(),
startDestination = AppNavigationItem.Feed.route
) {
composable(route = AppNavigationItem.Feed.route) {
appComposable(route = AppNavigationItem.Feed.route) {
FeedScreen(
scrollToTopState = scrollRequestState,
onScrollToTop = onScrollToTop,
goToUserPage = ::goToUserProfile,
goToArtistPage = ::goToArtistPage
)
}
composable(route = AppNavigationItem.BrainzPlayer.route) {
appComposable(route = AppNavigationItem.BrainzPlayer.route) {
BrainzPlayerScreen()
}
composable(route = AppNavigationItem.Explore.route) {
appComposable(route = AppNavigationItem.Explore.route) {
ExploreScreen()
}
composable(
appComposable(
route = AppNavigationItem.Profile.route
) {
val viewModel = hiltViewModel<DashBoardViewModel>()
Expand All @@ -92,7 +102,7 @@ fun AppNavigation(
}
}
}
composable(
appComposable(
route = "${AppNavigationItem.Profile.route}/{username}",
arguments = listOf(
navArgument("username") {
Expand All @@ -111,12 +121,12 @@ fun AppNavigation(
goToArtistPage = ::goToArtistPage,
)
}
composable(
appComposable(
route = AppNavigationItem.Settings.route
) {
SettingsScreen()
}
composable(
appComposable(
route = "${AppNavigationItem.Artist.route}/{mbid}",
arguments = listOf(
navArgument("mbid") {
Expand All @@ -139,7 +149,7 @@ fun AppNavigation(
)
}
}
composable(
appComposable(
route = "${AppNavigationItem.Album.route}/{mbid}",
arguments = listOf(
navArgument("mbid") {
Expand All @@ -157,4 +167,28 @@ fun AppNavigation(
}
}
}
}

fun NavGraphBuilder.appComposable(
route: String,
arguments: List<NamedNavArgument> = emptyList(),
content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)
) {
composable(
route = route,
arguments = arguments,
enterTransition = {
fadeIn(tween(200))
},
exitTransition = {
fadeOut(tween(200))
},
popExitTransition = {
fadeOut(tween(200))
},
popEnterTransition = {
fadeIn(tween(200))
},
content = content
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
Expand Down Expand Up @@ -89,6 +91,7 @@ import org.listenbrainz.android.model.PlayableType
import org.listenbrainz.android.model.RepeatMode
import org.listenbrainz.android.model.Song
import org.listenbrainz.android.model.feed.FeedListenArtist
import org.listenbrainz.android.service.NOTHING_PLAYING
import org.listenbrainz.android.ui.components.CustomSeekBar
import org.listenbrainz.android.ui.components.ListenCardSmall
import org.listenbrainz.android.ui.components.PlayPauseIcon
Expand Down Expand Up @@ -123,9 +126,19 @@ fun BrainzPlayerBackDropScreen(
val defaultBackgroundColor = ListenBrainzTheme.colorScheme.background
val isDarkThemeEnabled = onScreenUiModeIsDark()

LaunchedEffect(currentlyPlayingSong) {
println(currentlyPlayingSong)
}

val isNothingPlaying = remember(currentlyPlayingSong) {
currentlyPlayingSong.title == "null"
&& currentlyPlayingSong.artist == "null"
|| brainzPlayerViewModel.appPreferences.currentPlayable?.songs.isNullOrEmpty()
}

/** 56.dp is default bottom navigation height */
val headerHeight by animateDpAsState(
targetValue = if (currentlyPlayingSong.title == "null" && currentlyPlayingSong.artist == "null")
targetValue = if (isNothingPlaying)
56.dp
else
56.dp + ListenBrainzTheme.sizes.brainzPlayerPeekHeight
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
Expand All @@ -30,6 +31,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.hilt.navigation.compose.hiltViewModel
Expand Down Expand Up @@ -124,19 +127,22 @@ fun ListenBrainzLogin(
Resource.Status.LOADING -> {
LoadingAnimation()
Text(
modifier = Modifier.padding(horizontal = 8.dp),
text = "Verifying token...",
color = Color.White,
fontSize = 22.sp,
fontWeight = FontWeight.Medium
fontWeight = FontWeight.Medium,
textAlign = TextAlign.Center
)
}
Resource.Status.SUCCESS -> {
LaunchedEffectUnit {
delay(1.seconds)
delay(1.5.seconds)
onLoginFinished()
}

Text(
modifier = Modifier.padding(horizontal = 8.dp),
text = "Login successful!",
color = Color.White,
fontSize = 22.sp,
Expand All @@ -145,11 +151,12 @@ fun ListenBrainzLogin(
}
Resource.Status.FAILED -> {
LaunchedEffectUnit {
delay(1.seconds)
delay(1.5.seconds)
onLoginFinished()
}

Text(
modifier = Modifier.padding(horizontal = 8.dp),
text = "Login failed.",
color = Color.White,
fontSize = 22.sp,
Expand All @@ -162,7 +169,7 @@ fun ListenBrainzLogin(
}
Resource.Status.FAILED -> {
LaunchedEffectUnit {
delay(1.seconds)
delay(1.5.seconds)
onLoginFinished()
}

Expand All @@ -173,10 +180,12 @@ fun ListenBrainzLogin(
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier.padding(horizontal = 8.dp),
text = "Something went wrong, please try again later.",
color = Color.White,
fontSize = 22.sp,
fontWeight = FontWeight.Medium
fontWeight = FontWeight.Medium,
textAlign = TextAlign.Center
)
}
}
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/java/org/listenbrainz/android/util/SongViewPager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,13 @@ fun SongViewPager(
.takeIf { it != -1 } ?: 0
) { songList.size }

LaunchedEffect(pagerState.settledPage) {
val newSong = songList[pagerState.settledPage]
if (currentlyPlayingSong.mediaID != 0L && newSong != currentlyPlayingSong) {
LaunchedEffect(pagerState.currentPage) {
val newSong = songList[pagerState.currentPage]
if (
!newSong.isNothing()
&& newSong != currentlyPlayingSong
&& pagerState.currentPage != pagerState.settledPage
) {
try {
viewModel.playOrToggleSong(newSong)
} catch (e: Exception) {
Expand Down
Loading

0 comments on commit 0a77c80

Please sign in to comment.