From 21904e2a2664cb804777c72770f5085700b68ac2 Mon Sep 17 00:00:00 2001 From: SirPotato10000 Date: Tue, 24 Nov 2020 20:47:49 +0300 Subject: [PATCH] Fixed search bug Old search code in GenreRepository.kt was very slow on large libraries. Used selection parameters for contentResolver.query instead of fetching all genres and filtering afterwards. Changed code in SearchRepository.kt to call new function. --- .../retromusic/repository/GenreRepository.kt | 20 +++++++++++++++++++ .../retromusic/repository/SearchRepository.kt | 6 ++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt index ca7c822a..933e6d2d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt @@ -32,6 +32,8 @@ import code.name.monkey.retromusic.util.PreferenceUtil interface GenreRepository { fun genres(): List + fun genres(query: String): List + fun songs(genreId: Long): List } @@ -44,6 +46,9 @@ class RealGenreRepository( return getGenresFromCursor(makeGenreCursor()) } + override fun genres(query: String): List { + return getGenresFromCursor(makeGenreCursor(arrayOf("%$query%"))) + } override fun songs(genreId: Long): List { // The genres table only stores songs that have a genre specified, // so we need to get songs without a genre a different way. @@ -161,4 +166,19 @@ class RealGenreRepository( return null } } + private fun makeGenreCursor(selectionValues: Array?): Cursor? { + val selection = MediaStore.Audio.GenresColumns.NAME + " LIKE ?" + val projection = arrayOf(Genres._ID, Genres.NAME) + return try { + contentResolver.query( + Genres.EXTERNAL_CONTENT_URI, + projection, + selection, + selectionValues, + PreferenceUtil.genreSortOrder + ) + } catch (e: SecurityException) { + return null + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/SearchRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/SearchRepository.kt index d8bb7b06..c026fb9f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/SearchRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/SearchRepository.kt @@ -45,10 +45,8 @@ class RealSearchRepository( results.add(context.resources.getString(R.string.albums)) results.addAll(albums) } - val genres: List = genreRepository.genres().filter { genre -> - genre.name.toLowerCase(Locale.getDefault()) - .contains(searchString.toLowerCase(Locale.getDefault())) - } + + val genres = genreRepository.genres(searchString) if (genres.isNotEmpty()) { results.add(context.resources.getString(R.string.genres)) results.addAll(genres)