From 3e47cfa6aed92aa2ea0629c3c07591bd9c6e06b8 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Thu, 5 Dec 2024 18:46:54 +0530 Subject: [PATCH] Fixed: Books are not displayed on the LocalLibrary screen if a book is deleted from storage after being added to the DAO. * Improved the test cases as well. --- .../kiwixmobile/core/dao/LibkiwixBookmarks.kt | 2 +- .../kiwix/kiwixmobile/core/dao/NewBookDao.kt | 9 ++++----- .../core/utils/SharedPreferenceUtil.kt | 9 ++++++--- .../kiwixmobile/core/dao/NewBookDaoTest.kt | 18 ++++++++++-------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/LibkiwixBookmarks.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/LibkiwixBookmarks.kt index 7d91f87ca..a30ff7e81 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/LibkiwixBookmarks.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/LibkiwixBookmarks.kt @@ -60,7 +60,7 @@ class LibkiwixBookmarks @Inject constructor( manager: Manager, val sharedPreferenceUtil: SharedPreferenceUtil, private val bookDao: NewBookDao, - private val zimReaderContainer: ZimReaderContainer?, + private val zimReaderContainer: ZimReaderContainer? ) : PageDao { /** diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewBookDao.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewBookDao.kt index 5c3fece87..67542c596 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewBookDao.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewBookDao.kt @@ -22,7 +22,6 @@ import io.objectbox.kotlin.inValues import io.objectbox.kotlin.query import io.objectbox.query.QueryBuilder import io.reactivex.rxjava3.core.Completable -import io.reactivex.rxjava3.core.Flowable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -64,12 +63,12 @@ class NewBookDao @Inject constructor(private val box: Box) { .flatMapSingle { bookOnDiskEntity -> // Check if the zimReaderSource exists as a suspend function rxSingle { bookOnDiskEntity.zimReaderSource.exists() } - .flatMap { exists -> - if (exists) io.reactivex.rxjava3.core.Single.just(bookOnDiskEntity) - else io.reactivex.rxjava3.core.Single.never() + .map { exists -> + bookOnDiskEntity to exists } - .onErrorResumeNext { _: Throwable -> io.reactivex.rxjava3.core.Single.never() } } + .filter(Pair::second) + .map(Pair::first) .toList() .toFlowable() } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt index fc1e94a89..1e261a2fa 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt @@ -27,9 +27,11 @@ import androidx.core.content.edit import androidx.preference.PreferenceManager import io.reactivex.Flowable import io.reactivex.processors.PublishProcessor +import kotlinx.coroutines.runBlocking import org.kiwix.kiwixmobile.core.DarkModeConfig import org.kiwix.kiwixmobile.core.DarkModeConfig.Mode.Companion.from import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.extensions.isFileExist import java.io.File import java.util.Locale import javax.inject.Inject @@ -114,9 +116,10 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { putStoragePosition(0) } - !File(storage).exists() -> getPublicDirectoryPath(defaultPublicStorage()).also { - putStoragePosition(0) - } + runBlocking { !File(storage).isFileExist() } -> + getPublicDirectoryPath(defaultPublicStorage()).also { + putStoragePosition(0) + } else -> storage } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewBookDaoTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewBookDaoTest.kt index 2e11f7a29..91209c4d8 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewBookDaoTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/dao/NewBookDaoTest.kt @@ -32,6 +32,8 @@ import io.objectbox.query.Query import io.objectbox.query.QueryBuilder import io.objectbox.rx.RxQuery import io.reactivex.Observable +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach @@ -62,20 +64,20 @@ internal class NewBookDaoTest { inner class BooksTests { @Test fun `books emits entities whose file exists`() { - val (expectedEntity, _) = expectEmissionOfExistingAndNotExistingBook() - val books = newBookDao.books().test().also { - it.awaitTerminalEvent() + runBlocking { + val (expectedEntity, _) = expectEmissionOfExistingAndNotExistingBook() + val books = newBookDao.books().test() + delay(1000) + books.assertValues(listOf(BookOnDisk(expectedEntity))) } - books.assertValues(listOf(BookOnDisk(expectedEntity))) } @SuppressLint("CheckResult") @Test - fun `books deletes entities whose file does not exist`() { + fun `books deletes entities whose file does not exist`() = runBlocking { val (_, deletedEntity) = expectEmissionOfExistingAndNotExistingBook() - newBookDao.books().test().also { - it.awaitTerminalEvent() - } + newBookDao.books().test() + delay(1000) verify { box.remove(listOf(deletedEntity)) } }