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