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;
+ }
+}