Allow canceling media attachment send.

This commit is contained in:
Nicholas Tinsley
2024-01-05 13:36:31 -05:00
committed by Alex Hart
parent deacf28d77
commit 5022d81d9a
17 changed files with 278 additions and 133 deletions

View File

@@ -95,6 +95,8 @@ import org.thoughtcrime.securesms.components.ThumbnailView;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.components.mention.MentionAnnotation;
import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.conversation.clicklisteners.AttachmentCancelClickListener;
import org.thoughtcrime.securesms.conversation.clicklisteners.ResendClickListener;
import org.thoughtcrime.securesms.conversation.colors.Colorizer;
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectCollection;
import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart;
@@ -1083,7 +1085,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
boolean messageRequestAccepted,
boolean allowedToPlayInline)
{
boolean showControls = !messageRecord.isFailed() && !MessageRecordUtil.isScheduled(messageRecord);
boolean showControls = messageRecord.isMediaPending() || (!messageRecord.isFailed() && !MessageRecordUtil.isScheduled(messageRecord));
ViewUtil.setTopMargin(bodyText, readDimen(R.dimen.message_bubble_top_padding));
@@ -1174,8 +1176,8 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
mediaThumbnailStub.require().setMaximumThumbnailHeight(readDimen(R.dimen.media_bubble_max_height));
mediaThumbnailStub.require().setImageResource(glideRequests, Collections.singletonList(new ImageSlide(linkPreview.getThumbnail().get())), showControls, false);
mediaThumbnailStub.require().setThumbnailClickListener(new LinkPreviewThumbnailClickListener());
mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
mediaThumbnailStub.require().setCancelDownloadClickListener(attachmentCancelClickListener);
mediaThumbnailStub.require().setStartTransferClickListener(downloadClickListener);
mediaThumbnailStub.require().setCancelTransferClickListener(attachmentCancelClickListener);
mediaThumbnailStub.require().setPlayVideoClickListener(playVideoClickListener);
mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
@@ -1312,8 +1314,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
: R.dimen.media_bubble_max_height));
mediaThumbnailStub.require().setThumbnailClickListener(new ThumbnailClickListener());
mediaThumbnailStub.require().setDownloadClickListener(downloadClickListener);
mediaThumbnailStub.require().setCancelDownloadClickListener(attachmentCancelClickListener);
mediaThumbnailStub.require().setCancelTransferClickListener(attachmentCancelClickListener);
mediaThumbnailStub.require().setPlayVideoClickListener(playVideoClickListener);
mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener);
mediaThumbnailStub.require().setOnClickListener(passthroughClickListener);
@@ -1324,8 +1325,10 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
false);
if (!messageRecord.isOutgoing()) {
mediaThumbnailStub.require().setConversationColor(getDefaultBubbleColor(hasWallpaper));
mediaThumbnailStub.require().setStartTransferClickListener(downloadClickListener);
} else {
mediaThumbnailStub.require().setConversationColor(Color.TRANSPARENT);
mediaThumbnailStub.require().setStartTransferClickListener(new ResendClickListener(messageRecord));
}
mediaThumbnailStub.require().setBorderless(false);
@@ -1566,7 +1569,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
private void setStatusIcons(MessageRecord messageRecord, boolean hasWallpaper) {
bodyText.setCompoundDrawablesWithIntrinsicBounds(0, 0, messageRecord.isKeyExchange() ? R.drawable.ic_menu_login : 0, 0);
if (messageRecord.isFailed()) {
if (!messageRecord.isMediaPending() && messageRecord.isFailed()) {
alertView.setFailed();
} else if (messageRecord.isPendingInsecureSmsFallback()) {
alertView.setPendingApproval();
@@ -2445,25 +2448,6 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
}
}
private class AttachmentCancelClickListener implements SlidesClickedListener {
@Override
public void onClick(View v, List<Slide> slides) {
Log.i(TAG, "onClick() for attachment cancellation");
final JobManager jobManager = ApplicationDependencies.getJobManager();
if (messageRecord.isMmsNotification()) {
Log.i(TAG, "Canceling MMS attachments download");
jobManager.cancel("mms-operation");
} else {
Log.i(TAG, "Canceling push attachment downloads for " + slides.size() + " items");
for (Slide slide : slides) {
final String queue = AttachmentDownloadJob.constructQueueString(((DatabaseAttachment) slide.asAttachment()).attachmentId);
jobManager.cancelAllInQueue(queue);
}
}
}
}
private class PlayVideoClickListener implements SlideClickListener {
private static final float MINIMUM_DOWNLOADED_THRESHOLD = 0.05f;
private View parentView;

View File

@@ -0,0 +1,43 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.conversation.clicklisteners
import android.view.View
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobs.AttachmentCompressionJob
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob
import org.thoughtcrime.securesms.jobs.AttachmentUploadJob
import org.thoughtcrime.securesms.mms.Slide
import org.thoughtcrime.securesms.mms.SlidesClickedListener
internal class AttachmentCancelClickListener : SlidesClickedListener {
override fun onClick(v: View, slides: List<Slide>) {
Log.i(TAG, "Canceling compression/upload/download jobs for ${slides.size} items")
val jobManager = ApplicationDependencies.getJobManager()
var cancelCount = 0
for (slide in slides) {
val attachmentId = (slide.asAttachment() as DatabaseAttachment).attachmentId
val jobsToCancel = jobManager.find {
when (it.factoryKey) {
AttachmentDownloadJob.KEY -> AttachmentDownloadJob.jobSpecMatchesAttachmentId(it, attachmentId)
AttachmentCompressionJob.KEY -> AttachmentCompressionJob.jobSpecMatchesAttachmentId(it, attachmentId)
AttachmentUploadJob.KEY -> AttachmentUploadJob.jobSpecMatchesAttachmentId(it, attachmentId)
else -> false
}
}
jobsToCancel.forEach {
jobManager.cancel(it.id)
cancelCount++
}
}
Log.i(TAG, "Canceled $cancelCount jobs.")
}
companion object {
private val TAG = Log.tag(AttachmentCancelClickListener::class.java)
}
}

View File

@@ -0,0 +1,28 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.conversation.clicklisteners
import android.view.View
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.mms.Slide
import org.thoughtcrime.securesms.mms.SlidesClickedListener
import org.thoughtcrime.securesms.sms.MessageSender
class ResendClickListener(private val messageRecord: MessageRecord) : SlidesClickedListener {
override fun onClick(v: View?, slides: MutableList<Slide>?) {
if (v == null) {
Log.w(TAG, "Could not resend message, view was null!")
return
}
MessageSender.resend(v.context, messageRecord)
}
companion object {
private val TAG = Log.tag(ResendClickListener::class.java)
}
}