From 8f1f5656525e7d9a7e8c6f5569648a076e5ff337 Mon Sep 17 00:00:00 2001 From: Ryan Harg <3821-ryan_harg@users.noreply.dev.funkwhale.audio> Date: Tue, 21 Jun 2022 08:03:46 +0000 Subject: [PATCH] Bugfix/122 fix resource leakage --- .../ffa/activities/DownloadsActivity.kt | 53 ++++++++++--------- .../ffa/repositories/TracksRepository.kt | 19 ++++--- changes/changelog.d/122.bugfix | 1 + 3 files changed, 37 insertions(+), 36 deletions(-) create mode 100644 changes/changelog.d/122.bugfix diff --git a/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt b/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt index c5a3408..5faa5ff 100644 --- a/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt +++ b/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt @@ -14,7 +14,6 @@ import com.google.android.exoplayer2.offline.DownloadManager import kotlinx.coroutines.Dispatchers.Default import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koin.java.KoinJavaComponent.inject @@ -65,20 +64,19 @@ class DownloadsActivity : AppCompatActivity() { private fun refresh() { lifecycleScope.launch(Main) { - val cursor = exoDownloadManager.downloadIndex.getDownloads() - adapter.downloads.clear() + exoDownloadManager.downloadIndex.getDownloads() + .use { cursor -> + while (cursor.moveToNext()) { + val download = cursor.download - while (cursor.moveToNext()) { - val download = cursor.download - - download.getMetadata()?.let { info -> - adapter.downloads.add( - info.apply { this.download = download } - ) + download.getMetadata()?.let { info -> + adapter.downloads.add( + info.apply { this.download = download } + ) + } + } } - } - adapter.notifyDataSetChanged() } } @@ -101,26 +99,29 @@ class DownloadsActivity : AppCompatActivity() { } private suspend fun refreshProgress() { - val cursor = exoDownloadManager.downloadIndex.getDownloads() + exoDownloadManager.downloadIndex.getDownloads() + .use { cursor -> + while (cursor.moveToNext()) { + val download = cursor.download - while (cursor.moveToNext()) { - val download = cursor.download + download.getMetadata()?.let { info -> + adapter.downloads.withIndex().associate { it.value to it.index } + .filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match -> + if (download.state == Download.STATE_DOWNLOADING + && download.percentDownloaded != (info.download?.percentDownloaded ?: 0) + ) { + withContext(Main) { + adapter.downloads[match.second] = info.apply { + this.download = download + } - download.getMetadata()?.let { info -> - adapter.downloads.withIndex().associate { it.value to it.index } - .filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match -> - if (download.state == Download.STATE_DOWNLOADING && download.percentDownloaded != info.download?.percentDownloaded ?: 0) { - withContext(Main) { - adapter.downloads[match.second] = info.apply { - this.download = download + adapter.notifyItemChanged(match.second) + } } - - adapter.notifyItemChanged(match.second) } - } } + } } - } } inner class DownloadChangedListener : DownloadsAdapter.OnDownloadChangedListener { diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt index 6e14eef..4eb3dd4 100644 --- a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt +++ b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt @@ -42,19 +42,18 @@ class TracksRepository(override val context: Context?, albumId: Int) : companion object { fun getDownloadedIds(exoDownloadManager: DownloadManager): List? { - val cursor = exoDownloadManager.downloadIndex.getDownloads() val ids: MutableList = mutableListOf() - - while (cursor.moveToNext()) { - val download = cursor.download - - download.getMetadata()?.let { - if (download.state == Download.STATE_COMPLETED) { - ids.add(it.id) + exoDownloadManager.downloadIndex.getDownloads() + .use { cursor -> + while (cursor.moveToNext()) { + val download = cursor.download + download.getMetadata()?.let { + if (download.state == Download.STATE_COMPLETED) { + ids.add(it.id) + } + } } } - } - return ids } } diff --git a/changes/changelog.d/122.bugfix b/changes/changelog.d/122.bugfix new file mode 100644 index 0000000..eb3d6bc --- /dev/null +++ b/changes/changelog.d/122.bugfix @@ -0,0 +1 @@ +Fix leaked database cursor resource \ No newline at end of file