Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.ui.utils.UiString
import org.wordpress.android.viewmodel.uistate.ProgressBarUiState
import java.util.Date

Expand All @@ -20,7 +21,7 @@ sealed class PageItem(open val type: Type) {
open val id: Long,
open val title: String,
open val date: Date,
open val labels: List<Int>,
open val labels: List<UiString>,
open var indent: Int,
open var imageUrl: String?,
open val actions: Set<Action>,
Expand All @@ -34,7 +35,7 @@ sealed class PageItem(open val type: Type) {
override val id: Long,
override val title: String,
override val date: Date,
override val labels: List<Int> = emptyList(),
override val labels: List<UiString> = emptyList(),
override var indent: Int = 0,
override var imageUrl: String? = null,
override var actionsEnabled: Boolean = true,
Expand All @@ -58,7 +59,7 @@ sealed class PageItem(open val type: Type) {
override val id: Long,
override val title: String,
override val date: Date,
override val labels: List<Int> = emptyList(),
override val labels: List<UiString> = emptyList(),
override var imageUrl: String? = null,
override var actionsEnabled: Boolean = true,
override val progressBarUiState: ProgressBarUiState,
Expand All @@ -81,7 +82,7 @@ sealed class PageItem(open val type: Type) {
override val id: Long,
override val title: String,
override val date: Date,
override val labels: List<Int> = emptyList(),
override val labels: List<UiString> = emptyList(),
override var imageUrl: String? = null,
override var actionsEnabled: Boolean = true,
override val progressBarUiState: ProgressBarUiState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ sealed class PageItemViewHolder(internal val parent: ViewGroup, @LayoutRes layou
time.text = DateTimeUtils.javaDateToTimeSpan(date, parent.context)
.capitalizeWithLocaleWithoutLint(parent.context.currentLocale)

labels.text = page.labels.map { parent.context.getString(it) }.sorted()
.joinToString(separator = " · ")
labels.text = page.labels.map { uiHelper.getTextOfUiString(parent.context, it) }
.sorted().joinToString(separator = " · ")
uiHelper.updateVisibility(labels, page.labels.isNotEmpty())

itemView.setOnClickListener { onItemTapped(page) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ UiString getErrorMessageResIdFromPostError(PostStatus postStatus, boolean isPage
return isPage ? new UiStringRes(R.string.error_unknown_page)
: new UiStringRes(R.string.error_unknown_post);
case UNKNOWN_POST_TYPE:
return new UiStringRes(R.string.error_unknown_post_type);
return isPage ? new UiStringRes(R.string.error_unknown_page_type)
: new UiStringRes(R.string.error_unknown_post_type);
case UNAUTHORIZED:
return isPage ? new UiStringRes(R.string.error_refresh_unauthorized_pages)
: new UiStringRes(R.string.error_refresh_unauthorized_posts);
Expand All @@ -97,13 +98,17 @@ UiString getErrorMessageResIdFromPostError(PostStatus postStatus, boolean isPage
if (eligibleForAutoUpload) {
switch (postStatus) {
case PRIVATE:
return new UiStringRes(R.string.error_post_not_published_retrying_private);
return isPage ? new UiStringRes(R.string.error_page_not_published_retrying_private)
: new UiStringRes(R.string.error_post_not_published_retrying_private);
case PUBLISHED:
return new UiStringRes(R.string.error_post_not_published_retrying);
return isPage ? new UiStringRes(R.string.error_page_not_published_retrying)
: new UiStringRes(R.string.error_post_not_published_retrying);
case SCHEDULED:
return new UiStringRes(R.string.error_post_not_scheduled_retrying);
return isPage ? new UiStringRes(R.string.error_page_not_scheduled_retrying)
: new UiStringRes(R.string.error_post_not_scheduled_retrying);
case PENDING:
return new UiStringRes(R.string.error_post_not_submitted_retrying);
return isPage ? new UiStringRes(R.string.error_page_not_submitted_retrying)
: new UiStringRes(R.string.error_post_not_submitted_retrying);
case UNKNOWN:
case DRAFT:
case TRASHED:
Expand All @@ -112,13 +117,17 @@ UiString getErrorMessageResIdFromPostError(PostStatus postStatus, boolean isPage
} else {
switch (postStatus) {
case PRIVATE:
return new UiStringRes(R.string.error_post_not_published_private);
return isPage ? new UiStringRes(R.string.error_page_not_published_private)
: new UiStringRes(R.string.error_post_not_published_private);
case PUBLISHED:
return new UiStringRes(R.string.error_post_not_published);
return isPage ? new UiStringRes(R.string.error_page_not_published)
: new UiStringRes(R.string.error_post_not_published);
case SCHEDULED:
return new UiStringRes(R.string.error_post_not_scheduled);
return isPage ? new UiStringRes(R.string.error_page_not_scheduled)
: new UiStringRes(R.string.error_post_not_scheduled);
case PENDING:
return new UiStringRes(R.string.error_post_not_submitted);
return isPage ? new UiStringRes(R.string.error_page_not_submitted)
: new UiStringRes(R.string.error_post_not_submitted);
case UNKNOWN:
case DRAFT:
case TRASHED:
Expand Down
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(
Comment thread
jd-alexander marked this conversation as resolved.
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(

@jd-alexander jd-alexander Feb 11, 2020

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Jirka, the error labels that are returned from here all say post instead of page I think it's because the UploadUtils.getErrorMessageResIdFromPostError only support posts at the moment and it's isPage parameter is set to false. Let me know what you think.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great catch! Fixed in 0718d72

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome work :bowtie:

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(
Comment thread
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(
Comment thread
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 {
Comment thread
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()
}
}
Loading