From c183b8e5995c1fff6b4c3a52a3cfb607bb622054 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 22 May 2025 15:11:51 +0200 Subject: [PATCH] move message acking into its own processor class --- .../services/XmppConnectionService.java | 50 +---------------- .../conversations/xmpp/XmppConnection.java | 14 +++-- .../MessageAcknowledgedProcessor.java | 53 +++++++++++++++++++ 3 files changed, 61 insertions(+), 56 deletions(-) create mode 100644 src/main/java/im/conversations/android/xmpp/processor/MessageAcknowledgedProcessor.java diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 77e729f251c84f20e8f5cc6d8dbe0fb3988f6edd..1fc8667cf74efd068e28816858807a2cdf29ba87 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -123,14 +123,12 @@ import eu.siacs.conversations.xml.Namespace; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.OnContactStatusChanged; import eu.siacs.conversations.xmpp.OnKeyStatusUpdated; -import eu.siacs.conversations.xmpp.OnMessageAcknowledged; import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection; import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; -import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; import eu.siacs.conversations.xmpp.jingle.Media; import eu.siacs.conversations.xmpp.jingle.RtpEndUserState; import eu.siacs.conversations.xmpp.mam.MamReference; @@ -291,43 +289,6 @@ public class XmppConnectionService extends Service { markFileDeleted(file); } }; - private final OnMessageAcknowledged mOnMessageAcknowledgedListener = - new OnMessageAcknowledged() { - - @Override - public boolean onMessageAcknowledged( - final Account account, final Jid to, final String id) { - if (id.startsWith(JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX)) { - final String sessionId = - id.substring( - JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX - .length()); - mJingleConnectionManager.updateProposedSessionDiscovered( - account, - to, - sessionId, - JingleConnectionManager.DeviceDiscoveryState - .SEARCHING_ACKNOWLEDGED); - } - - final Jid bare = to.asBareJid(); - - for (final Conversation conversation : getConversations()) { - if (conversation.getAccount() == account - && conversation.getJid().asBareJid().equals(bare)) { - final Message message = conversation.findUnsentMessageWithUuid(id); - if (message != null) { - message.setStatus(Message.STATUS_SEND); - message.setErrorMessage(null); - databaseBackend.updateMessage(message, false); - return true; - } - } - } - return false; - } - }; - private boolean destroyed = false; private int unreadCount = -1; @@ -1642,13 +1603,8 @@ public class XmppConnectionService extends Service { ? PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT : PendingIntent.FLAG_UPDATE_CURRENT); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - alarmManager.setAndAllowWhileIdle( - AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent); - } else { - alarmManager.set( - AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent); - } + alarmManager.setAndAllowWhileIdle( + AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, pendingIntent); } catch (RuntimeException e) { Log.e(Config.LOGTAG, "unable to schedule alarm for post connectivity change", e); } @@ -1701,8 +1657,6 @@ public class XmppConnectionService extends Service { public XmppConnection createConnection(final Account account) { final XmppConnection connection = new XmppConnection(account, this); connection.setOnJinglePacketReceivedListener((mJingleConnectionManager::deliverPacket)); - // TODO move MessageAck into final Processor into XmppConnection - connection.setOnMessageAcknowledgeListener(this.mOnMessageAcknowledgedListener); connection.addOnAdvancedStreamFeaturesAvailableListener(this.mMessageArchiveService); connection.addOnAdvancedStreamFeaturesAvailableListener(this.mAvatarService); return connection; diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 2bd84684515889eb0c69cfc3ed1e2f10dd348284..b5db98f80ab0f6c95582090b3554abe93d830545 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -119,6 +119,7 @@ import im.conversations.android.xmpp.model.tls.Proceed; import im.conversations.android.xmpp.model.tls.StartTls; import im.conversations.android.xmpp.processor.AccountStateProcessor; import im.conversations.android.xmpp.processor.BindProcessor; +import im.conversations.android.xmpp.processor.MessageAcknowledgedProcessor; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -150,6 +151,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.regex.Matcher; import javax.net.ssl.KeyManager; @@ -204,10 +206,10 @@ public class XmppConnection implements Runnable { private final Consumer unregisteredIqListener; private final Consumer messageListener; private final Consumer accountStateProcessor; + private final BiFunction messageAcknowledgedProcessor; private AxolotlService axolotlService; private final PgpDecryptionService pgpDecryptionService; private final Runnable bindProcessor; - private OnMessageAcknowledged acknowledgedListener = null; private final PendingItem pendingResumeId = new PendingItem<>(); private LoginInfo loginInfo; private HashedToken.Mechanism hashTokenRequest; @@ -231,6 +233,7 @@ public class XmppConnection implements Runnable { this.messageListener = new MessageParser(service, this); this.bindProcessor = new BindProcessor(service, this); this.accountStateProcessor = new AccountStateProcessor(service, this); + this.messageAcknowledgedProcessor = new MessageAcknowledgedProcessor(service, this); this.managers = Managers.get(service, this); this.setAxolotlService(new AxolotlService(account, service)); this.pgpDecryptionService = new PgpDecryptionService(service); @@ -1249,12 +1252,11 @@ public class XmppConnection implements Runnable { } final Stanza stanza = mStanzaQueue.valueAt(i); if (stanza instanceof im.conversations.android.xmpp.model.stanza.Message packet - && acknowledgedListener != null) { + && messageAcknowledgedProcessor != null) { final String id = packet.getId(); final Jid to = packet.getTo(); if (id != null && to != null) { - acknowledgedMessages |= - acknowledgedListener.onMessageAcknowledged(account, to, id); + acknowledgedMessages |= messageAcknowledgedProcessor.apply(to, id); } } mStanzaQueue.removeAt(i); @@ -2654,10 +2656,6 @@ public class XmppConnection implements Runnable { this.jingleListener = listener; } - public void setOnMessageAcknowledgeListener(final OnMessageAcknowledged listener) { - this.acknowledgedListener = listener; - } - public void addOnAdvancedStreamFeaturesAvailableListener( final OnAdvancedStreamFeaturesLoaded listener) { this.advancedStreamFeaturesLoadedListeners.add(listener); diff --git a/src/main/java/im/conversations/android/xmpp/processor/MessageAcknowledgedProcessor.java b/src/main/java/im/conversations/android/xmpp/processor/MessageAcknowledgedProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..5be91b6b44b99dc22948de70ff963d251ff2cdc3 --- /dev/null +++ b/src/main/java/im/conversations/android/xmpp/processor/MessageAcknowledgedProcessor.java @@ -0,0 +1,53 @@ +package im.conversations.android.xmpp.processor; + +import eu.siacs.conversations.entities.Conversation; +import eu.siacs.conversations.entities.Message; +import eu.siacs.conversations.services.XmppConnectionService; +import eu.siacs.conversations.xmpp.Jid; +import eu.siacs.conversations.xmpp.XmppConnection; +import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; +import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; +import java.util.function.BiFunction; + +public class MessageAcknowledgedProcessor extends XmppConnection.Delegate + implements BiFunction { + + private final XmppConnectionService service; + + public MessageAcknowledgedProcessor( + final XmppConnectionService service, final XmppConnection connection) { + super(service.getApplicationContext(), connection); + this.service = service; + } + + @Override + public Boolean apply(final Jid to, final String id) { + if (id.startsWith(JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX)) { + final String sessionId = + id.substring(JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX.length()); + this.service + .getJingleConnectionManager() + .updateProposedSessionDiscovered( + getAccount(), + to, + sessionId, + JingleConnectionManager.DeviceDiscoveryState.SEARCHING_ACKNOWLEDGED); + } + + final Jid bare = to.asBareJid(); + + for (final Conversation conversation : service.getConversations()) { + if (conversation.getAccount() == getAccount() + && conversation.getJid().asBareJid().equals(bare)) { + final Message message = conversation.findUnsentMessageWithUuid(id); + if (message != null) { + message.setStatus(Message.STATUS_SEND); + message.setErrorMessage(null); + getDatabase().updateMessage(message, false); + return true; + } + } + } + return false; + } +}