-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Issue/11133 update page item labels #11278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
2127d34
8df63eb
e6344dd
5988cfb
6cf9c06
a79fa22
f0083d3
e155e7c
ffac0fc
cfa967f
0718d72
127b0db
5fab47a
e7d01ce
2e933f6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,143 @@ | ||
| package org.wordpress.android.viewmodel.pages | ||
|
|
||
| import org.wordpress.android.BuildConfig | ||
| import org.wordpress.android.R | ||
| 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.model.post.PostStatus.PENDING | ||
| import org.wordpress.android.fluxc.model.post.PostStatus.PRIVATE | ||
| import org.wordpress.android.fluxc.model.post.PostStatus.PUBLISHED | ||
| import org.wordpress.android.fluxc.model.post.PostStatus.SCHEDULED | ||
| import org.wordpress.android.fluxc.model.post.PostStatus.TRASHED | ||
| import org.wordpress.android.fluxc.model.post.PostStatus.UNKNOWN | ||
| import org.wordpress.android.ui.uploads.UploadUtils | ||
| import org.wordpress.android.ui.utils.UiString | ||
| import org.wordpress.android.ui.utils.UiString.UiStringRes | ||
| import org.wordpress.android.util.AppLog | ||
| import org.wordpress.android.util.AppLog.T.PAGES | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadFailed | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadQueued | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingMedia | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost | ||
| import javax.inject.Inject | ||
|
|
||
| /** | ||
| * Most of this code has been copied from PostListItemUIStateHelper. | ||
| */ | ||
| class CreatePageListItemLabelsUseCase @Inject constructor(private val pageConflictResolver: PageConflictResolver) { | ||
| fun createLabels(postModel: PostModel, uploadUiState: PostUploadUiState): List<UiString> { | ||
| return getLabels( | ||
| PostStatus.fromPost(postModel), | ||
| postModel.isLocalDraft, | ||
| postModel.isLocallyChanged, | ||
| uploadUiState, | ||
| false, // TODO use conflict resolver | ||
| pageConflictResolver.hasUnhandledAutoSave(postModel) | ||
| ) | ||
| } | ||
|
|
||
| private fun getLabels( | ||
| postStatus: PostStatus, | ||
| isLocalDraft: Boolean, | ||
| isLocallyChanged: Boolean, | ||
| uploadUiState: PostUploadUiState, | ||
| hasUnhandledConflicts: Boolean, | ||
| hasAutoSave: Boolean | ||
| ): List<UiString> { | ||
| val labels: MutableList<UiString> = ArrayList() | ||
| when { | ||
| uploadUiState is UploadFailed -> { | ||
| getErrorLabel(uploadUiState, postStatus)?.let { labels.add(it) } | ||
| } | ||
| uploadUiState is UploadingPost -> if (uploadUiState.isDraft) { | ||
| labels.add(UiStringRes(R.string.page_uploading_draft)) | ||
| } else { | ||
| labels.add(UiStringRes(R.string.page_uploading)) | ||
| } | ||
| uploadUiState is UploadingMedia -> labels.add(UiStringRes(R.string.uploading_media)) | ||
| uploadUiState is UploadQueued -> labels.add(UiStringRes(R.string.page_queued)) | ||
| uploadUiState is UploadWaitingForConnection -> { | ||
| when (uploadUiState.postStatus) { | ||
| UNKNOWN, PUBLISHED -> labels.add(UiStringRes(R.string.page_waiting_for_connection_publish)) | ||
| PRIVATE -> labels.add(UiStringRes(R.string.page_waiting_for_connection_private)) | ||
| PENDING -> labels.add(UiStringRes(R.string.page_waiting_for_connection_pending)) | ||
| SCHEDULED -> labels.add(UiStringRes(R.string.page_waiting_for_connection_scheduled)) | ||
| DRAFT -> labels.add(UiStringRes(R.string.page_waiting_for_connection_draft)) | ||
| TRASHED -> AppLog.e( | ||
| PAGES, | ||
| "Developer error: This state shouldn't happen. Trashed pages is in " + | ||
| "UploadWaitingForConnection state." | ||
| ) | ||
| } | ||
| } | ||
| hasUnhandledConflicts -> labels.add(UiStringRes(R.string.local_page_is_conflicted)) | ||
| hasAutoSave -> labels.add(UiStringRes(R.string.local_page_autosave_revision_available)) | ||
| } | ||
|
|
||
| // we want to show either single error/progress label or 0-n info labels. | ||
| if (labels.isEmpty()) { | ||
| if (isLocalDraft) { | ||
| labels.add(UiStringRes(R.string.page_local_draft)) | ||
| } else if (isLocallyChanged) { | ||
| labels.add(UiStringRes(R.string.page_local_changes)) | ||
| } | ||
| if (postStatus == PRIVATE) { | ||
| labels.add(UiStringRes(R.string.page_status_page_private)) | ||
| } | ||
| if (postStatus == PENDING) { | ||
| labels.add(UiStringRes(R.string.page_status_pending_review)) | ||
| } | ||
| } | ||
| return labels | ||
| } | ||
|
|
||
| private fun getErrorLabel(uploadUiState: UploadFailed, postStatus: PostStatus): UiString? { | ||
| return when { | ||
| uploadUiState.error.mediaError != null -> getMediaUploadErrorLabel( | ||
| uploadUiState, | ||
| postStatus | ||
| ) | ||
| uploadUiState.error.postError != null -> UploadUtils.getErrorMessageResIdFromPostError( | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi Jirka, the error labels that are returned from here all say
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great catch! Fixed in 0718d72
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Awesome work |
||
| postStatus, | ||
| true, | ||
| uploadUiState.error.postError, | ||
| uploadUiState.isEligibleForAutoUpload | ||
| ) | ||
| else -> { | ||
| val errorMsg = "MediaError and postError are both null." | ||
| if (BuildConfig.DEBUG) { | ||
| throw IllegalStateException(errorMsg) | ||
| } else { | ||
| AppLog.e(PAGES, errorMsg) | ||
| } | ||
| UiStringRes(R.string.error_generic) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private fun getMediaUploadErrorLabel( | ||
|
jd-alexander marked this conversation as resolved.
|
||
| uploadUiState: UploadFailed, | ||
| postStatus: PostStatus | ||
| ): UiStringRes { | ||
| return when { | ||
| uploadUiState.isEligibleForAutoUpload -> when (postStatus) { | ||
| PUBLISHED -> UiStringRes(R.string.error_media_recover_page_not_published_retrying) | ||
| PRIVATE -> UiStringRes(R.string.error_media_recover_page_not_published_retrying_private) | ||
| SCHEDULED -> UiStringRes(R.string.error_media_recover_page_not_scheduled_retrying) | ||
| PENDING -> UiStringRes(R.string.error_media_recover_page_not_submitted_retrying) | ||
| DRAFT, TRASHED, UNKNOWN -> UiStringRes(R.string.error_generic_error_retrying) | ||
| } | ||
| uploadUiState.retryWillPushChanges -> when (postStatus) { | ||
| PUBLISHED -> UiStringRes(R.string.error_media_recover_page_not_published) | ||
| PRIVATE -> UiStringRes(R.string.error_media_recover_page_not_published_private) | ||
| SCHEDULED -> UiStringRes(R.string.error_media_recover_page_not_scheduled) | ||
| PENDING -> UiStringRes(R.string.error_media_recover_page_not_submitted) | ||
| DRAFT, TRASHED, UNKNOWN -> UiStringRes(R.string.error_media_recover_page) | ||
| } | ||
| else -> UiStringRes(R.string.error_media_recover_page) | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| package org.wordpress.android.viewmodel.pages | ||
|
|
||
| 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.UploadStore.UploadError | ||
| import org.wordpress.android.ui.posts.PostModelUploadStatusTracker | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.NothingToUpload | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadFailed | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadQueued | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadWaitingForConnection | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingMedia | ||
| import org.wordpress.android.viewmodel.pages.CreatePageUploadUiStateUseCase.PostUploadUiState.UploadingPost | ||
| import javax.inject.Inject | ||
|
|
||
| class CreatePageUploadUiStateUseCase @Inject constructor(val uploadStatusTracker: PostModelUploadStatusTracker) { | ||
| /** | ||
| * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. | ||
| */ | ||
| fun createUploadUiState( | ||
|
jd-alexander marked this conversation as resolved.
|
||
| post: PostModel, | ||
| site: SiteModel | ||
| ): PostUploadUiState { | ||
| val postStatus = PostStatus.fromPost(post) | ||
| val uploadStatus = uploadStatusTracker.getUploadStatus(post, site) | ||
| 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 | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Copied from PostListItemUiStateHelper since the behavior is similar for the Page List UI State. | ||
| */ | ||
| sealed class PostUploadUiState { | ||
|
jd-alexander marked this conversation as resolved.
|
||
| 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() | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.