in common/src/main/java/com/example/android/uamp/media/library/MusicSource.kt [130:197]
override fun search(query: String, extras: Bundle): List<MediaMetadataCompat> {
// First attempt to search with the "focus" that's provided in the extras.
val focusSearchResult = when (extras[MediaStore.EXTRA_MEDIA_FOCUS]) {
MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE -> {
// For a Genre focused search, only genre is set.
val genre = extras[EXTRA_MEDIA_GENRE]
Log.d(TAG, "Focused genre search: '$genre'")
filter { song ->
song.genre == genre
}
}
MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE -> {
// For an Artist focused search, only the artist is set.
val artist = extras[MediaStore.EXTRA_MEDIA_ARTIST]
Log.d(TAG, "Focused artist search: '$artist'")
filter { song ->
(song.artist == artist || song.albumArtist == artist)
}
}
MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE -> {
// For an Album focused search, album and artist are set.
val artist = extras[MediaStore.EXTRA_MEDIA_ARTIST]
val album = extras[MediaStore.EXTRA_MEDIA_ALBUM]
Log.d(TAG, "Focused album search: album='$album' artist='$artist")
filter { song ->
(song.artist == artist || song.albumArtist == artist) && song.album == album
}
}
MediaStore.Audio.Media.ENTRY_CONTENT_TYPE -> {
// For a Song (aka Media) focused search, title, album, and artist are set.
val title = extras[MediaStore.EXTRA_MEDIA_TITLE]
val album = extras[MediaStore.EXTRA_MEDIA_ALBUM]
val artist = extras[MediaStore.EXTRA_MEDIA_ARTIST]
Log.d(TAG, "Focused media search: title='$title' album='$album' artist='$artist")
filter { song ->
(song.artist == artist || song.albumArtist == artist) && song.album == album
&& song.title == title
}
}
else -> {
// There isn't a focus, so no results yet.
emptyList()
}
}
// If there weren't any results from the focused search (or if there wasn't a focus
// to begin with), try to find any matches given the 'query' provided, searching against
// a few of the fields.
// In this sample, we're just checking a few fields with the provided query, but in a
// more complex app, more logic could be used to find fuzzy matches, etc...
if (focusSearchResult.isEmpty()) {
return if (query.isNotBlank()) {
Log.d(TAG, "Unfocused search for '$query'")
filter { song ->
song.title.containsCaseInsensitive(query)
|| song.genre.containsCaseInsensitive(query)
}
} else {
// If the user asked to "play music", or something similar, the query will also
// be blank. Given the small catalog of songs in the sample, just return them
// all, shuffled, as something to play.
Log.d(TAG, "Unfocused search without keyword")
return shuffled()
}
} else {
return focusSearchResult
}
}