From de900fda6f22b076d944f13bc4318710b3e45195 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Mon, 4 Sep 2023 17:07:19 +0530 Subject: [PATCH] Implemented Save/Delete functionality with libkiwix. --- .../kiwixmobile/core/dao/LibkiwixBookmarks.kt | 81 +++++++++++-------- .../kiwixmobile/core/dao/NewLanguagesDao.kt | 18 ----- .../remote/ObjectBoxToLibkiwixMigrator.kt | 14 ++-- .../core/main/CoreReaderFragment.kt | 5 ++ .../bookmark/adapter/LibkiwixBookmarkItem.kt | 19 ++--- .../bookmark/viewmodel/BookmarkViewModel.kt | 6 +- 6 files changed, 72 insertions(+), 71 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 b8864bb9f..c03a061b5 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 @@ -18,13 +18,11 @@ package org.kiwix.kiwixmobile.core.dao -import io.objectbox.kotlin.query -import io.objectbox.query.QueryBuilder +import io.reactivex.BackpressureStrategy import io.reactivex.Flowable -import org.kiwix.kiwixmobile.core.dao.entities.BookmarkEntity_ +import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.core.extensions.isFileExist import org.kiwix.kiwixmobile.core.page.adapter.Page -import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem import org.kiwix.kiwixmobile.core.page.bookmark.adapter.LibkiwixBookmarkItem import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil @@ -45,11 +43,17 @@ class LibkiwixBookmarks @Inject constructor( sharedPreferenceUtil.getPublicDirectoryPath(sharedPreferenceUtil.defaultStorage()) + "/kiwix/Bookmarks/" } - private val bookMarksFile: File by lazy { File(bookmarksFolderPath) } + private val bookmarkFile: File by lazy { + File("$bookmarksFolderPath/bookmark.txt") + } init { + // Check if bookmark folder exist if not then create the folder first. if (!File(bookmarksFolderPath).isFileExist()) File(bookmarksFolderPath).mkdir() - manager.readBookmarkFile(bookmarksFolderPath) + // Check if bookmark file exist if not then create the file to save the bookmarks. + if (!bookmarkFile.isFileExist()) bookmarkFile.createNewFile() + // set up manager to read the bookmarks from this file + manager.readBookmarkFile(bookmarkFile.canonicalPath) } fun bookmarks(): Flowable> { @@ -64,36 +68,37 @@ class LibkiwixBookmarks @Inject constructor( override fun deletePages(pagesToDelete: List) = deleteBookmarks(pagesToDelete as List) - fun getCurrentZimBookmarksUrl(zimFileReader: ZimFileReader?) = box.query { - equal( - BookmarkEntity_.zimId, zimFileReader?.id ?: "", - QueryBuilder.StringOrder.CASE_INSENSITIVE - ) - .or() - .equal( - BookmarkEntity_.zimName, zimFileReader?.name ?: "", - QueryBuilder.StringOrder.CASE_INSENSITIVE - ) - order(BookmarkEntity_.bookmarkTitle) - }.property(BookmarkEntity_.bookmarkUrl) - .findStrings() - .toList() - .distinct() + fun getCurrentZimBookmarksUrl(zimFileReader: ZimFileReader?): List { + return zimFileReader?.let { reader -> + library + .getBookmarks(true) + .map { it.url } + } ?: emptyList() + } fun bookmarkUrlsForCurrentBook(zimFileReader: ZimFileReader): Flowable> { - val book = Book().apply { - update(zimFileReader.jniKiwixReader) - } - library.addBook(book) - val bookMarksList: Flowable> = arrayListOf() - library.getBookmarks(true) - .map { + return Flowable.create({ emitter -> + // Create a Book object and add it to the library + val book = Book().apply { + update(zimFileReader.jniKiwixReader) } - return bookMarksList + addBookToLibrary(book) + + // Retrieve bookmarks from the library + val bookmarks = library.getBookmarks(true) + + // Extract URLs from bookmarks + val urls = bookmarks.map { it.url } + + // Emit the list of URLs + emitter.onNext(urls) + emitter.onComplete() + }, BackpressureStrategy.LATEST) + .subscribeOn(Schedulers.io()) } fun saveBookmark(libkiwixBookmarkItem: LibkiwixBookmarkItem) { - library.addBook(libkiwixBookmarkItem.libKiwixBook) + addBookToLibrary(libkiwixBookmarkItem.libKiwixBook) val bookmark = Bookmark().apply { bookId = libkiwixBookmarkItem.zimId title = libkiwixBookmarkItem.title @@ -101,17 +106,25 @@ class LibkiwixBookmarks @Inject constructor( bookTitle = libkiwixBookmarkItem.libKiwixBook?.title ?: libkiwixBookmarkItem.zimId } library.addBookmark(bookmark).also { - // if the book name is not found then takes zim id as file name - val bookMarkFileName = libkiwixBookmarkItem.libKiwixBook?.name ?: libkiwixBookmarkItem.id - library.writeBookmarksToFile("$bookmarksFolderPath/$bookMarkFileName") + writeBookMarksToFile() } } + private fun addBookToLibrary(libKiwixBook: Book?) { + library.addBook(libKiwixBook) + } + fun deleteBookmarks(bookmarks: List) { bookmarks.map { deleteBookmark(it.zimId, it.bookmarkUrl) } } fun deleteBookmark(bookId: String, bookmarkUrl: String) { - library.removeBookmark(bookId, bookmarkUrl) + library.removeBookmark(bookId, bookmarkUrl).also { + writeBookMarksToFile() + } + } + + private fun writeBookMarksToFile() { + library.writeBookmarksToFile(bookmarkFile.canonicalPath) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewLanguagesDao.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewLanguagesDao.kt index 5e029226b..0ea78ceec 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewLanguagesDao.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/dao/NewLanguagesDao.kt @@ -23,10 +23,8 @@ import io.objectbox.query.Query import io.objectbox.rx.RxQuery import io.reactivex.BackpressureStrategy import io.reactivex.BackpressureStrategy.LATEST -import io.reactivex.Flowable import org.kiwix.kiwixmobile.core.dao.entities.LanguageEntity import org.kiwix.kiwixmobile.core.zim_manager.Language -import org.kiwix.libkiwix.Library import javax.inject.Inject import javax.inject.Singleton @@ -48,19 +46,3 @@ internal fun Box.asFlowable( backpressureStrategy: BackpressureStrategy = LATEST ) = RxQuery.observable(query).toFlowable(backpressureStrategy) - -fun Library.asFlowable( - queryFunction: () -> List, - backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST -): Flowable> { - return Flowable.create({ emitter -> - val subscription = this.subscribe { - val results = queryFunction() - emitter.onNext(results) - } - - emitter.setCancellable { - subscription.dispose() - } - }, backpressureStrategy) -} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToLibkiwixMigrator.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToLibkiwixMigrator.kt index d3651b917..5ca0d811a 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToLibkiwixMigrator.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/data/remote/ObjectBoxToLibkiwixMigrator.kt @@ -47,13 +47,13 @@ class ObjectBoxToLibkiwixMigrator { bookMarksList.forEachIndexed { _, bookmarkEntity -> CoroutineScope(Dispatchers.IO).launch { // removing the single entity from the object box after migration. - box.query { - equal( - BookmarkEntity_.bookmarkUrl, - bookmarkEntity.bookmarkUrl, - QueryBuilder.StringOrder.CASE_INSENSITIVE - ) - }.remove() + // box.query { + // equal( + // BookmarkEntity_.bookmarkUrl, + // bookmarkEntity.bookmarkUrl, + // QueryBuilder.StringOrder.CASE_INSENSITIVE + // ) + // }.remove() } } sharedPreferenceUtil.putPrefBookMarkMigrated(true) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt index 3a65c947b..b751c4296 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt @@ -107,6 +107,7 @@ import org.kiwix.kiwixmobile.core.R2 import org.kiwix.kiwixmobile.core.StorageObserver import org.kiwix.kiwixmobile.core.base.BaseFragment import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions +import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.consumeObservable import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.hasNotificationPermission @@ -249,6 +250,10 @@ abstract class CoreReaderFragment : @Inject var newBookmarksDao: NewBookmarksDao? = null + @JvmField + @Inject + var libkiwixBookmarks: LibkiwixBookmarks? = null + @JvmField @Inject var alertDialogShower: DialogShower? = null diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/adapter/LibkiwixBookmarkItem.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/adapter/LibkiwixBookmarkItem.kt index f5e208863..34cb275e5 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/adapter/LibkiwixBookmarkItem.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/adapter/LibkiwixBookmarkItem.kt @@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.core.page.bookmark.adapter import org.kiwix.kiwixmobile.core.page.adapter.Page import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.libkiwix.Book +import org.kiwix.libkiwix.Bookmark data class LibkiwixBookmarkItem( val databaseId: Long = 0L, @@ -35,14 +36,14 @@ data class LibkiwixBookmarkItem( override val id: Long = databaseId, val libKiwixBook: Book?, ) : Page { - /*constructor(libkiwixBookmark: Bookmark, libkiwixBook: Book) : this( - id = 0L, - zimId = libkiwixBookmark.bookId, - zimFilePath = libkiwixBook.url, - zimName = libkiwixBookmark.bookTitle, - bookMarkUrl = libkiwixBookmark.url, - title = libkiwixBookmark.title, - )*/ + // constructor(libkiwixBookmark: Bookmark, libkiwixBook: Book) : this( + // id = 0L, + // zimId = libkiwixBookmark.bookId, + // zimFilePath = libkiwixBook.url, + // zimName = libkiwixBookmark.bookTitle, + // bookMarkUrl = libkiwixBookmark.url, + // title = libkiwixBookmark.title, + // ) constructor( title: String, @@ -50,7 +51,7 @@ data class LibkiwixBookmarkItem( zimFileReader: ZimFileReader, libKiwixBook: Book ) : this( - zimFilePath = libKiwixBook.path, + zimFilePath = zimFileReader.zimFile.canonicalPath, zimId = libKiwixBook.id, zimName = libKiwixBook.name, bookmarkUrl = articleUrl, diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/BookmarkViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/BookmarkViewModel.kt index ebdee2849..8e1fe6f12 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/BookmarkViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/BookmarkViewModel.kt @@ -18,7 +18,7 @@ package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel -import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao +import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.ShowDeleteBookmarksDialog import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.UpdateAllBookmarksPreference @@ -29,10 +29,10 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject class BookmarkViewModel @Inject constructor( - bookmarksDao: NewBookmarksDao, + libkiwixBookmarks: LibkiwixBookmarks, zimReaderContainer: ZimReaderContainer, sharedPrefs: SharedPreferenceUtil -) : PageViewModel(bookmarksDao, sharedPrefs, zimReaderContainer) { +) : PageViewModel(libkiwixBookmarks, sharedPrefs, zimReaderContainer) { override fun initialState(): BookmarkState = BookmarkState(emptyList(), sharedPreferenceUtil.showBookmarksAllBooks, zimReaderContainer.id)