mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Allow canceling media attachment send.
This commit is contained in:
committed by
Alex Hart
parent
deacf28d77
commit
5022d81d9a
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user