@@ -1303,29 +1303,53 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
final var occupant =
mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
final var occupantId = occupant == null ? null : occupant.getId();
- final var message = conversation.findMessageWithServerMsgId(reactingTo);
- // TODO use occupant id for isSelf assessment
- final boolean isReceived = !mucOptions.isSelf(counterpart);
- if (occupantId != null && message != null) {
- final var newReactions = new HashSet<>(reactions.getReactions());
- newReactions.removeAll(message.getReactions().stream().filter(r -> occupantId.equals(r.occupantId)).map(r -> r.reaction).collect(Collectors.toList()));
- final var combinedReactions =
- Reaction.withOccupantId(
- message.getReactions(),
- reactions.getReactions(),
- isReceived,
- counterpart,
- null,
- occupantId,
- message.getRemoteMsgId());
- message.setReactions(combinedReactions);
- mXmppConnectionService.updateMessage(message, false);
- if (!isCarbon && !packet.fromAccount(account)) mXmppConnectionService.getNotificationService().push(message, counterpart, occupantId, newReactions);
+ if (occupantId != null) {
+ // TODO use occupant id for isSelf assessment
+ final boolean isReceived = !mucOptions.isSelf(counterpart);
+ final Message message;
+ final var inMemoryMessage =
+ conversation.findMessageWithServerMsgId(reactingTo);
+ if (inMemoryMessage != null) {
+ message = inMemoryMessage;
+ } else {
+ message =
+ mXmppConnectionService.databaseBackend
+ .getMessageWithServerMsgId(conversation, reactingTo);
+ }
+ if (message != null) {
+ final var newReactions = new HashSet<>(reactions.getReactions());
+ newReactions.removeAll(message.getReactions().stream().filter(r -> occupantId.equals(r.occupantId)).map(r -> r.reaction).collect(Collectors.toList()));
+ final var combinedReactions =
+ Reaction.withOccupantId(
+ message.getReactions(),
+ reactions.getReactions(),
+ isReceived,
+ counterpart,
+ null,
+ occupantId,
+ message.getRemoteMsgId());
+ message.setReactions(combinedReactions);
+ mXmppConnectionService.updateMessage(message, false);
+ if (!isCarbon && !packet.fromAccount(account)) mXmppConnectionService.getNotificationService().push(message, counterpart, occupantId, newReactions);
+ } else {
+ Log.d(Config.LOGTAG, "message with id " + reactingTo + " not found");
+ }
} else {
- Log.d(Config.LOGTAG,"not found occupant or message");
+ Log.d(
+ Config.LOGTAG,
+ "received reaction in channel w/o occupant ids. ignoring");
}
} else if (conversation.getMode() == Conversational.MODE_SINGLE) {
- final var message = conversation.findMessageWithUuidOrRemoteId(reactingTo);
+ final Message message;
+ final var inMemoryMessage =
+ conversation.findMessageWithUuidOrRemoteId(reactingTo);
+ if (inMemoryMessage != null) {
+ message = inMemoryMessage;
+ } else {
+ message =
+ mXmppConnectionService.databaseBackend.getMessageWithUuidOrRemoteId(
+ conversation, reactingTo);
+ }
final boolean isReceived;
final Jid reactionFrom;
if (packet.fromAccount(account)) {
@@ -1349,6 +1373,8 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
message.setReactions(combinedReactions);
mXmppConnectionService.updateMessage(message, false);
if (!isCarbon && !packet.fromAccount(account)) mXmppConnectionService.getNotificationService().push(message, counterpart, null, newReactions);
+ } else {
+ Log.d(Config.LOGTAG, "message with id " + reactingTo + " not found");
}
}
}
@@ -1318,6 +1318,46 @@ public class DatabaseBackend extends SQLiteOpenHelper {
return filesPaths;
}
+ public Message getMessageWithServerMsgId(
+ final Conversation conversation, final String messageId) {
+ final var db = this.getReadableDatabase();
+ final String sql =
+ "select * from messages where conversationUuid=? and serverMsgId=? LIMIT 1";
+ final String[] args = {conversation.getUuid(), messageId};
+ final Cursor cursor = db.rawQuery(sql, args);
+ if (cursor == null) {
+ return null;
+ }
+ Message message = null;
+ try {
+ if (cursor.moveToFirst()) {
+ message = Message.fromCursor(cursor, conversation);
+ }
+ } catch (final IOException e) { }
+ cursor.close();
+ return message;
+ }
+
+ public Message getMessageWithUuidOrRemoteId(
+ final Conversation conversation, final String messageId) {
+ final var db = this.getReadableDatabase();
+ final String sql =
+ "select * from messages where conversationUuid=? and (uuid=? OR remoteMsgId=?) LIMIT 1";
+ final String[] args = {conversation.getUuid(), messageId, messageId};
+ final Cursor cursor = db.rawQuery(sql, args);
+ if (cursor == null) {
+ return null;
+ }
+ Message message = null;
+ try {
+ if (cursor.moveToFirst()) {
+ message = Message.fromCursor(cursor, conversation);
+ }
+ } catch (final IOException e) { }
+ cursor.close();
+ return message;
+ }
+
public static class FilePath {
public final UUID uuid;
public final String path;