use occupantResource for sender name
This commit is contained in:
parent
f13f15cc91
commit
cc07f86bf4
|
@ -52,6 +52,7 @@ public final class Converters {
|
|||
return input == null ? null : JidCreate.fromOrThrowUnchecked(input);
|
||||
}
|
||||
|
||||
// TODO do we want to return null on null input?
|
||||
@TypeConverter
|
||||
public static Resourcepart toResourcePart(final String input) {
|
||||
return Strings.isNullOrEmpty(input)
|
||||
|
|
|
@ -198,15 +198,20 @@ public abstract class ChatDao {
|
|||
"SELECT c.id,c.accountId,c.address,c.type,m.sentAt,m.senderIdentity as"
|
||||
+ " sender,m.outgoing,m.latestVersion as"
|
||||
+ " version,m.toBare,m.toResource,m.fromBare,m.fromResource,(SELECT count(id) FROM"
|
||||
+ " message WHERE chatId=c.id) as unread,(SELECT name FROM roster WHERE"
|
||||
+ " roster.accountId=c.accountId AND roster.address=c.address) as"
|
||||
+ " rosterName,(SELECT nick FROM nick WHERE nick.accountId=c.accountId AND"
|
||||
+ " nick.address=c.address) as nick,(SELECT identity.name FROM disco_item JOIN"
|
||||
+ " disco_identity identity ON disco_item.discoId=identity.discoId WHERE"
|
||||
+ " disco_item.accountId=c.accountId AND disco_item.address=c.address LIMIT 1) as"
|
||||
+ " discoIdentityName,(SELECT name FROM bookmark WHERE"
|
||||
+ " bookmark.accountId=c.accountId AND bookmark.address=c.address) as"
|
||||
+ " bookmarkName,(CASE WHEN c.type='MUC' THEN (SELECT vCardPhoto FROM presence"
|
||||
+ " message WHERE chatId=c.id) as unread,(CASE WHEN c.type = 'INDIVIDUAL' THEN"
|
||||
+ " (SELECT name FROM roster WHERE roster.accountId=c.accountId AND"
|
||||
+ " roster.address=c.address) ELSE NULL END) as rosterName,(CASE WHEN c.type ="
|
||||
+ " 'INDIVIDUAL' THEN (SELECT nick FROM nick WHERE nick.accountId=c.accountId AND"
|
||||
+ " nick.address=c.address) ELSE NULL END) as nick,(CASE WHEN c.type IN('MUC') THEN"
|
||||
+ " (SELECT name FROM roster WHERE roster.accountId=c.accountId AND"
|
||||
+ " roster.address=m.senderIdentity) ELSE NULL END) as senderRosterName,(CASE WHEN"
|
||||
+ " c.type IN ('MUC') THEN (SELECT nick FROM nick WHERE nick.accountId=c.accountId"
|
||||
+ " AND nick.address=m.senderIdentity) ELSE NULL END) as senderNick,(SELECT"
|
||||
+ " identity.name FROM disco_item JOIN disco_identity identity ON"
|
||||
+ " disco_item.discoId=identity.discoId WHERE disco_item.accountId=c.accountId AND"
|
||||
+ " disco_item.address=c.address LIMIT 1) as discoIdentityName,(SELECT name FROM"
|
||||
+ " bookmark WHERE bookmark.accountId=c.accountId AND bookmark.address=c.address)"
|
||||
+ " as bookmarkName,(CASE WHEN c.type='MUC' THEN (SELECT vCardPhoto FROM presence"
|
||||
+ " WHERE presence.accountId=c.accountId AND address=c.address AND resource='')"
|
||||
+ " WHEN c.type='INDIVIDUAL' THEN (SELECT vCardPhoto FROM presence WHERE"
|
||||
+ " accountId=c.accountId AND address=c.address AND vCardPhoto NOT NULL LIMIT 1)"
|
||||
|
|
|
@ -3,6 +3,7 @@ package im.conversations.android.database.model;
|
|||
import androidx.room.Relation;
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.collect.Iterables;
|
||||
import im.conversations.android.database.KnownSender;
|
||||
import im.conversations.android.database.entity.MessageContentEntity;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
@ -10,7 +11,7 @@ import org.jxmpp.jid.BareJid;
|
|||
import org.jxmpp.jid.Jid;
|
||||
import org.jxmpp.jid.parts.Resourcepart;
|
||||
|
||||
public class ChatOverviewItem extends ChatInfo {
|
||||
public class ChatOverviewItem extends ChatInfo implements KnownSender {
|
||||
|
||||
public long id;
|
||||
|
||||
|
@ -24,6 +25,8 @@ public class ChatOverviewItem extends ChatInfo {
|
|||
public String fromResource;
|
||||
|
||||
public BareJid sender;
|
||||
public String senderNick;
|
||||
public String senderRosterName;
|
||||
|
||||
public long version;
|
||||
|
||||
|
@ -45,17 +48,63 @@ public class ChatOverviewItem extends ChatInfo {
|
|||
return firstMessageContent == null ? null : firstMessageContent.body;
|
||||
}
|
||||
|
||||
public Sender getSender() {
|
||||
@Override
|
||||
public ChatType getChatType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMembersOnlyNonAnonymous() {
|
||||
return this.membersOnlyNonAnonymous;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BareJid getSender() {
|
||||
return this.sender;
|
||||
}
|
||||
|
||||
public Sender getMessageSender() {
|
||||
if (outgoing) {
|
||||
return new SenderYou();
|
||||
} else if (type == ChatType.MUC) {
|
||||
if (fromResource != null) {
|
||||
return new SenderName(fromResource);
|
||||
if (isKnownSender()) {
|
||||
return new SenderName(individualName());
|
||||
} else {
|
||||
if (occupantResource != null && occupantResource.length() > 0) {
|
||||
return new SenderName(occupantResource.toString());
|
||||
}
|
||||
if (fromResource != null && fromResource.length() > 0) {
|
||||
return new SenderName(fromResource.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String individualRosterName() {
|
||||
if (type == ChatType.INDIVIDUAL) {
|
||||
return super.individualRosterName();
|
||||
} else {
|
||||
return null;
|
||||
return this.senderRosterName;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String individualNick() {
|
||||
if (type == ChatType.INDIVIDUAL) {
|
||||
return super.individualNick();
|
||||
} else {
|
||||
return senderNick;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BareJid individualAddress() {
|
||||
if (type == ChatType.INDIVIDUAL) {
|
||||
return super.individualAddress();
|
||||
} else {
|
||||
return this.sender;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,23 +137,20 @@ public class ChatOverviewItem extends ChatInfo {
|
|||
if (o == null || getClass() != o.getClass()) return false;
|
||||
ChatOverviewItem that = (ChatOverviewItem) o;
|
||||
return id == that.id
|
||||
&& accountId == that.accountId
|
||||
&& outgoing == that.outgoing
|
||||
&& version == that.version
|
||||
&& unread == that.unread
|
||||
&& Objects.equal(address, that.address)
|
||||
&& type == that.type
|
||||
&& Objects.equal(sentAt, that.sentAt)
|
||||
&& Objects.equal(toBare, that.toBare)
|
||||
&& Objects.equal(toResource, that.toResource)
|
||||
&& Objects.equal(fromBare, that.fromBare)
|
||||
&& Objects.equal(fromResource, that.fromResource)
|
||||
&& Objects.equal(rosterName, that.rosterName)
|
||||
&& Objects.equal(nick, that.nick)
|
||||
&& Objects.equal(discoIdentityName, that.discoIdentityName)
|
||||
&& Objects.equal(bookmarkName, that.bookmarkName)
|
||||
&& Objects.equal(sender, that.sender)
|
||||
&& Objects.equal(senderNick, that.senderNick)
|
||||
&& Objects.equal(senderRosterName, that.senderRosterName)
|
||||
&& Objects.equal(vCardPhoto, that.vCardPhoto)
|
||||
&& Objects.equal(avatar, that.avatar)
|
||||
&& Objects.equal(occupantResource, that.occupantResource)
|
||||
&& Objects.equal(contents, that.contents);
|
||||
}
|
||||
|
||||
|
@ -112,22 +158,19 @@ public class ChatOverviewItem extends ChatInfo {
|
|||
public int hashCode() {
|
||||
return Objects.hashCode(
|
||||
id,
|
||||
accountId,
|
||||
address,
|
||||
type,
|
||||
sentAt,
|
||||
outgoing,
|
||||
toBare,
|
||||
toResource,
|
||||
fromBare,
|
||||
fromResource,
|
||||
sender,
|
||||
senderNick,
|
||||
senderRosterName,
|
||||
version,
|
||||
rosterName,
|
||||
nick,
|
||||
discoIdentityName,
|
||||
bookmarkName,
|
||||
vCardPhoto,
|
||||
avatar,
|
||||
occupantResource,
|
||||
unread,
|
||||
contents);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package im.conversations.android.database.model;
|
||||
|
||||
import androidx.room.Relation;
|
||||
import com.google.common.base.Objects;
|
||||
import im.conversations.android.database.entity.MessageContentEntity;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
@ -20,4 +21,22 @@ public class MessageEmbedded {
|
|||
parentColumn = "latestVersion",
|
||||
entityColumn = "messageVersionId")
|
||||
public List<MessageContent> contents;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MessageEmbedded that = (MessageEmbedded) o;
|
||||
return id == that.id
|
||||
&& Objects.equal(fromBare, that.fromBare)
|
||||
&& Objects.equal(fromResource, that.fromResource)
|
||||
&& Objects.equal(sentAt, that.sentAt)
|
||||
&& Objects.equal(latestVersion, that.latestVersion)
|
||||
&& Objects.equal(contents, that.contents);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id, fromBare, fromResource, sentAt, latestVersion, contents);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package im.conversations.android.database.model;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import org.jxmpp.jid.Jid;
|
||||
|
||||
public class MessageReaction {
|
||||
|
@ -17,4 +18,20 @@ public class MessageReaction {
|
|||
this.occupantId = occupantId;
|
||||
this.reaction = reaction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MessageReaction that = (MessageReaction) o;
|
||||
return Objects.equal(reactionBy, that.reactionBy)
|
||||
&& Objects.equal(reactionByResource, that.reactionByResource)
|
||||
&& Objects.equal(occupantId, that.occupantId)
|
||||
&& Objects.equal(reaction, that.reaction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(reactionBy, reactionByResource, occupantId, reaction);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package im.conversations.android.database.model;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Preconditions;
|
||||
import im.conversations.android.transformer.MessageTransformation;
|
||||
import im.conversations.android.xmpp.model.error.Condition;
|
||||
|
@ -64,4 +65,21 @@ public class MessageState {
|
|||
null,
|
||||
null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MessageState that = (MessageState) o;
|
||||
return Objects.equal(fromBare, that.fromBare)
|
||||
&& Objects.equal(fromResource, that.fromResource)
|
||||
&& type == that.type
|
||||
&& Objects.equal(errorCondition, that.errorCondition)
|
||||
&& Objects.equal(errorText, that.errorText);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(fromBare, fromResource, type, errorCondition, errorText);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package im.conversations.android.database.model;
|
||||
|
||||
import androidx.room.Relation;
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableSortedSet;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
@ -48,7 +49,7 @@ public class MessageWithContentReactions implements IndividualName, KnownSender
|
|||
public String senderNick;
|
||||
|
||||
public String occupantVcardPhoto;
|
||||
public String occupantResource;
|
||||
public Resourcepart occupantResource;
|
||||
|
||||
public Modification modification;
|
||||
public long version;
|
||||
|
@ -101,9 +102,13 @@ public class MessageWithContentReactions implements IndividualName, KnownSender
|
|||
if (isKnownSender()) {
|
||||
return new AddressWithName(individualAddress(), individualName());
|
||||
} else {
|
||||
final Jid address = JidCreate.fullFrom(fromBare, fromResource);
|
||||
final String name = fromResource.toString();
|
||||
return new AddressWithName(address, name);
|
||||
final Jid address;
|
||||
if (occupantResource != null && occupantResource.length() != 0) {
|
||||
address = JidCreate.fullFrom(fromBare, occupantResource);
|
||||
} else {
|
||||
address = JidCreate.fullFrom(fromBare, fromResource);
|
||||
}
|
||||
return new AddressWithName(address, address.getResourceOrEmpty().toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,7 +164,8 @@ public class MessageWithContentReactions implements IndividualName, KnownSender
|
|||
}
|
||||
|
||||
public String getSenderName() {
|
||||
return this.fromResource == null ? null : fromResource.toString();
|
||||
final var addressWithName = getAddressWithName();
|
||||
return addressWithName.name;
|
||||
}
|
||||
|
||||
public boolean isGroupChat() {
|
||||
|
@ -170,6 +176,72 @@ public class MessageWithContentReactions implements IndividualName, KnownSender
|
|||
return new EncryptionTuple(this.encryption, this.trust);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
MessageWithContentReactions that = (MessageWithContentReactions) o;
|
||||
return accountId == that.accountId
|
||||
&& id == that.id
|
||||
&& membersOnlyNonAnonymous == that.membersOnlyNonAnonymous
|
||||
&& outgoing == that.outgoing
|
||||
&& version == that.version
|
||||
&& chatType == that.chatType
|
||||
&& Objects.equal(sentAt, that.sentAt)
|
||||
&& Objects.equal(toBare, that.toBare)
|
||||
&& Objects.equal(toResource, that.toResource)
|
||||
&& Objects.equal(fromBare, that.fromBare)
|
||||
&& Objects.equal(fromResource, that.fromResource)
|
||||
&& Objects.equal(sender, that.sender)
|
||||
&& Objects.equal(senderVcardPhoto, that.senderVcardPhoto)
|
||||
&& Objects.equal(senderAvatar, that.senderAvatar)
|
||||
&& Objects.equal(senderRosterName, that.senderRosterName)
|
||||
&& Objects.equal(senderNick, that.senderNick)
|
||||
&& Objects.equal(occupantVcardPhoto, that.occupantVcardPhoto)
|
||||
&& Objects.equal(occupantResource, that.occupantResource)
|
||||
&& modification == that.modification
|
||||
&& Objects.equal(inReplyToMessageEntityId, that.inReplyToMessageEntityId)
|
||||
&& encryption == that.encryption
|
||||
&& Objects.equal(identityKey, that.identityKey)
|
||||
&& trust == that.trust
|
||||
&& Objects.equal(inReplyTo, that.inReplyTo)
|
||||
&& Objects.equal(contents, that.contents)
|
||||
&& Objects.equal(reactions, that.reactions)
|
||||
&& Objects.equal(states, that.states);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(
|
||||
accountId,
|
||||
id,
|
||||
chatType,
|
||||
membersOnlyNonAnonymous,
|
||||
sentAt,
|
||||
outgoing,
|
||||
toBare,
|
||||
toResource,
|
||||
fromBare,
|
||||
fromResource,
|
||||
sender,
|
||||
senderVcardPhoto,
|
||||
senderAvatar,
|
||||
senderRosterName,
|
||||
senderNick,
|
||||
occupantVcardPhoto,
|
||||
occupantResource,
|
||||
modification,
|
||||
version,
|
||||
inReplyToMessageEntityId,
|
||||
encryption,
|
||||
identityKey,
|
||||
trust,
|
||||
inReplyTo,
|
||||
contents,
|
||||
reactions,
|
||||
states);
|
||||
}
|
||||
|
||||
public static class EncryptionTuple {
|
||||
public final Encryption encryption;
|
||||
public final Trust trust;
|
||||
|
|
|
@ -12,11 +12,15 @@ import im.conversations.android.R;
|
|||
import im.conversations.android.database.model.MessageWithContentReactions;
|
||||
import im.conversations.android.databinding.ItemMessageReceivedBinding;
|
||||
import im.conversations.android.ui.AvatarFetcher;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class MessageAdapter
|
||||
extends PagingDataAdapter<
|
||||
MessageWithContentReactions, MessageAdapter.AbstractMessageViewHolder> {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(MessageAdapter.class);
|
||||
|
||||
public MessageAdapter(
|
||||
@NonNull DiffUtil.ItemCallback<MessageWithContentReactions> diffCallback) {
|
||||
super(diffCallback);
|
||||
|
@ -41,6 +45,7 @@ public class MessageAdapter
|
|||
if (message == null) {
|
||||
holder.setMessage(null);
|
||||
}
|
||||
LOGGER.info("onBindViewHolder({})", message == null ? null : message.id);
|
||||
holder.setMessage(message);
|
||||
if (holder instanceof MessageReceivedViewHolder messageReceivedViewHolder) {
|
||||
final var addressWithName = message == null ? null : message.getAddressWithName();
|
||||
|
|
|
@ -3,8 +3,13 @@ package im.conversations.android.ui.adapter;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import im.conversations.android.database.model.MessageWithContentReactions;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class MessageComparator extends DiffUtil.ItemCallback<MessageWithContentReactions> {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(MessageComparator.class);
|
||||
|
||||
@Override
|
||||
public boolean areItemsTheSame(
|
||||
@NonNull MessageWithContentReactions oldItem,
|
||||
|
@ -16,6 +21,10 @@ public class MessageComparator extends DiffUtil.ItemCallback<MessageWithContentR
|
|||
public boolean areContentsTheSame(
|
||||
@NonNull MessageWithContentReactions oldItem,
|
||||
@NonNull MessageWithContentReactions newItem) {
|
||||
final var equals = oldItem.equals(newItem);
|
||||
if (!equals) {
|
||||
LOGGER.info("Message {} got modified", oldItem.id);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="4sp"
|
||||
android:maxLines="1"
|
||||
android:text="@{chatOverviewItem.sender}"
|
||||
android:text="@{chatOverviewItem.messageSender}"
|
||||
android:textAppearance="?textAppearanceBodyMedium"
|
||||
android:textColor="?colorTertiary"
|
||||
android:visibility="visible"
|
||||
|
|
Loading…
Reference in a new issue