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 5f8e2650fb..4ab2784235 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java @@ -27,25 +27,30 @@ 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.util.Util; +import org.thoughtcrime.securesms.mms.SlidesClickedListener; 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 ProgressWheel downloadProgress; - private final @NonNull View container; private final @NonNull ViewGroup iconContainer; + private final @NonNull ViewGroup stopUploadButton; 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); @@ -59,10 +64,11 @@ public class DocumentView extends FrameLayout { super(context, attrs, defStyleAttr); inflate(context, R.layout.document_view, this); - this.container = findViewById(R.id.document_container); this.iconContainer = findViewById(R.id.icon_container); + this.stopUploadButton = findViewById(R.id.stop_upload_progress_container); this.controlToggle = findViewById(R.id.control_toggle); this.downloadButton = findViewById(R.id.download); + this.uploadButton = findViewById(R.id.upload); this.downloadProgress = findViewById(R.id.download_progress); this.fileName = findViewById(R.id.file_name); this.fileSize = findViewById(R.id.file_size); @@ -90,17 +96,30 @@ 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) { - if (showControls && documentSlide.isPendingDownload()) { + if (showControls && documentSlide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_STARTED) { + controlToggle.displayQuick(stopUploadButton); + downloadProgress.spin(); + stopUploadButton.setOnClickListener(new CancelTransferListener(documentSlide)); + } else if (showControls && documentSlide.getUri() != null && documentSlide.isPendingDownload()) { + controlToggle.displayQuick(uploadButton); + uploadButton.setOnClickListener(new ResendTransferClickListener(documentSlide)); + if (downloadProgress.isSpinning()) downloadProgress.stopSpinning(); + } else if (showControls && documentSlide.getUri() == null && documentSlide.isPendingDownload()) { controlToggle.displayQuick(downloadButton); downloadButton.setOnClickListener(new DownloadClickedListener(documentSlide)); if (downloadProgress.isSpinning()) downloadProgress.stopSpinning(); - } else if (showControls && documentSlide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_STARTED) { - controlToggle.displayQuick(downloadProgress); - downloadProgress.spin(); } else { controlToggle.displayQuick(iconContainer); if (downloadProgress.isSpinning()) downloadProgress.stopSpinning(); @@ -121,12 +140,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); @@ -180,4 +193,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 4e0857c093..3ef5e1dad8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -1267,6 +1267,8 @@ public final class ConversationItem extends RelativeLayout implements BindableCo displayMode != ConversationItemDisplayMode.Detailed.INSTANCE ); 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..509809d713 100644 --- a/app/src/main/res/layout/document_view.xml +++ b/app/src/main/res/layout/document_view.xml @@ -1,106 +1,151 @@ + 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 751cc627cd..41ced23210 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1156,6 +1156,7 @@ Unnamed file + Document file Optimize for missing Play Services @@ -3394,6 +3395,11 @@ Play … Pause Download + + Download + Upload + Cancel + Audio Video