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 package org.kiwix.kiwixmobile.core.dao
import io.objectbox.kotlin.query import io.reactivex.BackpressureStrategy
import io.objectbox.query.QueryBuilder
import io.reactivex.Flowable 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.extensions.isFileExist
import org.kiwix.kiwixmobile.core.page.adapter.Page 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.page.bookmark.adapter.LibkiwixBookmarkItem
import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.reader.ZimFileReader
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
@ -45,11 +43,17 @@ class LibkiwixBookmarks @Inject constructor(
sharedPreferenceUtil.getPublicDirectoryPath(sharedPreferenceUtil.defaultStorage()) + "/kiwix/Bookmarks/" 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 { init {
// Check if bookmark folder exist if not then create the folder first.
if (!File(bookmarksFolderPath).isFileExist()) File(bookmarksFolderPath).mkdir() 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>> { fun bookmarks(): Flowable<List<Page>> {
@ -64,36 +68,37 @@ class LibkiwixBookmarks @Inject constructor(
override fun deletePages(pagesToDelete: List<Page>) = override fun deletePages(pagesToDelete: List<Page>) =
deleteBookmarks(pagesToDelete as List<LibkiwixBookmarkItem>) deleteBookmarks(pagesToDelete as List<LibkiwixBookmarkItem>)
fun getCurrentZimBookmarksUrl(zimFileReader: ZimFileReader?) = box.query { fun getCurrentZimBookmarksUrl(zimFileReader: ZimFileReader?): List<String> {
equal( return zimFileReader?.let { reader ->
BookmarkEntity_.zimId, zimFileReader?.id ?: "", library
QueryBuilder.StringOrder.CASE_INSENSITIVE .getBookmarks(true)
) .map { it.url }
.or() } ?: emptyList()
.equal( }
BookmarkEntity_.zimName, zimFileReader?.name ?: "",
QueryBuilder.StringOrder.CASE_INSENSITIVE
)
order(BookmarkEntity_.bookmarkTitle)
}.property(BookmarkEntity_.bookmarkUrl)
.findStrings()
.toList()
.distinct()
fun bookmarkUrlsForCurrentBook(zimFileReader: ZimFileReader): Flowable<List<String>> { fun bookmarkUrlsForCurrentBook(zimFileReader: ZimFileReader): Flowable<List<String>> {
val book = Book().apply { return Flowable.create({ emitter ->
update(zimFileReader.jniKiwixReader) // Create a Book object and add it to the library
} val book = Book().apply {
library.addBook(book) update(zimFileReader.jniKiwixReader)
val bookMarksList: Flowable<List<String>> = arrayListOf<String>()
library.getBookmarks(true)
.map {
} }
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) { fun saveBookmark(libkiwixBookmarkItem: LibkiwixBookmarkItem) {
library.addBook(libkiwixBookmarkItem.libKiwixBook) addBookToLibrary(libkiwixBookmarkItem.libKiwixBook)
val bookmark = Bookmark().apply { val bookmark = Bookmark().apply {
bookId = libkiwixBookmarkItem.zimId bookId = libkiwixBookmarkItem.zimId
title = libkiwixBookmarkItem.title title = libkiwixBookmarkItem.title
@ -101,17 +106,25 @@ class LibkiwixBookmarks @Inject constructor(
bookTitle = libkiwixBookmarkItem.libKiwixBook?.title ?: libkiwixBookmarkItem.zimId bookTitle = libkiwixBookmarkItem.libKiwixBook?.title ?: libkiwixBookmarkItem.zimId
} }
library.addBookmark(bookmark).also { library.addBookmark(bookmark).also {
// if the book name is not found then takes zim id as file name writeBookMarksToFile()
val bookMarkFileName = libkiwixBookmarkItem.libKiwixBook?.name ?: libkiwixBookmarkItem.id
library.writeBookmarksToFile("$bookmarksFolderPath/$bookMarkFileName")
} }
} }
private fun addBookToLibrary(libKiwixBook: Book?) {
library.addBook(libKiwixBook)
}
fun deleteBookmarks(bookmarks: List<LibkiwixBookmarkItem>) { fun deleteBookmarks(bookmarks: List<LibkiwixBookmarkItem>) {
bookmarks.map { deleteBookmark(it.zimId, it.bookmarkUrl) } bookmarks.map { deleteBookmark(it.zimId, it.bookmarkUrl) }
} }
fun deleteBookmark(bookId: String, bookmarkUrl: String) { 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.objectbox.rx.RxQuery
import io.reactivex.BackpressureStrategy import io.reactivex.BackpressureStrategy
import io.reactivex.BackpressureStrategy.LATEST import io.reactivex.BackpressureStrategy.LATEST
import io.reactivex.Flowable
import org.kiwix.kiwixmobile.core.dao.entities.LanguageEntity import org.kiwix.kiwixmobile.core.dao.entities.LanguageEntity
import org.kiwix.kiwixmobile.core.zim_manager.Language import org.kiwix.kiwixmobile.core.zim_manager.Language
import org.kiwix.libkiwix.Library
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -48,19 +46,3 @@ internal fun <T> Box<T>.asFlowable(
backpressureStrategy: BackpressureStrategy = LATEST backpressureStrategy: BackpressureStrategy = LATEST
) = ) =
RxQuery.observable(query).toFlowable(backpressureStrategy) 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 -> bookMarksList.forEachIndexed { _, bookmarkEntity ->
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
// removing the single entity from the object box after migration. // removing the single entity from the object box after migration.
box.query { // box.query {
equal( // equal(
BookmarkEntity_.bookmarkUrl, // BookmarkEntity_.bookmarkUrl,
bookmarkEntity.bookmarkUrl, // bookmarkEntity.bookmarkUrl,
QueryBuilder.StringOrder.CASE_INSENSITIVE // QueryBuilder.StringOrder.CASE_INSENSITIVE
) // )
}.remove() // }.remove()
} }
} }
sharedPreferenceUtil.putPrefBookMarkMigrated(true) 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.StorageObserver
import org.kiwix.kiwixmobile.core.base.BaseFragment import org.kiwix.kiwixmobile.core.base.BaseFragment
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions 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.dao.NewBookmarksDao
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.consumeObservable import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.consumeObservable
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.hasNotificationPermission import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.hasNotificationPermission
@ -249,6 +250,10 @@ abstract class CoreReaderFragment :
@Inject @Inject
var newBookmarksDao: NewBookmarksDao? = null var newBookmarksDao: NewBookmarksDao? = null
@JvmField
@Inject
var libkiwixBookmarks: LibkiwixBookmarks? = null
@JvmField @JvmField
@Inject @Inject
var alertDialogShower: DialogShower? = null 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.page.adapter.Page
import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.reader.ZimFileReader
import org.kiwix.libkiwix.Book import org.kiwix.libkiwix.Book
import org.kiwix.libkiwix.Bookmark
data class LibkiwixBookmarkItem( data class LibkiwixBookmarkItem(
val databaseId: Long = 0L, val databaseId: Long = 0L,
@ -35,14 +36,14 @@ data class LibkiwixBookmarkItem(
override val id: Long = databaseId, override val id: Long = databaseId,
val libKiwixBook: Book?, val libKiwixBook: Book?,
) : Page { ) : Page {
/*constructor(libkiwixBookmark: Bookmark, libkiwixBook: Book) : this( // constructor(libkiwixBookmark: Bookmark, libkiwixBook: Book) : this(
id = 0L, // id = 0L,
zimId = libkiwixBookmark.bookId, // zimId = libkiwixBookmark.bookId,
zimFilePath = libkiwixBook.url, // zimFilePath = libkiwixBook.url,
zimName = libkiwixBookmark.bookTitle, // zimName = libkiwixBookmark.bookTitle,
bookMarkUrl = libkiwixBookmark.url, // bookMarkUrl = libkiwixBookmark.url,
title = libkiwixBookmark.title, // title = libkiwixBookmark.title,
)*/ // )
constructor( constructor(
title: String, title: String,
@ -50,7 +51,7 @@ data class LibkiwixBookmarkItem(
zimFileReader: ZimFileReader, zimFileReader: ZimFileReader,
libKiwixBook: Book libKiwixBook: Book
) : this( ) : this(
zimFilePath = libKiwixBook.path, zimFilePath = zimFileReader.zimFile.canonicalPath,
zimId = libKiwixBook.id, zimId = libKiwixBook.id,
zimName = libKiwixBook.name, zimName = libKiwixBook.name,
bookmarkUrl = articleUrl, bookmarkUrl = articleUrl,

View File

@ -18,7 +18,7 @@
package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel 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.adapter.BookmarkItem
import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.ShowDeleteBookmarksDialog import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.ShowDeleteBookmarksDialog
import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.UpdateAllBookmarksPreference 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 import javax.inject.Inject
class BookmarkViewModel @Inject constructor( class BookmarkViewModel @Inject constructor(
bookmarksDao: NewBookmarksDao, libkiwixBookmarks: LibkiwixBookmarks,
zimReaderContainer: ZimReaderContainer, zimReaderContainer: ZimReaderContainer,
sharedPrefs: SharedPreferenceUtil sharedPrefs: SharedPreferenceUtil
) : PageViewModel<BookmarkItem, BookmarkState>(bookmarksDao, sharedPrefs, zimReaderContainer) { ) : PageViewModel<BookmarkItem, BookmarkState>(libkiwixBookmarks, sharedPrefs, zimReaderContainer) {
override fun initialState(): BookmarkState = override fun initialState(): BookmarkState =
BookmarkState(emptyList(), sharedPreferenceUtil.showBookmarksAllBooks, zimReaderContainer.id) BookmarkState(emptyList(), sharedPreferenceUtil.showBookmarksAllBooks, zimReaderContainer.id)