From 37418efb537f93c20cf709c71f3b56c17986c9eb Mon Sep 17 00:00:00 2001 From: Frans-Lukas Date: Wed, 1 Jul 2020 20:01:24 +0200 Subject: [PATCH] #2154 more merging of viewmodels bookmark and history --- .../core/page/bookmark/BookmarksActivity.kt | 7 +++++- .../bookmark/viewmodel/BookmarkViewModel.kt | 14 +++++------ .../effects/ShowDeleteBookmarksDialog.kt | 4 +-- .../core/page/history/HistoryActivity.kt | 5 ++++ .../history/viewmodel/HistoryViewModel.kt | 23 +++++------------ .../effects/ShowDeleteHistoryDialog.kt | 4 +-- .../core/page/viewmodel/PageViewModel.kt | 23 +++++++++++++---- .../history/viewmodel/HistoryViewModelTest.kt | 16 ++++++++++-- .../effects/ShowDeleteHistoryDialogTest.kt | 25 +++++++++++++------ 9 files changed, 77 insertions(+), 44 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/BookmarksActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/BookmarksActivity.kt index 343a2fa38..858722f25 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/BookmarksActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/BookmarksActivity.kt @@ -1,11 +1,12 @@ package org.kiwix.kiwixmobile.core.page.bookmark import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.di.components.CoreComponent import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.page.PageActivity import org.kiwix.kiwixmobile.core.page.adapter.PageAdapter -import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.BookmarkViewModel import org.kiwix.kiwixmobile.core.page.adapter.PageDelegate.PageItemDelegate +import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.BookmarkViewModel class BookmarksActivity : PageActivity() { override val pageViewModel by lazy { viewModel(viewModelFactory) } @@ -14,6 +15,10 @@ class BookmarksActivity : PageActivity() { PageAdapter(PageItemDelegate(this)) } + override fun injection(coreComponent: CoreComponent) { + activityComponent.inject(this) + } + override val title: String by lazy { getString(R.string.bookmarks) } override val noItemsString: String by lazy { getString(R.string.no_bookmarks) } override val switchString: String by lazy { getString(R.string.bookmarks_from_current_book) } 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 b86601c2d..50e401e4f 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 @@ -31,13 +31,13 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject class BookmarkViewModel @Inject constructor( - override val pageDao: NewBookmarksDao, + bookmarksDao: NewBookmarksDao, override val zimReaderContainer: ZimReaderContainer, override val sharedPreferenceUtil: SharedPreferenceUtil -) : PageViewModel() { +) : PageViewModel(bookmarksDao) { override fun initialState(): BookmarkState = - BookmarkState(emptyList(), sharedPreferenceUtil.showBookmarksAllBooks, zimReaderContainer.id) + BookmarkState(emptyList(), true, null) init { compositeDisposable.addAll( @@ -61,11 +61,9 @@ class BookmarkViewModel @Inject constructor( return (state as BookmarkState).copy(showAll = action.isChecked) } - override fun offerShowDeleteDialog(state: PageState): PageState { - effects.offer(ShowDeleteBookmarksDialog(effects, state as BookmarkState, pageDao)) - return state - } - override fun deselectAllPages(state: PageState): PageState = (state as BookmarkState).copy(pageItems = state.pageItems.map { it.copy(isSelected = false) }) + + override fun createDeletePageDialogEffect(state: PageState) = + ShowDeleteBookmarksDialog(effects, state as BookmarkState, pageDao) } 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 61579dbf6..a15cd1ac4 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,7 +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.NewBookmarksDao +import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.page.bookmark.BookmarksActivity import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.BookmarkState import org.kiwix.kiwixmobile.core.page.viewmodel.effects.DeletePageItems @@ -33,7 +33,7 @@ import javax.inject.Inject data class ShowDeleteBookmarksDialog( private val effects: PublishProcessor>, private val state: BookmarkState, - private val bookmarksDao: NewBookmarksDao + private val bookmarksDao: PageDao ) : SideEffect { @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/HistoryActivity.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/HistoryActivity.kt index 7e0e12738..b86718f7d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/HistoryActivity.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/HistoryActivity.kt @@ -1,6 +1,7 @@ package org.kiwix.kiwixmobile.core.page.history import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.di.components.CoreComponent import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.page.PageActivity import org.kiwix.kiwixmobile.core.page.adapter.PageAdapter @@ -17,6 +18,10 @@ class HistoryActivity : PageActivity() { PageAdapter(PageItemDelegate(this), HistoryDateDelegate()) } + override fun injection(coreComponent: CoreComponent) { + activityComponent.inject(this) + } + override val noItemsString: String by lazy { getString(R.string.no_history) } override val switchString: String by lazy { getString(R.string.history_from_current_book) } override val title: String by lazy { getString(R.string.history) } 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 399b6a7ea..ebb7291f6 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 @@ -18,7 +18,6 @@ package org.kiwix.kiwixmobile.core.page.history.viewmodel -import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.core.dao.HistoryDao import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem import org.kiwix.kiwixmobile.core.page.history.viewmodel.effects.ShowDeleteHistoryDialog @@ -31,21 +30,13 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject class HistoryViewModel @Inject constructor( - override val pageDao: HistoryDao, override val zimReaderContainer: ZimReaderContainer, - override val sharedPreferenceUtil: SharedPreferenceUtil -) : PageViewModel() { + override val sharedPreferenceUtil: SharedPreferenceUtil, + historyDao: HistoryDao +) : PageViewModel(historyDao) { override fun initialState(): HistoryState = - HistoryState(emptyList(), sharedPreferenceUtil.showHistoryAllBooks, zimReaderContainer.id) - - init { - compositeDisposable.addAll( - viewStateReducer(), - pageDao.pages().subscribeOn(Schedulers.io()) - .subscribe({ actions.offer(Action.UpdatePages(it)) }, Throwable::printStackTrace) - ) - } + HistoryState(emptyList(), true, null) override fun updatePagesBasedOnFilter(state: PageState, action: Action.Filter): PageState = (state as HistoryState).copy(searchTerm = action.searchTerm) @@ -61,10 +52,8 @@ class HistoryViewModel @Inject constructor( return (state as HistoryState).copy(showAll = action.isChecked) } - override fun offerShowDeleteDialog(state: PageState): PageState { - effects.offer(ShowDeleteHistoryDialog(effects, state as HistoryState, pageDao)) - return state - } + override fun createDeletePageDialogEffect(state: PageState) = + ShowDeleteHistoryDialog(effects, state as HistoryState, pageDao) override fun deselectAllPages(state: PageState): PageState = (state as HistoryState).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 85d3cc76f..4aae40d40 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,7 +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.HistoryDao +import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.page.history.HistoryActivity import org.kiwix.kiwixmobile.core.page.history.viewmodel.HistoryState import org.kiwix.kiwixmobile.core.page.viewmodel.effects.DeletePageItems @@ -33,7 +33,7 @@ import javax.inject.Inject data class ShowDeleteHistoryDialog( private val effects: PublishProcessor>, private val state: HistoryState, - private val historyDao: HistoryDao + private val historyDao: PageDao ) : SideEffect { @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { 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 5ed363e1e..f1a94a0e6 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 @@ -23,6 +23,7 @@ import androidx.lifecycle.ViewModel import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable import io.reactivex.processors.PublishProcessor +import io.reactivex.schedulers.Schedulers import org.kiwix.kiwixmobile.core.base.SideEffect import org.kiwix.kiwixmobile.core.dao.PageDao import org.kiwix.kiwixmobile.core.page.viewmodel.Action.Exit @@ -39,17 +40,24 @@ import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.search.viewmodel.effects.Finish import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil -abstract class PageViewModel : ViewModel() { +abstract class PageViewModel(val pageDao: PageDao) : ViewModel() { abstract val zimReaderContainer: ZimReaderContainer abstract val sharedPreferenceUtil: SharedPreferenceUtil - abstract val pageDao: PageDao val state = MutableLiveData().apply { value = initialState() } + val compositeDisposable = CompositeDisposable() val effects = PublishProcessor.create>() val actions = PublishProcessor.create() - val compositeDisposable = CompositeDisposable() + + init { + compositeDisposable.addAll( + viewStateReducer(), + pageDao.pages().subscribeOn(Schedulers.io()) + .subscribe({ actions.offer(Action.UpdatePages(it)) }, Throwable::printStackTrace) + ) + } fun viewStateReducer(): Disposable = actions.map { reduce(it, state.value!!) } @@ -77,6 +85,11 @@ abstract class PageViewModel : ViewModel() { state: PageState ): PageState + private fun offerShowDeleteDialog(state: PageState): PageState { + effects.offer(createDeletePageDialogEffect(state)) + return state + } + private fun handleItemLongClick(state: PageState, action: OnItemLongClick): PageState = state.toggleSelectionOfItem(action.page) @@ -88,8 +101,6 @@ abstract class PageViewModel : ViewModel() { return state } - abstract fun offerShowDeleteDialog(state: PageState): PageState - abstract fun deselectAllPages(state: PageState): PageState private fun finishActivity(state: PageState): PageState { @@ -101,4 +112,6 @@ abstract class PageViewModel : ViewModel() { compositeDisposable.clear() super.onCleared() } + + abstract fun createDeletePageDialogEffect(state: PageState): SideEffect<*> } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModelTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModelTest.kt index 6777f82d7..fefc1af23 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModelTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/HistoryViewModelTest.kt @@ -84,14 +84,26 @@ internal class HistoryViewModelTest { @Test internal fun `UserClickedDeleteButton offers ShowDeleteHistoryDialog`() { viewModel.effects.test().also { viewModel.actions.offer(UserClickedDeleteButton) } - .assertValue(ShowDeleteHistoryDialog(viewModel.effects, historyState(), historyDao)) + .assertValue( + ShowDeleteHistoryDialog( + viewModel.effects, + historyState(), + historyDao + ) + ) viewModel.state.test().assertValue(historyState()) } @Test internal fun `UserClickedDeleteSelectedHistoryItems offers ShowDeleteHistoryDialog`() { viewModel.effects.test().also { viewModel.actions.offer(UserClickedDeleteSelectedPages) } - .assertValue(ShowDeleteHistoryDialog(viewModel.effects, historyState(), historyDao)) + .assertValue( + ShowDeleteHistoryDialog( + viewModel.effects, + historyState(), + historyDao + ) + ) viewModel.state.test().assertValue(historyState()) } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt index c0d579e36..e07a5df26 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt @@ -24,7 +24,12 @@ internal class ShowDeleteHistoryDialogTest { @Test fun `invoke with shows dialog that offers ConfirmDelete action`() { - val showDeleteHistoryDialog = ShowDeleteHistoryDialog(effects, historyState(), historyDao) + val showDeleteHistoryDialog = + ShowDeleteHistoryDialog( + effects, + historyState(), + historyDao + ) mockkActivityInjection(showDeleteHistoryDialog) val lambdaSlot = slot<() -> Unit>() showDeleteHistoryDialog.invokeWith(activity) @@ -35,11 +40,12 @@ internal class ShowDeleteHistoryDialogTest { @Test fun `invoke with selected item shows dialog with delete selected items title`() { - val showDeleteHistoryDialog = ShowDeleteHistoryDialog( - effects, - historyState(listOf(historyItem(isSelected = true))), - historyDao - ) + val showDeleteHistoryDialog = + ShowDeleteHistoryDialog( + effects, + historyState(listOf(historyItem(isSelected = true))), + historyDao + ) mockkActivityInjection(showDeleteHistoryDialog) showDeleteHistoryDialog.invokeWith(activity) verify { dialogShower.show(DeleteSelectedHistory, any()) } @@ -47,7 +53,12 @@ internal class ShowDeleteHistoryDialogTest { @Test fun `invoke with no selected items shows dialog with delete all items title`() { - val showDeleteHistoryDialog = ShowDeleteHistoryDialog(effects, historyState(), historyDao) + val showDeleteHistoryDialog = + ShowDeleteHistoryDialog( + effects, + historyState(), + historyDao + ) mockkActivityInjection(showDeleteHistoryDialog) showDeleteHistoryDialog.invokeWith(activity) verify { dialogShower.show(DeleteAllHistory, any()) }