From 24eb2f9b30054e04f8820355b04124ea2709606a Mon Sep 17 00:00:00 2001 From: Lucas Pinheiro Date: Wed, 7 Jul 2021 15:49:52 -0300 Subject: [PATCH] Update 1.1.2 - Fixed #12 --- CHANGELOG.md | 8 ++ README.md | 2 +- README.pt-BR.md | 2 +- .../on_audio_query/query/OnAudiosFromQuery.kt | 106 ++++++++++++------ example/lib/main.dart | 14 ++- pubspec.yaml | 2 +- 6 files changed, 89 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eea92b1..b4f5f99f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.1.2] - [07.07.2021] +### Fixes +#### Kotlin +- Fixed `[cursor]` problem when using `[AudiosFromType.GENRE_NAME]` or `[AudiosFromType.GENRE_ID]` on `[queryAudiosFrom]`. - [Fixed #12](https://github.com/LucasPJS/on_audio_query/issues/12) + +### Documentation +- Updated `README` documentation. + ## [1.1.1] - [06.23.2021] ### Features #### Dart/Kotlin diff --git a/README.md b/README.md index c505ab29..16c2ba49 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ NOTE: Feel free to help with readme translations Add the following code to your `pubspec.yaml`: ```yaml dependencies: - on_audio_query: ^1.1.1 + on_audio_query: ^1.1.2 ``` #### Request Permission: diff --git a/README.pt-BR.md b/README.pt-BR.md index 083cfe4c..cc5f4cf4 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -42,7 +42,7 @@ NOTE: Fique à vontade para ajudar nas traduções Adicione o seguinte codigo para seu `pubspec.yaml`: ```yaml dependencies: - on_audio_query: ^1.1.1 + on_audio_query: ^1.1.2 ``` #### Solicitar Permissões: diff --git a/android/src/main/kotlin/com/lucasjosino/on_audio_query/query/OnAudiosFromQuery.kt b/android/src/main/kotlin/com/lucasjosino/on_audio_query/query/OnAudiosFromQuery.kt index 932a2f12..f3590ae1 100644 --- a/android/src/main/kotlin/com/lucasjosino/on_audio_query/query/OnAudiosFromQuery.kt +++ b/android/src/main/kotlin/com/lucasjosino/on_audio_query/query/OnAudiosFromQuery.kt @@ -35,20 +35,23 @@ class OnAudiosFromQuery : ViewModel() { fun querySongsFrom(context: Context, result: MethodChannel.Result, call: MethodCall) { this.context = context ; resolver = context.contentResolver - //where -> Album/Artist/Genre/Playlist ; where -> uri - if (call.argument("type")!! != 6) { - whereVal = call.argument("where")!!.toString() - where = checkAudiosFromType(call.argument("type")!!) - - //Query everything in the Background it's necessary for better performance - viewModelScope.launch { - //Start querying - val resultSongList = loadSongsFrom() - - //Flutter UI will start, but, information still loading - result.success(resultSongList) + when (call.argument("type")!!) { + 0, 1, 2, 3 -> { + //where -> Album/Artist/Genre/Playlist ; where -> uri + whereVal = call.argument("where")!!.toString() + where = checkAudiosFromType(call.argument("type")!!) + + //Query everything in the Background it's necessary for better performance + viewModelScope.launch { + //Start querying + val resultSongList = loadSongsFrom() + + //Flutter UI will start, but, information still loading + result.success(resultSongList) + } } - } else querySongsFromPlaylist(result, call) + 4, 5, 6 -> querySongsFromPlaylistOrGenre(result, call, call.argument("type")!!) + } } @@ -82,53 +85,82 @@ class OnAudiosFromQuery : ViewModel() { return@withContext songsFromList } - private fun querySongsFromPlaylist(result: MethodChannel.Result, call: MethodCall) { - val playlistInfo = call.argument("where")!! + private fun querySongsFromPlaylistOrGenre(result: MethodChannel.Result, call: MethodCall, type: Int) { + val info = call.argument("where")!! //Check if Playlist exists based in Id - val checkedPl = checkPlaylistName(playlistInfo.toString()) - if (!checkedPl) pId = playlistInfo.toString().toInt() + val checkedName = if (type == 4 || type == 5) { + checkName(genreName = info.toString()) + } else checkName(plName = info.toString()) + + if (!checkedName) pId = info.toString().toInt() - pUri = MediaStore.Audio.Playlists.Members.getContentUri("external", pId.toLong()) + // + pUri = if (type == 4 || type == 5) { + MediaStore.Audio.Genres.Members.getContentUri("external", pId.toLong()) + } else MediaStore.Audio.Playlists.Members.getContentUri("external", pId.toLong()) //Query everything in the Background it's necessary for better performance viewModelScope.launch { //Start querying - val resultSongsFromPl = loadSongsFromPlaylist() + val resultSongsFrom = loadSongsFromPlaylistOrGenre() //Flutter UI will start, but, information still loading - result.success(resultSongsFromPl) + result.success(resultSongsFrom) } } - private suspend fun loadSongsFromPlaylist() : ArrayList> = withContext(Dispatchers.IO) { - val songsFromPlaylist: ArrayList> = ArrayList() + private suspend fun loadSongsFromPlaylistOrGenre() : ArrayList> = + withContext(Dispatchers.IO) { + + val songsFrom: ArrayList> = ArrayList() val cursor = resolver.query(pUri, songProjection, null, null, null) while (cursor != null && cursor.moveToNext()) { - val songFromPlData: MutableMap = HashMap() - for (playlistMedia in cursor.columnNames) { - if (cursor.getString(cursor.getColumnIndex(playlistMedia)) != null) { - songFromPlData[playlistMedia] = cursor.getString(cursor.getColumnIndex(playlistMedia)) - } else songFromPlData[playlistMedia] = "" + val songFromData: MutableMap = HashMap() + for (media in cursor.columnNames) { + if (cursor.getString(cursor.getColumnIndex(media)) != null) { + songFromData[media] = cursor.getString(cursor.getColumnIndex(media)) + } else songFromData[media] = "" } + //Artwork + val art = loadArtwork(context, songFromData["album"].toString()) + if (art.isNotEmpty()) songFromData["artwork"] = art + //Extra information from song - val extraInfo = getExtraInfo(songFromPlData["_data"].toString()) - songFromPlData.putAll(extraInfo) + val extraInfo = getExtraInfo(songFromData["_data"].toString()) + songFromData.putAll(extraInfo) + + // + val uri = ContentUris.withAppendedId(uri, songFromData["_id"].toString().toLong()) + songFromData["_uri"] = uri.toString() - songsFromPlaylist.add(songFromPlData) + songsFrom.add(songFromData) } cursor?.close() - return@withContext songsFromPlaylist + return@withContext songsFrom } - //Return true if playlist already exist, false if don't exist - private fun checkPlaylistName(plName: String) : Boolean { - val uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI - val cursor = resolver.query(uri, arrayOf(MediaStore.Audio.Playlists.NAME, MediaStore.Audio.Playlists._ID), null, null, null) + //Return true if playlist or genre exists, false, if don't. + private fun checkName(plName: String? = null, genreName: String? = null) : Boolean { + // + val uri = if (plName == null) MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI else + MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI + + // + val pProjection = if (plName == null) { + arrayOf(MediaStore.Audio.Playlists.NAME, MediaStore.Audio.Playlists._ID) + } else arrayOf(MediaStore.Audio.Genres.NAME, MediaStore.Audio.Genres._ID) + + // + val cursor = resolver.query(uri, pProjection, null, null, null) while (cursor != null && cursor.moveToNext()) { - val playListName = cursor.getString(0) //Id - if (playListName == plName) return true ; pId = cursor.getInt(1) + val name = cursor.getString(0) //Name + + if (name == plName || name == genreName) { + pId = cursor.getInt(1) + return true + } } cursor?.close() return false diff --git a/example/lib/main.dart b/example/lib/main.dart index ba5182df..fb1fdbca 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -6,6 +6,7 @@ Website: https://lucasjosino.com/ ============= Plugin/Id: on_audio_query#0 Homepage: https://github.com/LucasPJS/on_audio_query +Pub: https://pub.dev/packages/on_audio_query License: https://github.com/LucasPJS/on_audio_query/blob/main/LICENSE Copyright: © 2021, Lucas Josino. All rights reserved. ============= @@ -51,16 +52,19 @@ class _SongsState extends State { ) ], ), - body: FutureBuilder( - // DEFAULT: SongSortType.TITLE, OrderType.ASC_OR_SMALLER, UriType.EXTERNAL and false - future: OnAudioQuery().querySongs(null, null, null, true), - builder: (context, AsyncSnapshot> item) { + body: FutureBuilder>( + future: OnAudioQuery().querySongs( + SongSortType.DEFAULT, + OrderType.ASC_OR_SMALLER, + UriType.EXTERNAL, + false, + ), + builder: (context, item) { if (item.data != null) { songList = item.data!; return ListView.builder( itemCount: songList.length, itemBuilder: (context, index) { - print(songList[index].uri); return ListTile( title: Text(songList[index].title), subtitle: Text(songList[index].artist), diff --git a/pubspec.yaml b/pubspec.yaml index bd5a541e..cfdabefe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: on_audio_query description: Flutter Plugin used to query audios/songs infos [title, artist, album, etc..] from device storage. -version: 1.1.1 +version: 1.1.2 homepage: https://github.com/LucasPJS/on_audio_query # pub.dev: https://pub.dev/packages/on_audio_query # ========