From 65b36f511c29c5622839eb779fa9a4181d0ea70d Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 24 Jan 2020 14:29:53 -0500 Subject: [PATCH 01/59] added progress bar state --- .../wordpress/android/ui/pages/PageItem.kt | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 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 2e8e6287f123..9feed4d81bcf 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 @@ -24,7 +24,8 @@ sealed class PageItem(open val type: Type) { open var imageUrl: String?, open val actions: Set, open var actionsEnabled: Boolean, - open val tapActionEnabled: Boolean + open val tapActionEnabled: Boolean, + open val progressBarState: PageItemProgressBar ) : PageItem(PAGE) data class PublishedPage( @@ -34,7 +35,8 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var indent: Int = 0, override var imageUrl: String? = null, - override var actionsEnabled: Boolean = true + override var actionsEnabled: Boolean = true, + override val progressBarState: PageItemProgressBar ) : Page( id = id, title = title, @@ -44,7 +46,8 @@ sealed class PageItem(open val type: Type) { imageUrl = imageUrl, actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, - tapActionEnabled = true + tapActionEnabled = true, + progressBarState = progressBarState ) data class DraftPage( @@ -53,7 +56,8 @@ sealed class PageItem(open val type: Type) { override val date: Date, override val labels: List = emptyList(), override var imageUrl: String? = null, - override var actionsEnabled: Boolean = true + override var actionsEnabled: Boolean = true, + override val progressBarState: PageItemProgressBar ) : Page( id = id, title = title, @@ -63,7 +67,8 @@ sealed class PageItem(open val type: Type) { imageUrl = imageUrl, actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, - tapActionEnabled = true + tapActionEnabled = true, + progressBarState = progressBarState ) data class ScheduledPage( @@ -72,7 +77,8 @@ sealed class PageItem(open val type: Type) { override val date: Date, override val labels: List = emptyList(), override var imageUrl: String? = null, - override var actionsEnabled: Boolean = true + override var actionsEnabled: Boolean = true, + override val progressBarState: PageItemProgressBar ) : Page( id = id, title = title, @@ -82,7 +88,8 @@ sealed class PageItem(open val type: Type) { imageUrl = imageUrl, actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, - tapActionEnabled = true + tapActionEnabled = true, + progressBarState = progressBarState ) data class TrashedPage( @@ -90,7 +97,8 @@ sealed class PageItem(open val type: Type) { override val title: String, override val date: Date, override var imageUrl: String? = null, - override var actionsEnabled: Boolean = true + override var actionsEnabled: Boolean = true, + override val progressBarState: PageItemProgressBar ) : Page( id = id, title = title, @@ -100,7 +108,8 @@ sealed class PageItem(open val type: Type) { imageUrl = imageUrl, actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), actionsEnabled = actionsEnabled, - tapActionEnabled = false + tapActionEnabled = false, + progressBarState = progressBarState ) data class ParentPage( @@ -127,6 +136,12 @@ sealed class PageItem(open val type: Type) { TOP_LEVEL_PARENT(5) } + sealed class PageItemProgressBar(val visibility: Boolean){ + object Hidden : PageItemProgressBar(visibility = false) + object Indeterminate : PageItemProgressBar(visibility = true) + data class Determinate(val progress: Int) : PageItemProgressBar(visibility = true) + } + enum class Action(@IdRes val itemId: Int) { VIEW_PAGE(R.id.view_page), SET_PARENT(R.id.set_parent), From caa81e84479c02e77e23fdc02c67ad66e55263e0 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 24 Jan 2020 14:30:15 -0500 Subject: [PATCH 02/59] added upload status tracker --- .../android/viewmodel/pages/PageListViewModel.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 070fc5f7554a..4ecf67962a3d 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 @@ -17,6 +17,7 @@ import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.fluxc.store.MediaStore.MediaPayload import org.wordpress.android.fluxc.store.MediaStore.OnMediaChanged +import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Action @@ -27,6 +28,8 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage +import org.wordpress.android.ui.posts.PostListUploadStatusTracker +import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.util.AppLog import org.wordpress.android.util.LocaleManagerWrapper import org.wordpress.android.util.SiteUtils @@ -48,7 +51,9 @@ class PageListViewModel @Inject constructor( private val mediaStore: MediaStore, private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, - @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher + @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, + uploadActionUseCase: UploadActionUseCase, + uploadStore: UploadStore ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -69,6 +74,11 @@ class PageListViewModel @Inject constructor( SiteUtils.isPhotonCapable(pagesViewModel.site) } + private val uploadStatusTracker = PostListUploadStatusTracker( + uploadStore = uploadStore, + uploadActionUseCase = uploadActionUseCase + ) + enum class PageListType(val pageStatuses: List) { PUBLISHED(listOf(PageStatus.PUBLISHED, PageStatus.PRIVATE)), DRAFTS(listOf(PageStatus.DRAFT, PageStatus.PENDING)), From ef9d57342fd76970e16361b50e6ed4d96b230359 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:41:59 -0500 Subject: [PATCH 03/59] added progress state to the PageItem model. --- .../wordpress/android/ui/pages/PageItem.kt | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 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 9feed4d81bcf..8b4bf595281c 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,6 +12,7 @@ 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 +import org.wordpress.android.viewmodel.posts.PostItemProgressBar import java.util.Date sealed class PageItem(open val type: Type) { @@ -25,7 +26,8 @@ sealed class PageItem(open val type: Type) { open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean, - open val progressBarState: PageItemProgressBar + open val progressBarState: PostItemProgressBar?, + open val showOverlay: Boolean? ) : PageItem(PAGE) data class PublishedPage( @@ -36,7 +38,8 @@ sealed class PageItem(open val type: Type) { override var indent: Int = 0, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PageItemProgressBar + override val progressBarState: PostItemProgressBar? = null, + override val showOverlay: Boolean? = null ) : Page( id = id, title = title, @@ -47,7 +50,8 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState + progressBarState = progressBarState, + showOverlay = showOverlay ) data class DraftPage( @@ -57,7 +61,8 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PageItemProgressBar + override val progressBarState: PostItemProgressBar? = null, + override val showOverlay: Boolean? = null ) : Page( id = id, title = title, @@ -68,7 +73,8 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState + progressBarState = progressBarState, + showOverlay = showOverlay ) data class ScheduledPage( @@ -78,7 +84,8 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PageItemProgressBar + override val progressBarState: PostItemProgressBar? = null, + override val showOverlay: Boolean? = null ) : Page( id = id, title = title, @@ -89,7 +96,8 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState + progressBarState = progressBarState, + showOverlay = showOverlay ) data class TrashedPage( @@ -98,7 +106,8 @@ sealed class PageItem(open val type: Type) { override val date: Date, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PageItemProgressBar + override val progressBarState: PostItemProgressBar? = null, + override val showOverlay: Boolean? = null ) : Page( id = id, title = title, @@ -109,7 +118,8 @@ sealed class PageItem(open val type: Type) { actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), actionsEnabled = actionsEnabled, tapActionEnabled = false, - progressBarState = progressBarState + progressBarState = progressBarState, + showOverlay = showOverlay ) data class ParentPage( @@ -136,12 +146,6 @@ sealed class PageItem(open val type: Type) { TOP_LEVEL_PARENT(5) } - sealed class PageItemProgressBar(val visibility: Boolean){ - object Hidden : PageItemProgressBar(visibility = false) - object Indeterminate : PageItemProgressBar(visibility = true) - data class Determinate(val progress: Int) : PageItemProgressBar(visibility = true) - } - enum class Action(@IdRes val itemId: Int) { VIEW_PAGE(R.id.view_page), SET_PARENT(R.id.set_parent), From a681bb54fe7692ca833f8cb6733d75364c234f68 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:44:12 -0500 Subject: [PATCH 04/59] extracted PostListItemProgressBar so it can be shared easily. --- .../android/viewmodel/posts/PostListItemProgressBar.kt | 7 +++++++ .../wordpress/android/viewmodel/posts/PostListItemType.kt | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt new file mode 100644 index 000000000000..1a9ba840d806 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt @@ -0,0 +1,7 @@ +package org.wordpress.android.viewmodel.posts + +sealed class PostListItemProgressBar(val visibility: Boolean) { + object Hidden : PostListItemProgressBar(visibility = false) + object Indeterminate : PostListItemProgressBar(visibility = true) + data class Determinate(val progress: Int) : PostListItemProgressBar(visibility = true) +} diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt index f25673bf5c2c..8ce6eebfee3c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt @@ -60,12 +60,6 @@ data class PostListItemUiStateData( val disableRippleEffect: Boolean ) -sealed class PostListItemProgressBar(val visibility: Boolean) { - object Hidden : PostListItemProgressBar(visibility = false) - object Indeterminate : PostListItemProgressBar(visibility = true) - data class Determinate(val progress: Int) : PostListItemProgressBar(visibility = true) -} - sealed class PostListItemAction(val buttonType: PostListButtonType, val onButtonClicked: (PostListButtonType) -> Unit) { class SingleItem(buttonType: PostListButtonType, onButtonClicked: (PostListButtonType) -> Unit) : PostListItemAction(buttonType, onButtonClicked) From 0cbb1ad20d5af1044611274bf4032b97af0ed4bd Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:44:29 -0500 Subject: [PATCH 05/59] Renamed PostItemProgressBar --- .../java/org/wordpress/android/ui/pages/PageItem.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 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 8b4bf595281c..0ad20b2bb238 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 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 -import org.wordpress.android.viewmodel.posts.PostItemProgressBar +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar import java.util.Date sealed class PageItem(open val type: Type) { @@ -26,7 +26,7 @@ sealed class PageItem(open val type: Type) { open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean, - open val progressBarState: PostItemProgressBar?, + open val progressBarState: PostListItemProgressBar?, open val showOverlay: Boolean? ) : PageItem(PAGE) @@ -38,7 +38,7 @@ sealed class PageItem(open val type: Type) { override var indent: Int = 0, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostItemProgressBar? = null, + override val progressBarState: PostListItemProgressBar? = null, override val showOverlay: Boolean? = null ) : Page( id = id, @@ -61,7 +61,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostItemProgressBar? = null, + override val progressBarState: PostListItemProgressBar? = null, override val showOverlay: Boolean? = null ) : Page( id = id, @@ -84,7 +84,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostItemProgressBar? = null, + override val progressBarState: PostListItemProgressBar? = null, override val showOverlay: Boolean? = null ) : Page( id = id, @@ -106,7 +106,7 @@ sealed class PageItem(open val type: Type) { override val date: Date, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostItemProgressBar? = null, + override val progressBarState: PostListItemProgressBar? = null, override val showOverlay: Boolean? = null ) : Page( id = id, From 53c2ad6b70bc79e1fb3227d0f4e628b857aca113 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:45:57 -0500 Subject: [PATCH 06/59] Added critical action tracker for pages. --- .../pages/PageCriticalActionHandler.kt | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt new file mode 100644 index 000000000000..89f06f62829f --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt @@ -0,0 +1,115 @@ +package org.wordpress.android.viewmodel.pages + +import kotlinx.coroutines.Job +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId +import org.wordpress.android.fluxc.model.PostModel +import org.wordpress.android.fluxc.store.PostStore +import org.wordpress.android.ui.posts.CriticalPostActionTracker +import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.DELETING_POST +import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.MOVING_POST_TO_DRAFT +import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.RESTORING_POST +import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.TRASHING_POST +import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.TRASHING_POST_WITH_LOCAL_CHANGES + +class PageCriticalActionHandler( + private val postStore: PostStore, + private val invalidateList: () -> Job +) { + private val criticalPostActionTracker = CriticalPostActionTracker(onStateChanged = { + invalidateList.invoke() + }) + + private fun moveTrashedPostToDraft(post: PostModel) { + val localPostId = LocalId(post.id) + criticalPostActionTracker.add(localPostId, MOVING_POST_TO_DRAFT) + } + + private fun undoMoveTrashedPostToDraft(post: PostModel) { + val localPostId = LocalId(post.id) + + criticalPostActionTracker.remove(localPostId, MOVING_POST_TO_DRAFT) + } + + fun deletePost(localPostId: Int) { + // If post doesn't exist, nothing else to do + val post = postStore.getPostByLocalPostId(localPostId) ?: return + criticalPostActionTracker.add(LocalId(post.id), DELETING_POST) + } + + /** + * This function handles a post being deleted and removed. Since deleting remote posts will trigger both delete + * and remove actions we only want to remove the critical action when the post is actually successfully removed. + * + * It's possible to separate these into two methods that handles delete and remove. However, the fact that they + * follow the same approach and the tricky nature of delete action makes combining the actions like so makes our + * expectations clearer. + */ + fun handlePostDeletedOrRemoved(localPostId: LocalId) { + if (criticalPostActionTracker.get(localPostId) != DELETING_POST) { + /* + * This is an unexpected action and either it has already been handled or another critical action has + * been performed. In either case, safest action is to just ignore it. + */ + return + } + + criticalPostActionTracker.remove( + localPostId = localPostId, + criticalPostAction = DELETING_POST + ) + } + + private fun trashPost(post: PostModel, hasLocalChanges: Boolean = false) { + val criticalPostAction = if (hasLocalChanges) { + TRASHING_POST_WITH_LOCAL_CHANGES + } else { + TRASHING_POST + } + + criticalPostActionTracker.add( + localPostId = LocalId(post.id), + criticalPostAction = criticalPostAction + ) + } + + fun handlePostTrashedOrNot(localPostId: LocalId) { + val criticalAction = criticalPostActionTracker.get(localPostId) + if (criticalAction != TRASHING_POST && criticalAction != TRASHING_POST_WITH_LOCAL_CHANGES) { + /* + * This is an unexpected action and either it has already been handled or another critical action has + * been performed. In either case, safest action is to just ignore it. + */ + return + } + criticalPostActionTracker.remove( + localPostId = localPostId, + criticalPostAction = criticalAction + ) + } + + private fun restorePost(post: PostModel) { + criticalPostActionTracker.add( + localPostId = LocalId(post.id), + criticalPostAction = RESTORING_POST + ) + } + + fun handlePostRestoredOrNot(localPostId: LocalId) { + if (criticalPostActionTracker.get(localPostId) != RESTORING_POST) { + /* + * This is an unexpected action and either it has already been handled or another critical action has + * been performed. In either case, safest action is to just ignore it. + */ + return + } + criticalPostActionTracker.remove( + localPostId = localPostId, + criticalPostAction = RESTORING_POST + ) + } + + fun isPerformingCriticalAction(localPostId: LocalId): Boolean { + return criticalPostActionTracker.contains(localPostId) + } +} + From 3e5b74dcb7b14dabc5be39192f7937603ee355e3 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:46:12 -0500 Subject: [PATCH 07/59] Added helper to determine progress for page items. --- .../viewmodel/pages/PageItemProgressHelper.kt | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt new file mode 100644 index 000000000000..7446cdaa27ce --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -0,0 +1,94 @@ +package org.wordpress.android.viewmodel.pages + +import org.wordpress.android.fluxc.model.PostModel +import org.wordpress.android.fluxc.model.post.PostStatus +import org.wordpress.android.fluxc.model.post.PostStatus.DRAFT +import org.wordpress.android.fluxc.store.UploadStore.UploadError +import org.wordpress.android.ui.prefs.AppPrefsWrapper +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.NothingToUpload +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadFailed +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadQueued +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadWaitingForConnection +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadingMedia +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadingPost +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.posts.PostListItemUploadStatus + +import javax.inject.Inject + +typealias ShouldShowOverlay = Boolean + +class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: AppPrefsWrapper) { + fun getProgressBarState( + uploadUiState: PostUploadUiState, + performingCriticalAction: Boolean + ): PostListItemProgressBar { + return if (shouldShowProgress(uploadUiState, performingCriticalAction)) { + if (uploadUiState is UploadingMedia) { + PostListItemProgressBar.Determinate(uploadUiState.progress) + } else { + PostListItemProgressBar.Indeterminate + } + } else { + PostListItemProgressBar.Hidden + } + } + + private fun shouldShowProgress( + uploadUiState: PostUploadUiState, + performingCriticalAction: Boolean + ): Boolean { + return performingCriticalAction || uploadUiState is UploadingPost || uploadUiState is UploadingMedia || + uploadUiState is UploadQueued + } + + sealed class PostUploadUiState { + data class UploadingMedia(val progress: Int) : PostUploadUiState() + data class UploadingPost(val isDraft: Boolean) : PostUploadUiState() + data class UploadFailed( + val error: UploadError, + val isEligibleForAutoUpload: Boolean, + val retryWillPushChanges: Boolean + ) : PostUploadUiState() + + data class UploadWaitingForConnection(val postStatus: PostStatus) : PostUploadUiState() + object UploadQueued : PostUploadUiState() + object NothingToUpload : PostUploadUiState() + } + + fun createUploadUiState( + uploadStatus: PostListItemUploadStatus, + post: PostModel + ):PostUploadUiState { + val postStatus = PostStatus.fromPost(post) + return when { + uploadStatus.hasInProgressMediaUpload -> UploadingMedia( + uploadStatus.mediaUploadProgress + ) + uploadStatus.isUploading -> UploadingPost( + postStatus == DRAFT + ) + // the upload error is not null on retry -> it needs to be evaluated after UploadingMedia and UploadingPost + uploadStatus.uploadError != null -> UploadFailed( + uploadStatus.uploadError, + uploadStatus.isEligibleForAutoUpload, + uploadStatus.uploadWillPushChanges + ) + uploadStatus.hasPendingMediaUpload || + uploadStatus.isQueued || + uploadStatus.isUploadingOrQueued -> UploadQueued + uploadStatus.isEligibleForAutoUpload -> UploadWaitingForConnection(postStatus) + else -> NothingToUpload + } + } + + fun shouldShowOverlay( + uploadUiState: PostUploadUiState, + performingCriticalAction: Boolean + ): Boolean { + // show overlay when post upload is in progress or (media upload is in progress and the user is not using Aztec) + return performingCriticalAction || + (uploadUiState is UploadingPost || + (!appPrefsWrapper.isAztecEditorEnabled && uploadUiState is UploadingMedia)) + } +} From 727215d2e0959010016c475392af1b99346399e3 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:46:35 -0500 Subject: [PATCH 08/59] added progress to all pages. --- .../viewmodel/pages/PageListViewModel.kt | 68 ++++++++++++++++--- 1 file changed, 60 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 4ecf67962a3d..2b89e0c176ce 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 @@ -11,12 +11,14 @@ import org.greenrobot.eventbus.ThreadMode import org.wordpress.android.R import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.generated.MediaActionBuilder +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.MediaModel import org.wordpress.android.fluxc.model.page.PageModel import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.fluxc.store.MediaStore.MediaPayload import org.wordpress.android.fluxc.store.MediaStore.OnMediaChanged +import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.pages.PageItem @@ -41,6 +43,7 @@ import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAF 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.PostListItemProgressBar import javax.inject.Inject import javax.inject.Named @@ -52,8 +55,10 @@ class PageListViewModel @Inject constructor( private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - uploadActionUseCase: UploadActionUseCase, - uploadStore: UploadStore + private val uploadActionUseCase: UploadActionUseCase, + private val uploadStore: UploadStore, + private val postStore: PostStore, + private val progressHelper: PageItemProgressHelper ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -250,11 +255,41 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - PublishedPage(it.remoteId, it.title, it.date, labels, pageItemIndent, - getFeaturedImageUrl(it.featuredImageId), actionsEnabled) + val progressState = getProgressStateFromPage(LocalId(it.pageId)) + PublishedPage( + it.remoteId, + it.title, + it.date, + labels, + pageItemIndent, + getFeaturedImageUrl(it.featuredImageId), + actionsEnabled, + progressState.first, + progressState.second + ) } } + private fun getProgressStateFromPage(pageId: LocalId): Pair { + val post = postStore.getPostByLocalPostId(pageId.value) + val uploadStatus = uploadStatusTracker.getUploadStatus( + post, pagesViewModel.site + ) + val uploadUiState = progressHelper.createUploadUiState(uploadStatus, post) + val isPerformingCriticalAction = pagesViewModel.pageCriticalActionHandler.isPerformingCriticalAction( + pageId + ) + val shouldShowOverlay = progressHelper.shouldShowOverlay( + uploadUiState, + isPerformingCriticalAction + ) + return Pair( + progressHelper.getProgressBarState( + uploadUiState, shouldShowOverlay + ), shouldShowOverlay + ) + } + private fun prepareScheduledPages(pages: List, actionsEnabled: Boolean): List { return pages.asSequence().groupBy { it.date.toFormattedDateString() } .map { (date, results) -> listOf(Divider(date)) + @@ -263,8 +298,15 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_changes) - ScheduledPage(it.remoteId, it.title, it.date, labels, - getFeaturedImageUrl(it.featuredImageId), actionsEnabled) } + val progressState = getProgressStateFromPage(LocalId(it.pageId)) + ScheduledPage( + it.remoteId, it.title, it.date, labels, + getFeaturedImageUrl(it.featuredImageId), + actionsEnabled, + progressState.first, + progressState.second + ) + } } .fold(mutableListOf()) { acc: MutableList, list: List -> acc.addAll(list) @@ -280,14 +322,24 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_draft) + val progressState = getProgressStateFromPage(LocalId(it.pageId)) DraftPage(it.remoteId, it.title, it.date, labels, - getFeaturedImageUrl(it.featuredImageId), actionsEnabled) + getFeaturedImageUrl(it.featuredImageId), actionsEnabled,progressState.first,progressState.second) } } private fun prepareTrashedPages(pages: List, actionsEnabled: Boolean): List { return pages.map { - TrashedPage(it.remoteId, it.title, it.date, getFeaturedImageUrl(it.featuredImageId), actionsEnabled) + val progressState = getProgressStateFromPage(LocalId(it.pageId)) + TrashedPage( + it.remoteId, + it.title, + it.date, + getFeaturedImageUrl(it.featuredImageId), + actionsEnabled, + progressState.first, + progressState.second + ) } } From 964963f81b8cd0a83820fea4eab4f62fafb532d3 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 16:46:59 -0500 Subject: [PATCH 09/59] added critical action tracker to pages view model. --- .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 f04509ab3017..4799923c1a96 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 @@ -167,6 +167,12 @@ class PagesViewModel val previewType: RemotePreviewType ) + val pageCriticalActionHandler: PageCriticalActionHandler by lazy { + PageCriticalActionHandler( + postStore, this::loadPagesAsync + ) + } + fun start(site: SiteModel) { // Check if VM is not already initialized if (_site == null) { From 92561a4454196cf60d7a97c400974ea812b8df01 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 17:01:38 -0500 Subject: [PATCH 10/59] added overlay and progress bar to layout. Note : layout isn't optimized for status labels to be displayed above overlay. This optimization is outside the scope of this PR. --- .../android/ui/pages/PageItemViewHolder.kt | 4 +++ .../src/main/res/layout/page_list_item.xml | 29 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index 8710f2c69359..b717ce961cca 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -4,10 +4,12 @@ import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.FrameLayout import android.widget.ImageButton import android.widget.ImageView import android.widget.ImageView.ScaleType import android.widget.PopupMenu +import android.widget.ProgressBar import android.widget.RadioButton import android.widget.TextView import androidx.annotation.LayoutRes @@ -46,6 +48,8 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou private val time = itemView.findViewById(R.id.time_posted) private val labels = itemView.findViewById(R.id.labels) private val featuredImage = itemView.findViewById(R.id.featured_image) + private val uploadProgressBar: ProgressBar = itemView.findViewById(R.id.upload_progress) + private val disabledOverlay: FrameLayout = itemView.findViewById(R.id.disabled_overlay) private val pageItemContainer = itemView.findViewById(R.id.page_item) private val pageLayout = itemView.findViewById(R.id.page_layout) private val selectableBackground: Drawable? = parent.context.getDrawableFromAttribute( diff --git a/WordPress/src/main/res/layout/page_list_item.xml b/WordPress/src/main/res/layout/page_list_item.xml index 2f249c46d81b..522e39a5c96c 100644 --- a/WordPress/src/main/res/layout/page_list_item.xml +++ b/WordPress/src/main/res/layout/page_list_item.xml @@ -34,14 +34,14 @@ android:layout_width="40dp" android:layout_height="40dp" android:contentDescription="@string/featured_image_desc" - app:layout_constraintBottom_toBottomOf="@id/constraintLayout2" + app:layout_constraintBottom_toBottomOf="@id/text_layout" app:layout_constraintEnd_toStartOf="@id/page_more" - app:layout_constraintStart_toEndOf="@id/constraintLayout2" - app:layout_constraintTop_toTopOf="@id/constraintLayout2" + app:layout_constraintStart_toEndOf="@id/text_layout" + app:layout_constraintTop_toTopOf="@id/text_layout" tools:srcCompat="@tools:sample/avatars"/> + + From 515dfb16bfb8e8b1421463fce5e9b3c15d72861f Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 29 Jan 2020 17:31:08 -0500 Subject: [PATCH 11/59] attached page progress state to ui --- .../android/ui/pages/PageItemViewHolder.kt | 26 +++++++++++++++++-- .../android/ui/pages/PageListAdapter.kt | 6 +++-- .../android/ui/pages/PageListFragment.kt | 6 ++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index b717ce961cca..f887f70883db 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -22,14 +22,18 @@ import org.wordpress.android.ui.pages.PageItem.Empty import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.ParentPage import org.wordpress.android.ui.reader.utils.ReaderUtils -import org.wordpress.android.util.currentLocale +import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DateTimeUtils import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.ImageUtils import org.wordpress.android.util.capitalizeWithLocaleWithoutLint +import org.wordpress.android.util.currentLocale import org.wordpress.android.util.getDrawableFromAttribute import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Determinate +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Indeterminate import java.util.Date sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layout: Int) : @@ -41,7 +45,8 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou private val onMenuAction: (PageItem.Action, Page) -> Boolean, private val onItemTapped: (Page) -> Unit, private val imageManager: ImageManager? = null, - private val isSitePhotonCapable: Boolean = false + private val isSitePhotonCapable: Boolean = false, + private val uiHelper: UiHelpers? = null ) : PageItemViewHolder(parentView, R.layout.page_list_item) { private val pageTitle = itemView.findViewById(R.id.page_title) private val pageMore = itemView.findViewById(R.id.page_more) @@ -90,6 +95,23 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou setBackground(page.tapActionEnabled) showFeaturedImage(page.imageUrl) + page.showOverlay?.let { + uiHelper?.updateVisibility(disabledOverlay,it) + } + page.progressBarState?.let { + updateProgressBarState(it) + } + } + } + + private fun updateProgressBarState(progressBarState: PostListItemProgressBar) { + uiHelper?.updateVisibility(uploadProgressBar,progressBarState.visibility) + when (progressBarState) { + Indeterminate -> uploadProgressBar.isIndeterminate = true + is Determinate -> { + uploadProgressBar.isIndeterminate = false + uploadProgressBar.progress = progressBarState.progress + } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListAdapter.kt index 757bd14a76b1..7d4f73e34832 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListAdapter.kt @@ -7,6 +7,7 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItemViewHolder.EmptyViewHolder import org.wordpress.android.ui.pages.PageItemViewHolder.PageDividerViewHolder import org.wordpress.android.ui.pages.PageItemViewHolder.PageViewHolder +import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.image.ImageManager class PageListAdapter( @@ -14,14 +15,15 @@ class PageListAdapter( private val onItemTapped: (Page) -> Unit, private val onEmptyActionButtonTapped: () -> Unit, private val isSitePhotonCapable: Boolean, - private val imageManager: ImageManager + private val imageManager: ImageManager, + private val uiHelpers: UiHelpers ) : Adapter() { private val items = mutableListOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageItemViewHolder { return when (viewType) { PageItem.Type.PAGE.viewType -> PageViewHolder(parent, onMenuAction, onItemTapped, imageManager, - isSitePhotonCapable) + isSitePhotonCapable, uiHelpers) PageItem.Type.DIVIDER.viewType -> PageDividerViewHolder(parent) PageItem.Type.EMPTY.viewType -> EmptyViewHolder(parent, onEmptyActionButtonTapped) else -> throw Throwable("Unexpected view type") diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt index 253b32bacd75..ea3529ce5228 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt @@ -15,8 +15,10 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.pages_list_fragment.* import org.wordpress.android.R import org.wordpress.android.WordPress +import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.image.ImageManager +import org.wordpress.android.viewmodel.pages.PageItemProgressHelper import org.wordpress.android.viewmodel.pages.PageListViewModel import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType import org.wordpress.android.viewmodel.pages.PagesViewModel @@ -26,6 +28,7 @@ import javax.inject.Inject class PageListFragment : Fragment() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject internal lateinit var imageManager: ImageManager + @Inject internal lateinit var uiHelper: UiHelpers private lateinit var viewModel: PageListViewModel private var linearLayoutManager: LinearLayoutManager? = null @@ -107,7 +110,8 @@ class PageListFragment : Fragment() { { page -> viewModel.onItemTapped(page) }, { viewModel.onEmptyListNewPageButtonTapped() }, isSitePhotonCapable, - imageManager + imageManager, + uiHelper ) recyclerView.adapter = adapter } else { From a0a724b6730160158e04fd4a5490f313c6082734 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 12:51:27 -0500 Subject: [PATCH 12/59] Removed critical action from PR. --- .../pages/PageCriticalActionHandler.kt | 115 ------------------ .../viewmodel/pages/PageItemProgressHelper.kt | 22 ++-- .../viewmodel/pages/PageListViewModel.kt | 19 +-- .../android/viewmodel/pages/PagesViewModel.kt | 6 - 4 files changed, 13 insertions(+), 149 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt deleted file mode 100644 index 89f06f62829f..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageCriticalActionHandler.kt +++ /dev/null @@ -1,115 +0,0 @@ -package org.wordpress.android.viewmodel.pages - -import kotlinx.coroutines.Job -import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId -import org.wordpress.android.fluxc.model.PostModel -import org.wordpress.android.fluxc.store.PostStore -import org.wordpress.android.ui.posts.CriticalPostActionTracker -import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.DELETING_POST -import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.MOVING_POST_TO_DRAFT -import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.RESTORING_POST -import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.TRASHING_POST -import org.wordpress.android.ui.posts.CriticalPostActionTracker.CriticalPostAction.TRASHING_POST_WITH_LOCAL_CHANGES - -class PageCriticalActionHandler( - private val postStore: PostStore, - private val invalidateList: () -> Job -) { - private val criticalPostActionTracker = CriticalPostActionTracker(onStateChanged = { - invalidateList.invoke() - }) - - private fun moveTrashedPostToDraft(post: PostModel) { - val localPostId = LocalId(post.id) - criticalPostActionTracker.add(localPostId, MOVING_POST_TO_DRAFT) - } - - private fun undoMoveTrashedPostToDraft(post: PostModel) { - val localPostId = LocalId(post.id) - - criticalPostActionTracker.remove(localPostId, MOVING_POST_TO_DRAFT) - } - - fun deletePost(localPostId: Int) { - // If post doesn't exist, nothing else to do - val post = postStore.getPostByLocalPostId(localPostId) ?: return - criticalPostActionTracker.add(LocalId(post.id), DELETING_POST) - } - - /** - * This function handles a post being deleted and removed. Since deleting remote posts will trigger both delete - * and remove actions we only want to remove the critical action when the post is actually successfully removed. - * - * It's possible to separate these into two methods that handles delete and remove. However, the fact that they - * follow the same approach and the tricky nature of delete action makes combining the actions like so makes our - * expectations clearer. - */ - fun handlePostDeletedOrRemoved(localPostId: LocalId) { - if (criticalPostActionTracker.get(localPostId) != DELETING_POST) { - /* - * This is an unexpected action and either it has already been handled or another critical action has - * been performed. In either case, safest action is to just ignore it. - */ - return - } - - criticalPostActionTracker.remove( - localPostId = localPostId, - criticalPostAction = DELETING_POST - ) - } - - private fun trashPost(post: PostModel, hasLocalChanges: Boolean = false) { - val criticalPostAction = if (hasLocalChanges) { - TRASHING_POST_WITH_LOCAL_CHANGES - } else { - TRASHING_POST - } - - criticalPostActionTracker.add( - localPostId = LocalId(post.id), - criticalPostAction = criticalPostAction - ) - } - - fun handlePostTrashedOrNot(localPostId: LocalId) { - val criticalAction = criticalPostActionTracker.get(localPostId) - if (criticalAction != TRASHING_POST && criticalAction != TRASHING_POST_WITH_LOCAL_CHANGES) { - /* - * This is an unexpected action and either it has already been handled or another critical action has - * been performed. In either case, safest action is to just ignore it. - */ - return - } - criticalPostActionTracker.remove( - localPostId = localPostId, - criticalPostAction = criticalAction - ) - } - - private fun restorePost(post: PostModel) { - criticalPostActionTracker.add( - localPostId = LocalId(post.id), - criticalPostAction = RESTORING_POST - ) - } - - fun handlePostRestoredOrNot(localPostId: LocalId) { - if (criticalPostActionTracker.get(localPostId) != RESTORING_POST) { - /* - * This is an unexpected action and either it has already been handled or another critical action has - * been performed. In either case, safest action is to just ignore it. - */ - return - } - criticalPostActionTracker.remove( - localPostId = localPostId, - criticalPostAction = RESTORING_POST - ) - } - - fun isPerformingCriticalAction(localPostId: LocalId): Boolean { - return criticalPostActionTracker.contains(localPostId) - } -} - diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 7446cdaa27ce..6307da38e326 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -20,10 +20,9 @@ typealias ShouldShowOverlay = Boolean class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: AppPrefsWrapper) { fun getProgressBarState( - uploadUiState: PostUploadUiState, - performingCriticalAction: Boolean + uploadUiState: PostUploadUiState ): PostListItemProgressBar { - return if (shouldShowProgress(uploadUiState, performingCriticalAction)) { + return if (shouldShowProgress(uploadUiState)) { if (uploadUiState is UploadingMedia) { PostListItemProgressBar.Determinate(uploadUiState.progress) } else { @@ -35,10 +34,9 @@ class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: Ap } private fun shouldShowProgress( - uploadUiState: PostUploadUiState, - performingCriticalAction: Boolean + uploadUiState: PostUploadUiState ): Boolean { - return performingCriticalAction || uploadUiState is UploadingPost || uploadUiState is UploadingMedia || + return uploadUiState is UploadingPost || uploadUiState is UploadingMedia || uploadUiState is UploadQueued } @@ -59,7 +57,7 @@ class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: Ap fun createUploadUiState( uploadStatus: PostListItemUploadStatus, post: PostModel - ):PostUploadUiState { + ): PostUploadUiState { val postStatus = PostStatus.fromPost(post) return when { uploadStatus.hasInProgressMediaUpload -> UploadingMedia( @@ -82,13 +80,9 @@ class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: Ap } } - fun shouldShowOverlay( - uploadUiState: PostUploadUiState, - performingCriticalAction: Boolean - ): Boolean { + 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 performingCriticalAction || - (uploadUiState is UploadingPost || - (!appPrefsWrapper.isAztecEditorEnabled && uploadUiState is UploadingMedia)) + return (uploadUiState is UploadingPost || + (!appPrefsWrapper.isAztecEditorEnabled && uploadUiState is UploadingMedia)) } } 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 2b89e0c176ce..31e398d97f08 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 @@ -55,8 +55,8 @@ class PageListViewModel @Inject constructor( private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - private val uploadActionUseCase: UploadActionUseCase, - private val uploadStore: UploadStore, + uploadActionUseCase: UploadActionUseCase, + uploadStore: UploadStore, private val postStore: PostStore, private val progressHelper: PageItemProgressHelper ) : ScopedViewModel(coroutineDispatcher) { @@ -276,18 +276,9 @@ class PageListViewModel @Inject constructor( post, pagesViewModel.site ) val uploadUiState = progressHelper.createUploadUiState(uploadStatus, post) - val isPerformingCriticalAction = pagesViewModel.pageCriticalActionHandler.isPerformingCriticalAction( - pageId - ) - val shouldShowOverlay = progressHelper.shouldShowOverlay( - uploadUiState, - isPerformingCriticalAction - ) - return Pair( - progressHelper.getProgressBarState( - uploadUiState, shouldShowOverlay - ), shouldShowOverlay - ) + + val shouldShowOverlay = progressHelper.shouldShowOverlay(uploadUiState) + return Pair(progressHelper.getProgressBarState(uploadUiState), shouldShowOverlay) } private fun prepareScheduledPages(pages: List, actionsEnabled: Boolean): List { 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 4799923c1a96..f04509ab3017 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 @@ -167,12 +167,6 @@ class PagesViewModel val previewType: RemotePreviewType ) - val pageCriticalActionHandler: PageCriticalActionHandler by lazy { - PageCriticalActionHandler( - postStore, this::loadPagesAsync - ) - } - fun start(site: SiteModel) { // Check if VM is not already initialized if (_site == null) { From 1c1dedcd70cf99236656a6c1bc39c1526b80df42 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 13:31:15 -0500 Subject: [PATCH 13/59] refactored progress helper and added progress to search as well. --- .../wordpress/android/ui/pages/PageItem.kt | 22 ++-- .../android/ui/pages/PageItemViewHolder.kt | 13 +-- .../android/ui/pages/PageListFragment.kt | 1 - .../android/ui/pages/PageSearchAdapter.kt | 6 +- .../android/ui/pages/SearchListFragment.kt | 5 +- .../viewmodel/pages/PageItemProgressHelper.kt | 32 ++++-- .../viewmodel/pages/PageListViewModel.kt | 102 +++++++++++------- .../viewmodel/pages/SearchListViewModel.kt | 59 +++++++++- 8 files changed, 167 insertions(+), 73 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 0ad20b2bb238..9b0818449fff 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 @@ -26,9 +26,9 @@ sealed class PageItem(open val type: Type) { open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean, - open val progressBarState: PostListItemProgressBar?, - open val showOverlay: Boolean? - ) : PageItem(PAGE) + open val progressBarState: PostListItemProgressBar, + open val showOverlay: Boolean + ) : PageItem(PAGE) data class PublishedPage( override val id: Long, @@ -38,8 +38,8 @@ sealed class PageItem(open val type: Type) { override var indent: Int = 0, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar? = null, - override val showOverlay: Boolean? = null + override val progressBarState: PostListItemProgressBar, + override val showOverlay: Boolean ) : Page( id = id, title = title, @@ -61,8 +61,8 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar? = null, - override val showOverlay: Boolean? = null + override val progressBarState: PostListItemProgressBar, + override val showOverlay: Boolean ) : Page( id = id, title = title, @@ -84,8 +84,8 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar? = null, - override val showOverlay: Boolean? = null + override val progressBarState: PostListItemProgressBar, + override val showOverlay: Boolean ) : Page( id = id, title = title, @@ -106,8 +106,8 @@ sealed class PageItem(open val type: Type) { override val date: Date, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar? = null, - override val showOverlay: Boolean? = null + override val progressBarState: PostListItemProgressBar, + override val showOverlay: Boolean ) : Page( id = id, title = title, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index f887f70883db..1768874508d8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -46,7 +46,7 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou private val onItemTapped: (Page) -> Unit, private val imageManager: ImageManager? = null, private val isSitePhotonCapable: Boolean = false, - private val uiHelper: UiHelpers? = null + private val uiHelper: UiHelpers ) : PageItemViewHolder(parentView, R.layout.page_list_item) { private val pageTitle = itemView.findViewById(R.id.page_title) private val pageMore = itemView.findViewById(R.id.page_more) @@ -95,17 +95,14 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou setBackground(page.tapActionEnabled) showFeaturedImage(page.imageUrl) - page.showOverlay?.let { - uiHelper?.updateVisibility(disabledOverlay,it) - } - page.progressBarState?.let { - updateProgressBarState(it) - } + + uiHelper.updateVisibility(disabledOverlay, page.showOverlay) + updateProgressBarState(page.progressBarState) } } private fun updateProgressBarState(progressBarState: PostListItemProgressBar) { - uiHelper?.updateVisibility(uploadProgressBar,progressBarState.visibility) + uiHelper.updateVisibility(uploadProgressBar,progressBarState.visibility) when (progressBarState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt index ea3529ce5228..5560b5b17fb0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageListFragment.kt @@ -18,7 +18,6 @@ import org.wordpress.android.WordPress import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.image.ImageManager -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper import org.wordpress.android.viewmodel.pages.PageListViewModel import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType import org.wordpress.android.viewmodel.pages.PagesViewModel diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageSearchAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageSearchAdapter.kt index 30398b4b83d5..3b5fec9692a7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageSearchAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageSearchAdapter.kt @@ -7,16 +7,18 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItemViewHolder.EmptyViewHolder import org.wordpress.android.ui.pages.PageItemViewHolder.PageDividerViewHolder import org.wordpress.android.ui.pages.PageItemViewHolder.PageViewHolder +import org.wordpress.android.ui.utils.UiHelpers class PageSearchAdapter( private val onMenuAction: (PageItem.Action, Page) -> Boolean, - private val onItemTapped: (Page) -> Unit + private val onItemTapped: (Page) -> Unit, + private val uiHelper: UiHelpers ) : Adapter() { private val items = mutableListOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageItemViewHolder { return when (viewType) { - PageItem.Type.PAGE.viewType -> PageViewHolder(parent, onMenuAction, onItemTapped) + PageItem.Type.PAGE.viewType -> PageViewHolder(parent, onMenuAction, onItemTapped, uiHelper = uiHelper) PageItem.Type.DIVIDER.viewType -> PageDividerViewHolder(parent) PageItem.Type.EMPTY.viewType -> EmptyViewHolder(parent) { } else -> throw Throwable("Unexpected view type") diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt index 34115a399eb4..b590393de5e8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/SearchListFragment.kt @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.pages_list_fragment.* import org.wordpress.android.R import org.wordpress.android.WordPress +import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.DisplayUtils import org.wordpress.android.viewmodel.pages.PagesViewModel import org.wordpress.android.viewmodel.pages.SearchListViewModel @@ -25,6 +26,7 @@ class SearchListFragment : Fragment() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory private lateinit var viewModel: SearchListViewModel private var linearLayoutManager: LinearLayoutManager? = null + @Inject lateinit var uiHelper: UiHelpers private val listStateKey = "list_state" @@ -86,8 +88,7 @@ class SearchListFragment : Fragment() { if (recyclerView.adapter == null) { adapter = PageSearchAdapter( { action, page -> viewModel.onMenuAction(action, page) }, - { page -> viewModel.onItemTapped(page) } - ) + { page -> viewModel.onItemTapped(page) }, uiHelper) recyclerView.adapter = adapter } else { adapter = recyclerView.adapter as PageSearchAdapter diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 6307da38e326..b56bd9ddf9f0 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -1,9 +1,13 @@ package org.wordpress.android.viewmodel.pages +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.posts.PostListUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.NothingToUpload import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadFailed @@ -14,12 +18,15 @@ import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUi import org.wordpress.android.viewmodel.posts.PostListItemProgressBar import org.wordpress.android.viewmodel.posts.PostListItemUploadStatus -import javax.inject.Inject - typealias ShouldShowOverlay = Boolean -class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: AppPrefsWrapper) { - fun getProgressBarState( +class PageItemProgressHelper( + private val appPrefsWrapper: AppPrefsWrapper, + private val postStore: PostStore, + private val uploadStatusTracker: PostListUploadStatusTracker, + private val site: SiteModel +) { + private fun getProgressBarState( uploadUiState: PostUploadUiState ): PostListItemProgressBar { return if (shouldShowProgress(uploadUiState)) { @@ -54,7 +61,7 @@ class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: Ap object NothingToUpload : PostUploadUiState() } - fun createUploadUiState( + private fun createUploadUiState( uploadStatus: PostListItemUploadStatus, post: PostModel ): PostUploadUiState { @@ -80,9 +87,22 @@ class PageItemProgressHelper @Inject constructor(private val appPrefsWrapper: Ap } } - fun shouldShowOverlay(uploadUiState: PostUploadUiState): Boolean { + 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 || (!appPrefsWrapper.isAztecEditorEnabled && uploadUiState is UploadingMedia)) } + + fun getProgressStateForPage( + pageId: LocalId + ): Pair { + val post = postStore.getPostByLocalPostId(pageId.value) + val uploadStatus = uploadStatusTracker.getUploadStatus( + post, site + ) + val uploadUiState = createUploadUiState(uploadStatus, post) + + val shouldShowOverlay = shouldShowOverlay(uploadUiState) + return Pair(getProgressBarState(uploadUiState), shouldShowOverlay) + } } 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 31e398d97f08..329e5897cb0d 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 @@ -31,6 +31,7 @@ import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage import org.wordpress.android.ui.posts.PostListUploadStatusTracker +import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.util.AppLog import org.wordpress.android.util.LocaleManagerWrapper @@ -43,7 +44,6 @@ import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType.DRAF 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.PostListItemProgressBar import javax.inject.Inject import javax.inject.Named @@ -57,8 +57,8 @@ class PageListViewModel @Inject constructor( @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, uploadActionUseCase: UploadActionUseCase, uploadStore: UploadStore, - private val postStore: PostStore, - private val progressHelper: PageItemProgressHelper + appPrefsWrapper: AppPrefsWrapper, + private val postStore: PostStore ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -84,6 +84,10 @@ class PageListViewModel @Inject constructor( uploadActionUseCase = uploadActionUseCase ) + private val progressHelper: PageItemProgressHelper by lazy { + PageItemProgressHelper(appPrefsWrapper, postStore, uploadStatusTracker, pagesViewModel.site) + } + enum class PageListType(val pageStatuses: List) { PUBLISHED(listOf(PageStatus.PUBLISHED, PageStatus.PRIVATE)), DRAFTS(listOf(PageStatus.DRAFT, PageStatus.PENDING)), @@ -100,6 +104,7 @@ class PageListViewModel @Inject constructor( } } } + val title: Int get() = when (this) { PUBLISHED -> R.string.pages_published @@ -199,7 +204,14 @@ class PageListViewModel @Inject constructor( PUBLISHED -> _pages.postValue(listOf(Empty(R.string.pages_empty_published))) SCHEDULED -> _pages.postValue(listOf(Empty(R.string.pages_empty_scheduled))) DRAFTS -> _pages.postValue(listOf(Empty(R.string.pages_empty_drafts))) - TRASHED -> _pages.postValue(listOf(Empty(R.string.pages_empty_trashed, isButtonVisible = false))) + TRASHED -> _pages.postValue( + listOf( + Empty( + R.string.pages_empty_trashed, + isButtonVisible = false + ) + ) + ) } } } else { @@ -235,7 +247,10 @@ class PageListViewModel @Inject constructor( return null } - private fun preparePublishedPages(pages: List, actionsEnabled: Boolean): List { + private fun preparePublishedPages( + pages: List, + actionsEnabled: Boolean + ): List { val shouldSortTopologically = pages.size < MAX_TOPOLOGICAL_PAGE_COUNT val sortedPages = if (shouldSortTopologically) { topologicalSort(pages, listType = PUBLISHED) @@ -255,7 +270,8 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - val progressState = getProgressStateFromPage(LocalId(it.pageId)) + val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + PublishedPage( it.remoteId, it.title, @@ -270,34 +286,32 @@ class PageListViewModel @Inject constructor( } } - private fun getProgressStateFromPage(pageId: LocalId): Pair { - val post = postStore.getPostByLocalPostId(pageId.value) - val uploadStatus = uploadStatusTracker.getUploadStatus( - post, pagesViewModel.site - ) - val uploadUiState = progressHelper.createUploadUiState(uploadStatus, post) - - val shouldShowOverlay = progressHelper.shouldShowOverlay(uploadUiState) - return Pair(progressHelper.getProgressBarState(uploadUiState), shouldShowOverlay) - } - - private fun prepareScheduledPages(pages: List, actionsEnabled: Boolean): List { + private fun prepareScheduledPages( + pages: List, + actionsEnabled: Boolean + ): List { return pages.asSequence().groupBy { it.date.toFormattedDateString() } - .map { (date, results) -> listOf(Divider(date)) + - results.map { - val labels = mutableListOf() - if (it.hasLocalChanges) - labels.add(R.string.local_changes) - - val progressState = getProgressStateFromPage(LocalId(it.pageId)) - ScheduledPage( - it.remoteId, it.title, it.date, labels, - getFeaturedImageUrl(it.featuredImageId), - actionsEnabled, - progressState.first, - progressState.second - ) - } + .map { (date, results) -> + listOf(Divider(date)) + + results.map { + val labels = mutableListOf() + if (it.hasLocalChanges) + labels.add(R.string.local_changes) + + val progressState = progressHelper.getProgressStateForPage( + LocalId( + it.pageId + ) + ) + + ScheduledPage( + it.remoteId, it.title, it.date, labels, + getFeaturedImageUrl(it.featuredImageId), + actionsEnabled, + progressState.first, + progressState.second + ) + } } .fold(mutableListOf()) { acc: MutableList, list: List -> acc.addAll(list) @@ -313,15 +327,26 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_draft) - val progressState = getProgressStateFromPage(LocalId(it.pageId)) - DraftPage(it.remoteId, it.title, it.date, labels, - getFeaturedImageUrl(it.featuredImageId), actionsEnabled,progressState.first,progressState.second) + val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + DraftPage( + it.remoteId, + it.title, + it.date, + labels, + getFeaturedImageUrl(it.featuredImageId), + actionsEnabled, + progressState.first, + progressState.second + ) } } - private fun prepareTrashedPages(pages: List, actionsEnabled: Boolean): List { + private fun prepareTrashedPages( + pages: List, + actionsEnabled: Boolean + ): List { return pages.map { - val progressState = getProgressStateFromPage(LocalId(it.pageId)) + val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) TrashedPage( it.remoteId, it.title, @@ -370,3 +395,4 @@ class PageListViewModel @Inject constructor( } } } + 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 70b8e25d0845..168e1b2e9bdb 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,8 +7,11 @@ 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 +import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.modules.UI_SCOPE import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Action @@ -19,6 +22,9 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage +import org.wordpress.android.ui.posts.PostListUploadStatusTracker +import org.wordpress.android.ui.prefs.AppPrefsWrapper +import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType import java.util.SortedMap @@ -28,7 +34,11 @@ import javax.inject.Named class SearchListViewModel @Inject constructor( private val resourceProvider: ResourceProvider, - @Named(UI_SCOPE) private val uiScope: CoroutineScope + @Named(UI_SCOPE) private val uiScope: CoroutineScope, + uploadActionUseCase: UploadActionUseCase, + uploadStore: UploadStore, + appPrefsWrapper: AppPrefsWrapper, + private val postStore: PostStore ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult @@ -36,6 +46,15 @@ class SearchListViewModel private var isStarted: Boolean = false private lateinit var pagesViewModel: PagesViewModel + private val uploadStatusTracker = PostListUploadStatusTracker( + uploadStore = uploadStore, + uploadActionUseCase = uploadActionUseCase + ) + + private val progressHelper: PageItemProgressHelper by lazy { + PageItemProgressHelper(appPrefsWrapper, postStore, uploadStatusTracker, pagesViewModel.site) + } + fun start(pagesViewModel: PagesViewModel) { this.pagesViewModel = pagesViewModel @@ -86,12 +105,42 @@ class SearchListViewModel } private fun PageModel.toPageItem(areActionsEnabled: Boolean): PageItem { + val progressState = progressHelper.getProgressStateForPage(LocalId(pageId)) + return when (status) { PageStatus.PUBLISHED, PageStatus.PRIVATE -> - PublishedPage(remoteId, title, date, actionsEnabled = areActionsEnabled) - PageStatus.DRAFT, PageStatus.PENDING -> DraftPage(remoteId, title, date, actionsEnabled = areActionsEnabled) - PageStatus.TRASHED -> TrashedPage(remoteId, title, date, actionsEnabled = areActionsEnabled) - PageStatus.SCHEDULED -> ScheduledPage(remoteId, title, date, actionsEnabled = areActionsEnabled) + PublishedPage( + remoteId, + title, + date, + actionsEnabled = areActionsEnabled, + progressBarState = progressState.first, + showOverlay = progressState.second + ) + PageStatus.DRAFT, PageStatus.PENDING -> DraftPage( + remoteId, + title, + date, + actionsEnabled = areActionsEnabled, + progressBarState = progressState.first, + showOverlay = progressState.second + ) + PageStatus.TRASHED -> TrashedPage( + remoteId, + title, + date, + actionsEnabled = areActionsEnabled, + progressBarState = progressState.first, + showOverlay = progressState.second + ) + PageStatus.SCHEDULED -> ScheduledPage( + remoteId, + title, + date, + actionsEnabled = areActionsEnabled, + progressBarState = progressState.first, + showOverlay = progressState.second + ) } } } From 0e7dc7a1499dcc1b070e7a6ec903049e59df410c Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 17:45:29 -0500 Subject: [PATCH 14/59] fixed style errors. --- .../src/main/java/org/wordpress/android/ui/pages/PageItem.kt | 2 +- .../java/org/wordpress/android/ui/pages/PageItemViewHolder.kt | 2 +- 2 files changed, 2 insertions(+), 2 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 9b0818449fff..e25619c64cdd 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 @@ -28,7 +28,7 @@ sealed class PageItem(open val type: Type) { open val tapActionEnabled: Boolean, open val progressBarState: PostListItemProgressBar, open val showOverlay: Boolean - ) : PageItem(PAGE) + ) : PageItem(PAGE) data class PublishedPage( override val id: Long, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index 1768874508d8..9f7f9b03b2cf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -102,7 +102,7 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou } private fun updateProgressBarState(progressBarState: PostListItemProgressBar) { - uiHelper.updateVisibility(uploadProgressBar,progressBarState.visibility) + uiHelper.updateVisibility(uploadProgressBar, progressBarState.visibility) when (progressBarState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { From df1e6bb4a2b854ce4b5552bafb33560e6dff8a54 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:13:23 -0500 Subject: [PATCH 15/59] made tracker injectable. --- .../wordpress/android/ui/posts/PostListUploadStatusTracker.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt index 485933d6e190..caa36f7b9124 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt @@ -7,12 +7,13 @@ import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.ui.uploads.UploadService import org.wordpress.android.viewmodel.posts.PostListItemUploadStatus +import javax.inject.Inject /** * This is a temporary class to make the PostListViewModel more manageable. Please feel free to refactor it any way * you see fit. */ -class PostListUploadStatusTracker( +class PostListUploadStatusTracker @Inject constructor( private val uploadStore: UploadStore, private val uploadActionUseCase: UploadActionUseCase ) { From 49ce8fe3936c11e0babbb7b4e223b8de991fc209 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:13:46 -0500 Subject: [PATCH 16/59] made progress helper injectable --- .../viewmodel/pages/PageItemProgressHelper.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index b56bd9ddf9f0..27aeae7f3af9 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -17,15 +17,21 @@ import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUi import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadingPost import org.wordpress.android.viewmodel.posts.PostListItemProgressBar import org.wordpress.android.viewmodel.posts.PostListItemUploadStatus +import javax.inject.Inject typealias ShouldShowOverlay = Boolean -class PageItemProgressHelper( +class PageItemProgressHelper @Inject constructor( private val appPrefsWrapper: AppPrefsWrapper, private val postStore: PostStore, - private val uploadStatusTracker: PostListUploadStatusTracker, - private val site: SiteModel + private val uploadStatusTracker: PostListUploadStatusTracker ) { + private lateinit var site: SiteModel + + fun attachSite(site: SiteModel){ + this.site = site + } + private fun getProgressBarState( uploadUiState: PostUploadUiState ): PostListItemProgressBar { From fbe1fa57275606cc51a46a42bc4d7ec50f388434 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:14:12 -0500 Subject: [PATCH 17/59] removed unneeded dependencies and injected progress helper --- .../viewmodel/pages/PageListViewModel.kt | 22 +++---------------- .../viewmodel/pages/SearchListViewModel.kt | 20 ++--------------- 2 files changed, 5 insertions(+), 37 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 329e5897cb0d..815236e91436 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 @@ -18,8 +18,6 @@ import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.fluxc.store.MediaStore.MediaPayload import org.wordpress.android.fluxc.store.MediaStore.OnMediaChanged -import org.wordpress.android.fluxc.store.PostStore -import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Action @@ -30,9 +28,6 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage -import org.wordpress.android.ui.posts.PostListUploadStatusTracker -import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.util.AppLog import org.wordpress.android.util.LocaleManagerWrapper import org.wordpress.android.util.SiteUtils @@ -55,10 +50,7 @@ class PageListViewModel @Inject constructor( private val dispatcher: Dispatcher, private val localeManagerWrapper: LocaleManagerWrapper, @Named(BG_THREAD) private val coroutineDispatcher: CoroutineDispatcher, - uploadActionUseCase: UploadActionUseCase, - uploadStore: UploadStore, - appPrefsWrapper: AppPrefsWrapper, - private val postStore: PostStore + private val progressHelper: PageItemProgressHelper ) : ScopedViewModel(coroutineDispatcher) { private val _pages: MutableLiveData> = MutableLiveData() val pages: LiveData, Boolean>> = Transformations.map(_pages) { @@ -79,15 +71,6 @@ class PageListViewModel @Inject constructor( SiteUtils.isPhotonCapable(pagesViewModel.site) } - private val uploadStatusTracker = PostListUploadStatusTracker( - uploadStore = uploadStore, - uploadActionUseCase = uploadActionUseCase - ) - - private val progressHelper: PageItemProgressHelper by lazy { - PageItemProgressHelper(appPrefsWrapper, postStore, uploadStatusTracker, pagesViewModel.site) - } - enum class PageListType(val pageStatuses: List) { PUBLISHED(listOf(PageStatus.PUBLISHED, PageStatus.PRIVATE)), DRAFTS(listOf(PageStatus.DRAFT, PageStatus.PENDING)), @@ -125,6 +108,8 @@ class PageListViewModel @Inject constructor( this.listType = listType this.pagesViewModel = pagesViewModel + progressHelper.attachSite(site = pagesViewModel.site) + if (!isStarted) { isStarted = true @@ -395,4 +380,3 @@ class PageListViewModel @Inject constructor( } } } - 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 168e1b2e9bdb..12fe0bc62e8b 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 @@ -10,8 +10,6 @@ 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 -import org.wordpress.android.fluxc.store.UploadStore import org.wordpress.android.modules.UI_SCOPE import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Action @@ -22,9 +20,6 @@ import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.ui.pages.PageItem.ScheduledPage import org.wordpress.android.ui.pages.PageItem.TrashedPage -import org.wordpress.android.ui.posts.PostListUploadStatusTracker -import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.ui.uploads.UploadActionUseCase import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType import java.util.SortedMap @@ -35,10 +30,7 @@ class SearchListViewModel @Inject constructor( private val resourceProvider: ResourceProvider, @Named(UI_SCOPE) private val uiScope: CoroutineScope, - uploadActionUseCase: UploadActionUseCase, - uploadStore: UploadStore, - appPrefsWrapper: AppPrefsWrapper, - private val postStore: PostStore + private val progressHelper: PageItemProgressHelper ) : ViewModel() { private val _searchResult: MutableLiveData> = MutableLiveData() val searchResult: LiveData> = _searchResult @@ -46,15 +38,6 @@ class SearchListViewModel private var isStarted: Boolean = false private lateinit var pagesViewModel: PagesViewModel - private val uploadStatusTracker = PostListUploadStatusTracker( - uploadStore = uploadStore, - uploadActionUseCase = uploadActionUseCase - ) - - private val progressHelper: PageItemProgressHelper by lazy { - PageItemProgressHelper(appPrefsWrapper, postStore, uploadStatusTracker, pagesViewModel.site) - } - fun start(pagesViewModel: PagesViewModel) { this.pagesViewModel = pagesViewModel @@ -62,6 +45,7 @@ class SearchListViewModel isStarted = true pagesViewModel.searchPages.observeForever(searchObserver) + progressHelper.attachSite(site = pagesViewModel.site) } } From dc3870d933ca883ac1dec0299b1ab13e9a1f2bfa Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:14:39 -0500 Subject: [PATCH 18/59] fixed tests that were failing since progress helper wasn't added. --- .../viewmodel/pages/PageListViewModelTest.kt | 15 +++++++++++- .../pages/SearchListViewModelTest.kt | 23 ++++++++++++++++--- 2 files changed, 34 insertions(+), 4 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 c4d8e8579310..1c837a51e84c 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 @@ -1,6 +1,7 @@ package org.wordpress.android.viewmodel.pages import androidx.lifecycle.MutableLiveData +import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.whenever import kotlinx.coroutines.Dispatchers import org.assertj.core.api.Assertions.assertThat @@ -19,6 +20,7 @@ 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.PUBLISHED +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar import java.util.Date import java.util.Locale @@ -29,12 +31,23 @@ class PageListViewModelTest : BaseUnitTest() { @Mock lateinit var dispatcher: Dispatcher @Mock lateinit var pagesViewModel: PagesViewModel @Mock lateinit var localeManagerWrapper: LocaleManagerWrapper + @Mock lateinit var progressHelper: PageItemProgressHelper + private lateinit var viewModel: PageListViewModel private val site = SiteModel() private val pageListState = MutableLiveData() @Before fun setUp() { - viewModel = PageListViewModel(mediaStore, dispatcher, localeManagerWrapper, Dispatchers.Unconfined) + viewModel = PageListViewModel( + mediaStore, + dispatcher, + localeManagerWrapper, + Dispatchers.Unconfined, + progressHelper + ) + + whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair( + PostListItemProgressBar.Hidden, false)) whenever(pagesViewModel.arePageActionsEnabled).thenReturn(false) whenever(pagesViewModel.site).thenReturn(site) 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 07ace9570f3d..c519493f0897 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 @@ -26,6 +26,7 @@ import org.wordpress.android.ui.pages.PageItem.Empty import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar import java.util.Date import java.util.SortedMap @@ -37,6 +38,7 @@ class SearchListViewModelTest { @Mock lateinit var resourceProvider: ResourceProvider @Mock lateinit var site: SiteModel @Mock lateinit var pagesViewModel: PagesViewModel + @Mock lateinit var progressHelper: PageItemProgressHelper private lateinit var searchPages: MutableLiveData>> private lateinit var viewModel: SearchListViewModel @@ -46,8 +48,10 @@ class SearchListViewModelTest { @Before fun setUp() { page = PageModel(site, 1, "title", PUBLISHED, Date(), false, 11L, null, 0) - viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE) + viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, progressHelper) searchPages = MutableLiveData() + + whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair(PostListItemProgressBar.Hidden, false)) whenever(pagesViewModel.searchPages).thenReturn(searchPages) viewModel.start(pagesViewModel) } @@ -112,7 +116,17 @@ class SearchListViewModelTest { @Test fun `passes action to page view model on menu action`() { - val clickedPage = PageItem.PublishedPage(1, "title", Date(), listOf(), 0, null, false) + val clickedPage = PageItem.PublishedPage( + 1, + "title", + Date(), + listOf(), + 0, + null, + false, + PostListItemProgressBar.Hidden, + false + ) val action = VIEW_PAGE viewModel.onMenuAction(action, clickedPage) @@ -122,7 +136,10 @@ class SearchListViewModelTest { @Test fun `passes page to page view model on item tapped`() { - val clickedPage = PageItem.PublishedPage(1, "title", Date(), listOf(), 0, null, false) + val clickedPage = PageItem.PublishedPage( + 1, "title", Date(), listOf(), 0, null, false, PostListItemProgressBar.Hidden, + false + ) viewModel.onItemTapped(clickedPage) From e6df8eab092db413d71ac7d4aeb90fd4dd039fb4 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:37:47 -0500 Subject: [PATCH 19/59] fixed style error --- .../wordpress/android/viewmodel/pages/PageItemProgressHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 27aeae7f3af9..357cdd259d0c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -28,7 +28,7 @@ class PageItemProgressHelper @Inject constructor( ) { private lateinit var site: SiteModel - fun attachSite(site: SiteModel){ + fun attachSite(site: SiteModel) { this.site = site } From 08a926bbce584bb8abeb294de0577fe31ec77095 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:38:04 -0500 Subject: [PATCH 20/59] wrote test to verify progress helper behavior. --- .../viewmodel/pages/PageListViewModelTest.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) 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 1c837a51e84c..ccdde9f0507d 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 @@ -10,6 +10,7 @@ import org.junit.Test import org.mockito.Mock import org.wordpress.android.BaseUnitTest import org.wordpress.android.fluxc.Dispatcher +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 @@ -199,6 +200,46 @@ class PageListViewModelTest : BaseUnitTest() { assertThat((result[0].first[1] as PublishedPage).title).isEqualTo(secondPage.title) } + @Test + fun `checks if PageItems gets the correct progress state`() { + whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + Pair( + PostListItemProgressBar.Indeterminate, + true + ) + ) + + whenever(progressHelper.getProgressStateForPage(LocalId(1))).thenReturn( + Pair( + PostListItemProgressBar.Hidden, + false + ) + ) + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(PUBLISHED, pagesViewModel) + + val result = mutableListOf, Boolean>>() + + viewModel.pages.observeForever { result.add(it) } + + val firstPage = buildPageModel(0) + val secondPage = buildPageModel(1) + + val pageModels = mutableListOf() + pageModels += secondPage + pageModels += firstPage + pages.value = pageModels + + assertThat((result[0].first[0] as PublishedPage).progressBarState).isEqualTo(PostListItemProgressBar.Indeterminate) + assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) + + assertThat((result[0].first[1] as PublishedPage).progressBarState).isEqualTo(PostListItemProgressBar.Hidden) + assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) + } + private fun buildPageModel( id: Int, date: Date = Date(0), From b01e72b3316dd3e9efad351a415d5d21eb19df4d Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 21:44:26 -0500 Subject: [PATCH 21/59] fixed line length. --- .../android/viewmodel/pages/PageListViewModelTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 ccdde9f0507d..f10437cf3a6f 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 @@ -233,7 +233,9 @@ class PageListViewModelTest : BaseUnitTest() { pageModels += firstPage pages.value = pageModels - assertThat((result[0].first[0] as PublishedPage).progressBarState).isEqualTo(PostListItemProgressBar.Indeterminate) + assertThat((result[0].first[0] as PublishedPage).progressBarState).isEqualTo( + PostListItemProgressBar.Indeterminate + ) assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) assertThat((result[0].first[1] as PublishedPage).progressBarState).isEqualTo(PostListItemProgressBar.Hidden) From a6e73c2ff208f1e10fd3782366f7280c3c538ef6 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 30 Jan 2020 22:06:17 -0500 Subject: [PATCH 22/59] removed autoformat. --- .../android/viewmodel/pages/PageListViewModel.kt | 9 +-------- 1 file changed, 1 insertion(+), 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 815236e91436..731f3c87b8d1 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 @@ -189,14 +189,7 @@ class PageListViewModel @Inject constructor( PUBLISHED -> _pages.postValue(listOf(Empty(R.string.pages_empty_published))) SCHEDULED -> _pages.postValue(listOf(Empty(R.string.pages_empty_scheduled))) DRAFTS -> _pages.postValue(listOf(Empty(R.string.pages_empty_drafts))) - TRASHED -> _pages.postValue( - listOf( - Empty( - R.string.pages_empty_trashed, - isButtonVisible = false - ) - ) - ) + TRASHED -> _pages.postValue(listOf(Empty(R.string.pages_empty_trashed, isButtonVisible = false))) } } } else { From d1bc47240342d0fd1e1afa2b2dcde1f2a7d1b7aa Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 31 Jan 2020 14:22:09 -0500 Subject: [PATCH 23/59] invalidate tracker at the appropriate time. --- .../viewmodel/pages/PageItemProgressHelper.kt | 2 +- .../viewmodel/pages/PageListViewModel.kt | 6 +++ .../android/viewmodel/pages/PagesViewModel.kt | 42 ++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 357cdd259d0c..7780ebc536b4 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -24,7 +24,7 @@ typealias ShouldShowOverlay = Boolean class PageItemProgressHelper @Inject constructor( private val appPrefsWrapper: AppPrefsWrapper, private val postStore: PostStore, - private val uploadStatusTracker: PostListUploadStatusTracker + val uploadStatusTracker: PostListUploadStatusTracker ) { private lateinit var site: SiteModel 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 731f3c87b8d1..8518cb5deb04 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 @@ -114,6 +114,7 @@ class PageListViewModel @Inject constructor( isStarted = true pagesViewModel.pages.observeForever(pagesObserver) + pagesViewModel.invalidateUploadStatus.observeForever(uploadStatusObserver) dispatcher.register(this) } @@ -121,6 +122,7 @@ class PageListViewModel @Inject constructor( override fun onCleared() { pagesViewModel.pages.removeObserver(pagesObserver) + pagesViewModel.invalidateUploadStatus.removeObserver(uploadStatusObserver) dispatcher.unregister(this) } @@ -156,6 +158,10 @@ class PageListViewModel @Inject constructor( } } + private val uploadStatusObserver = Observer> { ids -> + progressHelper.uploadStatusTracker.invalidateUploadStatus(ids.map { localId -> localId.value }) + } + private fun loadPagesAsync(pages: List) = launch { val pageItems = pages .sortedBy { it.title.toLowerCase(localeManagerWrapper.getLocale()) } 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 f04509ab3017..4701b643352c 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 @@ -20,6 +20,7 @@ import org.wordpress.android.analytics.AnalyticsTracker.Stat.PAGES_TAB_PRESSED import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.CauseOfOnPostChanged import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.RemoteAutoSavePost +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.page.PageModel @@ -130,6 +131,9 @@ class PagesViewModel private val _scrollToPage = SingleLiveEvent() val scrollToPage: LiveData = _scrollToPage + private val _invalidateUploadStatus = MutableLiveData>() + val invalidateUploadStatus: LiveData> = _invalidateUploadStatus + private var isInitialized = false private var scrollToPageId: Long? = null @@ -694,8 +698,12 @@ class PagesViewModel } } + /** + * Has lower priority than the PostUploadHandler and UploadService, which ensures that they already processed this + * OnPostChanged event. This means we can safely rely on their internal state being up to date. + */ @Suppress("unused") - @Subscribe(threadMode = BACKGROUND) + @Subscribe(threadMode = BACKGROUND, priority = 5) fun onPostChanged(event: OnPostChanged) { when (event.causeOfChange) { // Fetched post list event will be handled by OnListChanged @@ -711,6 +719,27 @@ class PagesViewModel handleRemoteAutoSave(post, event.isError) } } + + is CauseOfOnPostChanged.UpdatePost -> { + if (event.isError) { + AppLog.e( + T.POSTS, + "Error updating the post with type: ${event.error.type} and" + + " message: ${event.error.message}" + ) + } else { + launch { + _invalidateUploadStatus.postValue( + listOf((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId).map { localId -> + LocalId( + localId + ) + } + ) + refreshPages() + } + } + } } } @@ -721,6 +750,17 @@ class PagesViewModel return } + launch { + _invalidateUploadStatus.postValue( + listOf((event.post.id)).map { localId -> + LocalId( + localId + ) + } + ) + refreshPages() + } + launch { performIfNetworkAvailableAsync { waitForPageUpdate(event.post.remotePostId) From 481431590a511674d53a7ce10423bc7ac254c4a6 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 31 Jan 2020 18:29:36 -0500 Subject: [PATCH 24/59] made an event listener to clean up the PagesViewModel --- .../viewmodel/pages/PageListEventListener.kt | 220 ++++++++++++++++++ .../android/viewmodel/pages/PagesViewModel.kt | 115 +++------ 2 files changed, 254 insertions(+), 81 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt new file mode 100644 index 000000000000..4d69aa1dc3de --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -0,0 +1,220 @@ +package org.wordpress.android.viewmodel.pages + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.OnLifecycleEvent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode.BACKGROUND +import org.greenrobot.eventbus.ThreadMode.MAIN +import org.wordpress.android.fluxc.Dispatcher +import org.wordpress.android.fluxc.model.CauseOfOnPostChanged +import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.RemoteAutoSavePost +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId +import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId +import org.wordpress.android.fluxc.model.SiteModel +import org.wordpress.android.fluxc.store.MediaStore.OnMediaChanged +import org.wordpress.android.fluxc.store.MediaStore.OnMediaUploaded +import org.wordpress.android.fluxc.store.PostStore +import org.wordpress.android.fluxc.store.PostStore.OnPostChanged +import org.wordpress.android.fluxc.store.PostStore.OnPostUploaded +import org.wordpress.android.ui.posts.PostUtils +import org.wordpress.android.ui.uploads.PostEvents +import org.wordpress.android.ui.uploads.UploadService +import org.wordpress.android.ui.uploads.VideoOptimizer +import org.wordpress.android.util.AppLog +import org.wordpress.android.util.AppLog.T +import javax.inject.Inject +import kotlin.coroutines.CoroutineContext + +/** + * This is a temporary class to make the PostListViewModel more manageable. Please feel free to refactor it any way + * you see fit. + */ +class PageListEventListener( + private val lifecycle: Lifecycle, + private val dispatcher: Dispatcher, + private val bgDispatcher: CoroutineDispatcher, + private val postStore: PostStore, + private val site: SiteModel, + private val handleRemoteAutoSave: (LocalId, Boolean) -> Unit, + private val handlePostUploadedWithoutError: (RemoteId) -> Unit, + private val handlePostUploadedStarted: (RemoteId) -> Unit, + private val invalidateUploadStatus: (List) -> Unit +) : LifecycleObserver, CoroutineScope { + init { + dispatcher.register(this) + EventBus.getDefault().register(this) + lifecycle.addObserver(this) + } + + private var job: Job = Job() + + override val coroutineContext: CoroutineContext + get() = bgDispatcher + job + + + /** + * Handles the [Lifecycle.Event.ON_DESTROY] event to cleanup the registration for dispatcher and removing the + * observer for lifecycle. + */ + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + private fun onDestroy() { + job.cancel() + lifecycle.removeObserver(this) + dispatcher.unregister(this) + EventBus.getDefault().unregister(this) + } + + /** + * Has lower priority than the PostUploadHandler and UploadService, which ensures that they already processed this + * OnPostChanged event. This means we can safely rely on their internal state being up to date. + */ + @Suppress("unused") + @Subscribe(threadMode = MAIN, priority = 5) + fun onPostChanged(event: OnPostChanged) { + // We need to subscribe on the MAIN thread, in order to ensure the priority parameter is taken into account. + // However, we want to perform the body of the method on a background thread. + launch { + when (event.causeOfChange) { + // Fetched post list event will be handled by OnListChanged + is CauseOfOnPostChanged.RemoteAutoSavePost -> { + if (event.isError) { + AppLog.d( + T.POSTS, "REMOTE_AUTO_SAVE_POST failed: " + + event.error.type + " - " + event.error.message + ) + } + + handleRemoteAutoSave.invoke( + LocalId((event.causeOfChange as RemoteAutoSavePost).localPostId), + event.isError + ) + } + + is CauseOfOnPostChanged.UpdatePost -> { + if (event.isError) { + AppLog.e( + T.POSTS, + "Error updating the post with type: ${event.error.type} and" + + " message: ${event.error.message}" + ) + } else { + invalidateUploadStatus.invoke( + listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) + ) + } + } + } + } + } + + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onMediaChanged(event: OnMediaChanged) { + if (!event.isError && event.mediaList != null) { + uploadStatusChanged(*event.mediaList.map { it.localPostId }.toIntArray()) + } + } + + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onPostUploaded(event: OnPostUploaded) { + if (event.post != null && event.post.localSiteId == site.id) { + uploadStatusChanged(event.post.id) + if (!event.isError) { + handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) + } + } + } + + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onMediaUploaded(event: OnMediaUploaded) { + if (event.isError || event.canceled) { + return + } + if (event.media == null || event.media.localPostId == 0 || site.id != event.media.localSiteId) { + // Not interested in media not attached to posts or not belonging to the current site + return + } + uploadStatusChanged(event.media.localPostId) + } + + /** + * Upload started, reload so correct status on uploading post appears + */ + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onEventBackgroundThread(event: PostEvents.PostUploadStarted) { + if (!event.post.isPage) { + return + } + + if (site.id == event.post.localSiteId) { + uploadStatusChanged(event.post.id) + + handlePostUploadedStarted(RemoteId(event.post.remotePostId)) + } + } + + /** + * Upload cancelled (probably due to failed media), reload so correct status on uploading post appears + */ + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onEventBackgroundThread(event: PostEvents.PostUploadCanceled) { + if (site.id == event.post.localSiteId) { + uploadStatusChanged(event.post.id) + } + } + + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onEventBackgroundThread(event: VideoOptimizer.ProgressEvent) { + uploadStatusChanged(event.media.localPostId) + } + + @Suppress("unused") + @Subscribe(threadMode = BACKGROUND) + fun onEventBackgroundThread(event: UploadService.UploadMediaRetryEvent) { + if (event.mediaModelList != null && !event.mediaModelList.isEmpty()) { + // if there' a Post to which the retried media belongs, clear their status + val postsToRefresh = PostUtils.getPostsThatIncludeAnyOfTheseMedia(postStore, event.mediaModelList) + uploadStatusChanged(*postsToRefresh.map { it.id }.toIntArray()) + } + } + + private fun uploadStatusChanged(vararg localPostIds: Int) { + invalidateUploadStatus.invoke(localPostIds.map { localId -> LocalId(localId) }.toList()) + } + + class Factory @Inject constructor() { + fun createAndStartListening( + lifecycle: Lifecycle, + dispatcher: Dispatcher, + bgDispatcher: CoroutineDispatcher, + postStore: PostStore, + site: SiteModel, + handlePostUploadedWithoutError: (RemoteId) -> Unit, + invalidateUploadStatus: (List) -> Unit, + handleRemoteAutoSave: (LocalId, Boolean) -> Unit, + handlePostUploadedStarted: (RemoteId) -> Unit + ) { + PageListEventListener( + lifecycle = lifecycle, + dispatcher = dispatcher, + bgDispatcher = bgDispatcher, + postStore = postStore, + site = site, + handlePostUploadedWithoutError = handlePostUploadedWithoutError, + invalidateUploadStatus = invalidateUploadStatus, + handleRemoteAutoSave = handleRemoteAutoSave, + handlePostUploadedStarted = handlePostUploadedStarted) + } + } +} 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 4701b643352c..98206bd3f0f9 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 @@ -1,6 +1,9 @@ package org.wordpress.android.viewmodel.pages import androidx.annotation.StringRes +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.CoroutineDispatcher @@ -9,26 +12,20 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode -import org.greenrobot.eventbus.ThreadMode.BACKGROUND import org.wordpress.android.R import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.analytics.AnalyticsTracker.Stat.PAGES_OPTIONS_PRESSED import org.wordpress.android.analytics.AnalyticsTracker.Stat.PAGES_SEARCH_ACCESSED import org.wordpress.android.analytics.AnalyticsTracker.Stat.PAGES_TAB_PRESSED import org.wordpress.android.fluxc.Dispatcher -import org.wordpress.android.fluxc.model.CauseOfOnPostChanged -import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.RemoteAutoSavePost import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId +import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId 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.store.PageStore import org.wordpress.android.fluxc.store.PostStore -import org.wordpress.android.fluxc.store.PostStore.OnPostChanged -import org.wordpress.android.fluxc.store.PostStore.OnPostUploaded import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.modules.UI_THREAD import org.wordpress.android.ui.pages.PageItem.Action @@ -44,10 +41,7 @@ import org.wordpress.android.ui.posts.PostInfoType 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.PostEvents import org.wordpress.android.util.AppLog -import org.wordpress.android.util.AppLog.T -import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.analytics.AnalyticsUtils import org.wordpress.android.util.coroutines.suspendCoroutineWithTimeout @@ -87,11 +81,14 @@ class PagesViewModel private val dispatcher: Dispatcher, private val actionPerfomer: ActionPerformer, private val networkUtils: NetworkUtilsWrapper, - private val eventBusWrapper: EventBusWrapper, private val previewStateHelper: PreviewStateHelper, @Named(UI_THREAD) private val uiDispatcher: CoroutineDispatcher, - @Named(BG_THREAD) private val defaultDispatcher: CoroutineDispatcher -) : ScopedViewModel(uiDispatcher) { + @Named(BG_THREAD) private val defaultDispatcher: CoroutineDispatcher, + private val pageListEventListenerFactory: PageListEventListener.Factory +) : ScopedViewModel(uiDispatcher), LifecycleOwner { + private val lifecycleRegistry = LifecycleRegistry(this) + override fun getLifecycle(): Lifecycle = lifecycleRegistry + private val _isSearchExpanded = MutableLiveData() val isSearchExpanded: LiveData = _isSearchExpanded @@ -171,25 +168,30 @@ class PagesViewModel val previewType: RemotePreviewType ) + + fun start(site: SiteModel) { // Check if VM is not already initialized if (_site == null) { _site = site - eventBusWrapper.register(this) - loadPagesAsync() } - } - init { - dispatcher.register(this) + pageListEventListenerFactory.createAndStartListening( + lifecycle = lifecycle, + dispatcher = dispatcher, + bgDispatcher = defaultDispatcher, + postStore = postStore, + site = site, + handlePostUploadedWithoutError = this::handlePostUploadedWithoutError, + invalidateUploadStatus = this::handleInvalidateUploadStatus, + handleRemoteAutoSave = this::handleRemoveAutoSaveEvent, + handlePostUploadedStarted = this::postUploadStarted + ) } override fun onCleared() { - dispatcher.unregister(this) - eventBusWrapper.unregister(this) - actionPerfomer.onCleanup() } @@ -684,12 +686,10 @@ class PagesViewModel private fun hasRemoteAutoSavePreviewError() = _previewState.value != null && _previewState.value == PostListRemotePreviewState.REMOTE_AUTO_SAVE_PREVIEW_ERROR - @Subscribe(threadMode = ThreadMode.MAIN) - @SuppressWarnings("unused") - fun onPostUploaded(event: OnPostUploaded) { + private fun handlePostUploadedWithoutError(remotePostId: RemoteId) { var id = 0L if (!pageUpdateContinuations.contains(id)) { - id = event.post.remotePostId + id = remotePostId.value } pageUpdateContinuations[id]?.let { cont -> @@ -698,72 +698,25 @@ class PagesViewModel } } - /** - * Has lower priority than the PostUploadHandler and UploadService, which ensures that they already processed this - * OnPostChanged event. This means we can safely rely on their internal state being up to date. - */ - @Suppress("unused") - @Subscribe(threadMode = BACKGROUND, priority = 5) - fun onPostChanged(event: OnPostChanged) { - when (event.causeOfChange) { - // Fetched post list event will be handled by OnListChanged - is CauseOfOnPostChanged.RemoteAutoSavePost -> { - val post = postStore.getPostByLocalPostId((event.causeOfChange as RemoteAutoSavePost).localPostId) - if (event.isError) { - AppLog.d( - T.POSTS, "REMOTE_AUTO_SAVE_POST failed: " + - event.error.type + " - " + event.error.message - ) - } - if (isRemotePreviewingFromPostsList()) { - handleRemoteAutoSave(post, event.isError) - } - } + private fun handleRemoveAutoSaveEvent(pageId: LocalId, isError: Boolean) { + val post = postStore.getPostByLocalPostId(pageId.value) - is CauseOfOnPostChanged.UpdatePost -> { - if (event.isError) { - AppLog.e( - T.POSTS, - "Error updating the post with type: ${event.error.type} and" + - " message: ${event.error.message}" - ) - } else { - launch { - _invalidateUploadStatus.postValue( - listOf((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId).map { localId -> - LocalId( - localId - ) - } - ) - refreshPages() - } - } - } + if (isRemotePreviewingFromPostsList()) { + handleRemoteAutoSave(post, isError) } } - @Subscribe(threadMode = ThreadMode.BACKGROUND) - @Suppress("unused") - fun onEventBackgroundThread(event: PostEvents.PostUploadStarted) { - if (!event.post.isPage) { - return - } - + private fun handleInvalidateUploadStatus(ids: List) { launch { - _invalidateUploadStatus.postValue( - listOf((event.post.id)).map { localId -> - LocalId( - localId - ) - } - ) + _invalidateUploadStatus.postValue(ids) refreshPages() } + } + private fun postUploadStarted(remoteId: RemoteId) { launch { performIfNetworkAvailableAsync { - waitForPageUpdate(event.post.remotePostId) + waitForPageUpdate(remoteId.value) reloadPages() } } From d26b85f7fe06369b2e1a6423eaf6c33b9ecc1556 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 31 Jan 2020 18:54:56 -0500 Subject: [PATCH 25/59] Fixed tests. --- .../android/viewmodel/pages/PagesViewModel.kt | 4 ++-- .../android/viewmodel/pages/PageListViewModelTest.kt | 3 +++ .../android/viewmodel/pages/PagesViewModelTest.kt | 11 +++++------ 3 files changed, 10 insertions(+), 8 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 98206bd3f0f9..e36cba54bc5b 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 @@ -686,7 +686,7 @@ class PagesViewModel private fun hasRemoteAutoSavePreviewError() = _previewState.value != null && _previewState.value == PostListRemotePreviewState.REMOTE_AUTO_SAVE_PREVIEW_ERROR - private fun handlePostUploadedWithoutError(remotePostId: RemoteId) { + fun handlePostUploadedWithoutError(remotePostId: RemoteId) { var id = 0L if (!pageUpdateContinuations.contains(id)) { id = remotePostId.value @@ -713,7 +713,7 @@ class PagesViewModel } } - private fun postUploadStarted(remoteId: RemoteId) { + fun postUploadStarted(remoteId: RemoteId) { launch { performIfNetworkAvailableAsync { waitForPageUpdate(remoteId.value) 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 f10437cf3a6f..db8ebac27689 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 @@ -50,8 +50,11 @@ class PageListViewModelTest : BaseUnitTest() { whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair( PostListItemProgressBar.Hidden, false)) + val invalidateUploadStatus = MutableLiveData>() + whenever(pagesViewModel.arePageActionsEnabled).thenReturn(false) whenever(pagesViewModel.site).thenReturn(site) + whenever(pagesViewModel.invalidateUploadStatus).thenReturn(invalidateUploadStatus) whenever(localeManagerWrapper.getLocale()).thenReturn(Locale.getDefault()) site.id = 10 pageListState.value = PageListState.DONE diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt index d8ab3f045bbc..ec8aac5da1d4 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt @@ -16,15 +16,14 @@ import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.CauseOfOnPostChanged +import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId 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.DRAFT import org.wordpress.android.fluxc.store.PageStore import org.wordpress.android.fluxc.store.PostStore.OnPostChanged -import org.wordpress.android.fluxc.store.PostStore.OnPostUploaded import org.wordpress.android.test -import org.wordpress.android.ui.uploads.PostEvents import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListState import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListState.DONE @@ -62,7 +61,7 @@ class PagesViewModelTest { previewStateHelper = mock(), uiDispatcher = Dispatchers.Unconfined, defaultDispatcher = Dispatchers.Unconfined, - eventBusWrapper = mock() + pageListEventListenerFactory = mock() ) listStates = mutableListOf() pages = mutableListOf() @@ -159,7 +158,7 @@ class PagesViewModelTest { assertThat(viewModel.arePageActionsEnabled).isTrue() // Act - viewModel.onEventBackgroundThread(PostEvents.PostUploadStarted(createPostModel())) + viewModel.postUploadStarted(RemoteId(createPostModel().remotePostId)) // Assert assertThat(viewModel.arePageActionsEnabled).isFalse() @@ -173,11 +172,11 @@ class PagesViewModelTest { setUpPageStoreWithEmptyPages() viewModel.start(site) - viewModel.onEventBackgroundThread(PostEvents.PostUploadStarted(page)) + viewModel.postUploadStarted(RemoteId(page.remotePostId)) assertThat(viewModel.arePageActionsEnabled).isFalse() // When - viewModel.onPostUploaded(OnPostUploaded(page)) + viewModel.handlePostUploadedWithoutError(RemoteId(page.remotePostId)) // Then assertThat(viewModel.arePageActionsEnabled).isTrue() From 910bb75ead58e39a47620d4af854186a0ad3319c Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 31 Jan 2020 19:03:09 -0500 Subject: [PATCH 26/59] removed unneeded lines. --- .../android/viewmodel/pages/PageListEventListener.kt | 1 - .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 4d69aa1dc3de..82c3c19d2669 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -57,7 +57,6 @@ class PageListEventListener( override val coroutineContext: CoroutineContext get() = bgDispatcher + job - /** * Handles the [Lifecycle.Event.ON_DESTROY] event to cleanup the registration for dispatcher and removing the * observer for lifecycle. 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 e36cba54bc5b..933ac12d7a9d 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 @@ -167,9 +167,7 @@ class PagesViewModel val post: PostModel, val previewType: RemotePreviewType ) - - - + fun start(site: SiteModel) { // Check if VM is not already initialized if (_site == null) { From f3b7a1402923dd036af7365759c1dd3da543106b Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 31 Jan 2020 19:33:23 -0500 Subject: [PATCH 27/59] removed trailing space. --- .../java/org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 1 - 1 file changed, 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 933ac12d7a9d..0dd896912178 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 @@ -167,7 +167,6 @@ class PagesViewModel val post: PostModel, val previewType: RemotePreviewType ) - fun start(site: SiteModel) { // Check if VM is not already initialized if (_site == null) { From 2ab3525c57022e9889ed15870d8fa786794d3dca Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Sun, 2 Feb 2020 20:45:54 -0500 Subject: [PATCH 28/59] add override to change payload so that animation doesnt blink. --- .../android/ui/pages/PageItemDiffUtil.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) 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 2ec71a5fc03e..310a0a0cc6b9 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 @@ -3,6 +3,7 @@ package org.wordpress.android.ui.pages import androidx.recyclerview.widget.DiffUtil.Callback import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.ParentPage +import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Determinate class PageItemDiffUtil(val items: List, val result: List) : Callback() { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { @@ -22,4 +23,24 @@ class PageItemDiffUtil(val items: List, val result: List) : override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return items[oldItemPosition] == result[newItemPosition] } + + override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { + val oldItem = items[oldItemPosition] + val newItem = result[newItemPosition] + + if(oldItem is Page && newItem is Page) { + /** + * Suppresses the default animation if the progress has changed to prevent blinking as the upload progresses + * + * We don't need to use the payload in onBindViewHolder unless we want to. Passing a non-null value + * suppresses the default ItemAnimator, which is all we need in this case. + */ + if (oldItem.progressBarState is Determinate && + newItem.progressBarState is Determinate && + (oldItem.progressBarState as Determinate).progress != (newItem.progressBarState as Determinate).progress) { + return true + } + } + return super.getChangePayload(oldItemPosition, newItemPosition) + } } From 8c95a071eae51db4eec8456c6df858c9c9cddb45 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Sun, 2 Feb 2020 22:29:43 -0500 Subject: [PATCH 29/59] added missing space. --- .../java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 310a0a0cc6b9..5af12470a111 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 @@ -28,7 +28,7 @@ class PageItemDiffUtil(val items: List, val result: List) : val oldItem = items[oldItemPosition] val newItem = result[newItemPosition] - if(oldItem is Page && newItem is Page) { + if (oldItem is Page && newItem is Page) { /** * Suppresses the default animation if the progress has changed to prevent blinking as the upload progresses * From 1534ba563d80104d2a5ecbaa9a9fa47b01f24723 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Sun, 2 Feb 2020 22:37:47 -0500 Subject: [PATCH 30/59] fixed line length issue. --- .../java/org/wordpress/android/ui/pages/PageItemDiffUtil.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 5af12470a111..c80a46c5d8be 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 @@ -37,7 +37,8 @@ class PageItemDiffUtil(val items: List, val result: List) : */ if (oldItem.progressBarState is Determinate && newItem.progressBarState is Determinate && - (oldItem.progressBarState as Determinate).progress != (newItem.progressBarState as Determinate).progress) { + (oldItem.progressBarState as Determinate).progress != + (newItem.progressBarState as Determinate).progress) { return true } } From 34132b13821ad248cd702f4a724fba8692cc1460 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 3 Feb 2020 12:22:22 -0500 Subject: [PATCH 31/59] added comments. --- .../viewmodel/pages/PageItemProgressHelper.kt | 15 +++++++++++++++ .../viewmodel/pages/PageListEventListener.kt | 3 +-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 7780ebc536b4..31b716f9d42f 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -28,10 +28,16 @@ class PageItemProgressHelper @Inject constructor( ) { private lateinit var site: SiteModel + /** + * This was done so that this class could be injectable for testing, as this dependency wouldn't be provided by DI + */ fun attachSite(site: SiteModel) { this.site = site } + /** + * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. + */ private fun getProgressBarState( uploadUiState: PostUploadUiState ): PostListItemProgressBar { @@ -46,6 +52,9 @@ class PageItemProgressHelper @Inject constructor( } } + /** + * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. + */ private fun shouldShowProgress( uploadUiState: PostUploadUiState ): Boolean { @@ -53,6 +62,9 @@ class PageItemProgressHelper @Inject constructor( uploadUiState is UploadQueued } + /** + * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. + */ sealed class PostUploadUiState { data class UploadingMedia(val progress: Int) : PostUploadUiState() data class UploadingPost(val isDraft: Boolean) : PostUploadUiState() @@ -67,6 +79,9 @@ class PageItemProgressHelper @Inject constructor( object NothingToUpload : PostUploadUiState() } + /** + * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. + */ private fun createUploadUiState( uploadStatus: PostListItemUploadStatus, post: PostModel diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 82c3c19d2669..bd807aab919d 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -32,8 +32,7 @@ import javax.inject.Inject import kotlin.coroutines.CoroutineContext /** - * This is a temporary class to make the PostListViewModel more manageable. Please feel free to refactor it any way - * you see fit. + * This is a temporary class to make the PagesViewModel more manageable. It was inspired by the PostListEventListener */ class PageListEventListener( private val lifecycle: Lifecycle, From 1b7caf92cab537ec8c432be5aa9cffa3b719d83b Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 3 Feb 2020 12:35:52 -0500 Subject: [PATCH 32/59] added EventBusWrapper instead of using EventBus directly. --- .../android/viewmodel/pages/PageListEventListener.kt | 9 ++++++--- .../wordpress/android/viewmodel/pages/PagesViewModel.kt | 3 +++ .../android/viewmodel/pages/PagesViewModelTest.kt | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index bd807aab919d..892d17ae101f 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -7,7 +7,6 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.BACKGROUND import org.greenrobot.eventbus.ThreadMode.MAIN @@ -28,6 +27,7 @@ import org.wordpress.android.ui.uploads.UploadService import org.wordpress.android.ui.uploads.VideoOptimizer import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T +import org.wordpress.android.util.EventBusWrapper import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -39,6 +39,7 @@ class PageListEventListener( private val dispatcher: Dispatcher, private val bgDispatcher: CoroutineDispatcher, private val postStore: PostStore, + private val eventBusWrapper: EventBusWrapper, private val site: SiteModel, private val handleRemoteAutoSave: (LocalId, Boolean) -> Unit, private val handlePostUploadedWithoutError: (RemoteId) -> Unit, @@ -47,7 +48,7 @@ class PageListEventListener( ) : LifecycleObserver, CoroutineScope { init { dispatcher.register(this) - EventBus.getDefault().register(this) + eventBusWrapper.register(this) lifecycle.addObserver(this) } @@ -65,7 +66,7 @@ class PageListEventListener( job.cancel() lifecycle.removeObserver(this) dispatcher.unregister(this) - EventBus.getDefault().unregister(this) + eventBusWrapper.unregister(this) } /** @@ -197,6 +198,7 @@ class PageListEventListener( dispatcher: Dispatcher, bgDispatcher: CoroutineDispatcher, postStore: PostStore, + eventBusWrapper: EventBusWrapper, site: SiteModel, handlePostUploadedWithoutError: (RemoteId) -> Unit, invalidateUploadStatus: (List) -> Unit, @@ -208,6 +210,7 @@ class PageListEventListener( dispatcher = dispatcher, bgDispatcher = bgDispatcher, postStore = postStore, + eventBusWrapper = eventBusWrapper, site = site, handlePostUploadedWithoutError = handlePostUploadedWithoutError, invalidateUploadStatus = invalidateUploadStatus, 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 0dd896912178..cfe9a57b4fcf 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 @@ -42,6 +42,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.util.AppLog +import org.wordpress.android.util.EventBusWrapper import org.wordpress.android.util.NetworkUtilsWrapper import org.wordpress.android.util.analytics.AnalyticsUtils import org.wordpress.android.util.coroutines.suspendCoroutineWithTimeout @@ -81,6 +82,7 @@ class PagesViewModel private val dispatcher: Dispatcher, private val actionPerfomer: ActionPerformer, private val networkUtils: NetworkUtilsWrapper, + private val eventBusWrapper: EventBusWrapper, private val previewStateHelper: PreviewStateHelper, @Named(UI_THREAD) private val uiDispatcher: CoroutineDispatcher, @Named(BG_THREAD) private val defaultDispatcher: CoroutineDispatcher, @@ -180,6 +182,7 @@ class PagesViewModel dispatcher = dispatcher, bgDispatcher = defaultDispatcher, postStore = postStore, + eventBusWrapper = eventBusWrapper, site = site, handlePostUploadedWithoutError = this::handlePostUploadedWithoutError, invalidateUploadStatus = this::handleInvalidateUploadStatus, diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt index ec8aac5da1d4..b92ed818a0d7 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt @@ -61,6 +61,7 @@ class PagesViewModelTest { previewStateHelper = mock(), uiDispatcher = Dispatchers.Unconfined, defaultDispatcher = Dispatchers.Unconfined, + eventBusWrapper = mock(), pageListEventListenerFactory = mock() ) listStates = mutableListOf() From efb20c54201281fab64f92dcd0ce62c98ef6632c Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 3 Feb 2020 13:03:53 -0500 Subject: [PATCH 33/59] refactored uploadStatusChanged to utilize a strongly typed LocalId --- .../viewmodel/pages/PageListEventListener.kt | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 892d17ae101f..edb31fe4ab49 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -116,7 +116,7 @@ class PageListEventListener( @Subscribe(threadMode = BACKGROUND) fun onMediaChanged(event: OnMediaChanged) { if (!event.isError && event.mediaList != null) { - uploadStatusChanged(*event.mediaList.map { it.localPostId }.toIntArray()) + uploadStatusChanged(*event.mediaList.map { LocalId(it.localPostId) }.toTypedArray()) } } @@ -124,7 +124,7 @@ class PageListEventListener( @Subscribe(threadMode = BACKGROUND) fun onPostUploaded(event: OnPostUploaded) { if (event.post != null && event.post.localSiteId == site.id) { - uploadStatusChanged(event.post.id) + uploadStatusChanged(LocalId(event.post.id)) if (!event.isError) { handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) } @@ -141,7 +141,7 @@ class PageListEventListener( // Not interested in media not attached to posts or not belonging to the current site return } - uploadStatusChanged(event.media.localPostId) + uploadStatusChanged(LocalId(event.media.localPostId)) } /** @@ -155,7 +155,7 @@ class PageListEventListener( } if (site.id == event.post.localSiteId) { - uploadStatusChanged(event.post.id) + uploadStatusChanged(LocalId(event.post.id)) handlePostUploadedStarted(RemoteId(event.post.remotePostId)) } @@ -168,30 +168,32 @@ class PageListEventListener( @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: PostEvents.PostUploadCanceled) { if (site.id == event.post.localSiteId) { - uploadStatusChanged(event.post.id) + uploadStatusChanged(LocalId(event.post.id)) } } @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: VideoOptimizer.ProgressEvent) { - uploadStatusChanged(event.media.localPostId) + uploadStatusChanged(LocalId(event.media.localPostId)) } @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: UploadService.UploadMediaRetryEvent) { - if (event.mediaModelList != null && !event.mediaModelList.isEmpty()) { + if (event.mediaModelList != null && event.mediaModelList.isNotEmpty()) { // if there' a Post to which the retried media belongs, clear their status val postsToRefresh = PostUtils.getPostsThatIncludeAnyOfTheseMedia(postStore, event.mediaModelList) - uploadStatusChanged(*postsToRefresh.map { it.id }.toIntArray()) + uploadStatusChanged(*postsToRefresh.map { LocalId(it.id) }.toTypedArray()) } } - private fun uploadStatusChanged(vararg localPostIds: Int) { - invalidateUploadStatus.invoke(localPostIds.map { localId -> LocalId(localId) }.toList()) + private fun uploadStatusChanged(vararg localPostIds: LocalId) { + invalidateUploadStatus.invoke(localPostIds.toList()) } + + class Factory @Inject constructor() { fun createAndStartListening( lifecycle: Lifecycle, From 11fd970529cd6cfd53b78f0474d658c7154ba521 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 3 Feb 2020 13:15:50 -0500 Subject: [PATCH 34/59] removed needless blank lines. --- .../android/viewmodel/pages/PageListEventListener.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index edb31fe4ab49..a0b34d9301c6 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -191,9 +191,7 @@ class PageListEventListener( private fun uploadStatusChanged(vararg localPostIds: LocalId) { invalidateUploadStatus.invoke(localPostIds.toList()) } - - - + class Factory @Inject constructor() { fun createAndStartListening( lifecycle: Lifecycle, From a8f5730069c8ec9a22b37329476a97623a857fc4 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Mon, 3 Feb 2020 13:22:41 -0500 Subject: [PATCH 35/59] resolved other style error. --- .../android/viewmodel/pages/PageListEventListener.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index a0b34d9301c6..3e89a952b27c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -191,7 +191,7 @@ class PageListEventListener( private fun uploadStatusChanged(vararg localPostIds: LocalId) { invalidateUploadStatus.invoke(localPostIds.toList()) } - + class Factory @Inject constructor() { fun createAndStartListening( lifecycle: Lifecycle, @@ -215,7 +215,8 @@ class PageListEventListener( handlePostUploadedWithoutError = handlePostUploadedWithoutError, invalidateUploadStatus = invalidateUploadStatus, handleRemoteAutoSave = handleRemoteAutoSave, - handlePostUploadedStarted = handlePostUploadedStarted) + handlePostUploadedStarted = handlePostUploadedStarted + ) } } } From e5e52fc1732c60759f3423d12c9b515acd403519 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Tue, 4 Feb 2020 18:25:50 -0500 Subject: [PATCH 36/59] renamed PostListUploadStatusTracker to PostModelUploadStatusTracker --- .../org/wordpress/android/ui/posts/PostListMainViewModel.kt | 2 +- ...UploadStatusTracker.kt => PostModelUploadStatusTracker.kt} | 2 +- .../android/viewmodel/pages/PageItemProgressHelper.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename WordPress/src/main/java/org/wordpress/android/ui/posts/{PostListUploadStatusTracker.kt => PostModelUploadStatusTracker.kt} (97%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListMainViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListMainViewModel.kt index fcac689e18e5..31454c6b562e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListMainViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListMainViewModel.kt @@ -134,7 +134,7 @@ class PostListMainViewModel @Inject constructor( private val _searchQuery = MutableLiveData() val searchQuery: LiveData = _searchQuery - private val uploadStatusTracker = PostListUploadStatusTracker( + private val uploadStatusTracker = PostModelUploadStatusTracker( uploadStore = uploadStore, uploadActionUseCase = uploadActionUseCase ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostModelUploadStatusTracker.kt similarity index 97% rename from WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt rename to WordPress/src/main/java/org/wordpress/android/ui/posts/PostModelUploadStatusTracker.kt index caa36f7b9124..160e13db5f65 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListUploadStatusTracker.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostModelUploadStatusTracker.kt @@ -13,7 +13,7 @@ import javax.inject.Inject * This is a temporary class to make the PostListViewModel more manageable. Please feel free to refactor it any way * you see fit. */ -class PostListUploadStatusTracker @Inject constructor( +class PostModelUploadStatusTracker @Inject constructor( private val uploadStore: UploadStore, private val uploadActionUseCase: UploadActionUseCase ) { diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt index 31b716f9d42f..c29de08d9830 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt @@ -7,7 +7,7 @@ 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.posts.PostListUploadStatusTracker +import org.wordpress.android.ui.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.NothingToUpload import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadFailed @@ -24,7 +24,7 @@ typealias ShouldShowOverlay = Boolean class PageItemProgressHelper @Inject constructor( private val appPrefsWrapper: AppPrefsWrapper, private val postStore: PostStore, - val uploadStatusTracker: PostListUploadStatusTracker + val uploadStatusTracker: PostModelUploadStatusTracker ) { private lateinit var site: SiteModel From 7b8eadc98d68e79d1c52ef8ab50f25e2d52ef20e Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Tue, 4 Feb 2020 18:47:39 -0500 Subject: [PATCH 37/59] renamed PageItemProgressHelper to incl. Upload to make it more specific --- ...ssHelper.kt => PageItemUploadProgressHelper.kt} | 14 +++++++------- .../android/viewmodel/pages/PageListViewModel.kt | 2 +- .../android/viewmodel/pages/SearchListViewModel.kt | 2 +- .../viewmodel/pages/PageListViewModelTest.kt | 2 +- .../viewmodel/pages/SearchListViewModelTest.kt | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) rename WordPress/src/main/java/org/wordpress/android/viewmodel/pages/{PageItemProgressHelper.kt => PageItemUploadProgressHelper.kt} (87%) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt similarity index 87% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt rename to WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt index c29de08d9830..42b95d879e58 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemProgressHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageItemUploadProgressHelper.kt @@ -9,19 +9,19 @@ import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.fluxc.store.UploadStore.UploadError import org.wordpress.android.ui.posts.PostModelUploadStatusTracker import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.NothingToUpload -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadFailed -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadQueued -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadWaitingForConnection -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadingMedia -import org.wordpress.android.viewmodel.pages.PageItemProgressHelper.PostUploadUiState.UploadingPost +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.posts.PostListItemProgressBar import org.wordpress.android.viewmodel.posts.PostListItemUploadStatus import javax.inject.Inject typealias ShouldShowOverlay = Boolean -class PageItemProgressHelper @Inject constructor( +class PageItemUploadProgressHelper @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 8518cb5deb04..731f634bfd4e 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: PageItemProgressHelper + private val progressHelper: PageItemUploadProgressHelper ) : 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 12fe0bc62e8b..6c02c56ebebf 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: PageItemProgressHelper + private val progressHelper: PageItemUploadProgressHelper ) : 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 db8ebac27689..f875273fa618 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 @@ -32,7 +32,7 @@ class PageListViewModelTest : BaseUnitTest() { @Mock lateinit var dispatcher: Dispatcher @Mock lateinit var pagesViewModel: PagesViewModel @Mock lateinit var localeManagerWrapper: LocaleManagerWrapper - @Mock lateinit var progressHelper: PageItemProgressHelper + @Mock lateinit var progressHelper: PageItemUploadProgressHelper private lateinit var viewModel: PageListViewModel private val site = SiteModel() 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 c519493f0897..01829c089f69 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: PageItemProgressHelper + @Mock lateinit var progressHelper: PageItemUploadProgressHelper private lateinit var searchPages: MutableLiveData>> private lateinit var viewModel: SearchListViewModel From 92130c0a0e18fe936dc2e89173e0b9ad89ee03c4 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Tue, 4 Feb 2020 18:47:59 -0500 Subject: [PATCH 38/59] Fixed the order of the methods in terms of importance. --- .../pages/PageItemUploadProgressHelper.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) 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 42b95d879e58..4ff4594e819e 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 @@ -35,6 +35,19 @@ class PageItemUploadProgressHelper @Inject constructor( this.site = site } + fun getProgressStateForPage( + pageId: LocalId + ): Pair { + val post = postStore.getPostByLocalPostId(pageId.value) + val uploadStatus = uploadStatusTracker.getUploadStatus( + post, site + ) + val uploadUiState = createUploadUiState(uploadStatus, post) + + val shouldShowOverlay = shouldShowOverlay(uploadUiState) + return Pair(getProgressBarState(uploadUiState), shouldShowOverlay) + } + /** * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. */ @@ -113,17 +126,4 @@ class PageItemUploadProgressHelper @Inject constructor( return (uploadUiState is UploadingPost || (!appPrefsWrapper.isAztecEditorEnabled && uploadUiState is UploadingMedia)) } - - fun getProgressStateForPage( - pageId: LocalId - ): Pair { - val post = postStore.getPostByLocalPostId(pageId.value) - val uploadStatus = uploadStatusTracker.getUploadStatus( - post, site - ) - val uploadUiState = createUploadUiState(uploadStatus, post) - - val shouldShowOverlay = shouldShowOverlay(uploadUiState) - return Pair(getProgressBarState(uploadUiState), shouldShowOverlay) - } } From 34f91c58c0e0e4f310101241bc4cbd189de02163 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 13:55:19 -0500 Subject: [PATCH 39/59] invalidate list for upload status changes instead of doing refresh --- .../android/viewmodel/pages/PageListEventListener.kt | 2 ++ .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 3e89a952b27c..b7977efad8ef 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -13,6 +13,7 @@ import org.greenrobot.eventbus.ThreadMode.MAIN import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.CauseOfOnPostChanged import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.RemoteAutoSavePost +import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.UpdatePost import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId import org.wordpress.android.fluxc.model.SiteModel @@ -103,6 +104,7 @@ class PageListEventListener( " message: ${event.error.message}" ) } else { + handlePostUploadedWithoutError.invoke(RemoteId((event.causeOfChange as UpdatePost).remotePostId)) invalidateUploadStatus.invoke( listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) ) 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 cfe9a57b4fcf..52704e9510c0 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 @@ -230,6 +230,10 @@ class PagesViewModel pageMap = pageStore.getPagesFromDb(site).associateBy { it.remoteId } } + private fun invalidatePages() { + pageMap = pageMap + } + fun onPageEditFinished() { launch { refreshPages() // show local changes immediately @@ -709,7 +713,7 @@ class PagesViewModel private fun handleInvalidateUploadStatus(ids: List) { launch { _invalidateUploadStatus.postValue(ids) - refreshPages() + invalidatePages() } } From 53cd03a86dd8c3ba4d71b538b498c381278f4acf Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:04:50 -0500 Subject: [PATCH 40/59] utilized languages features to make pair variables meaningful. --- .../viewmodel/pages/PageListViewModel.kt | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 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 731f634bfd4e..616825b3635f 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,7 +254,7 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) PublishedPage( it.remoteId, @@ -264,8 +264,8 @@ class PageListViewModel @Inject constructor( pageItemIndent, getFeaturedImageUrl(it.featuredImageId), actionsEnabled, - progressState.first, - progressState.second + progressBarUiState, + showOverlay ) } } @@ -282,18 +282,19 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_changes) - val progressState = progressHelper.getProgressStateForPage( + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage( LocalId( it.pageId ) ) + ScheduledPage( it.remoteId, it.title, it.date, labels, getFeaturedImageUrl(it.featuredImageId), actionsEnabled, - progressState.first, - progressState.second + progressBarUiState, + showOverlay ) } } @@ -311,7 +312,7 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_draft) - val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) DraftPage( it.remoteId, it.title, @@ -319,8 +320,8 @@ class PageListViewModel @Inject constructor( labels, getFeaturedImageUrl(it.featuredImageId), actionsEnabled, - progressState.first, - progressState.second + progressBarUiState, + showOverlay ) } } @@ -330,15 +331,15 @@ class PageListViewModel @Inject constructor( actionsEnabled: Boolean ): List { return pages.map { - val progressState = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) TrashedPage( it.remoteId, it.title, it.date, getFeaturedImageUrl(it.featuredImageId), actionsEnabled, - progressState.first, - progressState.second + progressBarUiState, + showOverlay ) } } From 9daef94b2cd7605af7e1e910a040b678a89d72fc Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:05:59 -0500 Subject: [PATCH 41/59] fixed line length issue. --- .../android/viewmodel/pages/PageListEventListener.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index b7977efad8ef..1f4c0117bdee 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -104,7 +104,9 @@ class PageListEventListener( " message: ${event.error.message}" ) } else { - handlePostUploadedWithoutError.invoke(RemoteId((event.causeOfChange as UpdatePost).remotePostId)) + handlePostUploadedWithoutError.invoke( + RemoteId((event.causeOfChange as UpdatePost).remotePostId) + ) invalidateUploadStatus.invoke( listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) ) From 09ddc74a3e7a25f8fb8d015877f0a77812f0caea Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:12:05 -0500 Subject: [PATCH 42/59] renamed PostListItemProgressBar to ProgressBarUiState --- .../wordpress/android/ui/pages/PageItem.kt | 20 +++++++++---------- .../android/ui/pages/PageItemDiffUtil.kt | 10 +++++----- .../android/ui/pages/PageItemViewHolder.kt | 16 +++++++-------- .../ui/posts/PostListItemViewHolder.kt | 16 +++++++-------- .../ui/posts/adapters/PostListAdapter.kt | 8 ++++---- .../pages/PageItemUploadProgressHelper.kt | 12 +++++------ .../viewmodel/pages/SearchListViewModel.kt | 8 ++++---- .../posts/PostListItemProgressBar.kt | 7 ------- .../viewmodel/posts/PostListItemType.kt | 3 ++- .../posts/PostListItemUiStateHelper.kt | 11 +++++----- .../viewmodel/uistate/ProgressBarUiState.kt | 7 +++++++ .../viewmodel/pages/PageListViewModelTest.kt | 14 ++++++------- .../pages/SearchListViewModelTest.kt | 8 ++++---- .../posts/PostListItemUiStateHelperTest.kt | 11 +++++----- 14 files changed, 77 insertions(+), 74 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt create mode 100644 WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt 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 e25619c64cdd..17520a1a1419 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 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 -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import java.util.Date sealed class PageItem(open val type: Type) { @@ -26,7 +26,7 @@ sealed class PageItem(open val type: Type) { open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean, - open val progressBarState: PostListItemProgressBar, + open val progressBarUiStateState: ProgressBarUiState, open val showOverlay: Boolean ) : PageItem(PAGE) @@ -38,7 +38,7 @@ sealed class PageItem(open val type: Type) { override var indent: Int = 0, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar, + override val progressBarUiStateState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -50,7 +50,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState, + progressBarUiStateState = progressBarUiStateState, showOverlay = showOverlay ) @@ -61,7 +61,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar, + override val progressBarUiStateState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -73,7 +73,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState, + progressBarUiStateState = progressBarUiStateState, showOverlay = showOverlay ) @@ -84,7 +84,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar, + override val progressBarUiStateState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -96,7 +96,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarState = progressBarState, + progressBarUiStateState = progressBarUiStateState, showOverlay = showOverlay ) @@ -106,7 +106,7 @@ sealed class PageItem(open val type: Type) { override val date: Date, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarState: PostListItemProgressBar, + override val progressBarUiStateState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -118,7 +118,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), actionsEnabled = actionsEnabled, tapActionEnabled = false, - progressBarState = progressBarState, + progressBarUiStateState = progressBarUiStateState, showOverlay = showOverlay ) 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 c80a46c5d8be..c16ef24c39b1 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 @@ -3,7 +3,7 @@ package org.wordpress.android.ui.pages import androidx.recyclerview.widget.DiffUtil.Callback import org.wordpress.android.ui.pages.PageItem.Page import org.wordpress.android.ui.pages.PageItem.ParentPage -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Determinate +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState.Determinate class PageItemDiffUtil(val items: List, val result: List) : Callback() { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { @@ -35,10 +35,10 @@ class PageItemDiffUtil(val items: List, val result: List) : * We don't need to use the payload in onBindViewHolder unless we want to. Passing a non-null value * suppresses the default ItemAnimator, which is all we need in this case. */ - if (oldItem.progressBarState is Determinate && - newItem.progressBarState is Determinate && - (oldItem.progressBarState as Determinate).progress != - (newItem.progressBarState as Determinate).progress) { + if (oldItem.progressBarUiStateState is Determinate && + newItem.progressBarUiStateState is Determinate && + (oldItem.progressBarUiStateState as Determinate).progress != + (newItem.progressBarUiStateState as Determinate).progress) { return true } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index 9f7f9b03b2cf..f395d2c865c6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -31,9 +31,9 @@ import org.wordpress.android.util.currentLocale import org.wordpress.android.util.getDrawableFromAttribute import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Determinate -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Indeterminate +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState.Determinate +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState.Indeterminate import java.util.Date sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layout: Int) : @@ -97,17 +97,17 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou showFeaturedImage(page.imageUrl) uiHelper.updateVisibility(disabledOverlay, page.showOverlay) - updateProgressBarState(page.progressBarState) + updateProgressBarState(page.progressBarUiStateState) } } - private fun updateProgressBarState(progressBarState: PostListItemProgressBar) { - uiHelper.updateVisibility(uploadProgressBar, progressBarState.visibility) - when (progressBarState) { + private fun updateProgressBarState(progressBarUiStateState: ProgressBarUiState) { + uiHelper.updateVisibility(uploadProgressBar, progressBarUiStateState.visibility) + when (progressBarUiStateState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { uploadProgressBar.isIndeterminate = false - uploadProgressBar.progress = progressBarState.progress + uploadProgressBar.progress = progressBarUiStateState.progress } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt index 632eba75c030..c9aab137a518 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt @@ -26,9 +26,9 @@ import org.wordpress.android.util.image.ImageType import org.wordpress.android.viewmodel.posts.PostListItemAction import org.wordpress.android.viewmodel.posts.PostListItemAction.MoreItem import org.wordpress.android.viewmodel.posts.PostListItemAction.SingleItem -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Determinate -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar.Indeterminate +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState.Determinate +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState.Indeterminate import org.wordpress.android.viewmodel.posts.PostListItemType.PostListItemUiState import org.wordpress.android.viewmodel.posts.PostListItemUiStateData import org.wordpress.android.widgets.PostListButton @@ -123,7 +123,7 @@ sealed class PostListItemViewHolder( uiHelpers.updateVisibility(statusesTextView, data.statuses.isNotEmpty()) updateStatusesLabel(statusesTextView, data.statuses, data.statusesDelimiter, data.statusesColor) showFeaturedImage(data.imageUrl) - updateProgressBarState(data.progressBarState) + updateProgressBarState(data.progressBarUiStateState) uiHelpers.updateVisibility(disabledOverlay, data.showOverlay) if (data.disableRippleEffect) { container.background = null @@ -149,13 +149,13 @@ sealed class PostListItemViewHolder( menu.show() } - private fun updateProgressBarState(progressBarState: PostListItemProgressBar) { - uiHelpers.updateVisibility(uploadProgressBar, progressBarState.visibility) - when (progressBarState) { + private fun updateProgressBarState(progressBarUiStateState: ProgressBarUiState) { + uiHelpers.updateVisibility(uploadProgressBar, progressBarUiStateState.visibility) + when (progressBarUiStateState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { uploadProgressBar.isIndeterminate = false - uploadProgressBar.progress = progressBarState.progress + uploadProgressBar.progress = progressBarUiStateState.progress } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt index 4182ff234ff5..ada3c8992f23 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt @@ -18,7 +18,7 @@ import org.wordpress.android.ui.posts.PostListViewLayoutType.STANDARD import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.setVisible -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import org.wordpress.android.viewmodel.posts.PostListItemType import org.wordpress.android.viewmodel.posts.PostListItemType.EndListIndicatorItem import org.wordpress.android.viewmodel.posts.PostListItemType.LoadingItem @@ -204,9 +204,9 @@ private val PostListDiffItemCallback = object : DiffUtil.ItemCallback { + ): Pair { val post = postStore.getPostByLocalPostId(pageId.value) val uploadStatus = uploadStatusTracker.getUploadStatus( post, site @@ -53,15 +53,15 @@ class PageItemUploadProgressHelper @Inject constructor( */ private fun getProgressBarState( uploadUiState: PostUploadUiState - ): PostListItemProgressBar { + ): ProgressBarUiState { return if (shouldShowProgress(uploadUiState)) { if (uploadUiState is UploadingMedia) { - PostListItemProgressBar.Determinate(uploadUiState.progress) + ProgressBarUiState.Determinate(uploadUiState.progress) } else { - PostListItemProgressBar.Indeterminate + ProgressBarUiState.Indeterminate } } else { - PostListItemProgressBar.Hidden + ProgressBarUiState.Hidden } } 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 6c02c56ebebf..c415249bd93f 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 @@ -98,7 +98,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarState = progressState.first, + progressBarUiStateState = progressState.first, showOverlay = progressState.second ) PageStatus.DRAFT, PageStatus.PENDING -> DraftPage( @@ -106,7 +106,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarState = progressState.first, + progressBarUiStateState = progressState.first, showOverlay = progressState.second ) PageStatus.TRASHED -> TrashedPage( @@ -114,7 +114,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarState = progressState.first, + progressBarUiStateState = progressState.first, showOverlay = progressState.second ) PageStatus.SCHEDULED -> ScheduledPage( @@ -122,7 +122,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarState = progressState.first, + progressBarUiStateState = progressState.first, showOverlay = progressState.second ) } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt deleted file mode 100644 index 1a9ba840d806..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemProgressBar.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.wordpress.android.viewmodel.posts - -sealed class PostListItemProgressBar(val visibility: Boolean) { - object Hidden : PostListItemProgressBar(visibility = false) - object Indeterminate : PostListItemProgressBar(visibility = true) - data class Determinate(val progress: Int) : PostListItemProgressBar(visibility = true) -} diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt index 8ce6eebfee3c..dec4e21bba18 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt @@ -6,6 +6,7 @@ import org.wordpress.android.ui.posts.PostListType import org.wordpress.android.ui.utils.UiString import org.wordpress.android.viewmodel.posts.PostListItemIdentifier.LocalPostId import org.wordpress.android.viewmodel.posts.PostListItemIdentifier.RemotePostId +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import org.wordpress.android.widgets.PostListButtonType sealed class PostListItemType { @@ -55,7 +56,7 @@ data class PostListItemUiStateData( @ColorRes val statusesColor: Int?, val statuses: List, val statusesDelimiter: UiString, - val progressBarState: PostListItemProgressBar, + val progressBarUiStateState: ProgressBarUiState, val showOverlay: Boolean, val disableRippleEffect: Boolean ) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt index 45a1447a19fe..4c0b559ad84a 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt @@ -40,6 +40,7 @@ import org.wordpress.android.viewmodel.posts.PostListItemUiStateHelper.PostUploa import org.wordpress.android.viewmodel.posts.PostListItemUiStateHelper.PostUploadUiState.UploadWaitingForConnection import org.wordpress.android.viewmodel.posts.PostListItemUiStateHelper.PostUploadUiState.UploadingMedia import org.wordpress.android.viewmodel.posts.PostListItemUiStateHelper.PostUploadUiState.UploadingPost +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import org.wordpress.android.widgets.PostListButtonType import org.wordpress.android.widgets.PostListButtonType.BUTTON_CANCEL_PENDING_AUTO_UPLOAD import org.wordpress.android.widgets.PostListButtonType.BUTTON_DELETE @@ -136,7 +137,7 @@ class PostListItemUiStateHelper @Inject constructor(private val appPrefsWrapper: statuses = statuses, statusesColor = statusesColor, statusesDelimiter = statusesDelimeter, - progressBarState = getProgressBarState( + progressBarUiStateState = getProgressBarState( uploadUiState = uploadUiState, performingCriticalAction = performingCriticalAction ), @@ -186,15 +187,15 @@ class PostListItemUiStateHelper @Inject constructor(private val appPrefsWrapper: private fun getProgressBarState( uploadUiState: PostUploadUiState, performingCriticalAction: Boolean - ): PostListItemProgressBar { + ): ProgressBarUiState { return if (shouldShowProgress(uploadUiState, performingCriticalAction)) { if (uploadUiState is UploadingMedia) { - PostListItemProgressBar.Determinate(uploadUiState.progress) + ProgressBarUiState.Determinate(uploadUiState.progress) } else { - PostListItemProgressBar.Indeterminate + ProgressBarUiState.Indeterminate } } else { - PostListItemProgressBar.Hidden + ProgressBarUiState.Hidden } } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt new file mode 100644 index 000000000000..2d11edb70be1 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt @@ -0,0 +1,7 @@ +package org.wordpress.android.viewmodel.uistate + +sealed class ProgressBarUiState(val visibility: Boolean) { + object Hidden : ProgressBarUiState(visibility = false) + object Indeterminate : ProgressBarUiState(visibility = true) + data class Determinate(val progress: Int) : ProgressBarUiState(visibility = true) +} 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 f875273fa618..f8099b368de8 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 @@ -21,7 +21,7 @@ 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.PUBLISHED -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import java.util.Date import java.util.Locale @@ -48,7 +48,7 @@ class PageListViewModelTest : BaseUnitTest() { ) whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair( - PostListItemProgressBar.Hidden, false)) + ProgressBarUiState.Hidden, false)) val invalidateUploadStatus = MutableLiveData>() @@ -207,14 +207,14 @@ class PageListViewModelTest : BaseUnitTest() { fun `checks if PageItems gets the correct progress state`() { whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( Pair( - PostListItemProgressBar.Indeterminate, + ProgressBarUiState.Indeterminate, true ) ) whenever(progressHelper.getProgressStateForPage(LocalId(1))).thenReturn( Pair( - PostListItemProgressBar.Hidden, + ProgressBarUiState.Hidden, false ) ) @@ -236,12 +236,12 @@ class PageListViewModelTest : BaseUnitTest() { pageModels += firstPage pages.value = pageModels - assertThat((result[0].first[0] as PublishedPage).progressBarState).isEqualTo( - PostListItemProgressBar.Indeterminate + assertThat((result[0].first[0] as PublishedPage).progressBarUiStateState).isEqualTo( + ProgressBarUiState.Indeterminate ) assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) - assertThat((result[0].first[1] as PublishedPage).progressBarState).isEqualTo(PostListItemProgressBar.Hidden) + assertThat((result[0].first[1] as PublishedPage).progressBarUiStateState).isEqualTo(ProgressBarUiState.Hidden) assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(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 01829c089f69..88fe999f40d2 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 @@ -26,7 +26,7 @@ import org.wordpress.android.ui.pages.PageItem.Empty import org.wordpress.android.ui.pages.PageItem.PublishedPage import org.wordpress.android.viewmodel.ResourceProvider import org.wordpress.android.viewmodel.pages.PageListViewModel.PageListType -import org.wordpress.android.viewmodel.posts.PostListItemProgressBar +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import java.util.Date import java.util.SortedMap @@ -51,7 +51,7 @@ class SearchListViewModelTest { viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, progressHelper) searchPages = MutableLiveData() - whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair(PostListItemProgressBar.Hidden, false)) + whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair(ProgressBarUiState.Hidden, false)) whenever(pagesViewModel.searchPages).thenReturn(searchPages) viewModel.start(pagesViewModel) } @@ -124,7 +124,7 @@ class SearchListViewModelTest { 0, null, false, - PostListItemProgressBar.Hidden, + ProgressBarUiState.Hidden, false ) val action = VIEW_PAGE @@ -137,7 +137,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, PostListItemProgressBar.Hidden, + 1, "title", Date(), listOf(), 0, null, false, ProgressBarUiState.Hidden, false ) diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt index f5e76e3b7f75..51214abf9ac4 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt @@ -25,6 +25,7 @@ import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringText import org.wordpress.android.viewmodel.posts.PostListItemAction.MoreItem import org.wordpress.android.viewmodel.posts.PostListItemType.PostListItemUiState +import org.wordpress.android.viewmodel.uistate.ProgressBarUiState import org.wordpress.android.widgets.PostListButtonType private const val FORMATTER_DATE = "January 1st, 1:35pm" @@ -672,19 +673,19 @@ class PostListItemUiStateHelperTest { @Test fun `show progress when performing critical action`() { val state = createPostListItemUiState(performingCriticalAction = true) - assertThat(state.data.progressBarState).isEqualTo(PostListItemProgressBar.Indeterminate) + assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Indeterminate) } @Test fun `show progress when post is uploading or queued`() { val state = createPostListItemUiState(uploadStatus = createUploadStatus(isUploadingOrQueued = true)) - assertThat(state.data.progressBarState).isEqualTo(PostListItemProgressBar.Indeterminate) + assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Indeterminate) } @Test fun `show progress when uploading media`() { val state = createPostListItemUiState(uploadStatus = createUploadStatus(hasInProgressMediaUpload = true)) - assertThat(state.data.progressBarState).isInstanceOf(PostListItemProgressBar.Determinate::class.java) + assertThat(state.data.progressBarUiStateState).isInstanceOf(ProgressBarUiState.Determinate::class.java) } @Test @@ -694,7 +695,7 @@ class PostListItemUiStateHelperTest { isUploadFailed = true ) ) - assertThat(state.data.progressBarState).isEqualTo(PostListItemProgressBar.Hidden) + assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Hidden) } @Test @@ -706,7 +707,7 @@ class PostListItemUiStateHelperTest { hasInProgressMediaUpload = true ) ) - assertThat(state.data.progressBarState).isInstanceOf(PostListItemProgressBar.Determinate::class.java) + assertThat(state.data.progressBarUiStateState).isInstanceOf(ProgressBarUiState.Determinate::class.java) } @Test From b02fc03d1c0266b819f4541c89eb2252049fd3f2 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:13:02 -0500 Subject: [PATCH 43/59] removed empty line. --- .../org/wordpress/android/viewmodel/pages/PageListViewModel.kt | 3 +-- 1 file changed, 1 insertion(+), 2 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 616825b3635f..3b725dd0bb38 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 @@ -287,8 +287,7 @@ class PageListViewModel @Inject constructor( it.pageId ) ) - - + ScheduledPage( it.remoteId, it.title, it.date, labels, getFeaturedImageUrl(it.featuredImageId), From 542fad7146beee8c143d0afc696f46212dacff66 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:41:22 -0500 Subject: [PATCH 44/59] fixed an issue that occurred when doing the renaming; extra state added --- .../org/wordpress/android/ui/pages/PageItem.kt | 18 +++++++++--------- .../android/ui/pages/PageItemDiffUtil.kt | 8 ++++---- .../android/ui/pages/PageItemViewHolder.kt | 10 +++++----- .../android/ui/posts/PostListItemViewHolder.kt | 10 +++++----- .../ui/posts/adapters/PostListAdapter.kt | 6 +++--- .../viewmodel/pages/PageListViewModel.kt | 2 +- .../viewmodel/pages/SearchListViewModel.kt | 8 ++++---- .../viewmodel/posts/PostListItemType.kt | 2 +- .../posts/PostListItemUiStateHelper.kt | 2 +- .../viewmodel/pages/PageListViewModelTest.kt | 6 +++--- .../posts/PostListItemUiStateHelperTest.kt | 10 +++++----- 11 files changed, 41 insertions(+), 41 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 17520a1a1419..5eaa9e49a359 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 @@ -26,7 +26,7 @@ sealed class PageItem(open val type: Type) { open val actions: Set, open var actionsEnabled: Boolean, open val tapActionEnabled: Boolean, - open val progressBarUiStateState: ProgressBarUiState, + open val progressBarUiState: ProgressBarUiState, open val showOverlay: Boolean ) : PageItem(PAGE) @@ -38,7 +38,7 @@ sealed class PageItem(open val type: Type) { override var indent: Int = 0, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarUiStateState: ProgressBarUiState, + override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -50,7 +50,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarUiStateState = progressBarUiStateState, + progressBarUiState = progressBarUiState, showOverlay = showOverlay ) @@ -61,7 +61,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarUiStateState: ProgressBarUiState, + override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -73,7 +73,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, PUBLISH_NOW, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarUiStateState = progressBarUiStateState, + progressBarUiState = progressBarUiState, showOverlay = showOverlay ) @@ -84,7 +84,7 @@ sealed class PageItem(open val type: Type) { override val labels: List = emptyList(), override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarUiStateState: ProgressBarUiState, + override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -96,7 +96,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(VIEW_PAGE, SET_PARENT, MOVE_TO_DRAFT, MOVE_TO_TRASH), actionsEnabled = actionsEnabled, tapActionEnabled = true, - progressBarUiStateState = progressBarUiStateState, + progressBarUiState = progressBarUiState, showOverlay = showOverlay ) @@ -106,7 +106,7 @@ sealed class PageItem(open val type: Type) { override val date: Date, override var imageUrl: String? = null, override var actionsEnabled: Boolean = true, - override val progressBarUiStateState: ProgressBarUiState, + override val progressBarUiState: ProgressBarUiState, override val showOverlay: Boolean ) : Page( id = id, @@ -118,7 +118,7 @@ sealed class PageItem(open val type: Type) { actions = setOf(MOVE_TO_DRAFT, DELETE_PERMANENTLY), actionsEnabled = actionsEnabled, tapActionEnabled = false, - progressBarUiStateState = progressBarUiStateState, + progressBarUiState = progressBarUiState, showOverlay = showOverlay ) 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 c16ef24c39b1..e6ba99d9b208 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 @@ -35,10 +35,10 @@ class PageItemDiffUtil(val items: List, val result: List) : * We don't need to use the payload in onBindViewHolder unless we want to. Passing a non-null value * suppresses the default ItemAnimator, which is all we need in this case. */ - if (oldItem.progressBarUiStateState is Determinate && - newItem.progressBarUiStateState is Determinate && - (oldItem.progressBarUiStateState as Determinate).progress != - (newItem.progressBarUiStateState as Determinate).progress) { + if (oldItem.progressBarUiState is Determinate && + newItem.progressBarUiState is Determinate && + (oldItem.progressBarUiState as Determinate).progress != + (newItem.progressBarUiState as Determinate).progress) { return true } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt index f395d2c865c6..245845bb10ac 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PageItemViewHolder.kt @@ -97,17 +97,17 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou showFeaturedImage(page.imageUrl) uiHelper.updateVisibility(disabledOverlay, page.showOverlay) - updateProgressBarState(page.progressBarUiStateState) + updateProgressBarState(page.progressBarUiState) } } - private fun updateProgressBarState(progressBarUiStateState: ProgressBarUiState) { - uiHelper.updateVisibility(uploadProgressBar, progressBarUiStateState.visibility) - when (progressBarUiStateState) { + private fun updateProgressBarState(progressBarUiState: ProgressBarUiState) { + uiHelper.updateVisibility(uploadProgressBar, progressBarUiState.visibility) + when (progressBarUiState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { uploadProgressBar.isIndeterminate = false - uploadProgressBar.progress = progressBarUiStateState.progress + uploadProgressBar.progress = progressBarUiState.progress } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt index c9aab137a518..71c8d4e0ad95 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostListItemViewHolder.kt @@ -123,7 +123,7 @@ sealed class PostListItemViewHolder( uiHelpers.updateVisibility(statusesTextView, data.statuses.isNotEmpty()) updateStatusesLabel(statusesTextView, data.statuses, data.statusesDelimiter, data.statusesColor) showFeaturedImage(data.imageUrl) - updateProgressBarState(data.progressBarUiStateState) + updateProgressBarState(data.progressBarUiState) uiHelpers.updateVisibility(disabledOverlay, data.showOverlay) if (data.disableRippleEffect) { container.background = null @@ -149,13 +149,13 @@ sealed class PostListItemViewHolder( menu.show() } - private fun updateProgressBarState(progressBarUiStateState: ProgressBarUiState) { - uiHelpers.updateVisibility(uploadProgressBar, progressBarUiStateState.visibility) - when (progressBarUiStateState) { + private fun updateProgressBarState(progressBarUiState: ProgressBarUiState) { + uiHelpers.updateVisibility(uploadProgressBar, progressBarUiState.visibility) + when (progressBarUiState) { Indeterminate -> uploadProgressBar.isIndeterminate = true is Determinate -> { uploadProgressBar.isIndeterminate = false - uploadProgressBar.progress = progressBarUiStateState.progress + uploadProgressBar.progress = progressBarUiState.progress } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt index ada3c8992f23..986d5d865f3e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/adapters/PostListAdapter.kt @@ -204,9 +204,9 @@ private val PostListDiffItemCallback = object : DiffUtil.ItemCallback DraftPage( @@ -106,7 +106,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarUiStateState = progressState.first, + progressBarUiState = progressState.first, showOverlay = progressState.second ) PageStatus.TRASHED -> TrashedPage( @@ -114,7 +114,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarUiStateState = progressState.first, + progressBarUiState = progressState.first, showOverlay = progressState.second ) PageStatus.SCHEDULED -> ScheduledPage( @@ -122,7 +122,7 @@ class SearchListViewModel title, date, actionsEnabled = areActionsEnabled, - progressBarUiStateState = progressState.first, + progressBarUiState = progressState.first, showOverlay = progressState.second ) } diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt index dec4e21bba18..00155aaaa65c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemType.kt @@ -56,7 +56,7 @@ data class PostListItemUiStateData( @ColorRes val statusesColor: Int?, val statuses: List, val statusesDelimiter: UiString, - val progressBarUiStateState: ProgressBarUiState, + val progressBarUiState: ProgressBarUiState, val showOverlay: Boolean, val disableRippleEffect: Boolean ) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt index 4c0b559ad84a..7f4e555beb59 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelper.kt @@ -137,7 +137,7 @@ class PostListItemUiStateHelper @Inject constructor(private val appPrefsWrapper: statuses = statuses, statusesColor = statusesColor, statusesDelimiter = statusesDelimeter, - progressBarUiStateState = getProgressBarState( + progressBarUiState = getProgressBarState( uploadUiState = uploadUiState, performingCriticalAction = performingCriticalAction ), 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 f8099b368de8..b718e1de403f 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 @@ -204,7 +204,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `checks if PageItems gets the correct progress state`() { + fun `progressBarUiState`() { whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( Pair( ProgressBarUiState.Indeterminate, @@ -236,12 +236,12 @@ class PageListViewModelTest : BaseUnitTest() { pageModels += firstPage pages.value = pageModels - assertThat((result[0].first[0] as PublishedPage).progressBarUiStateState).isEqualTo( + assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo( ProgressBarUiState.Indeterminate ) assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) - assertThat((result[0].first[1] as PublishedPage).progressBarUiStateState).isEqualTo(ProgressBarUiState.Hidden) + assertThat((result[0].first[1] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) } diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt index 51214abf9ac4..c7c91835112f 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/posts/PostListItemUiStateHelperTest.kt @@ -673,19 +673,19 @@ class PostListItemUiStateHelperTest { @Test fun `show progress when performing critical action`() { val state = createPostListItemUiState(performingCriticalAction = true) - assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Indeterminate) + assertThat(state.data.progressBarUiState).isEqualTo(ProgressBarUiState.Indeterminate) } @Test fun `show progress when post is uploading or queued`() { val state = createPostListItemUiState(uploadStatus = createUploadStatus(isUploadingOrQueued = true)) - assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Indeterminate) + assertThat(state.data.progressBarUiState).isEqualTo(ProgressBarUiState.Indeterminate) } @Test fun `show progress when uploading media`() { val state = createPostListItemUiState(uploadStatus = createUploadStatus(hasInProgressMediaUpload = true)) - assertThat(state.data.progressBarUiStateState).isInstanceOf(ProgressBarUiState.Determinate::class.java) + assertThat(state.data.progressBarUiState).isInstanceOf(ProgressBarUiState.Determinate::class.java) } @Test @@ -695,7 +695,7 @@ class PostListItemUiStateHelperTest { isUploadFailed = true ) ) - assertThat(state.data.progressBarUiStateState).isEqualTo(ProgressBarUiState.Hidden) + assertThat(state.data.progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) } @Test @@ -707,7 +707,7 @@ class PostListItemUiStateHelperTest { hasInProgressMediaUpload = true ) ) - assertThat(state.data.progressBarUiStateState).isInstanceOf(ProgressBarUiState.Determinate::class.java) + assertThat(state.data.progressBarUiState).isInstanceOf(ProgressBarUiState.Determinate::class.java) } @Test From 175a7c371e9e112c3f5fd6c093818478445b7a93 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 14:49:29 -0500 Subject: [PATCH 45/59] enhanced tests so they only verify one scenario at a time. --- .../viewmodel/pages/PageListViewModelTest.kt | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) 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 b718e1de403f..02a4c4bfef42 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 @@ -204,7 +204,7 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `progressBarUiState`() { + fun `progressState is specific to each page`() { whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( Pair( ProgressBarUiState.Indeterminate, @@ -245,6 +245,56 @@ class PageListViewModelTest : BaseUnitTest() { assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) } + @Test + fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { + whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + Pair( + ProgressBarUiState.Indeterminate, + true + ) + ) + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(PUBLISHED, pagesViewModel) + + val result = mutableListOf, Boolean>>() + + viewModel.pages.observeForever { result.add(it) } + + val firstPage = buildPageModel(0) + + pages.value = listOf(firstPage) + + assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) + } + + @Test + fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { + whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + Pair( + ProgressBarUiState.Indeterminate, + true + ) + ) + + val pages = MutableLiveData>() + whenever(pagesViewModel.pages).thenReturn(pages) + + viewModel.start(PUBLISHED, pagesViewModel) + + val result = mutableListOf, Boolean>>() + + viewModel.pages.observeForever { result.add(it) } + + val firstPage = buildPageModel(0) + + pages.value = listOf(firstPage) + + assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Indeterminate) + } + private fun buildPageModel( id: Int, date: Date = Date(0), From dd486202e7a967cccb3d812a612630bcbe4e433e Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Wed, 5 Feb 2020 20:02:12 -0500 Subject: [PATCH 46/59] reverted line changes and attempted fix for constructor declaration. --- .../android/viewmodel/pages/PageListViewModel.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 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 89ee02bca9bb..0ab2acd178db 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 @@ -87,7 +87,6 @@ class PageListViewModel @Inject constructor( } } } - val title: Int get() = when (this) { PUBLISHED -> R.string.pages_published @@ -231,10 +230,7 @@ class PageListViewModel @Inject constructor( return null } - private fun preparePublishedPages( - pages: List, - actionsEnabled: Boolean - ): List { + private fun preparePublishedPages(pages: List, actionsEnabled: Boolean): List { val shouldSortTopologically = pages.size < MAX_TOPOLOGICAL_PAGE_COUNT val sortedPages = if (shouldSortTopologically) { topologicalSort(pages, listType = PUBLISHED) @@ -257,11 +253,7 @@ class PageListViewModel @Inject constructor( val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) PublishedPage( - it.remoteId, - it.title, - it.date, - labels, - pageItemIndent, + it.remoteId, it.title, it.date, labels, pageItemIndent, getFeaturedImageUrl(it.featuredImageId), actionsEnabled, progressBarUiState, From 7fb606e97919fbe1ca290631bb1d71cd83d5eb4b Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 13:28:24 -0500 Subject: [PATCH 47/59] do proper checks to ensure right events are being propagated for pages --- .../viewmodel/pages/PageListEventListener.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 1f4c0117bdee..0f5255715ce8 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -127,7 +127,7 @@ class PageListEventListener( @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onPostUploaded(event: OnPostUploaded) { - if (event.post != null && event.post.localSiteId == site.id) { + if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { uploadStatusChanged(LocalId(event.post.id)) if (!event.isError) { handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) @@ -154,11 +154,7 @@ class PageListEventListener( @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: PostEvents.PostUploadStarted) { - if (!event.post.isPage) { - return - } - - if (site.id == event.post.localSiteId) { + if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { uploadStatusChanged(LocalId(event.post.id)) handlePostUploadedStarted(RemoteId(event.post.remotePostId)) @@ -171,7 +167,7 @@ class PageListEventListener( @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: PostEvents.PostUploadCanceled) { - if (site.id == event.post.localSiteId) { + if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { uploadStatusChanged(LocalId(event.post.id)) } } @@ -179,7 +175,9 @@ class PageListEventListener( @Suppress("unused") @Subscribe(threadMode = BACKGROUND) fun onEventBackgroundThread(event: VideoOptimizer.ProgressEvent) { - uploadStatusChanged(LocalId(event.media.localPostId)) + if (event.media != null && site.id == event.media.localSiteId) { + uploadStatusChanged(LocalId(event.media.localPostId)) + } } @Suppress("unused") From 08be0df9d5866674e4ce2d884738aa4406691537 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 13:45:47 -0500 Subject: [PATCH 48/59] refactored ProgressHelper function call to include site instead of state --- .../pages/PageItemUploadProgressHelper.kt | 11 +---------- .../viewmodel/pages/PageListViewModel.kt | 17 ++++++++--------- .../viewmodel/pages/SearchListViewModel.kt | 3 +-- .../viewmodel/pages/PageListViewModelTest.kt | 10 +++++----- .../viewmodel/pages/SearchListViewModelTest.kt | 3 ++- 5 files changed, 17 insertions(+), 27 deletions(-) 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 c1b82369b7d0..e485ba692f42 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 @@ -26,17 +26,8 @@ class PageItemUploadProgressHelper @Inject constructor( private val postStore: PostStore, val uploadStatusTracker: PostModelUploadStatusTracker ) { - private lateinit var site: SiteModel - - /** - * This was done so that this class could be injectable for testing, as this dependency wouldn't be provided by DI - */ - fun attachSite(site: SiteModel) { - this.site = site - } - fun getProgressStateForPage( - pageId: LocalId + pageId: LocalId, site : SiteModel ): Pair { val post = postStore.getPostByLocalPostId(pageId.value) val uploadStatus = uploadStatusTracker.getUploadStatus( 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 0ab2acd178db..32b49e8521a2 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 @@ -107,8 +107,6 @@ class PageListViewModel @Inject constructor( this.listType = listType this.pagesViewModel = pagesViewModel - progressHelper.attachSite(site = pagesViewModel.site) - if (!isStarted) { isStarted = true @@ -250,7 +248,8 @@ class PageListViewModel @Inject constructor( } else { DEFAULT_INDENT } - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + pagesViewModel.site) PublishedPage( it.remoteId, it.title, it.date, labels, pageItemIndent, @@ -275,10 +274,8 @@ class PageListViewModel @Inject constructor( labels.add(R.string.local_changes) val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage( - LocalId( - it.pageId - ) - ) + LocalId(it.pageId), + pagesViewModel.site) ScheduledPage( it.remoteId, it.title, it.date, labels, @@ -303,7 +300,8 @@ class PageListViewModel @Inject constructor( if (it.hasLocalChanges) labels.add(R.string.local_draft) - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + pagesViewModel.site) DraftPage( it.remoteId, it.title, @@ -322,7 +320,8 @@ class PageListViewModel @Inject constructor( actionsEnabled: Boolean ): List { return pages.map { - val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId)) + val (progressBarUiState, showOverlay) = progressHelper.getProgressStateForPage(LocalId(it.pageId), + pagesViewModel.site) TrashedPage( it.remoteId, it.title, 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 dbbaf9956cc1..579d9422796b 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 @@ -45,7 +45,6 @@ class SearchListViewModel isStarted = true pagesViewModel.searchPages.observeForever(searchObserver) - progressHelper.attachSite(site = pagesViewModel.site) } } @@ -89,7 +88,7 @@ class SearchListViewModel } private fun PageModel.toPageItem(areActionsEnabled: Boolean): PageItem { - val progressState = progressHelper.getProgressStateForPage(LocalId(pageId)) + val progressState = progressHelper.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 02a4c4bfef42..0d1e52021c2c 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 @@ -47,7 +47,7 @@ class PageListViewModelTest : BaseUnitTest() { progressHelper ) - whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair( + whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn(Pair( ProgressBarUiState.Hidden, false)) val invalidateUploadStatus = MutableLiveData>() @@ -205,14 +205,14 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `progressState is specific to each page`() { - whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( ProgressBarUiState.Indeterminate, true ) ) - whenever(progressHelper.getProgressStateForPage(LocalId(1))).thenReturn( + whenever(progressHelper.getProgressStateForPage(LocalId(1), site)).thenReturn( Pair( ProgressBarUiState.Hidden, false @@ -247,7 +247,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { - whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( ProgressBarUiState.Indeterminate, true @@ -272,7 +272,7 @@ class PageListViewModelTest : BaseUnitTest() { @Test fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { - whenever(progressHelper.getProgressStateForPage(LocalId(0))).thenReturn( + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( ProgressBarUiState.Indeterminate, true 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 88fe999f40d2..f721f4adeafb 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 @@ -51,8 +51,9 @@ class SearchListViewModelTest { viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, progressHelper) searchPages = MutableLiveData() - whenever(progressHelper.getProgressStateForPage(any())).thenReturn(Pair(ProgressBarUiState.Hidden, false)) + whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn(Pair(ProgressBarUiState.Hidden, false)) whenever(pagesViewModel.searchPages).thenReturn(searchPages) + whenever(pagesViewModel.site).thenReturn(site) viewModel.start(pagesViewModel) } From aecfb9f91df8f65b764bc8231662611a63611e6f Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 14:01:22 -0500 Subject: [PATCH 49/59] refactored tests. --- .../viewmodel/pages/PageListViewModelTest.kt | 95 +++++++++---------- 1 file changed, 46 insertions(+), 49 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 0d1e52021c2c..62e48ad0f0dd 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 @@ -2,6 +2,7 @@ package org.wordpress.android.viewmodel.pages import androidx.lifecycle.MutableLiveData import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever import kotlinx.coroutines.Dispatchers import org.assertj.core.api.Assertions.assertThat @@ -17,6 +18,7 @@ import org.wordpress.android.fluxc.model.page.PageStatus import org.wordpress.android.fluxc.store.MediaStore import org.wordpress.android.ui.pages.PageItem import org.wordpress.android.ui.pages.PageItem.Divider +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 @@ -204,74 +206,51 @@ class PageListViewModelTest : BaseUnitTest() { } @Test - fun `progressState is specific to each page`() { - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( - Pair( - ProgressBarUiState.Indeterminate, - true - ) - ) - - whenever(progressHelper.getProgressStateForPage(LocalId(1), site)).thenReturn( - Pair( - ProgressBarUiState.Hidden, - false - ) - ) - + fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { + // Arrange + val expectedShowOverlay = true val pages = MutableLiveData>() + + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn(Pair(mock(), + expectedShowOverlay)) whenever(pagesViewModel.pages).thenReturn(pages) viewModel.start(PUBLISHED, pagesViewModel) - val result = mutableListOf, Boolean>>() - viewModel.pages.observeForever { result.add(it) } - val firstPage = buildPageModel(0) - val secondPage = buildPageModel(1) - - val pageModels = mutableListOf() - pageModels += secondPage - pageModels += firstPage - pages.value = pageModels - - assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo( - ProgressBarUiState.Indeterminate - ) - assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) + // Act + pages.value = listOf(buildPageModel(0)) - assertThat((result[0].first[1] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) - assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) + // Assert + assertThat((result[0].first[0] as Page).showOverlay).isEqualTo(expectedShowOverlay) } @Test - fun `showOverlay is correctly propagated from PageItemUploadProgressHelper`() { - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( - Pair( - ProgressBarUiState.Indeterminate, - true - ) - ) - + fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { + // Arrange + val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() + + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)). + thenReturn(Pair(expectedProgressBarUiState, true)) whenever(pagesViewModel.pages).thenReturn(pages) viewModel.start(PUBLISHED, pagesViewModel) - val result = mutableListOf, Boolean>>() - viewModel.pages.observeForever { result.add(it) } - val firstPage = buildPageModel(0) - - pages.value = listOf(firstPage) + // Act + pages.value = listOf(buildPageModel(0)) - assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) + // Assert + assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo(expectedProgressBarUiState) } @Test - fun `ProgressBarUiState is correctly propagated from PageItemUploadProgressHelper`() { + fun `progressState is specific to each page`() { + // Arrange + val pages = MutableLiveData>() whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( Pair( ProgressBarUiState.Indeterminate, @@ -279,7 +258,13 @@ class PageListViewModelTest : BaseUnitTest() { ) ) - val pages = MutableLiveData>() + whenever(progressHelper.getProgressStateForPage(LocalId(1), site)).thenReturn( + Pair( + ProgressBarUiState.Hidden, + false + ) + ) + whenever(pagesViewModel.pages).thenReturn(pages) viewModel.start(PUBLISHED, pagesViewModel) @@ -289,10 +274,22 @@ class PageListViewModelTest : BaseUnitTest() { viewModel.pages.observeForever { result.add(it) } val firstPage = buildPageModel(0) + val secondPage = buildPageModel(1) - pages.value = listOf(firstPage) + // Act + val pageModels = mutableListOf() + pageModels += secondPage + pageModels += firstPage + pages.value = pageModels + + // Assert + assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo( + ProgressBarUiState.Indeterminate + ) + assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) - assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Indeterminate) + assertThat((result[0].first[1] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) + assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) } private fun buildPageModel( From 22525dd110e54aeae6d4a8293c4a4e45b1e99e39 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 14:24:11 -0500 Subject: [PATCH 50/59] fixed remote auto save issue. --- .../wordpress/android/viewmodel/pages/PageListEventListener.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 0f5255715ce8..8962e374df8e 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -90,6 +90,7 @@ class PageListEventListener( ) } + uploadStatusChanged(LocalId((event.causeOfChange as RemoteAutoSavePost).localPostId)) handleRemoteAutoSave.invoke( LocalId((event.causeOfChange as RemoteAutoSavePost).localPostId), event.isError From ebc2cd6eb0e4827b1694831d32b5fef548ec117f Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 17:42:10 -0500 Subject: [PATCH 51/59] fixed issue when changing page status. --- .../pages/PageItemUploadProgressHelper.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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 e485ba692f42..ccbb2a5e3041 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 @@ -30,13 +30,17 @@ class PageItemUploadProgressHelper @Inject constructor( pageId: LocalId, site : SiteModel ): Pair { val post = postStore.getPostByLocalPostId(pageId.value) - val uploadStatus = uploadStatusTracker.getUploadStatus( - post, site - ) - val uploadUiState = createUploadUiState(uploadStatus, post) - val shouldShowOverlay = shouldShowOverlay(uploadUiState) - return Pair(getProgressBarState(uploadUiState), shouldShowOverlay) + post?.let { + val uploadStatus = uploadStatusTracker.getUploadStatus( + post, site + ) + val uploadUiState = createUploadUiState(uploadStatus, post) + + val shouldShowOverlay = shouldShowOverlay(uploadUiState) + return Pair(getProgressBarState(uploadUiState), shouldShowOverlay) + } + return Pair(ProgressBarUiState.Hidden, false) } /** From 42faec85dfe642945b123fa14fee7a915550d933 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 17:42:58 -0500 Subject: [PATCH 52/59] run upload status changes when the page has been refreshed --- .../viewmodel/pages/PageListEventListener.kt | 19 ++++++++++--------- .../android/viewmodel/pages/PagesViewModel.kt | 3 ++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 8962e374df8e..a3abee827675 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -44,7 +44,7 @@ class PageListEventListener( private val site: SiteModel, private val handleRemoteAutoSave: (LocalId, Boolean) -> Unit, private val handlePostUploadedWithoutError: (RemoteId) -> Unit, - private val handlePostUploadedStarted: (RemoteId) -> Unit, + private val handlePostUploadedStarted: (RemoteId, LocalId) -> Unit, private val invalidateUploadStatus: (List) -> Unit ) : LifecycleObserver, CoroutineScope { init { @@ -99,6 +99,9 @@ class PageListEventListener( is CauseOfOnPostChanged.UpdatePost -> { if (event.isError) { + invalidateUploadStatus.invoke( + listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) + ) AppLog.e( T.POSTS, "Error updating the post with type: ${event.error.type} and" + @@ -106,11 +109,7 @@ class PageListEventListener( ) } else { handlePostUploadedWithoutError.invoke( - RemoteId((event.causeOfChange as UpdatePost).remotePostId) - ) - invalidateUploadStatus.invoke( - listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) - ) + RemoteId((event.causeOfChange as UpdatePost).remotePostId)) } } } @@ -129,10 +128,12 @@ class PageListEventListener( @Subscribe(threadMode = BACKGROUND) fun onPostUploaded(event: OnPostUploaded) { if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { - uploadStatusChanged(LocalId(event.post.id)) if (!event.isError) { handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) } + else{ + uploadStatusChanged(LocalId(event.post.id)) + } } } @@ -158,7 +159,7 @@ class PageListEventListener( if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { uploadStatusChanged(LocalId(event.post.id)) - handlePostUploadedStarted(RemoteId(event.post.remotePostId)) + handlePostUploadedStarted(RemoteId(event.post.remotePostId), LocalId(event.post.id)) } } @@ -206,7 +207,7 @@ class PageListEventListener( handlePostUploadedWithoutError: (RemoteId) -> Unit, invalidateUploadStatus: (List) -> Unit, handleRemoteAutoSave: (LocalId, Boolean) -> Unit, - handlePostUploadedStarted: (RemoteId) -> Unit + handlePostUploadedStarted: (RemoteId, LocalId) -> Unit ) { PageListEventListener( lifecycle = lifecycle, 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 53ff947df1d8..de68ebef4742 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 @@ -721,11 +721,12 @@ class PagesViewModel } } - fun postUploadStarted(remoteId: RemoteId) { + fun postUploadStarted(remoteId: RemoteId, localPostId: LocalId) { launch { performIfNetworkAvailableAsync { waitForPageUpdate(remoteId.value) reloadPages() + handleInvalidateUploadStatus(listOf(localPostId)) } } } From 23c8df4b4103403bcd142fc3fb8cc0044cf922ef Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 18:03:40 -0500 Subject: [PATCH 53/59] removed lifecycle code and did cleanup manually. Code style fixes. --- .../viewmodel/pages/PageListEventListener.kt | 29 +++++-------------- .../android/viewmodel/pages/PagesViewModel.kt | 14 ++++----- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index a3abee827675..1b0fd28ca06b 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -1,8 +1,5 @@ package org.wordpress.android.viewmodel.pages -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleObserver -import androidx.lifecycle.OnLifecycleEvent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -11,7 +8,6 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.BACKGROUND import org.greenrobot.eventbus.ThreadMode.MAIN import org.wordpress.android.fluxc.Dispatcher -import org.wordpress.android.fluxc.model.CauseOfOnPostChanged import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.RemoteAutoSavePost import org.wordpress.android.fluxc.model.CauseOfOnPostChanged.UpdatePost import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId @@ -36,7 +32,6 @@ import kotlin.coroutines.CoroutineContext * This is a temporary class to make the PagesViewModel more manageable. It was inspired by the PostListEventListener */ class PageListEventListener( - private val lifecycle: Lifecycle, private val dispatcher: Dispatcher, private val bgDispatcher: CoroutineDispatcher, private val postStore: PostStore, @@ -46,11 +41,10 @@ class PageListEventListener( private val handlePostUploadedWithoutError: (RemoteId) -> Unit, private val handlePostUploadedStarted: (RemoteId, LocalId) -> Unit, private val invalidateUploadStatus: (List) -> Unit -) : LifecycleObserver, CoroutineScope { +) : CoroutineScope { init { dispatcher.register(this) eventBusWrapper.register(this) - lifecycle.addObserver(this) } private var job: Job = Job() @@ -59,13 +53,10 @@ class PageListEventListener( get() = bgDispatcher + job /** - * Handles the [Lifecycle.Event.ON_DESTROY] event to cleanup the registration for dispatcher and removing the - * observer for lifecycle. + * Handles the onDestroy event to cleanup the registration for dispatcher and cancelling any pending jobs. */ - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) - private fun onDestroy() { + fun onDestroy() { job.cancel() - lifecycle.removeObserver(this) dispatcher.unregister(this) eventBusWrapper.unregister(this) } @@ -82,7 +73,7 @@ class PageListEventListener( launch { when (event.causeOfChange) { // Fetched post list event will be handled by OnListChanged - is CauseOfOnPostChanged.RemoteAutoSavePost -> { + is RemoteAutoSavePost -> { if (event.isError) { AppLog.d( T.POSTS, "REMOTE_AUTO_SAVE_POST failed: " + @@ -97,11 +88,9 @@ class PageListEventListener( ) } - is CauseOfOnPostChanged.UpdatePost -> { + is UpdatePost -> { if (event.isError) { - invalidateUploadStatus.invoke( - listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) - ) + uploadStatusChanged(LocalId((event.causeOfChange as UpdatePost).localPostId)) AppLog.e( T.POSTS, "Error updating the post with type: ${event.error.type} and" + @@ -198,7 +187,6 @@ class PageListEventListener( class Factory @Inject constructor() { fun createAndStartListening( - lifecycle: Lifecycle, dispatcher: Dispatcher, bgDispatcher: CoroutineDispatcher, postStore: PostStore, @@ -208,9 +196,8 @@ class PageListEventListener( invalidateUploadStatus: (List) -> Unit, handleRemoteAutoSave: (LocalId, Boolean) -> Unit, handlePostUploadedStarted: (RemoteId, LocalId) -> Unit - ) { - PageListEventListener( - lifecycle = lifecycle, + ):PageListEventListener { + return PageListEventListener( dispatcher = dispatcher, bgDispatcher = bgDispatcher, postStore = postStore, 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 de68ebef4742..3de68f57cc99 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 @@ -1,9 +1,6 @@ package org.wordpress.android.viewmodel.pages import androidx.annotation.StringRes -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.CoroutineDispatcher @@ -89,10 +86,7 @@ class PagesViewModel private val pageListEventListenerFactory: PageListEventListener.Factory, @Named(UI_THREAD) private val uiDispatcher: CoroutineDispatcher, @Named(BG_THREAD) private val defaultDispatcher: CoroutineDispatcher -) : ScopedViewModel(uiDispatcher), LifecycleOwner { - private val lifecycleRegistry = LifecycleRegistry(this) - override fun getLifecycle(): Lifecycle = lifecycleRegistry - +) : ScopedViewModel(uiDispatcher) { private val _isSearchExpanded = MutableLiveData() val isSearchExpanded: LiveData = _isSearchExpanded @@ -167,6 +161,8 @@ class PagesViewModel private var pageUpdateContinuations: MutableMap> = mutableMapOf() private var currentPageType = PUBLISHED + private lateinit var pageListEventListener: PageListEventListener + data class BrowsePreview( val post: PostModel, val previewType: RemotePreviewType @@ -180,8 +176,7 @@ class PagesViewModel uploadStarter.queueUploadFromSite(site) } - pageListEventListenerFactory.createAndStartListening( - lifecycle = lifecycle, + pageListEventListener = pageListEventListenerFactory.createAndStartListening( dispatcher = dispatcher, bgDispatcher = defaultDispatcher, postStore = postStore, @@ -196,6 +191,7 @@ class PagesViewModel override fun onCleared() { actionPerfomer.onCleanup() + pageListEventListener.onDestroy() } private fun loadPagesAsync() = launch(defaultDispatcher) { From f162fb5664115d332b3d39769ed8f082495d8742 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 18:23:23 -0500 Subject: [PATCH 54/59] fixed several style and unit test errors. --- .../viewmodel/pages/PageItemUploadProgressHelper.kt | 2 +- .../android/viewmodel/pages/PageListEventListener.kt | 5 ++--- .../wordpress/android/viewmodel/pages/PagesViewModel.kt | 6 +++--- .../android/viewmodel/pages/PagesViewModelTest.kt | 7 +++++-- 4 files changed, 11 insertions(+), 9 deletions(-) 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 ccbb2a5e3041..45e9746104ba 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 @@ -27,7 +27,7 @@ class PageItemUploadProgressHelper @Inject constructor( val uploadStatusTracker: PostModelUploadStatusTracker ) { fun getProgressStateForPage( - pageId: LocalId, site : SiteModel + pageId: LocalId, site: SiteModel ): Pair { val post = postStore.getPostByLocalPostId(pageId.value) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 1b0fd28ca06b..5b490d37f26d 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -119,8 +119,7 @@ class PageListEventListener( if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { if (!event.isError) { handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) - } - else{ + } else { uploadStatusChanged(LocalId(event.post.id)) } } @@ -196,7 +195,7 @@ class PageListEventListener( invalidateUploadStatus: (List) -> Unit, handleRemoteAutoSave: (LocalId, Boolean) -> Unit, handlePostUploadedStarted: (RemoteId, LocalId) -> Unit - ):PageListEventListener { + ): PageListEventListener { return PageListEventListener( dispatcher = dispatcher, bgDispatcher = bgDispatcher, 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 3de68f57cc99..8ad9db879bd5 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 @@ -717,12 +717,12 @@ class PagesViewModel } } - fun postUploadStarted(remoteId: RemoteId, localPostId: LocalId) { + fun postUploadStarted(remotePageIdForContinuation: RemoteId, localPageIdForUploadStatusInvalidation: LocalId) { launch { performIfNetworkAvailableAsync { - waitForPageUpdate(remoteId.value) + waitForPageUpdate(remotePageIdForContinuation.value) reloadPages() - handleInvalidateUploadStatus(listOf(localPostId)) + handleInvalidateUploadStatus(listOf(localPageIdForUploadStatusInvalidation)) } } } diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt index 06bb9523fc48..c6b1e5f392fa 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt @@ -18,6 +18,7 @@ import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.CauseOfOnPostChanged +import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel @@ -158,13 +159,15 @@ class PagesViewModelTest { @Test fun `when a page is being uploaded, page actions are disabled`() = test { // Arrange + val page = createPostModel() + setUpPageStoreWithEmptyPages() viewModel.start(site) assertThat(viewModel.arePageActionsEnabled).isTrue() // Act - viewModel.postUploadStarted(RemoteId(createPostModel().remotePostId)) + viewModel.postUploadStarted(RemoteId(page.remotePostId), LocalId(page.id)) // Assert assertThat(viewModel.arePageActionsEnabled).isFalse() @@ -178,7 +181,7 @@ class PagesViewModelTest { setUpPageStoreWithEmptyPages() viewModel.start(site) - viewModel.postUploadStarted(RemoteId(page.remotePostId)) + viewModel.postUploadStarted(RemoteId(page.remotePostId), LocalId(page.id)) assertThat(viewModel.arePageActionsEnabled).isFalse() // When From c07f1351f22563dafc620398942307faa8c563bc Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 18:29:01 -0500 Subject: [PATCH 55/59] fixed test style issues. --- .../android/viewmodel/pages/PageListViewModelTest.kt | 8 ++++++-- .../android/viewmodel/pages/SearchListViewModelTest.kt | 7 ++++++- 2 files changed, 12 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 62e48ad0f0dd..affd94836ac6 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 @@ -232,8 +232,12 @@ class PageListViewModelTest : BaseUnitTest() { val expectedProgressBarUiState = ProgressBarUiState.Indeterminate val pages = MutableLiveData>() - whenever(progressHelper.getProgressStateForPage(LocalId(0), site)). - thenReturn(Pair(expectedProgressBarUiState, true)) + whenever(progressHelper.getProgressStateForPage(LocalId(0), site)).thenReturn( + Pair( + expectedProgressBarUiState, + true + ) + ) whenever(pagesViewModel.pages).thenReturn(pages) viewModel.start(PUBLISHED, pagesViewModel) 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 f721f4adeafb..3508765ade80 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 @@ -51,7 +51,12 @@ class SearchListViewModelTest { viewModel = SearchListViewModel(resourceProvider, TEST_SCOPE, progressHelper) searchPages = MutableLiveData() - whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn(Pair(ProgressBarUiState.Hidden, false)) + whenever(progressHelper.getProgressStateForPage(any(), any())).thenReturn( + Pair( + ProgressBarUiState.Hidden, + false + ) + ) whenever(pagesViewModel.searchPages).thenReturn(searchPages) whenever(pagesViewModel.site).thenReturn(site) viewModel.start(pagesViewModel) From b9803f6cf5383a03de63c0698d8a9bc1fecf267f Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Thu, 6 Feb 2020 18:38:49 -0500 Subject: [PATCH 56/59] fixed another style issue from ktlint --- .../android/viewmodel/pages/PageItemUploadProgressHelper.kt | 3 ++- 1 file changed, 2 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 45e9746104ba..699203ccff0c 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 @@ -27,7 +27,8 @@ class PageItemUploadProgressHelper @Inject constructor( val uploadStatusTracker: PostModelUploadStatusTracker ) { fun getProgressStateForPage( - pageId: LocalId, site: SiteModel + pageId: LocalId, + site: SiteModel ): Pair { val post = postStore.getPostByLocalPostId(pageId.value) From 4d66519b5a4219a66ce0bfb516fc30eca40db358 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 00:27:44 -0500 Subject: [PATCH 57/59] use the Page type instead of PublishedPage since the type doesn't matter --- .../android/viewmodel/pages/PageListViewModelTest.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 affd94836ac6..7b4cf46e8b9d 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 @@ -248,7 +248,7 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = listOf(buildPageModel(0)) // Assert - assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo(expectedProgressBarUiState) + assertThat((result[0].first[0] as Page).progressBarUiState).isEqualTo(expectedProgressBarUiState) } @Test @@ -287,13 +287,13 @@ class PageListViewModelTest : BaseUnitTest() { pages.value = pageModels // Assert - assertThat((result[0].first[0] as PublishedPage).progressBarUiState).isEqualTo( + assertThat((result[0].first[0] as Page).progressBarUiState).isEqualTo( ProgressBarUiState.Indeterminate ) - assertThat((result[0].first[0] as PublishedPage).showOverlay).isEqualTo(true) + assertThat((result[0].first[0] as Page).showOverlay).isEqualTo(true) - assertThat((result[0].first[1] as PublishedPage).progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) - assertThat((result[0].first[1] as PublishedPage).showOverlay).isEqualTo(false) + assertThat((result[0].first[1] as Page).progressBarUiState).isEqualTo(ProgressBarUiState.Hidden) + assertThat((result[0].first[1] as Page).showOverlay).isEqualTo(false) } private fun buildPageModel( From 10e889712788bda88173f783a5bc5cb1d87eadb5 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 12:10:01 -0500 Subject: [PATCH 58/59] Revert "run upload status changes when the page has been refreshed" This reverts commit 42faec85dfe642945b123fa14fee7a915550d933. --- .../viewmodel/pages/PageListEventListener.kt | 20 ++++++++++--------- .../android/viewmodel/pages/PagesViewModel.kt | 3 +-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index 5b490d37f26d..fb9e3995d58a 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -39,7 +39,7 @@ class PageListEventListener( private val site: SiteModel, private val handleRemoteAutoSave: (LocalId, Boolean) -> Unit, private val handlePostUploadedWithoutError: (RemoteId) -> Unit, - private val handlePostUploadedStarted: (RemoteId, LocalId) -> Unit, + private val handlePostUploadedStarted: (RemoteId) -> Unit, private val invalidateUploadStatus: (List) -> Unit ) : CoroutineScope { init { @@ -90,7 +90,6 @@ class PageListEventListener( is UpdatePost -> { if (event.isError) { - uploadStatusChanged(LocalId((event.causeOfChange as UpdatePost).localPostId)) AppLog.e( T.POSTS, "Error updating the post with type: ${event.error.type} and" + @@ -98,7 +97,11 @@ class PageListEventListener( ) } else { handlePostUploadedWithoutError.invoke( - RemoteId((event.causeOfChange as UpdatePost).remotePostId)) + RemoteId((event.causeOfChange as UpdatePost).remotePostId) + ) + invalidateUploadStatus.invoke( + listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) + ) } } } @@ -117,10 +120,9 @@ class PageListEventListener( @Subscribe(threadMode = BACKGROUND) fun onPostUploaded(event: OnPostUploaded) { if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { + uploadStatusChanged(LocalId(event.post.id)) if (!event.isError) { handlePostUploadedWithoutError.invoke(RemoteId(event.post.remotePostId)) - } else { - uploadStatusChanged(LocalId(event.post.id)) } } } @@ -147,7 +149,7 @@ class PageListEventListener( if (event.post != null && event.post.isPage && event.post.localSiteId == site.id) { uploadStatusChanged(LocalId(event.post.id)) - handlePostUploadedStarted(RemoteId(event.post.remotePostId), LocalId(event.post.id)) + handlePostUploadedStarted(RemoteId(event.post.remotePostId)) } } @@ -194,9 +196,9 @@ class PageListEventListener( handlePostUploadedWithoutError: (RemoteId) -> Unit, invalidateUploadStatus: (List) -> Unit, handleRemoteAutoSave: (LocalId, Boolean) -> Unit, - handlePostUploadedStarted: (RemoteId, LocalId) -> Unit - ): PageListEventListener { - return PageListEventListener( + handlePostUploadedStarted: (RemoteId) -> Unit + ) { + PageListEventListener( dispatcher = dispatcher, bgDispatcher = bgDispatcher, postStore = postStore, 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 8ad9db879bd5..afcbdc1cc7e8 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 @@ -717,12 +717,11 @@ class PagesViewModel } } - fun postUploadStarted(remotePageIdForContinuation: RemoteId, localPageIdForUploadStatusInvalidation: LocalId) { + fun postUploadStarted(remoteId: RemoteId) { launch { performIfNetworkAvailableAsync { waitForPageUpdate(remotePageIdForContinuation.value) reloadPages() - handleInvalidateUploadStatus(listOf(localPageIdForUploadStatusInvalidation)) } } } From 1adbfd718608a7d15290d70f73f6bb788b5b6912 Mon Sep 17 00:00:00 2001 From: Joel Dean Date: Fri, 7 Feb 2020 12:18:32 -0500 Subject: [PATCH 59/59] resolved issue that took place during the revert. --- .../android/viewmodel/pages/PageListEventListener.kt | 6 +++--- .../org/wordpress/android/viewmodel/pages/PagesViewModel.kt | 2 +- .../wordpress/android/viewmodel/pages/PagesViewModelTest.kt | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt index fb9e3995d58a..57864bcd259c 100644 --- a/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt +++ b/WordPress/src/main/java/org/wordpress/android/viewmodel/pages/PageListEventListener.kt @@ -100,7 +100,7 @@ class PageListEventListener( RemoteId((event.causeOfChange as UpdatePost).remotePostId) ) invalidateUploadStatus.invoke( - listOf(LocalId((event.causeOfChange as CauseOfOnPostChanged.UpdatePost).localPostId)) + listOf(LocalId((event.causeOfChange as UpdatePost).localPostId)) ) } } @@ -197,8 +197,8 @@ class PageListEventListener( invalidateUploadStatus: (List) -> Unit, handleRemoteAutoSave: (LocalId, Boolean) -> Unit, handlePostUploadedStarted: (RemoteId) -> Unit - ) { - PageListEventListener( + ): PageListEventListener { + return PageListEventListener( dispatcher = dispatcher, bgDispatcher = bgDispatcher, postStore = postStore, 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 afcbdc1cc7e8..d0e98d749384 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 @@ -720,7 +720,7 @@ class PagesViewModel fun postUploadStarted(remoteId: RemoteId) { launch { performIfNetworkAvailableAsync { - waitForPageUpdate(remotePageIdForContinuation.value) + waitForPageUpdate(remoteId.value) reloadPages() } } diff --git a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt index c6b1e5f392fa..80caf8820630 100644 --- a/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/viewmodel/pages/PagesViewModelTest.kt @@ -18,7 +18,6 @@ import org.mockito.Mock import org.mockito.junit.MockitoJUnitRunner import org.wordpress.android.fluxc.Dispatcher import org.wordpress.android.fluxc.model.CauseOfOnPostChanged -import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.model.LocalOrRemoteId.RemoteId import org.wordpress.android.fluxc.model.PostModel import org.wordpress.android.fluxc.model.SiteModel @@ -167,7 +166,7 @@ class PagesViewModelTest { assertThat(viewModel.arePageActionsEnabled).isTrue() // Act - viewModel.postUploadStarted(RemoteId(page.remotePostId), LocalId(page.id)) + viewModel.postUploadStarted(RemoteId(page.remotePostId)) // Assert assertThat(viewModel.arePageActionsEnabled).isFalse() @@ -181,7 +180,7 @@ class PagesViewModelTest { setUpPageStoreWithEmptyPages() viewModel.start(site) - viewModel.postUploadStarted(RemoteId(page.remotePostId), LocalId(page.id)) + viewModel.postUploadStarted(RemoteId(page.remotePostId)) assertThat(viewModel.arePageActionsEnabled).isFalse() // When