Skip to content

Commit

Permalink
feat(data): Add insertAndReplacePlaylist function to handle playlist …
Browse files Browse the repository at this point in the history
…insertion and replacement (fixed online playlist in Android Auto)
  • Loading branch information
maxrave-dev committed Jan 31, 2025
1 parent 3ce7f1f commit d620633
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,9 @@ interface DatabaseDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insertPlaylist(playlist: PlaylistEntity)

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAndReplacePlaylist(playlist: PlaylistEntity)

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertRadioPlaylist(playlist: PlaylistEntity)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ class LocalDataSource(

suspend fun insertPlaylist(playlist: PlaylistEntity) = databaseDao.insertPlaylist(playlist)

suspend fun insertAndReplacePlaylist(playlist: PlaylistEntity) = databaseDao.insertAndReplacePlaylist(playlist)

suspend fun insertRadioPlaylist(playlist: PlaylistEntity) = databaseDao.insertRadioPlaylist(playlist)

suspend fun updatePlaylistLiked(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,11 @@ class MainRepository(

suspend fun insertPlaylist(playlistEntity: PlaylistEntity) = withContext(Dispatchers.IO) { localDataSource.insertPlaylist(playlistEntity) }

suspend fun insertAndReplacePlaylist(playlistEntity: PlaylistEntity) =
withContext(Dispatchers.IO) {
localDataSource.insertAndReplacePlaylist(playlistEntity)
}

suspend fun insertRadioPlaylist(playlistEntity: PlaylistEntity) =
withContext(Dispatchers.IO) { localDataSource.insertRadioPlaylist(playlistEntity) }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class SimpleMediaSessionCallback(
private val context: Context,
private val mainRepository: MainRepository,
) : MediaLibrarySession.Callback {
private val tag = "AndroidAuto"
var toggleLike: () -> Unit = {}
private val scope = CoroutineScope(Dispatchers.Main + Job())
private val searchTempList = mutableListOf<Track>()
Expand Down Expand Up @@ -293,7 +294,7 @@ class SimpleMediaSessionCallback(
if (playlist.data?.tracks.isNullOrEmpty()) {
emptyList()
} else {
mainRepository.insertPlaylist(playlist.data!!.toPlaylistEntity())
mainRepository.insertAndReplacePlaylist(playlist.data!!.toPlaylistEntity())
playlist.data.tracks.map { track ->
track
.toSongEntity()
Expand All @@ -313,7 +314,7 @@ class SimpleMediaSessionCallback(
if (playlistId != null) {
val playlist =
mainRepository.getLocalPlaylist(playlistId.toLong()).first()
Log.w("SimpleMediaSessionCallback", "onGetChildren: $playlist")
Log.w(tag, "onGetChildren: $playlist")
if (playlist.tracks.isNullOrEmpty()) {
emptyList()
} else {
Expand Down Expand Up @@ -393,7 +394,7 @@ class SimpleMediaSessionCallback(
PLAYLIST -> {
val songId = path.getOrNull(2) ?: return@future defaultResult
val playlistId = path.getOrNull(1) ?: return@future defaultResult
Log.d("SimpleMediaSessionCallback", "onSetMediaItems: $playlistId")
Log.d("SimpleMediaSessionCallback", "onSetMediaItems playlistId: $playlistId")
val songs =
mainRepository
.getLocalPlaylist(playlistId.toLong())
Expand All @@ -402,7 +403,7 @@ class SimpleMediaSessionCallback(
?.let {
mainRepository.getSongsByListVideoId(it)
}?.first()
Log.w("SimpleMediaSessionCallback", "onSetMediaItems: $songs")
Log.w("SimpleMediaSessionCallback", "onSetMediaItems songs: $songs")
if (songs.isNullOrEmpty()) {
defaultResult
} else {
Expand Down Expand Up @@ -438,16 +439,22 @@ class SimpleMediaSessionCallback(
} else if (type == PLAYLIST) {
val songId = path.getOrNull(4) ?: return@future defaultResult
val playlistId = path.getOrNull(3) ?: return@future defaultResult
Log.d(tag, "onSetMediaItems playlistId: $playlistId")
val playlistEntity = mainRepository.getPlaylist(playlistId).first()
Log.w(tag, "onSetMediaItems playlistEntity: $playlistEntity")
if (playlistEntity?.tracks.isNullOrEmpty()) {
defaultResult
} else if (playlistEntity?.tracks?.isNotEmpty() == true) {
playlistEntity.tracks
.let { it ->
.let { tracks ->
mainRepository
.getSongsByListVideoId(it)
.getSongsByListVideoId(tracks)
.first()
.map { it.toMediaItem() }
.sortedBy {
tracks.indexOf(it.videoId)
}.also {
Log.w(tag, "onSetMediaItems list songs: $it")
}.map { it.toMediaItem() }
}.let { mediaItemList ->
MediaSession.MediaItemsWithStartPosition(
mediaItemList,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -925,7 +925,8 @@ class LocalPlaylistFragment : Fragment() {
// binding.btSort.setIconResource(
// R.drawable.baseline_arrow_drop_down_24,
// )
// listTrack.sortBy {
// listTrack.
// sortBy {
// viewModel.listPair.value?.find {
// pair ->
// pair.songId == (it as SongEntity).videoId
Expand Down

0 comments on commit d620633

Please sign in to comment.