diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItem.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItem.kt index 2cbcdab550c4..55307e31003b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItem.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItem.kt @@ -4,12 +4,6 @@ import androidx.annotation.ColorRes import androidx.annotation.IdRes import androidx.annotation.StringRes import org.wordpress.android.R -import org.wordpress.android.ui.pages.PageItem.Action.DELETE_PERMANENTLY -import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_DRAFT -import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_TRASH -import org.wordpress.android.ui.pages.PageItem.Action.PUBLISH_NOW -import org.wordpress.android.ui.pages.PageItem.Action.SET_PARENT -import org.wordpress.android.ui.pages.PageItem.Action.VIEW_PAGE import org.wordpress.android.ui.pages.PageItem.Type.DIVIDER import org.wordpress.android.ui.pages.PageItem.Type.EMPTY import org.wordpress.android.ui.pages.PageItem.Type.PAGE @@ -19,7 +13,8 @@ import java.util.Date sealed class PageItem(open val type: Type) { abstract class Page( - open val id: Long, + open val remoteId: Long, + open val localId: Int, open val title: String, open val date: Date, open val labels: List, @@ -34,25 +29,28 @@ sealed class PageItem(open val type: Type) { ) : PageItem(PAGE) data class PublishedPage( - override val id: Long, + override val remoteId: Long, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), override val labelsColor: Int? = null, override var indent: Int = 0, override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, labelsColor = labelsColor, indent = indent, imageUrl = imageUrl, - actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = true, progressBarUiState = progressBarUiState, @@ -60,24 +58,27 @@ sealed class PageItem(open val type: Type) { ) data class DraftPage( - override val id: Long, + override val remoteId: Long, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), override val labelsColor: Int? = null, override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, labelsColor = labelsColor, indent = 0, imageUrl = imageUrl, - actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = true, progressBarUiState = progressBarUiState, @@ -85,24 +86,27 @@ sealed class PageItem(open val type: Type) { ) data class ScheduledPage( - override val id: Long, + override val remoteId: Long, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), override val labelsColor: Int? = null, override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, labelsColor = labelsColor, indent = 0, imageUrl = imageUrl, - actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = true, progressBarUiState = progressBarUiState, @@ -110,24 +114,27 @@ sealed class PageItem(open val type: Type) { ) data class TrashedPage( - override val id: Long, + override val remoteId: Long, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), override val labelsColor: Int? = null, override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, labelsColor = labelsColor, indent = 0, imageUrl = imageUrl, - actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = false, progressBarUiState = progressBarUiState, @@ -160,6 +167,7 @@ sealed class PageItem(open val type: Type) { enum class Action(@IdRes val itemId: Int) { VIEW_PAGE(R.id.view_page), + CANCEL_AUTO_UPLOAD(R.id.cancel_auto_upload), SET_PARENT(R.id.set_parent), PUBLISH_NOW(R.id.publish_now), MOVE_TO_DRAFT(R.id.move_to_draft), diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt index e6ba99d9b208..725823b5a35d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt @@ -10,7 +10,7 @@ class PageItemDiffUtil(val items: List, val result: List) : val oldItem = items[oldItemPosition] val newItem = result[newItemPosition] return oldItem.type == newItem.type && when (oldItem) { - is Page -> oldItem.id == (newItem as Page).id + is Page -> oldItem.remoteId == (newItem as Page).remoteId is ParentPage -> oldItem.id == (newItem as ParentPage).id else -> oldItem == newItem } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt new file mode 100644 index 000000000000..4823fdde3795 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt @@ -0,0 +1,46 @@ +package org.wordpress.android.viewmodel.pages + +import org.wordpress.android.ui.pages.PageItem.Action +import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD +import org.wordpress.android.ui.pages.PageItem.Action.DELETE_PERMANENTLY +import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_DRAFT +import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_TRASH +import org.wordpress.android.ui.pages.PageItem.Action.PUBLISH_NOW +import org.wordpress.android.ui.pages.PageItem.Action.SET_PARENT +import org.wordpress.android.ui.pages.PageItem.Action.VIEW_PAGE +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadFailed +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAFTS +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.SCHEDULED +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.TRASHED +import javax.inject.Inject + +class CreatePageListItemActionsUseCase @Inject constructor() { + fun setupPageActions(listType: PageListType, uploadUiState: PostUploadUiState): Set { + return when (listType) { + SCHEDULED, PUBLISHED -> mutableSetOf( + VIEW_PAGE, + SET_PARENT, + MOVE_TO_DRAFT, + MOVE_TO_TRASH + ).apply { + if (canCancelPendingAutoUpload(uploadUiState)) { + add(CANCEL_AUTO_UPLOAD) + } + } + DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { + if (canCancelPendingAutoUpload(uploadUiState)) { + add(CANCEL_AUTO_UPLOAD) + } + } + TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) + } + } + + private fun canCancelPendingAutoUpload(uploadUiState: PostUploadUiState) = + (uploadUiState is UploadWaitingForConnection || + (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) +} diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressUiStateUseCase.kt similarity index 97% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt rename to WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressUiStateUseCase.kt index 91f766101fe0..946010b86885 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressUiStateUseCase.kt @@ -11,7 +11,7 @@ import javax.inject.Inject typealias ShouldShowOverlay = Boolean -class PageItemUploadProgressHelper @Inject constructor( +class PageItemProgressUiStateUseCase @Inject constructor( private val appPrefsWrapper: AppPrefsWrapper ) { fun getProgressStateForPage( diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListViewModel.kt index 40fbf9ead6d4..a6692117377d 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListViewModel.kt @@ -52,12 +52,13 @@ private const val DEFAULT_INDENT = 0 class PageListViewModel @Inject constructor( private val createPageListItemLabelsUseCase: CreatePageListItemLabelsUseCase, private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase, + private val pageListItemActionsUseCase: CreatePageListItemActionsUseCase, + private val pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase, private val mediaStore: MediaStore, private val postStore: PostStore, private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, - @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - private val progressHelper: PageItemUploadProgressHelper + @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -147,7 +148,7 @@ class PageListViewModel @Inject constructor( } fun onScrollToPageRequested(remotePageId: Long) { - val position = _pages.value?.indexOfFirst { it is Page && it.id == remotePageId } ?: -1 + val position = _pages.value?.indexOfFirst { it is Page && it.remoteId == remotePageId } ?: -1 if (position != -1) { _scrollToPosition.postValue(position) } else { @@ -253,9 +254,15 @@ class PageListViewModel @Inject constructor( val itemUiStateData = createItemUiStateData(it) PublishedPage( - it.remoteId, it.title, it.date, itemUiStateData.labels, itemUiStateData.labelsColor, + it.remoteId, + it.pageId, + it.title, + it.date, + itemUiStateData.labels, + itemUiStateData.labelsColor, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -274,9 +281,13 @@ class PageListViewModel @Inject constructor( val itemUiStateData = createItemUiStateData(it) ScheduledPage( - it.remoteId, it.title, it.date, itemUiStateData.labels, + it.remoteId, it.pageId, + it.title, + it.date, + itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -294,11 +305,13 @@ class PageListViewModel @Inject constructor( val itemUiStateData = createItemUiStateData(it) DraftPage( it.remoteId, + it.pageId, it.title, it.date, itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -314,11 +327,13 @@ class PageListViewModel @Inject constructor( val itemUiStateData = createItemUiStateData(it) TrashedPage( it.remoteId, + it.pageId, it.title, it.date, itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -373,17 +388,19 @@ class PageListViewModel @Inject constructor( ) val (labels, labelColor) = createPageListItemLabelsUseCase.createLabels(postModel, uploadUiState) - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage( + val (progressBarUiState, showOverlay) = pageItemProgressUiStateUseCase.getProgressStateForPage( postModel, uploadUiState ) - return ItemUiStateData(labels, labelColor, progressBarUiState, showOverlay) + val actions = pageListItemActionsUseCase.setupPageActions(listType, uploadUiState) + return ItemUiStateData(labels, labelColor, progressBarUiState, showOverlay, actions) } private data class ItemUiStateData( val labels: List, @ColorRes val labelsColor: Int?, val progressBarUiState: ProgressBarUiState, - val showOverlay: Boolean + val showOverlay: Boolean, + val actions: Set ) } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PagesViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PagesViewModel.kt index dbbc5d27c986..c2b63e73191b 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PagesViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PagesViewModel.kt @@ -26,6 +26,7 @@ import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.modules.UI_THREAD import org.wordpress.android.ui.pages.PageItem.Action +import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD import org.wordpress.android.ui.pages.PageItem.Action.DELETE_PERMANENTLY import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_DRAFT import org.wordpress.android.ui.pages.PageItem.Action.MOVE_TO_TRASH @@ -40,6 +41,7 @@ import org.wordpress.android.ui.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.posts.PreviewStateHelper import org.wordpress.android.ui.posts.RemotePreviewLogicHelper.RemotePreviewType import org.wordpress.android.ui.uploads.UploadStarter +import org.wordpress.android.ui.uploads.UploadUtils import org.wordpress.android.util.AppLog import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.util.NetworkUtilsWrapper @@ -389,32 +391,39 @@ class PagesViewModel when (action) { VIEW_PAGE -> previewPage(page) SET_PARENT -> setParent(page) - MOVE_TO_DRAFT -> changePageStatus(page.id, PageStatus.DRAFT) - MOVE_TO_TRASH -> changePageStatus(page.id, PageStatus.TRASHED) - PUBLISH_NOW -> publishPageNow(page.id) + MOVE_TO_DRAFT -> changePageStatus(page.remoteId, PageStatus.DRAFT) + MOVE_TO_TRASH -> changePageStatus(page.remoteId, PageStatus.TRASHED) + PUBLISH_NOW -> publishPageNow(page.remoteId) DELETE_PERMANENTLY -> deletePage(page) + CANCEL_AUTO_UPLOAD -> cancelPendingAutoUpload(LocalId(page.localId)) } return true } private fun deletePage(page: Page) { performIfNetworkAvailable { - pageListDialogHelper.showDeletePageConfirmationDialog(RemoteId(page.id), page.title) + pageListDialogHelper.showDeletePageConfirmationDialog(RemoteId(page.remoteId), page.title) } } + private fun cancelPendingAutoUpload(pageId: LocalId) { + val page = postStore.getPostByLocalPostId(pageId.value) + val msgRes = UploadUtils.cancelPendingAutoUpload(page, dispatcher) + _showSnackbarMessage.postValue(SnackbarMessageHolder(msgRes)) + } + private fun setParent(page: Page) { performIfNetworkAvailable { trackMenuSelectionEvent(SET_PARENT) - _setPageParent.postValue(pageMap[page.id]) + _setPageParent.postValue(pageMap[page.remoteId]) } } private fun previewPage(page: Page) { launch(defaultDispatcher) { trackMenuSelectionEvent(VIEW_PAGE) - val pageModel = pageMap[page.id] + val pageModel = pageMap[page.remoteId] val post = if (pageModel != null) postStore.getPostByLocalPostId(pageModel.pageId) else null _previewPage.postValue(post) } @@ -469,13 +478,13 @@ class PagesViewModel // TODO We are going to be doing a refactor of the ViewModels related to Pages so that the PostModel is // available without doing subsequent fetches from the PostStore // https://github.com/wordpress-mobile/WordPress-Android/issues/11233 - val page = postStore.getPostByRemotePostId(pageItem.id, site) + val page = postStore.getPostByRemotePostId(pageItem.remoteId, site) // Then check if an autosave revision is available if (pageConflictResolver.hasUnhandledAutoSave(page)) { pageListDialogHelper.showAutoSaveRevisionDialog(page) return } - editPage(RemoteId(pageItem.id)) + editPage(RemoteId(pageItem.remoteId)) } fun onNewPageButtonTapped() { diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/SearchListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/SearchListViewModel.kt index 8585257e97c9..5128830b3e90 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/SearchListViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/SearchListViewModel.kt @@ -22,6 +22,10 @@ import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAFTS +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.SCHEDULED +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.TRASHED import java.util.SortedMap import javax.inject.Inject import javax.inject.Named @@ -29,10 +33,11 @@ import javax.inject.Named class SearchListViewModel @Inject constructor( private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase, + private val pageListItemActionsUseCase: CreatePageListItemActionsUseCase, + private val pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase, private val postStore: PostStore, private val resourceProvider: ResourceProvider, - @Named(UI_SCOPE) private val uiScope: CoroutineScope, - private val progressHelper: PageItemUploadProgressHelper + @Named(UI_SCOPE) private val uiScope: CoroutineScope ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult @@ -98,39 +103,47 @@ class SearchListViewModel pagesViewModel.uploadStatusTracker ) // TODO any reason why we don't show labels in search? - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(postModel, + val (progressBarUiState, showOverlay) = pageItemProgressUiStateUseCase.getProgressStateForPage(postModel, uploadUiState) return when (status) { PageStatus.PUBLISHED, PageStatus.PRIVATE -> PublishedPage( remoteId, + pageId, title, date, + actions = pageListItemActionsUseCase.setupPageActions(PUBLISHED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay ) PageStatus.DRAFT, PageStatus.PENDING -> DraftPage( remoteId, + pageId, title, date, + actions = pageListItemActionsUseCase.setupPageActions(DRAFTS, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay ) PageStatus.TRASHED -> TrashedPage( remoteId, + pageId, title, date, + actions = pageListItemActionsUseCase.setupPageActions(TRASHED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay ) PageStatus.SCHEDULED -> ScheduledPage( remoteId, + pageId, title, date, + actions = pageListItemActionsUseCase.setupPageActions(SCHEDULED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay diff --git a/WordPress/src/main/res/menu/page_more.xml b/WordPress/src/main/res/menu/page_more.xml index bc9e369e290e..c74c0ab62ce0 100644 --- a/WordPress/src/main/res/menu/page_more.xml +++ b/WordPress/src/main/res/menu/page_more.xml @@ -7,6 +7,11 @@ android:orderInCategory="100" android:title="@string/pages_view" app:showAsAction="never"/> + >() @@ -224,13 +226,22 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { + fun `showOverlay is correctly propagated from PageItemProgressUiStateUseCase`() { // Arrange val expectedShowOverlay = true val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn(Pair(mock(), - expectedShowOverlay)) + whenever( + pageItemProgressUiStateUseCase.getProgressStateForPage( + anyOrNull(), + anyOrNull() + ) + ).thenReturn( + Pair( + mock(), + expectedShowOverlay + ) + ) whenever(pagesViewModel.pages).thenReturn(pages) viewModel.start(PUBLISHED, pagesViewModel) @@ -245,12 +256,12 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { + fun `ProgressBarUiState is correctly propagated from PageItemProgressUiStateUseCase`() { // Arrange val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn( Pair( expectedProgressBarUiState, true @@ -276,14 +287,14 @@ class PageListViewModelTest : BaseUnitTest() { whenever(postStore.getPostByLocalPostId(0)).thenReturn(PostModel().also { it.setId(0) }) whenever(postStore.getPostByLocalPostId(1)).thenReturn(PostModel().also { it.setId(1) }) - whenever(progressHelper.getProgressStateForPage(argThat { this.id == 0 }, any())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(argThat { this.id == 0 }, any())).thenReturn( Pair( ProgressBarUiState.Indeterminate, true ) ) - whenever(progressHelper.getProgressStateForPage(argThat { this.id == 1 }, any())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(argThat { this.id == 1 }, any())).thenReturn( Pair( ProgressBarUiState.Hidden, false @@ -317,14 +328,36 @@ class PageListViewModelTest : BaseUnitTest() { assertThat((result[0].first[1] as Page).showOverlay).isEqualTo(false) } + @Test + fun `verify PageListItemActionsUseCase passes the Menu Actions to PublishedPage`() { + // Arrange + val actions = setOf(mock()) + + whenever(pageListItemActionsUseCase.setupPageActions(anyOrNull(), anyOrNull())).thenReturn(actions) + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(PUBLISHED, pagesViewModel) + val result = mutableListOf, Boolean>>() + viewModel.pages.observeForever { result.add(it) } + + // Act + pages.value = listOf(buildPageModel(0)) + + // Assert + assertThat((result[0].first[0] as PublishedPage).actions).isEqualTo(actions) + } + private fun buildPageModel( id: Int, date: Date = Date(0), parent: PageModel? = null, - pageTitle: String? = null + pageTitle: String? = null, + status: PageStatus = PageStatus.PUBLISHED ): PageModel { val title = pageTitle ?: if (id < 10) "Title 0$id" else "Title $id" - return PageModel(site, id, title, PageStatus.PUBLISHED, date, false, id.toLong(), parent, id.toLong()) + return PageModel(site, id, title, status, date, false, id.toLong(), parent, id.toLong()) } private fun assertDivider(pageItem: PageItem) { diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/SearchListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/SearchListViewModelTest.kt index dc941e5c0c29..0b1cc159c246 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/SearchListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/SearchListViewModelTest.kt @@ -43,7 +43,8 @@ class SearchListViewModelTest { @Mock lateinit var resourceProvider: ResourceProvider @Mock lateinit var site: SiteModel @Mock lateinit var pagesViewModel: PagesViewModel - @Mock lateinit var progressHelper: PageItemUploadProgressHelper + @Mock lateinit var pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase + @Mock lateinit var pageListItemActionsUseCase: CreatePageListItemActionsUseCase @Mock lateinit var createUploadStateUseCase: CreatePageUploadUiStateUseCase @Mock lateinit var postStore: PostStore @@ -57,14 +58,15 @@ class SearchListViewModelTest { page = PageModel(site, 1, "title", PUBLISHED, Date(), false, 11L, null, 0) viewModel = SearchListViewModel( createUploadStateUseCase, + pageListItemActionsUseCase, + pageItemProgressUiStateUseCase, postStore, resourceProvider, - TEST_SCOPE, - progressHelper + TEST_SCOPE ) searchPages = MutableLiveData() - whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(any(), any())).thenReturn( Pair( ProgressBarUiState.Hidden, false @@ -126,7 +128,7 @@ class SearchListViewModelTest { } assertThat(searchResult[1]).isInstanceOf(PublishedPage::class.java) (searchResult[1] as PublishedPage).apply { - assertThat(this.id).isEqualTo(publishedPageRemoteId) + assertThat(this.remoteId).isEqualTo(publishedPageRemoteId) } assertThat(searchResult[2]).isInstanceOf(Divider::class.java) (searchResult[2] as Divider).apply { @@ -134,13 +136,14 @@ class SearchListViewModelTest { } assertThat(searchResult[3]).isInstanceOf(DraftPage::class.java) (searchResult[3] as DraftPage).apply { - assertThat(this.id).isEqualTo(draftPageRemoteId) + assertThat(this.remoteId).isEqualTo(draftPageRemoteId) } } @Test fun `passes action to page view model on menu action`() { val clickedPage = PageItem.PublishedPage( + 1, 1, "title", Date(), @@ -148,6 +151,7 @@ class SearchListViewModelTest { 0, 0, null, + mock(), false, ProgressBarUiState.Hidden, false @@ -162,7 +166,17 @@ class SearchListViewModelTest { @Test fun `passes page to page view model on item tapped`() { val clickedPage = PageItem.PublishedPage( - 1, "title", Date(), listOf(), 0, 0, null, false, ProgressBarUiState.Hidden, + 1, + 1, + "title", + Date(), + listOf(), + 0, + 0, + null, + mock(), + false, + ProgressBarUiState.Hidden, false )