From 010b771373b35b8e52e12486a882e2767d9fff25 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 29 Jan 2022 00:28:16 +0530 Subject: [PATCH] Fixed slow search because of Genres, and also added Playlists to Search results, Don't worry that won't slow the search. --- .../fragments/search/SearchFragment.kt | 6 +- .../retromusic/repository/GenreRepository.kt | 90 +++++++------------ .../retromusic/repository/SearchRepository.kt | 42 ++++++--- app/src/main/res/layout/fragment_search.xml | 7 ++ app/src/main/res/values/styles.xml | 1 - 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index bb4a8249b..820b5ae51 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -96,11 +96,11 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa view.doOnPreDraw { startPostponedEnterTransition() } - libraryViewModel.getFabMargin().observe(viewLifecycleOwner, { + libraryViewModel.getFabMargin().observe(viewLifecycleOwner) { binding.keyboardPopup.updateLayoutParams { bottomMargin = it } - }) + } KeyboardVisibilityEvent.setEventListener(requireActivity(), viewLifecycleOwner) { if (it) { binding.keyboardPopup.isGone = true @@ -192,6 +192,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa R.id.chip_albums -> Filter.ALBUMS R.id.chip_album_artists -> Filter.ALBUM_ARTISTS R.id.chip_genres -> Filter.GENRES + R.id.chip_playlists -> Filter.PLAYLISTS else -> Filter.NO_FILTER } } @@ -245,6 +246,7 @@ enum class Filter { ALBUMS, ALBUM_ARTISTS, GENRES, + PLAYLISTS, NO_FILTER } 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 2c096092a..d773beef9 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 @@ -16,19 +16,19 @@ package code.name.monkey.retromusic.repository import android.content.ContentResolver import android.database.Cursor -import android.net.Uri import android.provider.BaseColumns import android.provider.MediaStore.Audio.Genres import code.name.monkey.retromusic.Constants.IS_MUSIC import code.name.monkey.retromusic.Constants.baseProjection import code.name.monkey.retromusic.extensions.getLong -import code.name.monkey.retromusic.extensions.getString import code.name.monkey.retromusic.extensions.getStringOrNull import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil interface GenreRepository { + fun genres(query: String): List + fun genres(): List fun songs(genreId: Long): List @@ -41,6 +41,10 @@ class RealGenreRepository( private val songRepository: RealSongRepository ) : GenreRepository { + override fun genres(query: String): List { + return getGenresFromCursor(makeGenreCursor(query)) + } + override fun genres(): List { return getGenresFromCursor(makeGenreCursor()) } @@ -57,18 +61,23 @@ class RealGenreRepository( return songRepository.song(makeGenreSongCursor(genreId)) } + private fun getSongCount(genreId: Long): Int { + contentResolver.query( + Genres.Members.getContentUri("external", genreId), + null, + null, + null, + null + ).use { + return it?.count ?: 0 + } + } + private fun getGenreFromCursor(cursor: Cursor): Genre { val id = cursor.getLong(Genres._ID) val name = cursor.getStringOrNull(Genres.NAME) - val songCount = songs(id).size + val songCount = getSongCount(id) return Genre(id, name ?: "", songCount) - - } - - private fun getGenreFromCursorWithOutSongs(cursor: Cursor): Genre { - val id = cursor.getLong(Genres._ID) - val name = cursor.getString(Genres.NAME) - return Genre(id, name, -1) } private fun getSongsWithNoGenre(): List { @@ -77,28 +86,6 @@ class RealGenreRepository( return songRepository.songs(songRepository.makeSongCursor(selection, null)) } - private fun hasSongsWithNoGenre(): Boolean { - val allSongsCursor = songRepository.makeSongCursor(null, null) - val allSongsWithGenreCursor = makeAllSongsWithGenreCursor() - - if (allSongsCursor == null || allSongsWithGenreCursor == null) { - return false - } - - val hasSongsWithNoGenre = allSongsCursor.count > allSongsWithGenreCursor.count - allSongsCursor.close() - allSongsWithGenreCursor.close() - return hasSongsWithNoGenre - } - - private fun makeAllSongsWithGenreCursor(): Cursor? { - println(Genres.EXTERNAL_CONTENT_URI.toString()) - return contentResolver.query( - Uri.parse("content://media/external/audio/genres/all/members"), - arrayOf(Genres.Members.AUDIO_ID), null, null, null - ) - } - private fun makeGenreSongCursor(genreId: Long): Cursor? { return try { contentResolver.query( @@ -121,37 +108,13 @@ class RealGenreRepository( val genre = getGenreFromCursor(cursor) if (genre.songCount > 0) { genres.add(genre) - } else { - // try to remove the empty genre from the media store - try { - contentResolver.delete( - Genres.EXTERNAL_CONTENT_URI, - Genres._ID + " == " + genre.id, - null - ) - } catch (e: Exception) { - e.printStackTrace() - } - } } while (cursor.moveToNext()) } - cursor.close() } return genres } - private fun getGenresFromCursorForSearch(cursor: Cursor?): List { - val genres = mutableListOf() - if (cursor != null && cursor.moveToFirst()) { - do { - genres.add(getGenreFromCursorWithOutSongs(cursor)) - } while (cursor.moveToNext()) - } - cursor?.close() - return genres - } - private fun makeGenreCursor(): Cursor? { val projection = arrayOf(Genres._ID, Genres.NAME) return try { @@ -166,4 +129,19 @@ class RealGenreRepository( return null } } + + private fun makeGenreCursor(query: String): Cursor? { + val projection = arrayOf(Genres._ID, Genres.NAME) + return try { + contentResolver.query( + Genres.EXTERNAL_CONTENT_URI, + projection, + Genres.NAME + " = ?", + arrayOf(query), + 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 4a1280d6a..abfcd0244 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 @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.repository import android.content.Context import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.fragments.search.Filter import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist @@ -29,20 +30,23 @@ class RealSearchRepository( private val roomRepository: RoomRepository, private val genreRepository: GenreRepository, ) { - fun searchAll(context: Context, query: String?, filter: Filter): MutableList { + suspend fun searchAll(context: Context, query: String?, filter: Filter): MutableList { val results = mutableListOf() if (query.isNullOrEmpty()) return results query.let { searchString -> + + /** Songs **/ val songs: List = if (filter == Filter.SONGS || filter == Filter.NO_FILTER) { songRepository.songs(searchString) } else { emptyList() } - if (songs.isNotEmpty()) { results.add(context.resources.getString(R.string.songs)) results.addAll(songs) } + + /** Artists **/ val artists: List = if (filter == Filter.ARTISTS || filter == Filter.NO_FILTER) { artistRepository.artists(searchString) @@ -53,6 +57,8 @@ class RealSearchRepository( results.add(context.resources.getString(R.string.artists)) results.addAll(artists) } + + /** Albums **/ val albums: List = if (filter == Filter.ALBUMS || filter == Filter.NO_FILTER) { albumRepository.albums(searchString) } else { @@ -62,6 +68,8 @@ class RealSearchRepository( results.add(context.resources.getString(R.string.albums)) results.addAll(albums) } + + /** Album-Artists **/ val albumArtists: List = if (filter == Filter.ALBUM_ARTISTS || filter == Filter.NO_FILTER) { artistRepository.albumArtists(searchString) @@ -72,11 +80,10 @@ class RealSearchRepository( results.add(context.resources.getString(R.string.album_artist)) results.addAll(albumArtists) } + + /** Genres **/ val genres: List = if (filter == Filter.GENRES || filter == Filter.NO_FILTER) { - genreRepository.genres().filter { genre -> - genre.name.lowercase() - .contains(searchString.lowercase()) - } + genreRepository.genres(query) } else { emptyList() } @@ -84,14 +91,21 @@ class RealSearchRepository( results.add(context.resources.getString(R.string.genres)) results.addAll(genres) } - /* val playlist = roomRepository.playlists().filter { playlist -> - playlist.playlistName.toLowerCase(Locale.getDefault()) - .contains(searchString.toLowerCase(Locale.getDefault())) - } - if (playlist.isNotEmpty()) { - results.add(context.getString(R.string.playlists)) - results.addAll(playlist) - }*/ + + /** Playlists **/ + val playlist: List = + if (filter == Filter.PLAYLISTS || filter == Filter.NO_FILTER) { + roomRepository.playlists().filter { playlist -> + playlist.playlistName.lowercase().contains(searchString.lowercase()) + } + } else { + emptyList() + } + + if (playlist.isNotEmpty()) { + results.add(context.getString(R.string.playlists)) + results.addAll(playlist) + } } return results } diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 70452fb5a..496c545a9 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -117,6 +117,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/genres" /> + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5a11aca98..7eb320a8e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -207,7 +207,6 @@ 16sp true 10dp - true 40dp 10dp