From f3bb40e0242847e73198b756a0700d54f3e8abbf Mon Sep 17 00:00:00 2001 From: Anton Chekulaev Date: Fri, 28 Aug 2020 17:38:19 +1000 Subject: [PATCH 1/2] Loading indicator for message thumbnail view. --- res/layout/conversation_item_thumbnail.xml | 15 +++++++- .../components/ConversationItemThumbnail.java | 37 ++++++++++++++----- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/res/layout/conversation_item_thumbnail.xml b/res/layout/conversation_item_thumbnail.xml index 23544e8e68..fe438060da 100644 --- a/res/layout/conversation_item_thumbnail.xml +++ b/res/layout/conversation_item_thumbnail.xml @@ -42,7 +42,18 @@ android:layout_marginStart="@dimen/message_bubble_horizontal_padding" android:layout_marginEnd="@dimen/message_bubble_horizontal_padding" android:layout_marginBottom="@dimen/message_bubble_bottom_padding" - app:footer_text_color="@color/core_white" - app:footer_icon_color="@color/core_white"/> + app:footer_text_color="@android:color/white" + app:footer_icon_color="@android:color/white"/> + + diff --git a/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java b/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java index 4b4e791ab2..ef7db1abb1 100644 --- a/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java +++ b/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java @@ -3,15 +3,16 @@ package org.thoughtcrime.securesms.components; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.util.AttributeSet; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ProgressBar; + import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; -import android.util.AttributeSet; -import android.widget.FrameLayout; -import android.widget.ImageView; -import network.loki.messenger.R; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.Slide; @@ -21,12 +22,15 @@ import org.thoughtcrime.securesms.util.ThemeUtil; import java.util.List; +import network.loki.messenger.R; + public class ConversationItemThumbnail extends FrameLayout { private ThumbnailView thumbnail; private AlbumThumbnailView album; private ImageView shade; private ConversationItemFooter footer; + private ProgressBar loadIndicator; private CornerMask cornerMask; private Outliner outliner; private boolean borderless; @@ -49,12 +53,13 @@ public class ConversationItemThumbnail extends FrameLayout { private void init(@Nullable AttributeSet attrs) { inflate(getContext(), R.layout.conversation_item_thumbnail, this); - this.thumbnail = findViewById(R.id.conversation_thumbnail_image); - this.album = findViewById(R.id.conversation_thumbnail_album); - this.shade = findViewById(R.id.conversation_thumbnail_shade); - this.footer = findViewById(R.id.conversation_thumbnail_footer); - this.cornerMask = new CornerMask(this); - this.outliner = new Outliner(); + this.thumbnail = findViewById(R.id.conversation_thumbnail_image); + this.album = findViewById(R.id.conversation_thumbnail_album); + this.shade = findViewById(R.id.conversation_thumbnail_shade); + this.footer = findViewById(R.id.conversation_thumbnail_footer); + this.loadIndicator = findViewById(R.id.conversation_thumbnail_load_indicator); + this.cornerMask = new CornerMask(this); + this.outliner = new Outliner(); outliner.setColor(ThemeUtil.getThemedColor(getContext(), R.attr.conversation_item_image_outline_color)); @@ -136,6 +141,18 @@ public class ConversationItemThumbnail extends FrameLayout { album.setSlides(glideRequests, slides, showControls); setTouchDelegate(album.getTouchDelegate()); } + + // Display loading indicator if any attachment is in loading state. + { + boolean anyLoading = false; + for (int i = 0; i < slides.size(); i++) { + if (slides.get(i).asAttachment().isInProgress()) { + anyLoading = true; + break; + } + } + loadIndicator.setVisibility(anyLoading ? VISIBLE : GONE); + } } public void setConversationColor(@ColorInt int color) { From 7cc67daf80603e204fb0c669607aab0623e6bf18 Mon Sep 17 00:00:00 2001 From: Anton Chekulaev Date: Mon, 31 Aug 2020 19:46:05 +1000 Subject: [PATCH 2/2] DB attachment record gets properly updated on upload error. Individual loading indicators per conversation item thumbnail. --- res/layout/conversation_item_thumbnail.xml | 11 ---------- res/layout/thumbnail_view.xml | 9 ++++++++ .../components/AlbumThumbnailView.java | 7 ++----- .../components/ConversationItemThumbnail.java | 21 ++++--------------- .../securesms/components/ThumbnailView.java | 12 ++++++++--- .../database/AttachmentDatabase.java | 11 +++++++++- .../securesms/jobs/AttachmentUploadJob.java | 19 +++++++++++------ 7 files changed, 47 insertions(+), 43 deletions(-) diff --git a/res/layout/conversation_item_thumbnail.xml b/res/layout/conversation_item_thumbnail.xml index fe438060da..bff1a90fa8 100644 --- a/res/layout/conversation_item_thumbnail.xml +++ b/res/layout/conversation_item_thumbnail.xml @@ -45,15 +45,4 @@ app:footer_text_color="@android:color/white" app:footer_icon_color="@android:color/white"/> - - diff --git a/res/layout/thumbnail_view.xml b/res/layout/thumbnail_view.xml index a9f979014c..96ec33477e 100644 --- a/res/layout/thumbnail_view.xml +++ b/res/layout/thumbnail_view.xml @@ -22,6 +22,15 @@ android:src="@drawable/ic_caption_28" android:visibility="gone" /> + + insertAttachmentsForMessage(long mmsId, @NonNull List attachments, @NonNull List quoteAttachment) throws MmsException { diff --git a/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java b/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java index 766e8f20f6..a356deabec 100644 --- a/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java +++ b/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java @@ -87,13 +87,20 @@ public class AttachmentUploadJob extends BaseJob implements InjectableType { // Only upload attachment if necessary if (databaseAttachment.getUrl().isEmpty()) { - MediaConstraints mediaConstraints = MediaConstraints.getPushMediaConstraints(); - Attachment scaledAttachment = scaleAndStripExif(database, mediaConstraints, databaseAttachment); - SignalServiceAttachment localAttachment = getAttachmentFor(scaledAttachment); - SignalServiceAttachmentPointer remoteAttachment = messageSender.uploadAttachment(localAttachment.asStream(), databaseAttachment.isSticker(), new SignalServiceAddress(destination.serialize())); - Attachment attachment = PointerAttachment.forPointer(Optional.of(remoteAttachment), null, databaseAttachment.getFastPreflightId()).get(); + final Attachment attachment; + try { + MediaConstraints mediaConstraints = MediaConstraints.getPushMediaConstraints(); + Attachment scaledAttachment = scaleAndStripExif(database, mediaConstraints, databaseAttachment); + SignalServiceAttachment localAttachment = getAttachmentFor(scaledAttachment); + SignalServiceAttachmentPointer remoteAttachment = messageSender.uploadAttachment(localAttachment.asStream(), databaseAttachment.isSticker(), new SignalServiceAddress(destination.serialize())); + attachment = PointerAttachment.forPointer(Optional.of(remoteAttachment), null, databaseAttachment.getFastPreflightId()).get(); + } catch (Exception e) { + // On any error make sure we mark the related DB record's transfer state as failed. + database.updateAttachmentAfterUploadFailed(databaseAttachment.getAttachmentId()); + throw e; + } - database.updateAttachmentAfterUpload(databaseAttachment.getAttachmentId(), attachment); + database.updateAttachmentAfterUploadSucceeded(databaseAttachment.getAttachmentId(), attachment); } }