From ad2ca94c90066a0b517f24ddebe4d22d35ec7d89 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 19:53:12 -0500 Subject: [PATCH 01/43] added cancel auto upload to menu --- .../src/main/java/org/wordpress/android/ui/pages/PageItem.kt | 1 + WordPress/src/main/res/menu/page_more.xml | 5 +++++ 2 files changed, 6 insertions(+) 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 2e8e6287f123..79f5696fec4e 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 @@ -129,6 +129,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/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"/> + Date: Wed, 5 Feb 2020 19:54:03 -0500 Subject: [PATCH 02/43] made the menu actions mutable so it can be modified for dynamic items --- .../src/main/java/org/wordpress/android/ui/pages/PageItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 79f5696fec4e..d7f53d942385 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 @@ -22,7 +22,7 @@ sealed class PageItem(open val type: Type) { open val labels: List, open var indent: Int, open var imageUrl: String?, - open val actions: Set, + open var actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean ) : PageItem(PAGE) From d31ee95f455ba03116f9ee55678eccd0e10b97f5 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 19:54:03 -0500 Subject: [PATCH 03/43] Revert "made the menu actions mutable so it can be modified for dynamic items" This reverts commit b9b8ca7f2021b0083b91b353c4e68700b9d22c3c. --- .../src/main/java/org/wordpress/android/ui/pages/PageItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d7f53d942385..79f5696fec4e 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 @@ -22,7 +22,7 @@ sealed class PageItem(open val type: Type) { open val labels: List, open var indent: Int, open var imageUrl: String?, - open var actions: Set, + open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean ) : PageItem(PAGE) From d2fd956bbe5a8cc8d2f886a8b11b2c0eab8405ab Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 16:31:52 -0500 Subject: [PATCH 04/43] added logic to setup PageItem Actions. --- .../pages/PageItemUploadProgressHelper.kt | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt index 699203ccff0c..4ad4d4b40a6a 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt @@ -7,6 +7,14 @@ import org.wordpress.android.fluxc.model.post.PostStatus import org.wordpress.android.fluxc.model.post.PostStatus.DRAFT import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.fluxc.store.UploadStore.UploadError +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.ui.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.NothingToUpload @@ -15,8 +23,13 @@ import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUp import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadWaitingForConnection import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadingMedia import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadingPost -import org.wordpress.android.viewmodel.uistate.ProgressBarUiState +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 org.wordpress.android.viewmodel.posts.PostListItemUploadStatus +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import javax.inject.Inject typealias ShouldShowOverlay = Boolean @@ -117,6 +130,40 @@ class PageItemUploadProgressHelper @Inject constructor( } } + fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { + return when (listType) { + PUBLISHED -> { + val actions = mutableSetOf() + if (canCancelPendingAutoUpload(pageId, site)) { + actions.add(CANCEL_AUTO_UPLOAD) + } + + actions.addAll(listOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH)) + actions + } + DRAFTS -> { + val actions = mutableSetOf() + if (canCancelPendingAutoUpload(pageId, site)) { + actions.add(CANCEL_AUTO_UPLOAD) + } + actions.addAll(listOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH)) + actions + } + SCHEDULED -> setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH) + TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) + } + } + + private fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { + val post = postStore.getPostByLocalPostId(pageId.value) + val uploadUiState = createUploadUiState( + uploadStatusTracker.getUploadStatus(post, site), + post + ) + return (uploadUiState is UploadWaitingForConnection || + (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) + } + private fun shouldShowOverlay(uploadUiState: PostUploadUiState): Boolean { // show overlay when post upload is in progress or (media upload is in progress and the user is not using Aztec) return (uploadUiState is UploadingPost || From 10f5abbf3bb7a513e7caec33a0f4863f428b7e05 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 16:34:45 -0500 Subject: [PATCH 05/43] override actions in base class so that they can be set at initialization --- .../java/org/wordpress/android/ui/pages/PageItem.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 3c9043b5105e..753c93492d98 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 @@ -37,6 +37,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), 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 @@ -47,7 +48,7 @@ sealed class PageItem(open val type: Type) { labels = labels, 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,6 +61,7 @@ sealed class PageItem(open val type: Type) { override val date: Date, override val labels: List = emptyList(), override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean @@ -70,7 +72,7 @@ sealed class PageItem(open val type: Type) { labels = labels, indent = 0, imageUrl = imageUrl, - actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = true, progressBarUiState = progressBarUiState, @@ -83,6 +85,7 @@ sealed class PageItem(open val type: Type) { override val date: Date, override val labels: List = emptyList(), override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean @@ -93,7 +96,7 @@ sealed class PageItem(open val type: Type) { labels = labels, indent = 0, imageUrl = imageUrl, - actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = true, progressBarUiState = progressBarUiState, @@ -105,6 +108,7 @@ sealed class PageItem(open val type: Type) { override val title: String, override val date: Date, override var imageUrl: String? = null, + override val actions: Set, override var actionsEnabled: Boolean = true, override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean @@ -115,7 +119,7 @@ sealed class PageItem(open val type: Type) { labels = emptyList(), indent = 0, imageUrl = imageUrl, - actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), + actions = actions, actionsEnabled = actionsEnabled, tapActionEnabled = false, progressBarUiState = progressBarUiState, From e921872dea7c865bc694e958ec8781d6b97829a6 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 16:42:21 -0500 Subject: [PATCH 06/43] renamed helper to uistatehelper since it contains logic for other stuff --- ...gressHelper.kt => PageItemUiStateHelper.kt} | 14 +++++++------- .../viewmodel/pages/PageListViewModel.kt | 12 ++++++------ .../viewmodel/pages/SearchListViewModel.kt | 4 ++-- .../viewmodel/pages/PageListViewModelTest.kt | 18 +++++++++--------- .../viewmodel/pages/SearchListViewModelTest.kt | 6 +++--- 5 files changed, 27 insertions(+), 27 deletions(-) rename WordPress/src/main/java/org/wordpress/android/viewmodel/pages/{PageItemUploadProgressHelper.kt => PageItemUiStateHelper.kt} (91%) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt similarity index 91% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt rename to WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 4ad4d4b40a6a..85fcbf645c49 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -17,12 +17,12 @@ 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.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.NothingToUpload -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadFailed -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadQueued -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadWaitingForConnection -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadingMedia -import org.wordpress.android.viewmodel.pages.PageItemUploadProgressHelper.PostUploadUiState.UploadingPost +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.NothingToUpload +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadFailed +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadQueued +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadWaitingForConnection +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadingMedia +import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadingPost 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 @@ -34,7 +34,7 @@ import javax.inject.Inject typealias ShouldShowOverlay = Boolean -class PageItemUploadProgressHelper @Inject constructor( +class PageItemUiStateHelper @Inject constructor( private val appPrefsWrapper: AppPrefsWrapper, private val postStore: PostStore, val uploadStatusTracker: PostModelUploadStatusTracker 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 32b49e8521a2..ffa2ce530dda 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 @@ -50,7 +50,7 @@ class PageListViewModel @Inject constructor( private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - private val progressHelper: PageItemUploadProgressHelper + private val pageItemUiStateHelper: PageItemUiStateHelper ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -156,7 +156,7 @@ class PageListViewModel @Inject constructor( } private val uploadStatusObserver = Observer> { ids -> - progressHelper.uploadStatusTracker.invalidateUploadStatus(ids.map { localId -> localId.value }) + pageItemUiStateHelper.uploadStatusTracker.invalidateUploadStatus(ids.map { localId -> localId.value }) } private fun loadPagesAsync(pages: List) = launch { @@ -248,7 +248,7 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(LocalId(it.pageId), pagesViewModel.site) PublishedPage( @@ -273,7 +273,7 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_changes) - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage( + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage( LocalId(it.pageId), pagesViewModel.site) @@ -300,7 +300,7 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_draft) - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(LocalId(it.pageId), pagesViewModel.site) DraftPage( it.remoteId, @@ -320,7 +320,7 @@ class PageListViewModel @Inject constructor( actionsEnabled: Boolean ): List { return pages.map { - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(LocalId(it.pageId), pagesViewModel.site) TrashedPage( it.remoteId, 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 579d9422796b..179a27b47724 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 @@ -30,7 +30,7 @@ class SearchListViewModel @Inject constructor( private val resourceProvider: ResourceProvider, @Named(UI_SCOPE) private val uiScope: CoroutineScope, - private val progressHelper: PageItemUploadProgressHelper + private val pageItemUiStateHelper: PageItemUiStateHelper ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult @@ -88,7 +88,7 @@ class SearchListViewModel } private fun PageModel.toPageItem(areActionsEnabled: Boolean): PageItem { - val progressState = progressHelper.getProgressStateForPage(LocalId(pageId), pagesViewModel.site) + val progressState = pageItemUiStateHelper.getProgressStateForPage(LocalId(pageId), pagesViewModel.site) return when (status) { PageStatus.PUBLISHED, PageStatus.PRIVATE -> diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index 7b4cf46e8b9d..6b4ba0e8e65e 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -34,7 +34,7 @@ class PageListViewModelTest : BaseUnitTest() { @Mock lateinit var dispatcher: Dispatcher @Mock lateinit var pagesViewModel: PagesViewModel @Mock lateinit var localeManagerWrapper: LocaleManagerWrapper - @Mock lateinit var progressHelper: PageItemUploadProgressHelper + @Mock lateinit var pageItemUiStateHelper: PageItemUiStateHelper private lateinit var viewModel: PageListViewModel private val site = SiteModel() @@ -46,10 +46,10 @@ class PageListViewModelTest : BaseUnitTest() { dispatcher, localeManagerWrapper, Dispatchers.Unconfined, - progressHelper + pageItemUiStateHelper ) - whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn(Pair( + whenever(pageItemUiStateHelper.getProgressStateForPage(any(), any())).thenReturn(Pair( ProgressBarUiState.Hidden, false)) val invalidateUploadStatus = MutableLiveData>() @@ -206,12 +206,12 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { + fun `showOverlay is correctly propagated from PageItemUploadpageItemUiStateHelper`() { // Arrange val expectedShowOverlay = true val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn(Pair(mock(), + whenever(pageItemUiStateHelper.getProgressStateForPage(LocalId(0), site)).thenReturn(Pair(mock(), expectedShowOverlay)) whenever(pagesViewModel.pages).thenReturn(pages) @@ -227,12 +227,12 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { + fun `ProgressBarUiState is correctly propagated from PageItemUploadpageItemUiStateHelper`() { // Arrange val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( + whenever(pageItemUiStateHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( expectedProgressBarUiState, true @@ -255,14 +255,14 @@ class PageListViewModelTest : BaseUnitTest() { fun `progressState is specific to each page`() { // Arrange val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( + whenever(pageItemUiStateHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( ProgressBarUiState.Indeterminate, true ) ) - whenever(progressHelper.getProgressStateForPage(LocalId(1), site)).thenReturn( + whenever(pageItemUiStateHelper.getProgressStateForPage(LocalId(1), site)).thenReturn( Pair( ProgressBarUiState.Hidden, false 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 3508765ade80..a14c34ff5c0a 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 @@ -38,7 +38,7 @@ 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 pageItemUiStateHelper: PageItemUiStateHelper private lateinit var searchPages: MutableLiveData>> private lateinit var viewModel: SearchListViewModel @@ -48,10 +48,10 @@ class SearchListViewModelTest { @Before fun setUp() { page = PageModel(site, 1, "title", PUBLISHED, Date(), false, 11L, null, 0) - viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, progressHelper) + viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, pageItemUiStateHelper) searchPages = MutableLiveData() - whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn( + whenever(pageItemUiStateHelper.getProgressStateForPage(any(), any())).thenReturn( Pair( ProgressBarUiState.Hidden, false From 6b311471f3d6910a625c6f2789060444abd3e81e Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 16:48:17 -0500 Subject: [PATCH 07/43] simplified action set creation. --- .../viewmodel/pages/PageItemUiStateHelper.kt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 85fcbf645c49..aa322d11793c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -132,23 +132,18 @@ class PageItemUiStateHelper @Inject constructor( fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { return when (listType) { - PUBLISHED -> { - val actions = mutableSetOf() + PUBLISHED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { if (canCancelPendingAutoUpload(pageId, site)) { - actions.add(CANCEL_AUTO_UPLOAD) + add(CANCEL_AUTO_UPLOAD) } - - actions.addAll(listOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH)) - actions } - DRAFTS -> { - val actions = mutableSetOf() + + DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { if (canCancelPendingAutoUpload(pageId, site)) { - actions.add(CANCEL_AUTO_UPLOAD) + add(CANCEL_AUTO_UPLOAD) } - actions.addAll(listOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH)) - actions } + SCHEDULED -> setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH) TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) } From 76be9bfdf3da6707c92ce6bded406bbdd1192cc8 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:06:02 -0500 Subject: [PATCH 08/43] added dynamic action generation to pages. --- .../viewmodel/pages/PageListViewModel.kt | 20 ++++++++++++++++ .../viewmodel/pages/SearchListViewModel.kt | 23 +++++++++++++++++++ 2 files changed, 43 insertions(+) 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 ffa2ce530dda..58b3b2b2ced0 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 @@ -254,6 +254,11 @@ class PageListViewModel @Inject constructor( PublishedPage( it.remoteId, it.title, it.date, labels, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), + pageItemUiStateHelper.setupPageActions( + listType, + LocalId(it.pageId), + pagesViewModel.site + ), actionsEnabled, progressBarUiState, showOverlay @@ -280,6 +285,11 @@ class PageListViewModel @Inject constructor( ScheduledPage( it.remoteId, it.title, it.date, labels, getFeaturedImageUrl(it.featuredImageId), + pageItemUiStateHelper.setupPageActions( + listType, + LocalId(it.pageId), + pagesViewModel.site + ), actionsEnabled, progressBarUiState, showOverlay @@ -308,6 +318,11 @@ class PageListViewModel @Inject constructor( it.date, labels, getFeaturedImageUrl(it.featuredImageId), + pageItemUiStateHelper.setupPageActions( + listType, + LocalId(it.pageId), + pagesViewModel.site + ), actionsEnabled, progressBarUiState, showOverlay @@ -327,6 +342,11 @@ class PageListViewModel @Inject constructor( it.title, it.date, getFeaturedImageUrl(it.featuredImageId), + pageItemUiStateHelper.setupPageActions( + listType, + LocalId(it.pageId), + pagesViewModel.site + ), actionsEnabled, progressBarUiState, showOverlay 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 179a27b47724..11445b97f9ab 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,9 @@ 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.TRASHED import java.util.SortedMap import javax.inject.Inject import javax.inject.Named @@ -96,6 +99,11 @@ class SearchListViewModel remoteId, title, date, + actions = pageItemUiStateHelper.setupPageActions( + PUBLISHED, + LocalId(pageId), + pagesViewModel.site + ), actionsEnabled = areActionsEnabled, progressBarUiState = progressState.first, showOverlay = progressState.second @@ -104,6 +112,11 @@ class SearchListViewModel remoteId, title, date, + actions = pageItemUiStateHelper.setupPageActions( + DRAFTS, + LocalId(pageId), + pagesViewModel.site + ), actionsEnabled = areActionsEnabled, progressBarUiState = progressState.first, showOverlay = progressState.second @@ -112,6 +125,11 @@ class SearchListViewModel remoteId, title, date, + actions = pageItemUiStateHelper.setupPageActions( + TRASHED, + LocalId(pageId), + pagesViewModel.site + ), actionsEnabled = areActionsEnabled, progressBarUiState = progressState.first, showOverlay = progressState.second @@ -120,6 +138,11 @@ class SearchListViewModel remoteId, title, date, + actions = pageItemUiStateHelper.setupPageActions( + PUBLISHED, + LocalId(pageId), + pagesViewModel.site + ), actionsEnabled = areActionsEnabled, progressBarUiState = progressState.first, showOverlay = progressState.second From c412101415b5eab404a9db3ef8026801e327719e Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:07:24 -0500 Subject: [PATCH 09/43] fixed test issue in SearchListViewModelTest due to page action changes --- .../android/viewmodel/pages/SearchListViewModelTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 a14c34ff5c0a..bc4fbe10560f 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 @@ -3,6 +3,7 @@ package org.wordpress.android.viewmodel.pages import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.lifecycle.MutableLiveData import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import org.assertj.core.api.Assertions.assertThat @@ -129,6 +130,7 @@ class SearchListViewModelTest { listOf(), 0, null, + mock(), false, ProgressBarUiState.Hidden, false @@ -143,7 +145,7 @@ class SearchListViewModelTest { @Test fun `passes page to page view model on item tapped`() { val clickedPage = PageItem.PublishedPage( - 1, "title", Date(), listOf(), 0, null, false, ProgressBarUiState.Hidden, + 1, "title", Date(), listOf(), 0, null, mock(), false, ProgressBarUiState.Hidden, false ) From 3f1c9c0ff89f3b817ce387261de10c94c0751446 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:21:56 -0500 Subject: [PATCH 10/43] Added logic to do cancel of auto upload. Fixed import logic. --- .../android/viewmodel/pages/PagesViewModel.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 d0e98d749384..f5e13f4a7545 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 @@ -21,11 +21,13 @@ import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus +import org.wordpress.android.fluxc.model.page.PageStatus.DRAFT import org.wordpress.android.fluxc.store.PageStore 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 @@ -39,6 +41,7 @@ import org.wordpress.android.ui.posts.PostListRemotePreviewState 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 @@ -374,10 +377,11 @@ class PagesViewModel when (action) { VIEW_PAGE -> previewPage(page) SET_PARENT -> setParent(page) - MOVE_TO_DRAFT -> changePageStatus(page.id, PageStatus.DRAFT) + MOVE_TO_DRAFT -> changePageStatus(page.id, DRAFT) MOVE_TO_TRASH -> changePageStatus(page.id, PageStatus.TRASHED) PUBLISH_NOW -> publishPageNow(page.id) DELETE_PERMANENTLY -> deletePage(page) + CANCEL_AUTO_UPLOAD -> cancelPendingAutoUpload(RemoteId(page.id), site) } return true } @@ -388,6 +392,12 @@ class PagesViewModel } } + private fun cancelPendingAutoUpload(pageId :RemoteId, site: SiteModel) { + val page = postStore.getPostByRemotePostId(pageId.value, site) + val msgRes = UploadUtils.cancelPendingAutoUpload(page, dispatcher) + _showSnackbarMessage.postValue(SnackbarMessageHolder(msgRes)) + } + private fun setParent(page: Page) { performIfNetworkAvailable { trackMenuSelectionEvent(SET_PARENT) From b89ffec8cfd0faff85190e45dda330609e10d750 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:37:03 -0500 Subject: [PATCH 11/43] fixed formatting issues. --- .../wordpress/android/viewmodel/pages/PageListViewModel.kt | 6 ++++-- .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 2 +- .../android/viewmodel/pages/SearchListViewModelTest.kt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) 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 58b3b2b2ced0..7c5b58639e5d 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 @@ -248,8 +248,10 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(LocalId(it.pageId), - pagesViewModel.site) + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage( + LocalId(it.pageId), + pagesViewModel.site + ) PublishedPage( it.remoteId, it.title, it.date, labels, pageItemIndent, 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 f5e13f4a7545..28d90ad46f93 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 @@ -392,7 +392,7 @@ class PagesViewModel } } - private fun cancelPendingAutoUpload(pageId :RemoteId, site: SiteModel) { + private fun cancelPendingAutoUpload(pageId: RemoteId, site: SiteModel) { val page = postStore.getPostByRemotePostId(pageId.value, site) val msgRes = UploadUtils.cancelPendingAutoUpload(page, dispatcher) _showSnackbarMessage.postValue(SnackbarMessageHolder(msgRes)) 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 bc4fbe10560f..bc7ae54e3d44 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 @@ -130,7 +130,7 @@ class SearchListViewModelTest { listOf(), 0, null, - mock(), + mock(), false, ProgressBarUiState.Hidden, false From eee0dbc71791b676cf41183642978ff975ed2162 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:43:25 -0500 Subject: [PATCH 12/43] add cancel auto upload action to scheduled pages. --- .../android/viewmodel/pages/PageItemUiStateHelper.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index aa322d11793c..da71a1be5153 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -144,7 +144,11 @@ class PageItemUiStateHelper @Inject constructor( } } - SCHEDULED -> setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH) + SCHEDULED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { + if (canCancelPendingAutoUpload(pageId, site)) { + add(CANCEL_AUTO_UPLOAD) + } + } TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) } } From e63146a4b39a75e56c1f8f59e24f119926eb43a1 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 17:46:41 -0500 Subject: [PATCH 13/43] removed unused imports from PageItem. --- .../main/java/org/wordpress/android/ui/pages/PageItem.kt | 6 ------ 1 file changed, 6 deletions(-) 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 753c93492d98..de8f5f16e96c 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 @@ -3,12 +3,6 @@ package org.wordpress.android.ui.pages 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 From 4caff1cdb1c2c29f52eb313606748234f60dace1 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 18:50:28 -0500 Subject: [PATCH 14/43] added local id to page.renamed id to remoteId to avoid confusion. --- .../wordpress/android/ui/pages/PageItem.kt | 27 ++++++++++++------- .../android/ui/pages/PageItemDiffUtil.kt | 2 +- .../android/ui/pages/PagesFragment.kt | 4 +-- .../viewmodel/pages/PageListViewModel.kt | 8 +++--- .../android/viewmodel/pages/PagesViewModel.kt | 14 +++++----- .../viewmodel/pages/SearchListViewModel.kt | 4 +++ .../pages/SearchListViewModelTest.kt | 7 ++--- 7 files changed, 41 insertions(+), 25 deletions(-) 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 de8f5f16e96c..756955490316 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 @@ -11,7 +11,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, @@ -25,7 +26,8 @@ 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(), @@ -36,7 +38,8 @@ sealed class PageItem(open val type: Type) { override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, @@ -50,7 +53,8 @@ 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(), @@ -60,7 +64,8 @@ sealed class PageItem(open val type: Type) { override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, @@ -74,7 +79,8 @@ 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(), @@ -84,7 +90,8 @@ sealed class PageItem(open val type: Type) { override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = labels, @@ -98,7 +105,8 @@ 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 var imageUrl: String? = null, @@ -107,7 +115,8 @@ sealed class PageItem(open val type: Type) { override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( - id = id, + remoteId = remoteId, + localId = localId, title = title, date = date, labels = emptyList(), 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/ui/pages/PagesFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt index dec2c9e56596..7211da3ff1bc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt @@ -411,13 +411,13 @@ class PagesFragment : Fragment() { private fun displayDeleteDialog(page: Page) { val dialog = BasicFragmentDialog() dialog.initialize( - page.id.toString(), + page.remoteId.toString(), getString(R.string.delete_page), getString(R.string.page_delete_dialog_message, page.title), getString(R.string.delete), getString(R.string.cancel) ) - dialog.show(fragmentManager, page.id.toString()) + dialog.show(fragmentManager, page.remoteId.toString()) } override fun onStart() { 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 7c5b58639e5d..7c09b0b74b6c 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 @@ -139,7 +139,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 { @@ -254,7 +254,7 @@ class PageListViewModel @Inject constructor( ) PublishedPage( - it.remoteId, it.title, it.date, labels, pageItemIndent, + it.remoteId, it.pageId, it.title, it.date, labels, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), pageItemUiStateHelper.setupPageActions( listType, @@ -285,7 +285,7 @@ class PageListViewModel @Inject constructor( pagesViewModel.site) ScheduledPage( - it.remoteId, it.title, it.date, labels, + it.remoteId, it.pageId, it.title, it.date, labels, getFeaturedImageUrl(it.featuredImageId), pageItemUiStateHelper.setupPageActions( listType, @@ -316,6 +316,7 @@ class PageListViewModel @Inject constructor( pagesViewModel.site) DraftPage( it.remoteId, + it.pageId, it.title, it.date, labels, @@ -341,6 +342,7 @@ class PageListViewModel @Inject constructor( pagesViewModel.site) TrashedPage( it.remoteId, + it.pageId, it.title, it.date, getFeaturedImageUrl(it.featuredImageId), 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 28d90ad46f93..1120eefafdd7 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 @@ -377,11 +377,11 @@ class PagesViewModel when (action) { VIEW_PAGE -> previewPage(page) SET_PARENT -> setParent(page) - MOVE_TO_DRAFT -> changePageStatus(page.id, DRAFT) - MOVE_TO_TRASH -> changePageStatus(page.id, PageStatus.TRASHED) - PUBLISH_NOW -> publishPageNow(page.id) + MOVE_TO_DRAFT -> changePageStatus(page.remoteId, DRAFT) + MOVE_TO_TRASH -> changePageStatus(page.remoteId, PageStatus.TRASHED) + PUBLISH_NOW -> publishPageNow(page.remoteId) DELETE_PERMANENTLY -> deletePage(page) - CANCEL_AUTO_UPLOAD -> cancelPendingAutoUpload(RemoteId(page.id), site) + CANCEL_AUTO_UPLOAD -> cancelPendingAutoUpload(LocalId(page.localId)) } return true } @@ -402,14 +402,14 @@ class PagesViewModel 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) } @@ -467,7 +467,7 @@ class PagesViewModel } fun onItemTapped(pageItem: Page) { - _editPage.postValue(pageMap[pageItem.id]) + _editPage.postValue(pageMap[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 11445b97f9ab..801618e3f4d4 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 @@ -97,6 +97,7 @@ class SearchListViewModel PageStatus.PUBLISHED, PageStatus.PRIVATE -> PublishedPage( remoteId, + pageId, title, date, actions = pageItemUiStateHelper.setupPageActions( @@ -110,6 +111,7 @@ class SearchListViewModel ) PageStatus.DRAFT, PageStatus.PENDING -> DraftPage( remoteId, + pageId, title, date, actions = pageItemUiStateHelper.setupPageActions( @@ -123,6 +125,7 @@ class SearchListViewModel ) PageStatus.TRASHED -> TrashedPage( remoteId, + pageId, title, date, actions = pageItemUiStateHelper.setupPageActions( @@ -136,6 +139,7 @@ class SearchListViewModel ) PageStatus.SCHEDULED -> ScheduledPage( remoteId, + pageId, title, date, actions = pageItemUiStateHelper.setupPageActions( 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 bc7ae54e3d44..995c3fe6ba5b 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 @@ -109,7 +109,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 { @@ -117,13 +117,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(), @@ -145,7 +146,7 @@ class SearchListViewModelTest { @Test fun `passes page to page view model on item tapped`() { val clickedPage = PageItem.PublishedPage( - 1, "title", Date(), listOf(), 0, null, mock(), false, ProgressBarUiState.Hidden, + 1, 1, "title", Date(), listOf(), 0, null, mock(), false, ProgressBarUiState.Hidden, false ) From da89959d6340a709f584238b980f124df374da02 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 18:51:26 -0500 Subject: [PATCH 15/43] use local id to avoid crash that occurs when a post hasnt been uploaded --- .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1120eefafdd7..b7eed162cabb 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 @@ -392,8 +392,8 @@ class PagesViewModel } } - private fun cancelPendingAutoUpload(pageId: RemoteId, site: SiteModel) { - val page = postStore.getPostByRemotePostId(pageId.value, site) + private fun cancelPendingAutoUpload(pageId: LocalId) { + val page = postStore.getPostByLocalPostId(pageId.value) val msgRes = UploadUtils.cancelPendingAutoUpload(page, dispatcher) _showSnackbarMessage.postValue(SnackbarMessageHolder(msgRes)) } From 0a035ad6de396287865228b0acd0382da4389669 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 19:00:12 -0500 Subject: [PATCH 16/43] added a null check to ensure there's a post. This will be investigated. --- .../viewmodel/pages/PageItemUiStateHelper.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index da71a1be5153..0c9cb205b8c8 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -155,12 +155,17 @@ class PageItemUiStateHelper @Inject constructor( private fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { val post = postStore.getPostByLocalPostId(pageId.value) - val uploadUiState = createUploadUiState( - uploadStatusTracker.getUploadStatus(post, site), - post - ) - return (uploadUiState is UploadWaitingForConnection || - (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) + + post?.let { + val uploadUiState = createUploadUiState( + uploadStatusTracker.getUploadStatus(post, site), + post + ) + return (uploadUiState is UploadWaitingForConnection || + (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) + } + + return false } private fun shouldShowOverlay(uploadUiState: PostUploadUiState): Boolean { From 8038af74299b29bdcc323d119bb42a0b8c6d27a1 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 19:20:25 -0500 Subject: [PATCH 17/43] fixed style issues --- .../java/org/wordpress/android/ui/pages/PageItem.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 756955490316..fa3ef7090e78 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 @@ -12,7 +12,7 @@ import java.util.Date sealed class PageItem(open val type: Type) { abstract class Page( open val remoteId: Long, - open val localId : Int, + open val localId: Int, open val title: String, open val date: Date, open val labels: List, @@ -27,7 +27,7 @@ sealed class PageItem(open val type: Type) { data class PublishedPage( override val remoteId: Long, - override val localId : Int, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), @@ -54,7 +54,7 @@ sealed class PageItem(open val type: Type) { data class DraftPage( override val remoteId: Long, - override val localId : Int, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), @@ -80,7 +80,7 @@ sealed class PageItem(open val type: Type) { data class ScheduledPage( override val remoteId: Long, - override val localId : Int, + override val localId: Int, override val title: String, override val date: Date, override val labels: List = emptyList(), @@ -106,7 +106,7 @@ sealed class PageItem(open val type: Type) { data class TrashedPage( override val remoteId: Long, - override val localId : Int, + override val localId: Int, override val title: String, override val date: Date, override var imageUrl: String? = null, From 1a0d3ee668d35214428739fda4d71f4efbea8734 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 19:24:43 -0500 Subject: [PATCH 18/43] utilized PageStatus.DRAFT for consistency. --- .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 b7eed162cabb..da241decc10e 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 @@ -21,7 +21,6 @@ import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus -import org.wordpress.android.fluxc.model.page.PageStatus.DRAFT import org.wordpress.android.fluxc.store.PageStore import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.modules.BG_THREAD @@ -377,7 +376,7 @@ class PagesViewModel when (action) { VIEW_PAGE -> previewPage(page) SET_PARENT -> setParent(page) - MOVE_TO_DRAFT -> changePageStatus(page.remoteId, DRAFT) + 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) From d139230374308e647829238cb1ab4ac205f5dde6 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 10 Feb 2020 14:14:27 -0500 Subject: [PATCH 19/43] fixed naming of PageItemUiStateHelper in test. --- .../android/viewmodel/pages/PageListViewModelTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index 6b4ba0e8e65e..faaed5023837 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -206,7 +206,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `showOverlay is correctly propagated from PageItemUploadpageItemUiStateHelper`() { + fun `showOverlay is correctly propagated from PageItemUiStateHelper`() { // Arrange val expectedShowOverlay = true val pages = MutableLiveData>() @@ -227,7 +227,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `ProgressBarUiState is correctly propagated from PageItemUploadpageItemUiStateHelper`() { + fun `ProgressBarUiState is correctly propagated from PageItemUiStateHelper`() { // Arrange val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() From a9562ef1adf0c7b7c1a210fc94d3ee783533469d Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 10 Feb 2020 14:23:06 -0500 Subject: [PATCH 20/43] canCancelPendingAutoUpload public; the dynamic actions can be tested --- .../android/viewmodel/pages/PageItemUiStateHelper.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 0c9cb205b8c8..35b4ec447831 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -1,5 +1,7 @@ package org.wordpress.android.viewmodel.pages +import androidx.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting.PRIVATE import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel @@ -153,7 +155,8 @@ class PageItemUiStateHelper @Inject constructor( } } - private fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { + @VisibleForTesting(otherwise = PRIVATE) + fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { val post = postStore.getPostByLocalPostId(pageId.value) post?.let { From a9b20032e4fe5648bc885dcd893c29b8bfeeb047 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 10 Feb 2020 23:35:22 -0500 Subject: [PATCH 21/43] Scheduled and Published Pages have the same actions. duplicate removed. --- .../android/viewmodel/pages/PageItemUiStateHelper.kt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 35b4ec447831..e974891e883c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -134,7 +134,7 @@ class PageItemUiStateHelper @Inject constructor( fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { return when (listType) { - PUBLISHED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { + SCHEDULED, PUBLISHED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { if (canCancelPendingAutoUpload(pageId, site)) { add(CANCEL_AUTO_UPLOAD) } @@ -145,12 +145,7 @@ class PageItemUiStateHelper @Inject constructor( add(CANCEL_AUTO_UPLOAD) } } - - SCHEDULED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { - if (canCancelPendingAutoUpload(pageId, site)) { - add(CANCEL_AUTO_UPLOAD) - } - } + TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) } } From f39dc69e8758678ca2179629ba3671093db26952 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 10 Feb 2020 23:48:34 -0500 Subject: [PATCH 22/43] added tests for CANCEL_AUTO_UPLOAD behavior. --- .../viewmodel/pages/PageListViewModelTest.kt | 91 ++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index faaed5023837..3cf3deebfd11 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -4,6 +4,8 @@ import androidx.lifecycle.MutableLiveData import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever +import junit.framework.Assert.assertFalse +import junit.framework.Assert.assertTrue import kotlinx.coroutines.Dispatchers import org.assertj.core.api.Assertions.assertThat import org.junit.Before @@ -15,13 +17,17 @@ import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus +import org.wordpress.android.fluxc.model.page.PageStatus.DRAFT import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.ui.pages.PageItem +import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD import org.wordpress.android.ui.pages.PageItem.Divider +import org.wordpress.android.ui.pages.PageItem.DraftPage import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.util.LocaleManagerWrapper import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListState +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAFTS import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import java.util.Date @@ -296,14 +302,95 @@ class PageListViewModelTest : BaseUnitTest() { assertThat((result[0].first[1] as Page).showOverlay).isEqualTo(false) } + @Test + fun `CANCEL_AUTO_UPLOAD is added to PublishedPage if auto upload is pending`() { + // Arrange + whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(true) + whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + + 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 + assertTrue((result[0].first[0] as PublishedPage).actions.contains(CANCEL_AUTO_UPLOAD)) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage if auto upload is not pending`() { + // Arrange + whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(false) + whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + + 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 + assertFalse((result[0].first[0] as PublishedPage).actions.contains(CANCEL_AUTO_UPLOAD)) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is added to DraftPage if auto upload is pending`() { + // Arrange + whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(true) + whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(DRAFTS, pagesViewModel) + val result = mutableListOf, Boolean>>() + viewModel.pages.observeForever { result.add(it) } + + // Act + pages.value = listOf(buildPageModel(0, status = DRAFT)) + + // Assert + assertTrue((result[0].first[0] as DraftPage).actions.contains(CANCEL_AUTO_UPLOAD)) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is not added to DraftPage if auto upload is not pending`() { + // Arrange + whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(false) + whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(DRAFTS, pagesViewModel) + val result = mutableListOf, Boolean>>() + viewModel.pages.observeForever { result.add(it) } + + // Act + pages.value = listOf(buildPageModel(0, status = DRAFT)) + + // Assert + assertFalse((result[0].first[0] as DraftPage).actions.contains(CANCEL_AUTO_UPLOAD)) + } + 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) { From 33cd9667ba4a6dae23bfd18b92d19cd92ccc9e57 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Tue, 11 Feb 2020 00:00:23 -0500 Subject: [PATCH 23/43] removed unnecessary whitespace. --- .../wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index e974891e883c..47c6656848be 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -139,13 +139,11 @@ class PageItemUiStateHelper @Inject constructor( add(CANCEL_AUTO_UPLOAD) } } - DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { if (canCancelPendingAutoUpload(pageId, site)) { add(CANCEL_AUTO_UPLOAD) } } - TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) } } From 17f16d9d8e8c1bcbc2fa395b096822d993d67e66 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Tue, 11 Feb 2020 19:44:53 -0500 Subject: [PATCH 24/43] utilized assertThat and contains assertion instead of list api --- .../android/viewmodel/pages/PageListViewModelTest.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index 3cf3deebfd11..88f6901a1ca8 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -4,8 +4,6 @@ import androidx.lifecycle.MutableLiveData import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import junit.framework.Assert.assertFalse -import junit.framework.Assert.assertTrue import kotlinx.coroutines.Dispatchers import org.assertj.core.api.Assertions.assertThat import org.junit.Before @@ -319,7 +317,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0)) // Assert - assertTrue((result[0].first[0] as PublishedPage).actions.contains(CANCEL_AUTO_UPLOAD)) + assertThat((result[0].first[0] as PublishedPage).actions).contains(CANCEL_AUTO_UPLOAD) } @Test @@ -339,7 +337,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0)) // Assert - assertFalse((result[0].first[0] as PublishedPage).actions.contains(CANCEL_AUTO_UPLOAD)) + assertThat((result[0].first[0] as PublishedPage).actions).doesNotContain(CANCEL_AUTO_UPLOAD) } @Test @@ -359,7 +357,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0, status = DRAFT)) // Assert - assertTrue((result[0].first[0] as DraftPage).actions.contains(CANCEL_AUTO_UPLOAD)) + assertThat((result[0].first[0] as DraftPage).actions).contains(CANCEL_AUTO_UPLOAD) } @Test @@ -379,7 +377,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0, status = DRAFT)) // Assert - assertFalse((result[0].first[0] as DraftPage).actions.contains(CANCEL_AUTO_UPLOAD)) + assertThat((result[0].first[0] as DraftPage).actions).doesNotContain(CANCEL_AUTO_UPLOAD) } private fun buildPageModel( From 5e00b56e697a07db4e2ee37d533289014cc627ed Mon Sep 17 00:00:00 2001 From: malinajirka Date: Thu, 13 Feb 2020 17:25:02 +0100 Subject: [PATCH 25/43] Fix merge issues --- .../viewmodel/pages/PageItemUiStateHelper.kt | 33 +++++++------------ .../viewmodel/pages/PageListViewModel.kt | 2 +- .../android/viewmodel/pages/PagesViewModel.kt | 4 +-- .../viewmodel/pages/SearchListViewModel.kt | 3 +- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 02afba75a4be..07bb6513fc48 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -5,10 +5,7 @@ import androidx.annotation.VisibleForTesting.PRIVATE import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel -import org.wordpress.android.fluxc.model.post.PostStatus -import org.wordpress.android.fluxc.model.post.PostStatus.DRAFT import org.wordpress.android.fluxc.store.PostStore -import org.wordpress.android.fluxc.store.UploadStore.UploadError 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 @@ -17,32 +14,27 @@ 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.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.NothingToUpload -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadFailed -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadQueued -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadWaitingForConnection -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadingMedia -import org.wordpress.android.viewmodel.pages.PageItemUiStateHelper.PostUploadUiState.UploadingPost +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.UploadQueued +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingMedia +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost 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 org.wordpress.android.viewmodel.posts.PostListItemUploadStatus -import org.wordpress.android.viewmodel.uistate.ProgressBarUiState -import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState -import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadQueued -import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingMedia -import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import javax.inject.Inject typealias ShouldShowOverlay = Boolean -class PageItemUploadProgressHelper @Inject constructor( - private val appPrefsWrapper: AppPrefsWrapper +class PageItemUiStateHelper @Inject constructor( + private val appPrefsWrapper: AppPrefsWrapper, + private val postStore: PostStore, + private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase ) { fun getProgressStateForPage( post: PostModel?, @@ -104,10 +96,7 @@ class PageItemUploadProgressHelper @Inject constructor( val post = postStore.getPostByLocalPostId(pageId.value) post?.let { - val uploadUiState = createUploadUiState( - uploadStatusTracker.getUploadStatus(post, site), - post - ) + val uploadUiState = createPageUploadUiStateUseCase.createUploadUiState(post, site) return (uploadUiState is UploadWaitingForConnection || (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) } 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 1d397d3259d0..9824e5621cb5 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 @@ -402,7 +402,7 @@ class PageListViewModel @Inject constructor( ) val (labels, labelColor) = createPageListItemLabelsUseCase.createLabels(postModel, uploadUiState) - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage( + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage( postModel, uploadUiState ) 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 2c6c9aa1283a..49573da18e85 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 @@ -400,7 +400,7 @@ class PagesViewModel private fun deletePage(page: Page) { performIfNetworkAvailable { - pageListDialogHelper.showDeletePageConfirmationDialog(RemoteId(page.id), page.title) + pageListDialogHelper.showDeletePageConfirmationDialog(RemoteId(page.remoteId), page.title) } } @@ -476,7 +476,7 @@ 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) 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 af04ab14045f..7610c24e9817 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 @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.wordpress.android.R +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.PostStore @@ -100,7 +101,7 @@ class SearchListViewModel pagesViewModel.site ) // TODO any reason why we don't show labels in search? - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(postModel, + val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(postModel, uploadUiState) return when (status) { From 220f0aa577c478744caabf890184ff945675bc10 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 12:50:06 -0500 Subject: [PATCH 26/43] fixed style issue --- .../wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 07bb6513fc48..1ce252e76b7f 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -74,7 +74,7 @@ class PageItemUiStateHelper @Inject constructor( return uploadUiState is UploadingPost || uploadUiState is UploadingMedia || uploadUiState is UploadQueued } - // TODO MERGE CONFLICT + // TODO MERGE CONFLICT fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { return when (listType) { SCHEDULED, PUBLISHED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { From aa8231a50bc1737a67d026a394e49b2dcd9dc2de Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 12:56:03 -0500 Subject: [PATCH 27/43] Moved page actions to it's own use case --- .../pages/CreatePageListItemActionsUseCase.kt | 59 +++++++++++++++++++ .../viewmodel/pages/PageItemUiStateHelper.kt | 53 +---------------- 2 files changed, 60 insertions(+), 52 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt 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..efb9e1340652 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt @@ -0,0 +1,59 @@ +package org.wordpress.android.viewmodel.pages + +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId +import org.wordpress.android.fluxc.model.SiteModel +import org.wordpress.android.fluxc.store.PostStore +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.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( + private val postStore: PostStore, + private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase +) { + fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { + return when (listType) { + SCHEDULED, PUBLISHED -> mutableSetOf( + VIEW_PAGE, + SET_PARENT, + MOVE_TO_DRAFT, + MOVE_TO_TRASH + ).apply { + if (canCancelPendingAutoUpload(pageId, site)) { + add(CANCEL_AUTO_UPLOAD) + } + } + DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { + if (canCancelPendingAutoUpload(pageId, site)) { + add(CANCEL_AUTO_UPLOAD) + } + } + TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) + } + } + + private fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { + val post = postStore.getPostByLocalPostId(pageId.value) + + post?.let { + val uploadUiState = createPageUploadUiStateUseCase.createUploadUiState(post, site) + return (uploadUiState is UploadWaitingForConnection || + (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) + } + + return false + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt index 1ce252e76b7f..ae32a33d225a 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.kt @@ -1,40 +1,18 @@ package org.wordpress.android.viewmodel.pages -import androidx.annotation.VisibleForTesting -import androidx.annotation.VisibleForTesting.PRIVATE -import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.PostModel -import org.wordpress.android.fluxc.model.SiteModel -import org.wordpress.android.fluxc.store.PostStore -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.ui.prefs.AppPrefsWrapper 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.UploadQueued -import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingMedia import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost -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 org.wordpress.android.viewmodel.uistate.ProgressBarUiState import javax.inject.Inject typealias ShouldShowOverlay = Boolean class PageItemUiStateHelper @Inject constructor( - private val appPrefsWrapper: AppPrefsWrapper, - private val postStore: PostStore, - private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase + private val appPrefsWrapper: AppPrefsWrapper ) { fun getProgressStateForPage( post: PostModel?, @@ -74,35 +52,6 @@ class PageItemUiStateHelper @Inject constructor( return uploadUiState is UploadingPost || uploadUiState is UploadingMedia || uploadUiState is UploadQueued } - // TODO MERGE CONFLICT - fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { - return when (listType) { - SCHEDULED, PUBLISHED -> mutableSetOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH).apply { - if (canCancelPendingAutoUpload(pageId, site)) { - add(CANCEL_AUTO_UPLOAD) - } - } - DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { - if (canCancelPendingAutoUpload(pageId, site)) { - add(CANCEL_AUTO_UPLOAD) - } - } - TRASHED -> setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) - } - } - // TODO MERGE CONFLICT - @VisibleForTesting(otherwise = PRIVATE) - fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { - val post = postStore.getPostByLocalPostId(pageId.value) - - post?.let { - val uploadUiState = createPageUploadUiStateUseCase.createUploadUiState(post, site) - return (uploadUiState is UploadWaitingForConnection || - (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) - } - - return false - } private fun shouldShowOverlay(uploadUiState: PostUploadUiState): Boolean { // show overlay when post upload is in progress or (media upload is in progress and the user is not using Aztec) From cb18e91c6d4eda9ca8133071911fa38121761dc5 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 13:01:58 -0500 Subject: [PATCH 28/43] PageListItemActionsUseCase used instead of helper. --- .../android/viewmodel/pages/PageListViewModel.kt | 9 +++++---- .../android/viewmodel/pages/SearchListViewModel.kt | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) 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 9824e5621cb5..8f1c5fb52b52 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,6 +52,7 @@ private const val DEFAULT_INDENT = 0 class PageListViewModel @Inject constructor( private val createPageListItemLabelsUseCase: CreatePageListItemLabelsUseCase, private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase, + private val pageListItemActionsUseCase: CreatePageListItemActionsUseCase, private val mediaStore: MediaStore, private val postStore: PostStore, private val dispatcher: Dispatcher, @@ -261,7 +262,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labelsColor, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), - pageItemUiStateHelper.setupPageActions( + pageListItemActionsUseCase.setupPageActions( listType, LocalId(it.pageId), pagesViewModel.site @@ -290,7 +291,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageItemUiStateHelper.setupPageActions( + pageListItemActionsUseCase.setupPageActions( listType, LocalId(it.pageId), pagesViewModel.site @@ -318,7 +319,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageItemUiStateHelper.setupPageActions( + pageListItemActionsUseCase.setupPageActions( listType, LocalId(it.pageId), pagesViewModel.site @@ -344,7 +345,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageItemUiStateHelper.setupPageActions( + pageListItemActionsUseCase.setupPageActions( listType, LocalId(it.pageId), pagesViewModel.site 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 7610c24e9817..feba4b2b437b 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 @@ -33,6 +33,7 @@ import javax.inject.Named class SearchListViewModel @Inject constructor( private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase, + private val pageListItemActionsUseCase: CreatePageListItemActionsUseCase, private val postStore: PostStore, private val resourceProvider: ResourceProvider, @Named(UI_SCOPE) private val uiScope: CoroutineScope, @@ -111,7 +112,7 @@ class SearchListViewModel pageId, title, date, - actions = pageItemUiStateHelper.setupPageActions( + actions = pageListItemActionsUseCase.setupPageActions( PUBLISHED, LocalId(pageId), pagesViewModel.site @@ -125,7 +126,7 @@ class SearchListViewModel pageId, title, date, - actions = pageItemUiStateHelper.setupPageActions( + actions = pageListItemActionsUseCase.setupPageActions( DRAFTS, LocalId(pageId), pagesViewModel.site @@ -139,7 +140,7 @@ class SearchListViewModel pageId, title, date, - actions = pageItemUiStateHelper.setupPageActions( + actions = pageListItemActionsUseCase.setupPageActions( TRASHED, LocalId(pageId), pagesViewModel.site @@ -153,7 +154,7 @@ class SearchListViewModel pageId, title, date, - actions = pageItemUiStateHelper.setupPageActions( + actions = pageListItemActionsUseCase.setupPageActions( PUBLISHED, LocalId(pageId), pagesViewModel.site From 9da40ef643c77009e63c22b381d3bf820395c321 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 13:06:32 -0500 Subject: [PATCH 29/43] Changed the helper to a use case for consistency. --- ...ItemUiStateHelper.kt => PageItemProgressUiStateUseCase.kt} | 2 +- .../wordpress/android/viewmodel/pages/PageListViewModel.kt | 4 ++-- .../wordpress/android/viewmodel/pages/SearchListViewModel.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename WordPress/src/main/java/org/wordpress/android/viewmodel/pages/{PageItemUiStateHelper.kt => PageItemProgressUiStateUseCase.kt} (97%) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.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/PageItemUiStateHelper.kt rename to WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressUiStateUseCase.kt index ae32a33d225a..946010b86885 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUiStateHelper.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 PageItemUiStateHelper @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 8f1c5fb52b52..207bc9c7e040 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 @@ -58,7 +58,7 @@ class PageListViewModel @Inject constructor( private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - private val pageItemUiStateHelper: PageItemUiStateHelper + private val pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -403,7 +403,7 @@ class PageListViewModel @Inject constructor( ) val (labels, labelColor) = createPageListItemLabelsUseCase.createLabels(postModel, uploadUiState) - val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage( + val (progressBarUiState, showOverlay) = pageItemProgressUiStateUseCase.getProgressStateForPage( postModel, uploadUiState ) 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 feba4b2b437b..771937a69df6 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 @@ -37,7 +37,7 @@ class SearchListViewModel private val postStore: PostStore, private val resourceProvider: ResourceProvider, @Named(UI_SCOPE) private val uiScope: CoroutineScope, - private val pageItemUiStateHelper: PageItemUiStateHelper + private val pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult @@ -102,7 +102,7 @@ class SearchListViewModel pagesViewModel.site ) // TODO any reason why we don't show labels in search? - val (progressBarUiState, showOverlay) = pageItemUiStateHelper.getProgressStateForPage(postModel, + val (progressBarUiState, showOverlay) = pageItemProgressUiStateUseCase.getProgressStateForPage(postModel, uploadUiState) return when (status) { From d7b40b7ef3a25611ff6eb37de90b31ad1f112ea9 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 13:29:36 -0500 Subject: [PATCH 30/43] refactored tests to support use case approach by the diff actions. --- .../viewmodel/pages/PageListViewModel.kt | 4 +-- .../viewmodel/pages/SearchListViewModel.kt | 4 +-- .../viewmodel/pages/PageListViewModelTest.kt | 30 +++++++++---------- .../pages/SearchListViewModelTest.kt | 22 ++++++++++---- 4 files changed, 35 insertions(+), 25 deletions(-) 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 207bc9c7e040..241d2288fb77 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 @@ -53,12 +53,12 @@ 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 pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase + @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { 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 771937a69df6..21d7707d7565 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 @@ -34,10 +34,10 @@ 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 pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase + @Named(UI_SCOPE) private val uiScope: CoroutineScope ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index c8bb323c191e..ccf76fcb05d6 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -45,7 +45,8 @@ class PageListViewModelTest : BaseUnitTest() { @Mock lateinit var dispatcher: Dispatcher @Mock lateinit var pagesViewModel: PagesViewModel @Mock lateinit var localeManagerWrapper: LocaleManagerWrapper - @Mock lateinit var progressHelper: PageItemUploadProgressHelper + @Mock lateinit var pageItemProgressUiStateUseCase: PageItemProgressUiStateUseCase + @Mock lateinit var pageListItemActionsUseCase: CreatePageListItemActionsUseCase @Mock lateinit var createUploadStateUseCase: CreatePageUploadUiStateUseCase @Mock lateinit var createLabelsUseCase: CreatePageListItemLabelsUseCase @@ -57,15 +58,16 @@ class PageListViewModelTest : BaseUnitTest() { viewModel = PageListViewModel( createLabelsUseCase, createUploadStateUseCase, + pageListItemActionsUseCase, + pageItemProgressUiStateUseCase, mediaStore, postStore, dispatcher, localeManagerWrapper, - Dispatchers.Unconfined, - pageItemUiStateHelper + Dispatchers.Unconfined ) - whenever(pageItemUiStateHelper.getProgressStateForPage(any(), any())).thenReturn(Pair( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(any(), any())).thenReturn(Pair( ProgressBarUiState.Hidden, false)) val invalidateUploadStatus = MutableLiveData>() @@ -232,7 +234,7 @@ class PageListViewModelTest : BaseUnitTest() { val expectedShowOverlay = true val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn(Pair(mock(), + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn(Pair(mock(), expectedShowOverlay)) whenever(pagesViewModel.pages).thenReturn(pages) @@ -253,7 +255,7 @@ class PageListViewModelTest : BaseUnitTest() { val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(anyOrNull(), anyOrNull())).thenReturn( Pair( expectedProgressBarUiState, true @@ -279,14 +281,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 @@ -323,8 +325,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage if auto upload is pending`() { // Arrange - whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(true) - whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + // TODO add mocks here. val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) @@ -343,8 +344,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage if auto upload is not pending`() { // Arrange - whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(false) - whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + // TODO add mocks here. val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) @@ -363,8 +363,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `CANCEL_AUTO_UPLOAD is added to DraftPage if auto upload is pending`() { // Arrange - whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(true) - whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + // TODO add mocks here. val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) @@ -383,8 +382,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `CANCEL_AUTO_UPLOAD is not added to DraftPage if auto upload is not pending`() { // Arrange - whenever(pageItemUiStateHelper.canCancelPendingAutoUpload(any(), any())).thenReturn(false) - whenever(pageItemUiStateHelper.setupPageActions(any(), any(), any())).thenCallRealMethod() + // TODO add mocks here. val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) 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 cc051997b8c8..02d7606683d1 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(pageItemUiStateHelper.getProgressStateForPage(any(), any())).thenReturn( + whenever(pageItemProgressUiStateUseCase.getProgressStateForPage(any(), any())).thenReturn( Pair( ProgressBarUiState.Hidden, false @@ -163,7 +165,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, mock(), false, ProgressBarUiState.Hidden, + 1, + 1, + "title", + Date(), + listOf(), + 0, + 0, + null, + mock(), + false, + ProgressBarUiState.Hidden, false ) From adfffae14f978120c0894b9b95cbdcacfb74b71c Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 14:15:34 -0500 Subject: [PATCH 31/43] Created test for menu action use case. --- .../CreatePageListItemActionsUseCaseTest.kt | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt new file mode 100644 index 000000000000..de44eea15cdf --- /dev/null +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -0,0 +1,74 @@ +package org.wordpress.android.viewmodel.pages + +import com.nhaarman.mockitokotlin2.anyOrNull +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import org.assertj.core.api.Assertions.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.wordpress.android.fluxc.store.PostStore +import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection +import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAFTS +import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED + +@RunWith(MockitoJUnitRunner::class) +class CreatePageListItemActionsUseCaseTest { + @Mock private lateinit var postStore: PostStore + @Mock private lateinit var createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase + private lateinit var useCase: CreatePageListItemActionsUseCase + + @Before + fun setUp() { + useCase = CreatePageListItemActionsUseCase( + postStore, + createPageUploadUiStateUseCase + ) + whenever(postStore.getPostByLocalPostId(anyInt())).thenReturn(mock()) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { + whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) + .thenReturn(UploadWaitingForConnection(mock())) + + val actions = useCase.setupPageActions(PUBLISHED, mock(), mock()) + + assertThat(actions).contains(CANCEL_AUTO_UPLOAD) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage Actions if auto upload is not pending`() { + whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) + .thenReturn(UploadingPost(false)) + + val actions = useCase.setupPageActions(PUBLISHED, mock(), mock()) + + assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is added to DraftPage Actions if auto upload is pending`() { + whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) + .thenReturn(UploadWaitingForConnection(mock())) + + val actions = useCase.setupPageActions(DRAFTS, mock(), mock()) + + assertThat(actions).contains(CANCEL_AUTO_UPLOAD) + } + + @Test + fun `CANCEL_AUTO_UPLOAD is not added to DraftPage Actions if auto upload is not pending`() { + whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) + .thenReturn(UploadingPost(true)) + + val actions = useCase.setupPageActions(DRAFTS, mock(), mock()) + + assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) + } +} From 3cbea5b88c892d2889da1a0adf36ee9a9fe96db8 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 14:16:03 -0500 Subject: [PATCH 32/43] Removed menu action use case related tests and simplified page test --- .../viewmodel/pages/PageListViewModelTest.kt | 76 ++++--------------- 1 file changed, 14 insertions(+), 62 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index ccf76fcb05d6..397293789d2c 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -19,19 +19,20 @@ import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus -import org.wordpress.android.fluxc.model.page.PageStatus.DRAFT import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD +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.SET_PARENT +import org.wordpress.android.ui.pages.PageItem.Action.VIEW_PAGE import org.wordpress.android.ui.pages.PageItem.Divider -import org.wordpress.android.ui.pages.PageItem.DraftPage import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.util.LocaleManagerWrapper import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListState -import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAFTS import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBLISHED import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import java.util.Date @@ -323,28 +324,17 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `CANCEL_AUTO_UPLOAD is added to PublishedPage if auto upload is pending`() { + fun `verify that Menu Actions are added to PublishedPage`() { // Arrange - // TODO add mocks here. - - 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).contains(CANCEL_AUTO_UPLOAD) - } + val actions = setOf( + VIEW_PAGE, + SET_PARENT, + MOVE_TO_DRAFT, + MOVE_TO_TRASH, + CANCEL_AUTO_UPLOAD + ) - @Test - fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage if auto upload is not pending`() { - // Arrange - // TODO add mocks here. + whenever(pageListItemActionsUseCase.setupPageActions(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn(actions) val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) @@ -357,45 +347,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0)) // Assert - assertThat((result[0].first[0] as PublishedPage).actions).doesNotContain(CANCEL_AUTO_UPLOAD) - } - - @Test - fun `CANCEL_AUTO_UPLOAD is added to DraftPage if auto upload is pending`() { - // Arrange - // TODO add mocks here. - - val pages = MutableLiveData>() - whenever(pagesViewModel.pages).thenReturn(pages) - - viewModel.start(DRAFTS, pagesViewModel) - val result = mutableListOf, Boolean>>() - viewModel.pages.observeForever { result.add(it) } - - // Act - pages.value = listOf(buildPageModel(0, status = DRAFT)) - - // Assert - assertThat((result[0].first[0] as DraftPage).actions).contains(CANCEL_AUTO_UPLOAD) - } - - @Test - fun `CANCEL_AUTO_UPLOAD is not added to DraftPage if auto upload is not pending`() { - // Arrange - // TODO add mocks here. - - val pages = MutableLiveData>() - whenever(pagesViewModel.pages).thenReturn(pages) - - viewModel.start(DRAFTS, pagesViewModel) - val result = mutableListOf, Boolean>>() - viewModel.pages.observeForever { result.add(it) } - - // Act - pages.value = listOf(buildPageModel(0, status = DRAFT)) - - // Assert - assertThat((result[0].first[0] as DraftPage).actions).doesNotContain(CANCEL_AUTO_UPLOAD) + assertThat((result[0].first[0] as PublishedPage).actions).isEqualTo(actions) } private fun buildPageModel( From 78dda37539d8af4553f2d5d5c5a010b3e2c65388 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 14:17:08 -0500 Subject: [PATCH 33/43] Fixed schedule page list type --- .../wordpress/android/viewmodel/pages/SearchListViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 21d7707d7565..e67e27b68858 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 @@ -25,6 +25,7 @@ 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 @@ -155,7 +156,7 @@ class SearchListViewModel title, date, actions = pageListItemActionsUseCase.setupPageActions( - PUBLISHED, + SCHEDULED, LocalId(pageId), pagesViewModel.site ), From e036fa0315693928ec8d37121b428689230dcec6 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 15:14:09 -0500 Subject: [PATCH 34/43] uploadUiState is now passed from ViewModel.Refactored tests and behavior --- .../pages/CreatePageListItemActionsUseCase.kt | 27 ++++----------- .../viewmodel/pages/PageListViewModel.kt | 31 +++++------------ .../viewmodel/pages/SearchListViewModel.kt | 25 +++----------- .../CreatePageListItemActionsUseCaseTest.kt | 33 +++---------------- .../viewmodel/pages/PageListViewModelTest.kt | 2 +- 5 files changed, 26 insertions(+), 92 deletions(-) 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 index efb9e1340652..4823fdde3795 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCase.kt @@ -1,8 +1,5 @@ package org.wordpress.android.viewmodel.pages -import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId -import org.wordpress.android.fluxc.model.SiteModel -import org.wordpress.android.fluxc.store.PostStore 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 @@ -11,6 +8,7 @@ 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 @@ -20,11 +18,8 @@ import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.SCHE import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.TRASHED import javax.inject.Inject -class CreatePageListItemActionsUseCase @Inject constructor( - private val postStore: PostStore, - private val createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase -) { - fun setupPageActions(listType: PageListType, pageId: LocalId, site: SiteModel): Set { +class CreatePageListItemActionsUseCase @Inject constructor() { + fun setupPageActions(listType: PageListType, uploadUiState: PostUploadUiState): Set { return when (listType) { SCHEDULED, PUBLISHED -> mutableSetOf( VIEW_PAGE, @@ -32,12 +27,12 @@ class CreatePageListItemActionsUseCase @Inject constructor( MOVE_TO_DRAFT, MOVE_TO_TRASH ).apply { - if (canCancelPendingAutoUpload(pageId, site)) { + if (canCancelPendingAutoUpload(uploadUiState)) { add(CANCEL_AUTO_UPLOAD) } } DRAFTS -> mutableSetOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH).apply { - if (canCancelPendingAutoUpload(pageId, site)) { + if (canCancelPendingAutoUpload(uploadUiState)) { add(CANCEL_AUTO_UPLOAD) } } @@ -45,15 +40,7 @@ class CreatePageListItemActionsUseCase @Inject constructor( } } - private fun canCancelPendingAutoUpload(pageId: LocalId, site: SiteModel): Boolean { - val post = postStore.getPostByLocalPostId(pageId.value) - - post?.let { - val uploadUiState = createPageUploadUiStateUseCase.createUploadUiState(post, site) - return (uploadUiState is UploadWaitingForConnection || + private fun canCancelPendingAutoUpload(uploadUiState: PostUploadUiState) = + (uploadUiState is UploadWaitingForConnection || (uploadUiState is UploadFailed && uploadUiState.isEligibleForAutoUpload)) - } - - return false - } } 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 241d2288fb77..344cb7147883 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 @@ -262,11 +262,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labelsColor, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), - pageListItemActionsUseCase.setupPageActions( - listType, - LocalId(it.pageId), - pagesViewModel.site - ), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -291,11 +287,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageListItemActionsUseCase.setupPageActions( - listType, - LocalId(it.pageId), - pagesViewModel.site - ), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -319,11 +311,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageListItemActionsUseCase.setupPageActions( - listType, - LocalId(it.pageId), - pagesViewModel.site - ), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -345,11 +333,7 @@ class PageListViewModel @Inject constructor( itemUiStateData.labels, itemUiStateData.labelsColor, getFeaturedImageUrl(it.featuredImageId), - pageListItemActionsUseCase.setupPageActions( - listType, - LocalId(it.pageId), - pagesViewModel.site - ), + itemUiStateData.actions, actionsEnabled, itemUiStateData.progressBarUiState, itemUiStateData.showOverlay @@ -407,13 +391,16 @@ class PageListViewModel @Inject constructor( 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/SearchListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/SearchListViewModel.kt index e67e27b68858..c2a937bd274b 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 @@ -7,7 +7,6 @@ import androidx.lifecycle.ViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.wordpress.android.R -import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.PostStore @@ -113,11 +112,7 @@ class SearchListViewModel pageId, title, date, - actions = pageListItemActionsUseCase.setupPageActions( - PUBLISHED, - LocalId(pageId), - pagesViewModel.site - ), + actions = pageListItemActionsUseCase.setupPageActions(PUBLISHED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay @@ -127,11 +122,7 @@ class SearchListViewModel pageId, title, date, - actions = pageListItemActionsUseCase.setupPageActions( - DRAFTS, - LocalId(pageId), - pagesViewModel.site - ), + actions = pageListItemActionsUseCase.setupPageActions(DRAFTS, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay @@ -141,11 +132,7 @@ class SearchListViewModel pageId, title, date, - actions = pageListItemActionsUseCase.setupPageActions( - TRASHED, - LocalId(pageId), - pagesViewModel.site - ), + actions = pageListItemActionsUseCase.setupPageActions(TRASHED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay @@ -155,11 +142,7 @@ class SearchListViewModel pageId, title, date, - actions = pageListItemActionsUseCase.setupPageActions( - SCHEDULED, - LocalId(pageId), - pagesViewModel.site - ), + actions = pageListItemActionsUseCase.setupPageActions(SCHEDULED, uploadUiState), actionsEnabled = areActionsEnabled, progressBarUiState = progressBarUiState, showOverlay = showOverlay diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index de44eea15cdf..eb0dba09e76f 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -1,16 +1,11 @@ package org.wordpress.android.viewmodel.pages -import com.nhaarman.mockitokotlin2.anyOrNull import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.whenever import org.assertj.core.api.Assertions.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.anyInt -import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner -import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost @@ -19,55 +14,37 @@ import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.PUBL @RunWith(MockitoJUnitRunner::class) class CreatePageListItemActionsUseCaseTest { - @Mock private lateinit var postStore: PostStore - @Mock private lateinit var createPageUploadUiStateUseCase: CreatePageUploadUiStateUseCase private lateinit var useCase: CreatePageListItemActionsUseCase @Before fun setUp() { - useCase = CreatePageListItemActionsUseCase( - postStore, - createPageUploadUiStateUseCase - ) - whenever(postStore.getPostByLocalPostId(anyInt())).thenReturn(mock()) + useCase = CreatePageListItemActionsUseCase() } @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { - whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) - .thenReturn(UploadWaitingForConnection(mock())) - - val actions = useCase.setupPageActions(PUBLISHED, mock(), mock()) + val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock())) assertThat(actions).contains(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage Actions if auto upload is not pending`() { - whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) - .thenReturn(UploadingPost(false)) - - val actions = useCase.setupPageActions(PUBLISHED, mock(), mock()) + val actions = useCase.setupPageActions(PUBLISHED, UploadingPost(false)) assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is added to DraftPage Actions if auto upload is pending`() { - whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) - .thenReturn(UploadWaitingForConnection(mock())) - - val actions = useCase.setupPageActions(DRAFTS, mock(), mock()) + val actions = useCase.setupPageActions(DRAFTS, UploadWaitingForConnection(mock())) assertThat(actions).contains(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is not added to DraftPage Actions if auto upload is not pending`() { - whenever(createPageUploadUiStateUseCase.createUploadUiState(anyOrNull(), anyOrNull())) - .thenReturn(UploadingPost(true)) - - val actions = useCase.setupPageActions(DRAFTS, mock(), mock()) + val actions = useCase.setupPageActions(DRAFTS, UploadingPost(true)) assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) } diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index 397293789d2c..62508885d4bf 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -334,7 +334,7 @@ class PageListViewModelTest : BaseUnitTest() { CANCEL_AUTO_UPLOAD ) - whenever(pageListItemActionsUseCase.setupPageActions(anyOrNull(), anyOrNull(), anyOrNull())).thenReturn(actions) + whenever(pageListItemActionsUseCase.setupPageActions(anyOrNull(), anyOrNull())).thenReturn(actions) val pages = MutableLiveData>() whenever(pagesViewModel.pages).thenReturn(pages) From 990764d968c9a3a543089db42357fecd108e16d4 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 15:16:59 -0500 Subject: [PATCH 35/43] fixed naming in PageListViewModelTest --- .../android/viewmodel/pages/PageListViewModelTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index 62508885d4bf..fbb4ee028f1a 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -230,7 +230,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `showOverlay is correctly propagated from PageItemUiStateHelper`() { + fun `showOverlay is correctly propagated from PageItemProgressUiStateUseCase`() { // Arrange val expectedShowOverlay = true val pages = MutableLiveData>() @@ -251,7 +251,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `ProgressBarUiState is correctly propagated from PageItemUiStateHelper`() { + fun `ProgressBarUiState is correctly propagated from PageItemProgressUiStateUseCase`() { // Arrange val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() @@ -324,7 +324,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `verify that Menu Actions are added to PublishedPage`() { + fun `verify PageListItemActionsUseCase generates correct Menu Actions for PublishedPage`() { // Arrange val actions = setOf( VIEW_PAGE, From 39daf2a9f17daf7a616a66d29f09927d3c3bc34c Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 15:18:08 -0500 Subject: [PATCH 36/43] removed extra lines from menu actions test --- .../viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index eb0dba09e76f..3794ccac5ef8 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -24,28 +24,24 @@ class CreatePageListItemActionsUseCaseTest { @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock())) - assertThat(actions).contains(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is not added to PublishedPage Actions if auto upload is not pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadingPost(false)) - assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is added to DraftPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(DRAFTS, UploadWaitingForConnection(mock())) - assertThat(actions).contains(CANCEL_AUTO_UPLOAD) } @Test fun `CANCEL_AUTO_UPLOAD is not added to DraftPage Actions if auto upload is not pending`() { val actions = useCase.setupPageActions(DRAFTS, UploadingPost(true)) - assertThat(actions).doesNotContain(CANCEL_AUTO_UPLOAD) } } From e4efebb76f1a0c74d9207b1a7334323c3dd5023d Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 15:35:35 -0500 Subject: [PATCH 37/43] Fixed lint issues. --- .../android/viewmodel/pages/PageListViewModel.kt | 1 - .../viewmodel/pages/PageListViewModelTest.kt | 13 +++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) 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 344cb7147883..e38cadcd94b4 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 @@ -391,7 +391,6 @@ class PageListViewModel @Inject constructor( postModel, uploadUiState ) - val actions = pageListItemActionsUseCase.setupPageActions(listType, uploadUiState) return ItemUiStateData(labels, labelColor, progressBarUiState, showOverlay, actions) } diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index fbb4ee028f1a..8c0b492366a8 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -235,8 +235,17 @@ class PageListViewModelTest : BaseUnitTest() { val expectedShowOverlay = true val pages = MutableLiveData>() - whenever(pageItemProgressUiStateUseCase.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) From 88aa7ec39ff795f6723f80e70b3b20e8242427db Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 16:09:40 -0500 Subject: [PATCH 38/43] added unit test to verify scheduled and published actions. --- .../CreatePageListItemActionsUseCaseTest.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index 3794ccac5ef8..52ec6df4d13f 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -7,10 +7,15 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD +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.SET_PARENT +import org.wordpress.android.ui.pages.PageItem.Action.VIEW_PAGE import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost 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 @RunWith(MockitoJUnitRunner::class) class CreatePageListItemActionsUseCaseTest { @@ -21,6 +26,25 @@ class CreatePageListItemActionsUseCaseTest { useCase = CreatePageListItemActionsUseCase() } + @Test + fun `verify that SCHEDULED & PUBLISHED actions are the same`() { + // Arrange + val expectedActions = mutableSetOf( + VIEW_PAGE, + SET_PARENT, + MOVE_TO_DRAFT, + MOVE_TO_TRASH + ) + + // Act + val scheduledActions = useCase.setupPageActions(SCHEDULED, mock()) + val publishedActions = useCase.setupPageActions(PUBLISHED, mock()) + + // Assert + assertThat(scheduledActions).isEqualTo(expectedActions) + assertThat(publishedActions).isEqualTo(expectedActions) + } + @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock())) From 8bd3cb1be3925a9d4a51c1a15883db2c338ad567 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 16:11:48 -0500 Subject: [PATCH 39/43] added test for draft action --- .../pages/CreatePageListItemActionsUseCaseTest.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index 52ec6df4d13f..3c5f9a3d7822 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -9,6 +9,7 @@ import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD 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.UploadWaitingForConnection @@ -45,6 +46,18 @@ class CreatePageListItemActionsUseCaseTest { assertThat(publishedActions).isEqualTo(expectedActions) } + @Test + fun `Verify DRAFT actions`() { + // Arrange + val expectedActions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH) + + // Act + val draftActions = useCase.setupPageActions(DRAFTS, mock()) + + // Assert + assertThat(draftActions).isEqualTo(expectedActions) + } + @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock())) From 440f0d5dafd5493c4856f89a51c50d0857ac44a4 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 16:12:20 -0500 Subject: [PATCH 40/43] made set immutable. --- .../viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index 3c5f9a3d7822..742fdb8281f7 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -30,7 +30,7 @@ class CreatePageListItemActionsUseCaseTest { @Test fun `verify that SCHEDULED & PUBLISHED actions are the same`() { // Arrange - val expectedActions = mutableSetOf( + val expectedActions = setOf( VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, From 546a824404f52de1c645fb3c98586c981bb3ec42 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 13 Feb 2020 16:14:49 -0500 Subject: [PATCH 41/43] added more tests to use case. --- .../CreatePageListItemActionsUseCaseTest.kt | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index 742fdb8281f7..5fe2caaf4777 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -7,6 +7,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.junit.MockitoJUnitRunner 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 @@ -17,6 +18,7 @@ import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.Post 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 @RunWith(MockitoJUnitRunner::class) class CreatePageListItemActionsUseCaseTest { @@ -27,6 +29,30 @@ class CreatePageListItemActionsUseCaseTest { useCase = CreatePageListItemActionsUseCase() } + @Test + fun `Verify DRAFT actions`() { + // Arrange + val expectedActions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH) + + // Act + val draftActions = useCase.setupPageActions(DRAFTS, mock()) + + // Assert + assertThat(draftActions).isEqualTo(expectedActions) + } + + @Test + fun `Verify TRASH actions`() { + // Arrange + val expectedActions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY) + + // Act + val trashedActions = useCase.setupPageActions(TRASHED, mock()) + + // Assert + assertThat(trashedActions).isEqualTo(expectedActions) + } + @Test fun `verify that SCHEDULED & PUBLISHED actions are the same`() { // Arrange @@ -46,18 +72,6 @@ class CreatePageListItemActionsUseCaseTest { assertThat(publishedActions).isEqualTo(expectedActions) } - @Test - fun `Verify DRAFT actions`() { - // Arrange - val expectedActions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH) - - // Act - val draftActions = useCase.setupPageActions(DRAFTS, mock()) - - // Assert - assertThat(draftActions).isEqualTo(expectedActions) - } - @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock())) From 4e6dc61d488d4ae21d8ed93cc1644fbf16aa06b2 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 17 Feb 2020 12:25:07 -0500 Subject: [PATCH 42/43] made use case menu actions test clearer. --- .../viewmodel/pages/PageListViewModelTest.kt | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt index a22f56b9defe..bbbe67dd09a4 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt @@ -22,11 +22,6 @@ import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.ui.pages.PageItem -import org.wordpress.android.ui.pages.PageItem.Action.CANCEL_AUTO_UPLOAD -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.SET_PARENT -import org.wordpress.android.ui.pages.PageItem.Action.VIEW_PAGE import org.wordpress.android.ui.pages.PageItem.Divider import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage @@ -334,15 +329,9 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `verify PageListItemActionsUseCase generates correct Menu Actions for PublishedPage`() { + fun `verify PageListItemActionsUseCase passes the Menu Actions to PublishedPage`() { // Arrange - val actions = setOf( - VIEW_PAGE, - SET_PARENT, - MOVE_TO_DRAFT, - MOVE_TO_TRASH, - CANCEL_AUTO_UPLOAD - ) + val actions = setOf(mock()) whenever(pageListItemActionsUseCase.setupPageActions(anyOrNull(), anyOrNull())).thenReturn(actions) From fd35b8cbf78a2a32ee2f23d321d12fdb3e116970 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 17 Feb 2020 12:28:20 -0500 Subject: [PATCH 43/43] split the test so the intent is clearer and the actions being the same isnt enforced. --- .../CreatePageListItemActionsUseCaseTest.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt index 5fe2caaf4777..f43d0a3c1180 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt @@ -54,7 +54,7 @@ class CreatePageListItemActionsUseCaseTest { } @Test - fun `verify that SCHEDULED & PUBLISHED actions are the same`() { + fun `verify PUBLISHED actions`() { // Arrange val expectedActions = setOf( VIEW_PAGE, @@ -64,14 +64,29 @@ class CreatePageListItemActionsUseCaseTest { ) // Act - val scheduledActions = useCase.setupPageActions(SCHEDULED, mock()) val publishedActions = useCase.setupPageActions(PUBLISHED, mock()) // Assert - assertThat(scheduledActions).isEqualTo(expectedActions) assertThat(publishedActions).isEqualTo(expectedActions) } + @Test + fun `verify SCHEDULED actions`() { + // Arrange + val expectedActions = setOf( + VIEW_PAGE, + SET_PARENT, + MOVE_TO_DRAFT, + MOVE_TO_TRASH + ) + + // Act + val scheduledActions = useCase.setupPageActions(SCHEDULED, mock()) + + // Assert + assertThat(scheduledActions).isEqualTo(expectedActions) + } + @Test fun `CANCEL_AUTO_UPLOAD is added to PublishedPage Actions if auto upload is pending`() { val actions = useCase.setupPageActions(PUBLISHED, UploadWaitingForConnection(mock()))