Detailed changes
  
  
    
    @@ -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;
  
  
  
    
    @@ -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<Iq> unregisteredIqListener;
     private final Consumer<im.conversations.android.xmpp.model.stanza.Message> messageListener;
     private final Consumer<Account.State> accountStateProcessor;
+    private final BiFunction<Jid, String, Boolean> messageAcknowledgedProcessor;
     private AxolotlService axolotlService;
     private final PgpDecryptionService pgpDecryptionService;
     private final Runnable bindProcessor;
-    private OnMessageAcknowledged acknowledgedListener = null;
     private final PendingItem<String> 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);
  
  
  
    
    @@ -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<Jid, String, Boolean> {
+
+    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;
+    }
+}