diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadNotifier.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadNotifier.java index 3f1077408df1..a20070bc1651 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadNotifier.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadNotifier.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.support.annotation.NonNull; import android.support.v4.app.NotificationCompat; import android.text.TextUtils; import android.util.SparseArray; @@ -20,6 +21,7 @@ import org.wordpress.android.ui.posts.PostsListActivity; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.CrashlyticsUtils; +import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.SystemServiceFactory; import org.wordpress.android.util.WPMeShortlinks; @@ -53,10 +55,8 @@ public PostUploadNotifier(Context context, PostUploadService service) { mNotificationBuilder.setSmallIcon(android.R.drawable.stat_sys_upload); } - public void updateNotificationNewPost(PostModel post, String title, String message) { - if (title != null) { - mNotificationBuilder.setContentTitle(title); - } + public void createNotificationForPost(@NonNull PostModel post, String message) { + mNotificationBuilder.setContentTitle(buildNotificationTitleForPost(post)); if (message != null) { mNotificationBuilder.setContentText(message); } @@ -68,6 +68,16 @@ public void updateNotificationNewPost(PostModel post, String title, String messa mService.startForeground(notificationId, mNotificationBuilder.build()); } + public boolean isDisplayingNotificationForPost(@NonNull PostModel post) { + return mPostIdToNotificationData.get(post.getId()) != null; + } + + public void updateNotificationMessage(@NonNull PostModel post, String message) { + NotificationData notificationData = mPostIdToNotificationData.get(post.getId()); + mNotificationBuilder.setContentText(StringUtils.notNullStr(message)); + doNotify(notificationData.notificationId, mNotificationBuilder.build()); + } + public void updateNotificationIcon(PostModel post, Bitmap icon) { NotificationData notificationData = mPostIdToNotificationData.get(post.getId()); @@ -231,4 +241,9 @@ public void setCurrentMediaItem(PostModel post, int currentItem) { mNotificationBuilder.setContentText(String.format(mContext.getString(R.string.uploading_total), currentItem, notificationData.totalMediaItems)); } + + private String buildNotificationTitleForPost(PostModel post) { + String postTitle = TextUtils.isEmpty(post.getTitle()) ? mContext.getString(R.string.untitled) : post.getTitle(); + return String.format(mContext.getString(R.string.posting_post), postTitle); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadService.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadService.java index 0eb89c0aab7f..39c9f619a31c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/services/PostUploadService.java @@ -167,6 +167,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { } uploadNextPost(); + showNotificationsForPendingMediaPosts(); // We want this service to continue running until it is explicitly stopped, so return sticky. return START_STICKY; } @@ -214,6 +215,16 @@ private PostModel getNextUploadablePost() { return null; } + private void showNotificationsForPendingMediaPosts() { + for (PostModel postModel : mPostsList) { + if (MediaUploadService.hasPendingMediaUploadsForPost(postModel)) { + if (!mPostUploadNotifier.isDisplayingNotificationForPost(postModel)) { + mPostUploadNotifier.createNotificationForPost(postModel, getString(R.string.uploading_post_media)); + } + } + } + } + /** * Removes a post from the queued post list given its local ID. * @return the post that was removed - if no post was removed, returns null @@ -266,14 +277,16 @@ protected void onPostExecute(Boolean pushActionWasDispatched) { protected Boolean doInBackground(PostModel... posts) { mPost = posts[0]; - String postTitle = TextUtils.isEmpty(mPost.getTitle()) ? getString(R.string.untitled) : mPost.getTitle(); - String uploadingPostTitle = String.format(getString(R.string.posting_post), postTitle); String uploadingPostMessage = String.format( getString(R.string.sending_content), mPost.isPage() ? getString(R.string.page).toLowerCase() : getString(R.string.post).toLowerCase() ); - mPostUploadNotifier.updateNotificationNewPost(mPost, uploadingPostTitle, uploadingPostMessage); + if (mPostUploadNotifier.isDisplayingNotificationForPost(mPost)) { + mPostUploadNotifier.updateNotificationMessage(mPost, uploadingPostMessage); + } else { + mPostUploadNotifier.createNotificationForPost(mPost, uploadingPostMessage); + } mSite = mSiteStore.getSiteByLocalId(mPost.getLocalSiteId()); if (mSite == null) { @@ -606,11 +619,14 @@ private String uploadImageFile(MediaFile mediaFile, SiteModel site) { } } - private void cancelPostUploadMatchingMedia(MediaModel media) { + private void cancelPostUploadMatchingMedia(MediaModel media, String mediaErrorMessage) { PostModel postToCancel = removeQueuedPostByLocalId(media.getLocalPostId()); if (postToCancel == null) return; - // TODO: Update post upload messaging at this point + SiteModel site = mSiteStore.getSiteByLocalId(postToCancel.getLocalSiteId()); + String message = getErrorMessage(postToCancel, mediaErrorMessage); + mPostUploadNotifier.updateNotificationError(postToCancel, site, message, true); + mFirstPublishPosts.remove(postToCancel.getId()); EventBus.getDefault().post(new PostEvents.PostUploadCanceled(postToCancel.getLocalSiteId())); finishUpload(); @@ -705,14 +721,15 @@ private void handleMediaUploadCompleted(OnMediaUploaded event) { if (event.isError()) { AppLog.e(T.MEDIA, "Media upload failed for post " + event.media.getLocalPostId() + " : " + event.error.type + ": " + event.error.message); - cancelPostUploadMatchingMedia(event.media); + String errorMessage = getErrorMessageFromMediaError(event.error); + cancelPostUploadMatchingMedia(event.media, errorMessage); return; } if (event.canceled) { AppLog.i(T.MEDIA, "Upload cancelled for post with id " + event.media.getLocalPostId() + " - a media upload for this post has been cancelled, id: " + event.media.getId()); - cancelPostUploadMatchingMedia(event.media); + cancelPostUploadMatchingMedia(event.media, getString(R.string.error_media_canceled)); return; } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index d8813ce2aebb..a64468971a34 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -391,6 +391,7 @@ Update Uploading %s content Uploading %1$d of %2$d + Uploading media… Logging in… @@ -1090,6 +1091,7 @@ Unable to load media Media too large, can\'t be uploaded Unable to save media + Uploading media were canceled This blog is hidden and couldn\'t be loaded. Enable it again in settings and try again. An error occurred while creating the app database. Try reinstalling the app. An error occurred while copying text to clipboard