From b681e412bb1f5f7e2302cb904a9b0c9b2e00f963 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 11 Feb 2025 11:39:52 +0100 Subject: [PATCH] add force P2P menu item to failed HTTP uploads --- .../services/XmppConnectionService.java | 34 ++++++++++++------- .../ui/ConversationFragment.java | 29 +++++++++++----- src/main/res/menu/message_context.xml | 3 ++ src/main/res/values/strings.xml | 1 + 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 0ff7dbe6fceb11fd24763ee7b8cfb8b3785da4e2..7a177262013ac97db7ca6e1232b1da8a99b179fd 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1816,11 +1816,15 @@ public class XmppConnectionService extends Service { } } - private void sendFileMessage(final Message message, final boolean delay) { - Log.d(Config.LOGTAG, "send file message"); - final Account account = message.getConversation().getAccount(); - if (account.httpUploadAvailable(fileBackend.getFile(message, false).getSize()) - || message.getConversation().getMode() == Conversation.MODE_MULTI) { + private void sendFileMessage( + final Message message, final boolean delay, final boolean forceP2P) { + final var account = message.getConversation().getAccount(); + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + ": send file message. forceP2P=" + forceP2P); + if ((account.httpUploadAvailable(fileBackend.getFile(message, false).getSize()) + || message.getConversation().getMode() == Conversation.MODE_MULTI) + && !forceP2P) { mHttpConnectionManager.createNewUploadConnection(message, delay); } else { mJingleConnectionManager.startJingleFileTransfer(message); @@ -1828,10 +1832,14 @@ public class XmppConnectionService extends Service { } public void sendMessage(final Message message) { - sendMessage(message, false, false); + sendMessage(message, false, false, false); } - private void sendMessage(final Message message, final boolean resend, final boolean delay) { + private void sendMessage( + final Message message, + final boolean resend, + final boolean delay, + final boolean forceP2P) { final Account account = message.getConversation().getAccount(); if (account.setShowErrorNotification(true)) { databaseBackend.updateAccount(account); @@ -1878,7 +1886,7 @@ public class XmppConnectionService extends Service { fileBackend.getFile(message, false).getSize()) || conversation.getMode() == Conversation.MODE_MULTI || message.fixCounterpart()) { - this.sendFileMessage(message, delay); + this.sendFileMessage(message, delay, forceP2P); } else { break; } @@ -1893,7 +1901,7 @@ public class XmppConnectionService extends Service { fileBackend.getFile(message, false).getSize()) || conversation.getMode() == Conversation.MODE_MULTI || message.fixCounterpart()) { - this.sendFileMessage(message, delay); + this.sendFileMessage(message, delay, forceP2P); } else { break; } @@ -1908,7 +1916,7 @@ public class XmppConnectionService extends Service { fileBackend.getFile(message, false).getSize()) || conversation.getMode() == Conversation.MODE_MULTI || message.fixCounterpart()) { - this.sendFileMessage(message, delay); + this.sendFileMessage(message, delay, forceP2P); } else { break; } @@ -2030,7 +2038,7 @@ public class XmppConnectionService extends Service { } public void resendMessage(final Message message, final boolean delay) { - sendMessage(message, true, delay); + sendMessage(message, true, delay, false); } public void requestEasyOnboardingInvite( @@ -5992,10 +6000,10 @@ public class XmppConnectionService extends Service { return this.mHttpConnectionManager; } - public void resendFailedMessages(final Message message) { + public void resendFailedMessages(final Message message, final boolean forceP2P) { message.setTime(System.currentTimeMillis()); markMessage(message, Message.STATUS_WAITING); - this.resendMessage(message, false); + this.sendMessage(message, true, false, forceP2P); if (message.getConversation() instanceof Conversation c) { c.sort(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 20ed93c058fa244fd90ba8a61eb08c4940ec7ce9..498b08773cbfc37e7f9024a27bbb967bb2b5169b 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1305,6 +1305,7 @@ public class ConversationFragment extends XmppFragment final MenuItem correctMessage = menu.findItem(R.id.correct_message); final MenuItem shareWith = menu.findItem(R.id.share_with); final MenuItem sendAgain = menu.findItem(R.id.send_again); + final MenuItem retryAsP2P = menu.findItem(R.id.send_again_as_p2p); final MenuItem copyUrl = menu.findItem(R.id.copy_url); final MenuItem downloadFile = menu.findItem(R.id.download_file); final MenuItem cancelTransmission = menu.findItem(R.id.cancel_transmission); @@ -1372,6 +1373,12 @@ public class ConversationFragment extends XmppFragment } if (m.getStatus() == Message.STATUS_SEND_FAILED) { sendAgain.setVisible(true); + final var fileNotUploaded = m.isFileOrImage() && !m.hasFileOnRemoteHost(); + final var isPeerOnline = + conversational.getMode() == Conversation.MODE_SINGLE + && (conversational instanceof Conversation c) + && !c.getContact().getPresences().isEmpty(); + retryAsP2P.setVisible(fileNotUploaded && isPeerOnline); } if (m.hasFileOnRemoteHost() || m.isGeoUri() @@ -1438,7 +1445,10 @@ public class ConversationFragment extends XmppFragment quoteMessage(selectedMessage); return true; case R.id.send_again: - resendMessage(selectedMessage); + resendMessage(selectedMessage, false); + return true; + case R.id.send_again_as_p2p: + resendMessage(selectedMessage, true); return true; case R.id.copy_url: ShareUtil.copyUrlToClipboard(activity, selectedMessage); @@ -2195,12 +2205,11 @@ public class ConversationFragment extends XmppFragment builder.create().show(); } - private void resendMessage(final Message message) { + private void resendMessage(final Message message, final boolean forceP2P) { if (message.isFileOrImage()) { - if (!(message.getConversation() instanceof Conversation)) { + if (!(message.getConversation() instanceof Conversation conversation)) { return; } - final Conversation conversation = (Conversation) message.getConversation(); final DownloadableFile file = activity.xmppConnectionService.getFileBackend().getFile(message); if ((file.exists() && file.canRead()) || message.hasFileOnRemoteHost()) { @@ -2208,14 +2217,16 @@ public class ConversationFragment extends XmppFragment if (!message.hasFileOnRemoteHost() && xmppConnection != null && conversation.getMode() == Conversational.MODE_SINGLE - && !xmppConnection - .getFeatures() - .httpUpload(message.getFileParams().getSize())) { + && (!xmppConnection + .getFeatures() + .httpUpload(message.getFileParams().getSize()) + || forceP2P)) { activity.selectPresence( conversation, () -> { message.setCounterpart(conversation.getNextCounterpart()); - activity.xmppConnectionService.resendFailedMessages(message); + activity.xmppConnectionService.resendFailedMessages( + message, forceP2P); new Handler() .post( () -> { @@ -2238,7 +2249,7 @@ public class ConversationFragment extends XmppFragment return; } } - activity.xmppConnectionService.resendFailedMessages(message); + activity.xmppConnectionService.resendFailedMessages(message, false); new Handler() .post( () -> { diff --git a/src/main/res/menu/message_context.xml b/src/main/res/menu/message_context.xml index 831808db20be6e2000067d64355ce5fca351b849..aa572bcdf712b74c8732a15197269e80b48ac352 100644 --- a/src/main/res/menu/message_context.xml +++ b/src/main/res/menu/message_context.xml @@ -55,6 +55,9 @@ android:id="@+id/send_again" android:title="@string/send_again" android:visible="false" /> + Paste as quote Copy original URL Send again + Retry with P2P File URL Copied URL to clipboard Copied XMPP address to clipboard