From c2446d27c4aae49c524b1a603aa5fa241b9a379f Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Thu, 30 May 2024 12:21:56 +0530 Subject: [PATCH] Refactored the code for saving the history in room database. --- buildSrc/src/main/kotlin/Libs.kt | 2 ++ .../kotlin/plugin/AllProjectConfigurer.kt | 2 ++ .../kotlin/plugin/ConvenienceExtensions.kt | 3 ++ .../core/data/KiwixRoomDatabase.kt | 10 +++++++ .../kiwix/kiwixmobile/core/data/Repository.kt | 10 +++---- .../core/di/components/CoreComponent.kt | 2 ++ .../core/di/modules/DatabaseModule.kt | 4 +++ .../bookmark/viewmodel/BookmarkViewModel.kt | 2 +- .../effects/ShowDeleteBookmarksDialog.kt | 5 ++-- .../history/viewmodel/HistoryViewModel.kt | 7 +++-- .../effects/ShowDeleteHistoryDialog.kt | 5 ++-- .../page/notes/viewmodel/NotesViewModel.kt | 2 +- .../effects/ShowDeleteNotesDialog.kt | 5 ++-- .../core/page/viewmodel/PageViewModel.kt | 30 +++++++++++++++---- .../page/viewmodel/effects/DeletePageItems.kt | 7 +++-- 15 files changed, 71 insertions(+), 25 deletions(-) diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index 8d6432d61..670a53319 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -355,4 +355,6 @@ object Libs { const val roomKtx = "androidx.room:room-ktx:" + Versions.roomVersion const val roomCompiler = "androidx.room:room-compiler:" + Versions.roomVersion + + const val roomRuntime = "androidx.room:room-runtime:" + Versions.roomVersion } diff --git a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt index c879d60de..7d455f588 100644 --- a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt +++ b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt @@ -207,6 +207,8 @@ class AllProjectConfigurer { implementation(Libs.preference_ktx) implementation(Libs.material_show_case_view) implementation(Libs.roomKtx) + annotationProcessor(Libs.roomCompiler) + implementation(Libs.roomRuntime) kapt(Libs.roomCompiler) } } diff --git a/buildSrc/src/main/kotlin/plugin/ConvenienceExtensions.kt b/buildSrc/src/main/kotlin/plugin/ConvenienceExtensions.kt index 33b2f7fb4..0a397888d 100644 --- a/buildSrc/src/main/kotlin/plugin/ConvenienceExtensions.kt +++ b/buildSrc/src/main/kotlin/plugin/ConvenienceExtensions.kt @@ -54,5 +54,8 @@ internal fun DependencyHandlerScope.testImplementation(dependency: String) = internal fun DependencyHandlerScope.implementation(dependency: String) = addDependency("implementation", dependency) +internal fun DependencyHandlerScope.annotationProcessor(dependency: String) = + addDependency("annotationProcessor", dependency) + private fun DependencyHandlerScope.addDependency(configurationName: String, dependency: String) = add(configurationName, dependency) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt index 737fb3c6f..27054cfcb 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/data/KiwixRoomDatabase.kt @@ -23,6 +23,9 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao import org.kiwix.kiwixmobile.core.dao.HistoryRoomDaoCoverts import org.kiwix.kiwixmobile.core.dao.RecentSearchRoomDao import org.kiwix.kiwixmobile.core.dao.entities.HistoryRoomEntity @@ -33,6 +36,7 @@ import org.kiwix.kiwixmobile.core.dao.entities.RecentSearchRoomEntity @TypeConverters(HistoryRoomDaoCoverts::class) abstract class KiwixRoomDatabase : RoomDatabase() { abstract fun recentSearchRoomDao(): RecentSearchRoomDao + abstract fun historyRoomDao(): HistoryRoomDao companion object { private var db: KiwixRoomDatabase? = null @@ -42,10 +46,16 @@ abstract class KiwixRoomDatabase : RoomDatabase() { ?: Room.databaseBuilder(context, KiwixRoomDatabase::class.java, "KiwixRoom.db") // We have already database name called kiwix.db in order to avoid complexity we named // as kiwixRoom.db + // .addMigrations(MIGRATION_1_2) .build() } } + private val MIGRATION_1_2: Migration = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + } + } + fun destroyInstance() { db = null } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/data/Repository.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/data/Repository.kt index 99c1da369..021da2645 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/data/Repository.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/data/Repository.kt @@ -22,7 +22,7 @@ import io.reactivex.Completable import io.reactivex.Flowable import io.reactivex.Scheduler import io.reactivex.Single -import org.kiwix.kiwixmobile.core.dao.HistoryDao +import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks import org.kiwix.kiwixmobile.core.dao.NewBookDao import org.kiwix.kiwixmobile.core.dao.NewLanguagesDao @@ -54,7 +54,7 @@ class Repository @Inject internal constructor( @param:MainThread private val mainThread: Scheduler, private val bookDao: NewBookDao, private val libkiwixBookmarks: LibkiwixBookmarks, - private val historyDao: HistoryDao, + private val historyRoomDao: HistoryRoomDao, private val notesDao: NewNoteDao, private val languageDao: NewLanguagesDao, private val recentSearchRoomDao: RecentSearchRoomDao, @@ -90,17 +90,17 @@ class Repository @Inject internal constructor( .subscribeOn(io) override fun saveHistory(history: HistoryItem) = - Completable.fromAction { historyDao.saveHistory(history) } + Completable.fromAction { historyRoomDao.saveHistory(history) } .subscribeOn(io) override fun deleteHistory(historyList: List) = Completable.fromAction { - historyDao.deleteHistory(historyList.filterIsInstance(HistoryItem::class.java)) + historyRoomDao.deleteHistory(historyList.filterIsInstance(HistoryItem::class.java)) } .subscribeOn(io) override fun clearHistory() = Completable.fromAction { - historyDao.deleteAllHistory() + historyRoomDao.deleteAllHistory() recentSearchRoomDao.deleteSearchHistory() }.subscribeOn(io) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt index 1fd819206..828d20459 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/components/CoreComponent.kt @@ -29,6 +29,7 @@ import org.kiwix.kiwixmobile.core.CoreApp import org.kiwix.kiwixmobile.core.StorageObserver import org.kiwix.kiwixmobile.core.dao.FetchDownloadDao import org.kiwix.kiwixmobile.core.dao.HistoryDao +import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao import org.kiwix.kiwixmobile.core.dao.LibkiwixBookmarks import org.kiwix.kiwixmobile.core.dao.NewBookDao import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao @@ -100,6 +101,7 @@ interface CoreComponent { fun objectBoxToLibkiwixMigrator(): ObjectBoxToLibkiwixMigrator fun libkiwixBookmarks(): LibkiwixBookmarks fun recentSearchRoomDao(): RecentSearchRoomDao + fun historyRoomDao(): HistoryRoomDao fun objectBoxToRoomMigrator(): ObjectBoxToRoomMigrator fun context(): Context fun downloader(): Downloader diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt index 461aed705..1f1896228 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/DatabaseModule.kt @@ -88,4 +88,8 @@ open class DatabaseModule { @Singleton @Provides fun provideNewRecentSearchRoomDao(db: KiwixRoomDatabase) = db.recentSearchRoomDao() + + @Provides + @Singleton + fun provideHistoryDao(db: KiwixRoomDatabase) = db.historyRoomDao() } 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 a955b7b4c..af6206389 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 @@ -65,7 +65,7 @@ class BookmarkViewModel @Inject constructor( state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) }) override fun createDeletePageDialogEffect(state: BookmarkState) = - ShowDeleteBookmarksDialog(effects, state, pageDao) + ShowDeleteBookmarksDialog(effects, state, basePageDao) override fun copyWithNewItems( state: BookmarkState, diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt index 22ba4ad65..ca95c2eb6 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt @@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects import androidx.appcompat.app.AppCompatActivity import io.reactivex.processors.PublishProcessor import org.kiwix.kiwixmobile.core.base.SideEffect +import org.kiwix.kiwixmobile.core.dao.BasePageDao import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent import org.kiwix.kiwixmobile.core.page.bookmark.adapter.LibkiwixBookmarkItem @@ -34,14 +35,14 @@ import javax.inject.Inject data class ShowDeleteBookmarksDialog( private val effects: PublishProcessor>, private val state: PageState, - private val pageDao: PageDao + private val basePageDao: BasePageDao ) : SideEffect { @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { activity.cachedComponent.inject(this) dialogShower.show( if (state.isInSelectionState) DeleteSelectedBookmarks else DeleteAllBookmarks, - { effects.offer(DeletePageItems(state, pageDao)) } + { effects.offer(DeletePageItems(state, basePageDao)) } ) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModel.kt index d7ca9a5c3..ae6e5525f 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModel.kt @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.core.page.history.viewmodel import org.kiwix.kiwixmobile.core.dao.HistoryDao +import org.kiwix.kiwixmobile.core.dao.HistoryRoomDao import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem import org.kiwix.kiwixmobile.core.page.history.viewmodel.effects.ShowDeleteHistoryDialog import org.kiwix.kiwixmobile.core.page.history.viewmodel.effects.UpdateAllHistoryPreference @@ -29,10 +30,10 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject class HistoryViewModel @Inject constructor( - historyDao: HistoryDao, + historyRoomDao: HistoryRoomDao, zimReaderContainer: ZimReaderContainer, sharedPrefs: SharedPreferenceUtil -) : PageViewModel(historyDao, sharedPrefs, zimReaderContainer) { +) : PageViewModel(historyRoomDao, sharedPrefs, zimReaderContainer) { override fun initialState(): HistoryState = HistoryState(emptyList(), sharedPreferenceUtil.showHistoryAllBooks, zimReaderContainer.id) @@ -58,7 +59,7 @@ class HistoryViewModel @Inject constructor( } override fun createDeletePageDialogEffect(state: HistoryState) = - ShowDeleteHistoryDialog(effects, state, pageDao) + ShowDeleteHistoryDialog(effects, state, basePageDao) override fun deselectAllPages(state: HistoryState): HistoryState = state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) }) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt index 9d833fd6e..1e0211a72 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt @@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.core.page.history.viewmodel.effects import androidx.appcompat.app.AppCompatActivity import io.reactivex.processors.PublishProcessor import org.kiwix.kiwixmobile.core.base.SideEffect +import org.kiwix.kiwixmobile.core.dao.BasePageDao import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent import org.kiwix.kiwixmobile.core.page.history.viewmodel.HistoryState @@ -33,13 +34,13 @@ import javax.inject.Inject data class ShowDeleteHistoryDialog( private val effects: PublishProcessor>, private val state: HistoryState, - private val pageDao: PageDao + private val basePageDao: BasePageDao ) : SideEffect { @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { activity.cachedComponent.inject(this) dialogShower.show(if (state.isInSelectionState) DeleteSelectedHistory else DeleteAllHistory, { - effects.offer(DeletePageItems(state, pageDao)) + effects.offer(DeletePageItems(state, basePageDao)) }) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/NotesViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/NotesViewModel.kt index ad7aa7462..d06ff606b 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/NotesViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/NotesViewModel.kt @@ -66,7 +66,7 @@ class NotesViewModel @Inject constructor( state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) }) override fun createDeletePageDialogEffect(state: NotesState) = - ShowDeleteNotesDialog(effects, state, pageDao) + ShowDeleteNotesDialog(effects, state, basePageDao) override fun onItemClick(page: Page) = ShowOpenNoteDialog(effects, page, zimReaderContainer) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/effects/ShowDeleteNotesDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/effects/ShowDeleteNotesDialog.kt index 5a754521d..0781e5e74 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/effects/ShowDeleteNotesDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/notes/viewmodel/effects/ShowDeleteNotesDialog.kt @@ -22,6 +22,7 @@ import org.kiwix.kiwixmobile.core.utils.files.Log import androidx.appcompat.app.AppCompatActivity import io.reactivex.processors.PublishProcessor import org.kiwix.kiwixmobile.core.base.SideEffect +import org.kiwix.kiwixmobile.core.dao.BasePageDao import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent import org.kiwix.kiwixmobile.core.page.notes.viewmodel.NotesState @@ -34,7 +35,7 @@ import javax.inject.Inject data class ShowDeleteNotesDialog( private val effects: PublishProcessor>, private val state: NotesState, - private val pageDao: PageDao + private val basePageDao: BasePageDao ) : SideEffect { @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { @@ -43,7 +44,7 @@ data class ShowDeleteNotesDialog( dialogShower.show( if (state.isInSelectionState) DeleteSelectedNotes else DeleteAllNotes, { - effects.offer(DeletePageItems(state, pageDao)) + effects.offer(DeletePageItems(state, basePageDao)) } ) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/PageViewModel.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/PageViewModel.kt index 7dbfbc817..651bbbd1f 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/PageViewModel.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/PageViewModel.kt @@ -20,12 +20,16 @@ package org.kiwix.kiwixmobile.core.page.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable import io.reactivex.processors.PublishProcessor import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.launch import org.kiwix.kiwixmobile.core.base.SideEffect +import org.kiwix.kiwixmobile.core.dao.BasePageDao import org.kiwix.kiwixmobile.core.dao.PageDao +import org.kiwix.kiwixmobile.core.dao.PageRoomDao import org.kiwix.kiwixmobile.core.page.adapter.Page import org.kiwix.kiwixmobile.core.page.viewmodel.Action.Exit import org.kiwix.kiwixmobile.core.page.viewmodel.Action.ExitActionModeMenu @@ -42,7 +46,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.effects.PopFragmentBackstack import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil abstract class PageViewModel>( - protected val pageDao: PageDao, + protected val basePageDao: BasePageDao, val sharedPreferenceUtil: SharedPreferenceUtil, val zimReaderContainer: ZimReaderContainer ) : ViewModel() { @@ -70,11 +74,25 @@ abstract class PageViewModel>( .subscribe(state::postValue, Throwable::printStackTrace) protected fun addDisposablesToCompositeDisposable() { - compositeDisposable.addAll( - viewStateReducer(), - pageDao.pages().subscribeOn(Schedulers.io()) - .subscribe({ actions.offer(UpdatePages(it)) }, Throwable::printStackTrace) - ) + when (basePageDao) { + is PageDao -> { + compositeDisposable.addAll( + viewStateReducer(), + basePageDao.pages().subscribeOn(Schedulers.io()) + .subscribe({ actions.offer(UpdatePages(it)) }, Throwable::printStackTrace) + ) + } + + is PageRoomDao -> { + viewModelScope.launch { + try { + // basePageDao.pages().collect(::UpdatePages) + } catch (exception: Exception) { + exception.printStackTrace() + } + } + } + } } private fun reduce(action: Action, state: S): S = when (action) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/effects/DeletePageItems.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/effects/DeletePageItems.kt index 3e22c083b..6c2d10e65 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/effects/DeletePageItems.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/viewmodel/effects/DeletePageItems.kt @@ -20,19 +20,20 @@ package org.kiwix.kiwixmobile.core.page.viewmodel.effects import androidx.appcompat.app.AppCompatActivity import org.kiwix.kiwixmobile.core.base.SideEffect +import org.kiwix.kiwixmobile.core.dao.BasePageDao import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.page.adapter.Page import org.kiwix.kiwixmobile.core.page.viewmodel.PageState data class DeletePageItems( private val state: PageState<*>, - private val pageDao: PageDao + private val basePageDao: BasePageDao ) : SideEffect { override fun invokeWith(activity: AppCompatActivity) { if (state.isInSelectionState) { - pageDao.deletePages(state.pageItems.filter(Page::isSelected)) + basePageDao.deletePages(state.pageItems.filter(Page::isSelected)) } else { - pageDao.deletePages(state.pageItems) + basePageDao.deletePages(state.pageItems) } } }