Skip to content

Commit

Permalink
feat(LocalPlaylist): Update getLocalPlaylist to handle null cases and…
Browse files Browse the repository at this point in the history
… improve safety (fixed #744)
  • Loading branch information
maxrave-dev committed Feb 1, 2025
1 parent 23de601 commit 7be2ac0
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ interface DatabaseDao {
suspend fun getAllLocalPlaylists(): List<LocalPlaylistEntity>

@Query("SELECT * FROM local_playlist WHERE id = :id")
suspend fun getLocalPlaylist(id: Long): LocalPlaylistEntity
suspend fun getLocalPlaylist(id: Long): LocalPlaylistEntity?

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertLocalPlaylist(localPlaylist: LocalPlaylistEntity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import java.time.LocalDateTime

class LocalPlaylistManager(
context: Context,
private val youTube: YouTube
private val youTube: YouTube,
) : BaseManager(context) {
override val tag: String = this.javaClass.simpleName

Expand All @@ -58,7 +58,7 @@ class LocalPlaylistManager(
id: Long,
filter: FilterState,
): Flow<PagingData<SongEntity>> {
val totalCount = runBlocking(Dispatchers.IO) { localDataSource.getLocalPlaylist(id).tracks?.size ?: 0 }
val totalCount = runBlocking(Dispatchers.IO) { localDataSource.getLocalPlaylist(id)?.tracks?.size ?: 0 }
Log.w(tag, "getTracksPaging: $totalCount")
return Pager(
config = PagingConfig(pageSize = 100, prefetchDistance = 5),
Expand All @@ -74,7 +74,8 @@ class LocalPlaylistManager(
}

suspend fun getFullPlaylistTracks(id: Long): List<SongEntity> {
val playlist = localDataSource.getLocalPlaylist(id)
val playlist = localDataSource.getLocalPlaylist(id) ?: return emptyList()
Log.d(tag, "getFullPlaylistTracks: $playlist")
val tracks = mutableListOf<SongEntity>()
var currentPage = 0
while (true) {
Expand Down Expand Up @@ -106,7 +107,7 @@ class LocalPlaylistManager(

suspend fun getListTrackVideoId(id: Long): List<String> {
val playlist = localDataSource.getLocalPlaylist(id)
return playlist.tracks ?: emptyList()
return playlist?.tracks ?: emptyList()
}

suspend fun insertLocalPlaylist(localPlaylist: LocalPlaylistEntity): Flow<LocalResource<String>> =
Expand Down Expand Up @@ -134,7 +135,7 @@ class LocalPlaylistManager(
}.onSuccess {
emit(LocalResource.Success(getString(R.string.updated)))
val localPlaylist = localDataSource.getLocalPlaylist(id)
if (localPlaylist.youtubePlaylistId != null) {
if (localPlaylist?.youtubePlaylistId != null) {
youTube
.editPlaylist(localPlaylist.youtubePlaylistId, newTitle)
.onSuccess {
Expand Down Expand Up @@ -279,7 +280,7 @@ class LocalPlaylistManager(
fun syncLocalPlaylistToYouTubePlaylist(playlistId: Long) =
flow<LocalResource<String>> {
emit(LocalResource.Loading())
val playlist = localDataSource.getLocalPlaylist(playlistId)
val playlist = localDataSource.getLocalPlaylist(playlistId) ?: return@flow
val res =
youTube.createPlaylist(
playlist.title,
Expand Down Expand Up @@ -346,7 +347,7 @@ class LocalPlaylistManager(

suspend fun updateListTrackSynced(id: Long) =
flow<Boolean> {
val localPlaylist = localDataSource.getLocalPlaylist(id)
val localPlaylist = localDataSource.getLocalPlaylist(id) ?: return@flow
val tracks = localPlaylist.tracks ?: emptyList()
val currentTracks = tracks.toMutableList()
localPlaylist.youtubePlaylistId?.let { ytId ->
Expand Down Expand Up @@ -407,7 +408,7 @@ class LocalPlaylistManager(
if (checkSong == null) {
localDataSource.insertSong(song)
}
val localPlaylist = localDataSource.getLocalPlaylist(id)
val localPlaylist = localDataSource.getLocalPlaylist(id) ?: return@flow
val nextPosition = localPlaylist.tracks?.size ?: 0
val nextPair =
PairSongLocalPlaylist(
Expand Down Expand Up @@ -457,7 +458,7 @@ class LocalPlaylistManager(
): Flow<LocalResource<String>> =
flow {
emit(LocalResource.Loading())
val localPlaylist = localDataSource.getLocalPlaylist(id)
val localPlaylist = localDataSource.getLocalPlaylist(id) ?: return@flow
val nextTracks = localPlaylist.tracks?.toMutableList() ?: mutableListOf()
nextTracks.remove(song.videoId)
localDataSource.updateLocalPlaylistTracks(nextTracks, id)
Expand All @@ -481,7 +482,7 @@ class LocalPlaylistManager(

suspend fun getSuggestionsTrackForPlaylist(id: Long): Flow<LocalResource<Pair<String?, List<Track>>>> =
flow {
val localPlaylist = localDataSource.getLocalPlaylist(id)
val localPlaylist = localDataSource.getLocalPlaylist(id) ?: return@flow
val ytPlaylistId = localPlaylist.youtubePlaylistId ?: return@flow

youTube
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,7 @@ class MainRepository(

suspend fun getAllLocalPlaylists(): Flow<List<LocalPlaylistEntity>> = flow { emit(localDataSource.getAllLocalPlaylists()) }.flowOn(Dispatchers.IO)

suspend fun getLocalPlaylist(id: Long): Flow<LocalPlaylistEntity> = flow { emit(localDataSource.getLocalPlaylist(id)) }.flowOn(Dispatchers.IO)
suspend fun getLocalPlaylist(id: Long): Flow<LocalPlaylistEntity?> = flow { emit(localDataSource.getLocalPlaylist(id)) }.flowOn(Dispatchers.IO)

suspend fun insertLocalPlaylist(localPlaylistEntity: LocalPlaylistEntity) =
withContext(Dispatchers.IO) { localDataSource.insertLocalPlaylist(localPlaylistEntity) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,14 +314,18 @@ class SimpleMediaSessionCallback(
if (playlistId != null) {
val playlist =
mainRepository.getLocalPlaylist(playlistId.toLong()).first()
Log.w(tag, "onGetChildren: $playlist")
if (playlist.tracks.isNullOrEmpty()) {
emptyList()
if (playlist != null) {
Log.w(tag, "onGetChildren: $playlist")
if (playlist.tracks.isNullOrEmpty()) {
emptyList()
} else {
mainRepository
.getSongsByListVideoId(playlist.tracks)
.first()
.map { it.toMediaItem(parentId) }
}
} else {
mainRepository
.getSongsByListVideoId(playlist.tracks)
.first()
.map { it.toMediaItem(parentId) }
emptyList()
}
} else {
emptyList()
Expand Down Expand Up @@ -399,7 +403,7 @@ class SimpleMediaSessionCallback(
mainRepository
.getLocalPlaylist(playlistId.toLong())
.first()
.tracks
?.tracks
?.let {
mainRepository.getSongsByListVideoId(it)
}?.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,14 @@ import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.materials.CupertinoMaterials
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.distinctUntilChangedBy
import org.koin.compose.koinInject

@OptIn(ExperimentalFoundationApi::class)
@OptIn(ExperimentalFoundationApi::class, ExperimentalHazeMaterialsApi::class)
@UnstableApi
@ExperimentalMaterial3Api
@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,10 @@ import kotlinx.coroutines.flow.singleOrNull
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

import org.koin.core.component.inject
import java.time.LocalDateTime

@UnstableApi

class LocalPlaylistViewModel(
private val application: Application,
) : BaseViewModel(application) {
Expand Down Expand Up @@ -411,6 +409,7 @@ class LocalPlaylistViewModel(
fun deletePlaylist(id: Long) {
showLoadingDialog(message = getString(R.string.delete))
viewModelScope.launch {
_uiState.value = LocalPlaylistState.initial()
localPlaylistManager.deleteLocalPlaylist(id).collectLatestResource(
onSuccess = {
makeToast(it)
Expand Down

0 comments on commit 7be2ac0

Please sign in to comment.