From 7dd1a496de1ce15ec2e236191fae5d3d94100253 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:38:49 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20Optimize=20loading=20in?= =?UTF-8?q?=20Browse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Sped up loading in Browse using coroutines Part-of: #91 --- .../repository/FileSystemRepositoryImpl.kt | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt index afd1fcf5..d8f2d48c 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/FileSystemRepositoryImpl.kt @@ -7,6 +7,10 @@ import android.os.Environment import android.os.storage.StorageManager import android.util.Log import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.withContext import ua.acclorite.book_story.R import ua.acclorite.book_story.data.local.room.BookDao @@ -77,17 +81,28 @@ class FileSystemRepositoryImpl @Inject constructor( /** * Get all verified files from directory (root). */ - fun File.getFilesFromDirectory(): List { - return walk().mapNotNull { - if (!it.isValid()) return@mapNotNull null - SelectableFile( - name = it.name, - path = it.path, - size = it.length(), - lastModified = it.lastModified(), - selected = false - ) - }.toList() + suspend fun File.getFilesFromDirectory(): List { + return withContext(Dispatchers.IO) { + val semaphore = Semaphore(5) + walk() + .map { file -> + async { + semaphore.withPermit { + if (!file.isValid()) return@async null + SelectableFile( + name = file.name, + path = file.path, + size = file.length(), + lastModified = file.lastModified(), + selected = false + ) + } + } + } + .toList() + .awaitAll() + .filterNotNull() + } } /** @@ -133,7 +148,7 @@ class FileSystemRepositoryImpl @Inject constructor( val files = mutableListOf() for (volume in storageDirectories) { - files.addAll(withContext(Dispatchers.IO) { volume.getFilesFromDirectory() }) + files.addAll(volume.getFilesFromDirectory()) } Log.i(GET_FILES_FROM_DEVICE, "Successfully got all matching files.")