diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java b/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java
index 921f4552d8..b621402626 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java
@@ -26,25 +26,33 @@ import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.events.PartProgressEvent;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.SlideClickListener;
+import org.thoughtcrime.securesms.mms.SlidesClickedListener;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.util.OptionalUtil;
+import java.util.Collections;
+
public class DocumentView extends FrameLayout {
private static final String TAG = Log.tag(DocumentView.class);
private final @NonNull AnimatingToggle controlToggle;
private final @NonNull ImageView downloadButton;
+ private final @NonNull ImageView uploadButton;
+ private final @NonNull ImageView stopUploadButton;
private final @NonNull ProgressWheel downloadProgress;
private final @NonNull View container;
private final @NonNull ViewGroup iconContainer;
+ private final @NonNull ViewGroup progressContainer;
private final @NonNull TextView fileName;
private final @NonNull TextView fileSize;
private final @NonNull TextView document;
- private @Nullable SlideClickListener downloadListener;
- private @Nullable SlideClickListener viewListener;
- private @Nullable Slide documentSlide;
+ private @Nullable SlideClickListener downloadListener;
+ private @Nullable SlideClickListener viewListener;
+ private @Nullable SlidesClickedListener cancelTransferClickListener;
+ private @Nullable SlidesClickedListener resendTransferClickListener;
+ private @Nullable Slide documentSlide;
public DocumentView(@NonNull Context context) {
this(context, null);
@@ -60,8 +68,11 @@ public class DocumentView extends FrameLayout {
this.container = findViewById(R.id.document_container);
this.iconContainer = findViewById(R.id.icon_container);
+ this.progressContainer = findViewById(R.id.progress_container);
this.controlToggle = findViewById(R.id.control_toggle);
this.downloadButton = findViewById(R.id.download);
+ this.uploadButton = findViewById(R.id.upload);
+ this.stopUploadButton = findViewById(R.id.stop_upload);
this.downloadProgress = findViewById(R.id.download_progress);
this.fileName = findViewById(R.id.file_name);
this.fileSize = findViewById(R.id.file_size);
@@ -89,17 +100,31 @@ public class DocumentView extends FrameLayout {
this.viewListener = listener;
}
+ public void setCancelTransferClickListener(@Nullable SlidesClickedListener listener) {
+ this.cancelTransferClickListener = listener;
+ }
+
+ public void setResendTransferClickListener(@Nullable SlidesClickedListener listener) {
+ this.resendTransferClickListener = listener;
+ }
+
public void setDocument(final @NonNull Slide documentSlide,
final boolean showControls,
- final boolean showSingleLineFilename)
+ final boolean showSingleLineFilename,
+ final boolean isSender)
{
- if (showControls && documentSlide.isPendingDownload()) {
+ if (showControls && documentSlide.isPendingDownload() && !isSender) {
controlToggle.displayQuick(downloadButton);
downloadButton.setOnClickListener(new DownloadClickedListener(documentSlide));
if (downloadProgress.isSpinning()) downloadProgress.stopSpinning();
+ } else if (showControls && documentSlide.isPendingDownload() && isSender) {
+ controlToggle.displayQuick(uploadButton);
+ uploadButton.setOnClickListener(new ResendTransferClickListener(documentSlide));
+ if (downloadProgress.isSpinning()) downloadProgress.stopSpinning();
} else if (showControls && documentSlide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_STARTED) {
- controlToggle.displayQuick(downloadProgress);
+ controlToggle.displayQuick(progressContainer);
downloadProgress.spin();
+ stopUploadButton.setOnClickListener(new CancelTransferListener(documentSlide));
} else {
controlToggle.displayQuick(iconContainer);
if (downloadProgress.isSpinning()) downloadProgress.stopSpinning();
@@ -120,12 +145,6 @@ public class DocumentView extends FrameLayout {
this.setOnClickListener(new OpenClickedListener(documentSlide));
}
- public void setDocument(final @NonNull Slide documentSlide,
- final boolean showControls)
- {
- setDocument(documentSlide, showControls, true);
- }
-
@Override
public void setFocusable(boolean focusable) {
super.setFocusable(focusable);
@@ -179,4 +198,38 @@ public class DocumentView extends FrameLayout {
}
}
+ private class CancelTransferListener implements View.OnClickListener {
+ private final @NonNull Slide slide;
+
+ private CancelTransferListener(@NonNull Slide slide) {
+ this.slide = slide;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (cancelTransferClickListener != null) {
+ cancelTransferClickListener.onClick(v, Collections.singletonList(slide));
+ } else {
+ Log.w(TAG, "Received a cancel button click, but unable to execute it. slide: " + slide);
+ }
+ }
+ }
+
+ private class ResendTransferClickListener implements View.OnClickListener {
+ private final @NonNull Slide slide;
+
+ private ResendTransferClickListener(@NonNull Slide slide) {
+ this.slide = slide;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (resendTransferClickListener != null) {
+ resendTransferClickListener.onClick(v, Collections.singletonList(slide));
+ } else {
+ Log.w(TAG, "Received a cancel button click, but unable to execute it. slide: " + slide);
+ }
+ }
+ }
+
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
index 16c7494cb7..c3e2ebc99b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
@@ -1263,11 +1263,14 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
//noinspection ConstantConditions
documentViewStub.get().setDocument(
- ((MmsMessageRecord) messageRecord).getSlideDeck().getDocumentSlide(),
+ ((MmsMessageRecord) messageRecord).getSlideDeck() .getDocumentSlide(),
showControls,
- displayMode != ConversationItemDisplayMode.Detailed.INSTANCE
+ displayMode != ConversationItemDisplayMode.Detailed.INSTANCE,
+ messageRecord.isOutgoing()
);
documentViewStub.get().setDocumentClickListener(new ThumbnailClickListener());
+ documentViewStub.get().setCancelTransferClickListener(attachmentCancelClickListener);
+ documentViewStub.get().setResendTransferClickListener(new ResendClickListener(messageRecord));
documentViewStub.get().setDownloadClickListener(singleDownloadClickListener);
documentViewStub.get().setOnLongClickListener(passthroughClickListener);
diff --git a/app/src/main/res/layout/document_view.xml b/app/src/main/res/layout/document_view.xml
index 0b929dcef5..c535dfeebe 100644
--- a/app/src/main/res/layout/document_view.xml
+++ b/app/src/main/res/layout/document_view.xml
@@ -1,106 +1,146 @@
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="org.thoughtcrime.securesms.components.DocumentView"
+ tools:viewBindingIgnore="true">
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:gravity="center"
+ android:scaleType="centerInside"
+ android:textAlignment="center"
+ android:textColor="@color/core_black"
+ android:textSize="10sp"
+ android:visibility="visible"
+ tools:text="PDF"
+ tools:visibility="visible" />
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 750a617c13..4de9cd24dd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3238,6 +3238,11 @@
Play … Pause
Download
+
+ Download
+ Upload
+ Cancel
+
Audio
Video