Логика для очереди списка песен при использовании exoplayer

#android #android-studio #kotlin #mvvm #exoplayer

Вопрос:

Я пытаюсь воспроизвести список песен, основанный на текущем фрагменте.

Например

  1. В Allsongfragment — Воспроизводите и ставьте в очередь все песни с пользовательского устройства
  2. В избранных песнях — Только воспроизведение и список очередей песен, добавленных пользователем в избранное
  3. В Artistesongfragent — Только воспроизведение и список очередей песен этого исполнителя.

Я могу воспроизводить песни, но мне трудно сформировать очередь из списка песен на основе фрагмента, который был воспроизведен

Что я и пытался.

Когда пользователь нажимает «воспроизвести песню» в любом фрагменте, например:

FavoriteSongsFragment

 favouriteSongsAdapter.setOnItemClickListener {

   //Played from FavoriteSongsFragment, now save in preference
   PreferenceHelper.storeQueue = Constants.QUEUE_FAV_SONGS

   //ViewModel for playing song with the queue passed as parameter
   mainViewModel.playOrToggleSong(it, queue = PreferenceHelper.storeQueue)

}
 

Mainviewмодель

  fun playOrToggleSong(mediaItem: Songs, toggle: Boolean = false, queue: String? = PreferenceHelper.storeQueue)
{
  val isPrepared = playBackState.value?.isPrepared ?: false
  if (isPrepared amp;amp; mediaItem.mediaId.toString() == currentlyPlayingSong.value?.getString(METADATA_KEY_MEDIA_ID)){
 playBackState.value?.let { playbackState ->
 when{
 playbackState.isPlaying -> if (toggle) musicServiceConnection.transportControls.pause()
playbackState.isPlayEnabled -> musicServiceConnection.transportControls.play()
       }
    }
 }
    else{
        musicServiceConnection.transportControls.playFromMediaId(mediaItem.mediaId.toString(), null)
    }

}
 

Музыкальный источник

 var songs = emptyList<MediaMetadataCompat>()
var allSongs: List<Songs>? = null

suspend fun fetchMediaData() = withContext(Dispatchers.IO){
    state = State.STATE_INITIALIZING
    val permissionGranted = ContextCompat.checkSelfPermission(context,
        Manifest.permission.READ_EXTERNAL_STORAGE) == 
 PackageManager.PERMISSION_GRANTED
  
if (permissionGranted){
//check which fragment was played and pass the list of songs to be queued
        if (PreferenceHelper.storeQueue == Constants.QUEUE_ALL_SONGS){
            allSongs = musicDatabase.getContentProviderValue()
        }
        else if (PreferenceHelper.storeQueue == Constants.QUEUE_ARTISTE_SONGS){
            allSongs = artisteDatabase.getArtisteSongs(191)
        }

        songs = allSongs!!.map { song ->
            Builder()
                .putString(METADATA_KEY_ARTIST, song.subtitle.toString())
                .putString(METADATA_KEY_MEDIA_ID, song.mediaId.toString())
                .putString(METADATA_KEY_TITLE, song.title.toString())
                .putString(METADATA_KEY_GENRE, song.genre.toString())
                .putString(METADATA_KEY_ALBUM, song.album.toString())
                .putString(METADATA_KEY_DATE, song.dateAdded.toString())
                .build()

        }
        state = State.STATE_INITIALIZED
    }

}
 

Currently, when I play a song, the preference is saved and the queue only takes effect after I close and reopen the app.

E.g

When I play a song in ArtisteSongsFragment, the queue doesnt take effect that moment, only when I close and open the app…then when I now play a song from AllSongsFragment, it gives the queue for songs in ArtisteSongsFragment which was saved before.