Skip to content

Commit

Permalink
Update 1.1.2 - Fixed #12
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Pinheiro committed Jul 7, 2021
1 parent 3b947ed commit 24eb2f9
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 45 deletions.
8 changes: 8 additions & 0 deletions 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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion README.pt-BR.md
Expand Up @@ -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:
Expand Down
Expand Up @@ -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<Int>("type")!! != 6) {
whereVal = call.argument<Any>("where")!!.toString()
where = checkAudiosFromType(call.argument<Int>("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<Int>("type")!!) {
0, 1, 2, 3 -> {
//where -> Album/Artist/Genre/Playlist ; where -> uri
whereVal = call.argument<Any>("where")!!.toString()
where = checkAudiosFromType(call.argument<Int>("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<Int>("type")!!)
}

}

Expand Down Expand Up @@ -82,53 +85,82 @@ class OnAudiosFromQuery : ViewModel() {
return@withContext songsFromList
}

private fun querySongsFromPlaylist(result: MethodChannel.Result, call: MethodCall) {
val playlistInfo = call.argument<Any>("where")!!
private fun querySongsFromPlaylistOrGenre(result: MethodChannel.Result, call: MethodCall, type: Int) {
val info = call.argument<Any>("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<MutableMap<String, Any>> = withContext(Dispatchers.IO) {
val songsFromPlaylist: ArrayList<MutableMap<String, Any>> = ArrayList()
private suspend fun loadSongsFromPlaylistOrGenre() : ArrayList<MutableMap<String, Any>> =
withContext(Dispatchers.IO) {

val songsFrom: ArrayList<MutableMap<String, Any>> = ArrayList()
val cursor = resolver.query(pUri, songProjection, null, null, null)
while (cursor != null && cursor.moveToNext()) {
val songFromPlData: MutableMap<String, Any> = 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<String, Any> = 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
Expand Down
14 changes: 9 additions & 5 deletions example/lib/main.dart
Expand Up @@ -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.
=============
Expand Down Expand Up @@ -51,16 +52,19 @@ class _SongsState extends State<Songs> {
)
],
),
body: FutureBuilder(
// DEFAULT: SongSortType.TITLE, OrderType.ASC_OR_SMALLER, UriType.EXTERNAL and false
future: OnAudioQuery().querySongs(null, null, null, true),
builder: (context, AsyncSnapshot<List<SongModel>> item) {
body: FutureBuilder<List<SongModel>>(
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),
Expand Down
2 changes: 1 addition & 1 deletion 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
# ========
Expand Down

0 comments on commit 24eb2f9

Please sign in to comment.