Implemented Save/Delete functionality with libkiwix.

This commit is contained in:
MohitMali 2023-09-04 17:07:19 +05:30 committed by MohitMaliFtechiz
parent 627851a127
commit de900fda6f
6 changed files with 72 additions and 71 deletions

View File

@ -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<List<Page>> {
@ -64,36 +68,37 @@ class LibkiwixBookmarks @Inject constructor(
override fun deletePages(pagesToDelete: List<Page>) =
deleteBookmarks(pagesToDelete as List<LibkiwixBookmarkItem>)
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<String> {
return zimFileReader?.let { reader ->
library
.getBookmarks(true)
.map { it.url }
} ?: emptyList()
}
fun bookmarkUrlsForCurrentBook(zimFileReader: ZimFileReader): Flowable<List<String>> {
val book = Book().apply {
update(zimFileReader.jniKiwixReader)
}
library.addBook(book)
val bookMarksList: Flowable<List<String>> = arrayListOf<String>()
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<LibkiwixBookmarkItem>) {
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)
}
}

View File

@ -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 <T> Box<T>.asFlowable(
backpressureStrategy: BackpressureStrategy = LATEST
) =
RxQuery.observable(query).toFlowable(backpressureStrategy)
fun <T> Library.asFlowable(
queryFunction: () -> List<T>,
backpressureStrategy: BackpressureStrategy = BackpressureStrategy.LATEST
): Flowable<List<T>> {
return Flowable.create({ emitter ->
val subscription = this.subscribe {
val results = queryFunction()
emitter.onNext(results)
}
emitter.setCancellable {
subscription.dispose()
}
}, backpressureStrategy)
}

View File

@ -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)

View File

@ -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

View File

@ -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,

View File

@ -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<BookmarkItem, BookmarkState>(bookmarksDao, sharedPrefs, zimReaderContainer) {
) : PageViewModel<BookmarkItem, BookmarkState>(libkiwixBookmarks, sharedPrefs, zimReaderContainer) {
override fun initialState(): BookmarkState =
BookmarkState(emptyList(), sharedPreferenceUtil.showBookmarksAllBooks, zimReaderContainer.id)