Browse Source

Improve voice search behavior

merge-requests/1205/head
Robert Stone 5 years ago
committed by Nicolas Pomepuy
parent
commit
d61c6f89c8
  1. 53
      application/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt

53
application/vlc-android/src/org/videolan/vlc/MediaSessionCallback.kt

@ -15,7 +15,6 @@ import kotlinx.coroutines.*
import org.videolan.medialibrary.Tools
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.*
import org.videolan.resources.util.getFromMl
import org.videolan.tools.PLAYBACK_HISTORY
@ -255,37 +254,49 @@ internal class MediaSessionCallback(private val playbackService: PlaybackService
override fun onPlayFromUri(uri: Uri?, extras: Bundle?) = playbackService.loadUri(uri)
override fun onPlayFromSearch(query: String?, extras: Bundle?) {
playbackService.mediaSession.setPlaybackState(PlaybackStateCompat.Builder().setState(PlaybackStateCompat.STATE_CONNECTING, playbackService.getTime(), 1.0f).build())
val playbackState = PlaybackStateCompat.Builder()
.setActions(playbackService.enabledActions)
.setState(PlaybackStateCompat.STATE_CONNECTING, playbackService.getTime(), playbackService.speed)
.build()
playbackService.mediaSession.setPlaybackState(playbackState)
playbackService.lifecycleScope.launch(Dispatchers.IO) {
if (!isActive) return@launch
playbackService.awaitMedialibraryStarted()
val vsp = VoiceSearchParams(query ?: "", extras)
var items: Array<out MediaLibraryItem>? = null
var tracks: Array<MediaWrapper>? = null
when {
vsp.isAny -> {
items = playbackService.medialibrary.audio.also { if (!playbackService.isShuffling) playbackService.shuffle() }
}
vsp.isArtistFocus -> items = playbackService.medialibrary.searchArtist(vsp.artist)
vsp.isAlbumFocus -> items = playbackService.medialibrary.searchAlbum(vsp.album)
vsp.isGenreFocus -> items = playbackService.medialibrary.searchGenre(vsp.genre)
vsp.isPlaylistFocus -> items = playbackService.medialibrary.searchPlaylist(vsp.playlist, Settings.includeMissing)
vsp.isSongFocus -> tracks = playbackService.medialibrary.searchMedia(vsp.song)
var tracks = when {
vsp.isAny -> playbackService.medialibrary.audio
vsp.isSongFocus -> playbackService.medialibrary.searchMedia(vsp.song)
else -> null
}
tracks?.sortWith(MediaComparators.ANDROID_AUTO)
val items = when {
vsp.isAlbumFocus -> playbackService.medialibrary.searchAlbum(vsp.album)
vsp.isGenreFocus -> playbackService.medialibrary.searchGenre(vsp.genre)
vsp.isArtistFocus -> playbackService.medialibrary.searchArtist(vsp.artist)
vsp.isPlaylistFocus -> playbackService.medialibrary.searchPlaylist(vsp.playlist, Settings.includeMissing)
else -> null
}
if (!isActive) return@launch
if (tracks.isNullOrEmpty() && items.isNullOrEmpty() && query?.length ?: 0 > 2) playbackService.medialibrary.search(query, Settings.includeMissing)?.run {
when {
!albums.isNullOrEmpty() -> tracks = albums!![0].tracks
!artists.isNullOrEmpty() -> tracks = artists!![0].tracks
!playlists.isNullOrEmpty() -> tracks = playlists!![0].tracks
!genres.isNullOrEmpty() -> tracks = genres!![0].tracks
if (tracks.isNullOrEmpty() && items.isNullOrEmpty() && query?.length ?: 0 > 2) {
playbackService.medialibrary.search(query, Settings.includeMissing)?.run {
tracks = when {
!albums.isNullOrEmpty() -> albums!!.flatMap { it.tracks.toList() }.toTypedArray()
!artists.isNullOrEmpty() -> artists!!.flatMap { it.tracks.toList() }.toTypedArray()
!playlists.isNullOrEmpty() -> playlists!!.flatMap { it.tracks.toList() }.toTypedArray()
!genres.isNullOrEmpty() -> genres!!.flatMap { it.tracks.toList() }.toTypedArray()
else -> null
}
}
}
if (!isActive) return@launch
if (tracks.isNullOrEmpty() && !items.isNullOrEmpty()) tracks = items[0].tracks
if (tracks.isNullOrEmpty() && !items.isNullOrEmpty()) tracks = items.flatMap { it.tracks.toList() }.toTypedArray()
playbackService.lifecycleScope.launch(Dispatchers.Main) {
when {
!tracks.isNullOrEmpty() -> loadMedia(tracks?.toList())
!tracks.isNullOrEmpty() -> {
loadMedia(tracks?.toList(), if (vsp.isAny) SecureRandom().nextInt(min(tracks!!.size, MEDIALIBRARY_PAGE_SIZE)) else 0)
// Enable shuffle when isAny is true and disable when false
if (vsp.isAny == !playbackService.isShuffling) playbackService.shuffle()
}
playbackService.hasMedia() -> playbackService.play()
else -> playbackService.displayPlaybackError(R.string.search_no_result)
}

Loading…
Cancel
Save