diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt b/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt index 44776a885..bef5f38d1 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/files/FileSearch.kt @@ -65,8 +65,7 @@ class FileSearch @Inject constructor(private val context: Context) { directoryRoots(defaultPath) .minus(Environment.getExternalStorageDirectory().absolutePath) .fold(mutableListOf(), { acc, root -> - if (File(root).isDirectory) acc.addAll(scanDirectory(root)) - acc + acc.apply { addAll(scanDirectory(root)) } }) private fun directoryRoots(defaultPath: String) = listOf( @@ -78,10 +77,10 @@ class FileSearch @Inject constructor(private val context: Context) { private fun scanDirectory(directory: String) = filesMatchingExtensions(directory) ?: emptyList() private fun filesMatchingExtensions(directory: String) = File(directory) - .listFiles { dir, name -> name?.endsWithAny(*zimFileExtensions) ?: false } + .listFiles { _, name -> name.endsWithAny(*zimFileExtensions) } ?.toList() } private fun String.endsWithAny(vararg suffixes: String) = - suffixes.fold(false, {acc, s -> acc or endsWith(s) }) + suffixes.fold(false, { acc, s -> acc or endsWith(s) }) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt index f04614e3b..8552bdd61 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserver.kt @@ -1,6 +1,5 @@ package org.kiwix.kiwixmobile.zim_manager.fileselect_view -import android.util.Log import io.reactivex.functions.BiFunction import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.data.ZimContentProvider @@ -45,18 +44,12 @@ class StorageObserver @Inject constructor( private fun convertToBookOnDisk(file: File): BookOnDisk? { configureZimContentProvider() + var bookOnDisk: BookOnDisk? = null if (ZimContentProvider.canIterate && ZimContentProvider.setZimFile(file.absolutePath) != null) { - try { - return BookOnDisk(book = bookFromZimContentProvider(), file = file) - } catch (e: Exception) { - // TODO 20171215 Consider more elegant approaches. - // This is to see if we can catch the exception at all! - Log.e("kiwix-filesearch", "Problem parsing a book entry from the library file. ", e) - } finally { - resetZimContentProvider() - } + bookOnDisk = BookOnDisk(book = bookFromZimContentProvider(), file = file) } - return null + resetZimContentProvider() + return bookOnDisk } private fun bookFromZimContentProvider() = Book().apply { @@ -72,16 +65,16 @@ class StorageObserver @Inject constructor( language = ZimContentProvider.getLanguage() } + private fun configureZimContentProvider() { + if (ZimContentProvider.zimFileName != null) { + ZimContentProvider.originalFileName = ZimContentProvider.zimFileName + } + } + private fun resetZimContentProvider() { if (ZimContentProvider.originalFileName != "") { ZimContentProvider.setZimFile(ZimContentProvider.originalFileName) } ZimContentProvider.originalFileName = "" } - - private fun configureZimContentProvider() { - if (ZimContentProvider.zimFileName != null) { - ZimContentProvider.originalFileName = ZimContentProvider.zimFileName - } - } } diff --git a/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserverTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserverTest.kt index b4070db8c..0f111ae39 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserverTest.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/StorageObserverTest.kt @@ -22,8 +22,10 @@ import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic +import io.mockk.verify import io.reactivex.processors.PublishProcessor import io.reactivex.schedulers.Schedulers +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -32,6 +34,7 @@ import org.kiwix.kiwixmobile.bookOnDisk import org.kiwix.kiwixmobile.data.ZimContentProvider import org.kiwix.kiwixmobile.database.newdb.dao.NewDownloadDao import org.kiwix.kiwixmobile.downloader.model.DownloadModel +import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.resetSchedulers import org.kiwix.kiwixmobile.setScheduler import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil @@ -108,15 +111,7 @@ class StorageObserverTest { ZimContentProvider.canIterate = true every { ZimContentProvider.setZimFile("This won't match") } returns "" - every { ZimContentProvider.getZimFileTitle() } returns expectedBook.title - every { ZimContentProvider.getId() } returns expectedBook.id - every { ZimContentProvider.getFileSize() } returns expectedBook.size.toInt() - every { ZimContentProvider.getFavicon() } returns expectedBook.favicon - every { ZimContentProvider.getCreator() } returns expectedBook.creator - every { ZimContentProvider.getPublisher() } returns expectedBook.publisher - every { ZimContentProvider.getDate() } returns expectedBook.date - every { ZimContentProvider.getDescription() } returns expectedBook.description - every { ZimContentProvider.getLanguage() } returns expectedBook.language + expect(expectedBook) storageObserver.booksOnFileSystem .test() @@ -134,5 +129,36 @@ class StorageObserverTest { ) ) + assertThat(ZimContentProvider.originalFileName).isEqualTo("") + } + + @Test + fun `zim provider sets zim file to original file name if it exists`() { + every { downloadModel.fileNameFromUrl } returns "test" + every { file.absolutePath } returns "This is not" + + mockkStatic(ZimContentProvider::class) + every { ZimContentProvider.setZimFile(any()) } returns null + ZimContentProvider.zimFileName = "myZimFileName" + storageObserver.booksOnFileSystem + .test() + .also { + downloads.offer(listOf(downloadModel)) + files.offer(listOf(file)) + } + .assertValues(listOf()) + verify { ZimContentProvider.setZimFile("myZimFileName") } + } + + private fun expect(expectedBook: Book) { + every { ZimContentProvider.getZimFileTitle() } returns expectedBook.title + every { ZimContentProvider.getId() } returns expectedBook.id + every { ZimContentProvider.getFileSize() } returns expectedBook.size.toInt() + every { ZimContentProvider.getFavicon() } returns expectedBook.favicon + every { ZimContentProvider.getCreator() } returns expectedBook.creator + every { ZimContentProvider.getPublisher() } returns expectedBook.publisher + every { ZimContentProvider.getDate() } returns expectedBook.date + every { ZimContentProvider.getDescription() } returns expectedBook.description + every { ZimContentProvider.getLanguage() } returns expectedBook.language } }