make chat markers opportunistic in private mucs
This commit is contained in:
parent
e62b0ca320
commit
eee5d885ba
|
@ -788,12 +788,11 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConversationAxolotlCapable(Conversation conversation) {
|
public boolean isConversationAxolotlCapable(Conversation conversation) {
|
||||||
return conversation.getMode() == Conversation.MODE_SINGLE || (conversation.getMucOptions().nonanonymous() && conversation.getMucOptions().membersOnly());
|
return conversation.isSingleOrPrivateAndNonAnonymous();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pair<AxolotlCapability, Jid> isConversationAxolotlCapableDetailed(Conversation conversation) {
|
public Pair<AxolotlCapability, Jid> isConversationAxolotlCapableDetailed(Conversation conversation) {
|
||||||
if (conversation.getMode() == Conversation.MODE_SINGLE
|
if (conversation.isSingleOrPrivateAndNonAnonymous()) {
|
||||||
|| (conversation.getMucOptions().membersOnly() && conversation.getMucOptions().nonanonymous())) {
|
|
||||||
final List<Jid> jids = getCryptoTargets(conversation);
|
final List<Jid> jids = getCryptoTargets(conversation);
|
||||||
for (Jid jid : jids) {
|
for (Jid jid : jids) {
|
||||||
if (!hasAny(jid) && (!deviceIds.containsKey(jid) || deviceIds.get(jid).isEmpty())) {
|
if (!hasAny(jid) && (!deviceIds.containsKey(jid) || deviceIds.get(jid).isEmpty())) {
|
||||||
|
|
|
@ -194,16 +194,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean setOutgoingChatState(ChatState state) {
|
public boolean setOutgoingChatState(ChatState state) {
|
||||||
if (mode == MODE_MULTI && (getNextCounterpart() != null || !isPnNA())) {
|
if (mode == MODE_SINGLE || (isPrivateAndNonAnonymous() && getNextCounterpart() == null)) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (this.mOutgoingChatState != state) {
|
if (this.mOutgoingChatState != state) {
|
||||||
this.mOutgoingChatState = state;
|
this.mOutgoingChatState = state;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public ChatState getOutgoingChatState() {
|
public ChatState getOutgoingChatState() {
|
||||||
return this.mOutgoingChatState;
|
return this.mOutgoingChatState;
|
||||||
|
@ -466,12 +464,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
return unread;
|
return unread;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Message getLatestMarkableMessage() {
|
public Message getLatestMarkableMessage(boolean isPrivateAndNonAnonymousMuc) {
|
||||||
synchronized (this.messages) {
|
synchronized (this.messages) {
|
||||||
for (int i = this.messages.size() - 1; i >= 0; --i) {
|
for (int i = this.messages.size() - 1; i >= 0; --i) {
|
||||||
final Message message = this.messages.get(i);
|
final Message message = this.messages.get(i);
|
||||||
if (message.getStatus() <= Message.STATUS_RECEIVED
|
if (message.getStatus() <= Message.STATUS_RECEIVED
|
||||||
&& message.markable
|
&& (message.markable || isPrivateAndNonAnonymousMuc)
|
||||||
&& message.getType() != Message.TYPE_PRIVATE) {
|
&& message.getType() != Message.TYPE_PRIVATE) {
|
||||||
return message.isRead() ? null : message;
|
return message.isRead() ? null : message;
|
||||||
}
|
}
|
||||||
|
@ -697,8 +695,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
/**
|
/**
|
||||||
* short for is Private and Non-anonymous
|
* short for is Private and Non-anonymous
|
||||||
*/
|
*/
|
||||||
private boolean isPnNA() {
|
public boolean isSingleOrPrivateAndNonAnonymous() {
|
||||||
return mode == MODE_SINGLE || (getMucOptions().membersOnly() && getMucOptions().nonanonymous());
|
return mode == MODE_SINGLE || isPrivateAndNonAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPrivateAndNonAnonymous() {
|
||||||
|
return getMucOptions().isPrivateAndNonAnonymous();
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized MucOptions getMucOptions() {
|
public synchronized MucOptions getMucOptions() {
|
||||||
|
@ -866,7 +868,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean alwaysNotify() {
|
public boolean alwaysNotify() {
|
||||||
return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY, Config.ALWAYS_NOTIFY_BY_DEFAULT || isPnNA());
|
return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY, Config.ALWAYS_NOTIFY_BY_DEFAULT || isPrivateAndNonAnonymous());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean setAttribute(String key, String value) {
|
public boolean setAttribute(String key, String value) {
|
||||||
|
|
|
@ -424,6 +424,10 @@ public class MucOptions {
|
||||||
return hasFeature("muc_nonanonymous");
|
return hasFeature("muc_nonanonymous");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPrivateAndNonAnonymous() {
|
||||||
|
return membersOnly() && nonanonymous();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean persistent() {
|
public boolean persistent() {
|
||||||
return hasFeature("muc_persistent");
|
return hasFeature("muc_persistent");
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,8 +53,7 @@ public class MessageGenerator extends AbstractGenerator {
|
||||||
packet.setTo(message.getCounterpart().toBareJid());
|
packet.setTo(message.getCounterpart().toBareJid());
|
||||||
packet.setType(MessagePacket.TYPE_GROUPCHAT);
|
packet.setType(MessagePacket.TYPE_GROUPCHAT);
|
||||||
}
|
}
|
||||||
if (conversation.getMode() == Conversation.MODE_SINGLE ||
|
if (conversation.isSingleOrPrivateAndNonAnonymous() && message.getType() != Message.TYPE_PRIVATE) {
|
||||||
(conversation.getMucOptions().nonanonymous() && conversation.getMucOptions().membersOnly() && message.getType() != Message.TYPE_PRIVATE)) {
|
|
||||||
packet.addChild("markable", "urn:xmpp:chat-markers:0");
|
packet.addChild("markable", "urn:xmpp:chat-markers:0");
|
||||||
}
|
}
|
||||||
packet.setFrom(account.getJid());
|
packet.setFrom(account.getJid());
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class PresenceParser extends AbstractParser implements
|
||||||
}
|
}
|
||||||
boolean isNew = mucOptions.updateUser(user);
|
boolean isNew = mucOptions.updateUser(user);
|
||||||
final AxolotlService axolotlService = conversation.getAccount().getAxolotlService();
|
final AxolotlService axolotlService = conversation.getAccount().getAxolotlService();
|
||||||
if (isNew && user.getRealJid() != null && mucOptions.membersOnly() && mucOptions.nonanonymous() && axolotlService.hasEmptyDeviceList(user.getRealJid())) {
|
if (isNew && user.getRealJid() != null && mucOptions.isPrivateAndNonAnonymous() && axolotlService.hasEmptyDeviceList(user.getRealJid())) {
|
||||||
axolotlService.fetchDeviceIds(user.getRealJid());
|
axolotlService.fetchDeviceIds(user.getRealJid());
|
||||||
}
|
}
|
||||||
if (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED) && mucOptions.autoPushConfiguration()) {
|
if (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED) && mucOptions.autoPushConfiguration()) {
|
||||||
|
|
|
@ -2271,7 +2271,7 @@ public class XmppConnectionService extends Service {
|
||||||
if (mucOptions.mamSupport()) {
|
if (mucOptions.mamSupport()) {
|
||||||
getMessageArchiveService().catchupMUC(conversation);
|
getMessageArchiveService().catchupMUC(conversation);
|
||||||
}
|
}
|
||||||
if (mucOptions.membersOnly() && mucOptions.nonanonymous()) {
|
if (mucOptions.isPrivateAndNonAnonymous()) {
|
||||||
fetchConferenceMembers(conversation);
|
fetchConferenceMembers(conversation);
|
||||||
if (followedInvite && conversation.getBookmark() == null) {
|
if (followedInvite && conversation.getBookmark() == null) {
|
||||||
saveConversationAsBookmark(conversation, null);
|
saveConversationAsBookmark(conversation, null);
|
||||||
|
@ -3432,15 +3432,15 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendReadMarker(final Conversation conversation) {
|
public void sendReadMarker(final Conversation conversation) {
|
||||||
final Message markable = conversation.getLatestMarkableMessage();
|
final boolean isPrivateAndNonAnonymousMuc = conversation.getMode() == Conversation.MODE_MULTI && conversation.isPrivateAndNonAnonymous();
|
||||||
|
final Message markable = conversation.getLatestMarkableMessage(isPrivateAndNonAnonymousMuc);
|
||||||
if (this.markRead(conversation)) {
|
if (this.markRead(conversation)) {
|
||||||
updateConversationUi();
|
updateConversationUi();
|
||||||
}
|
}
|
||||||
if (confirmMessages()
|
if (confirmMessages()
|
||||||
&& markable != null
|
&& markable != null
|
||||||
&& markable.trusted()
|
&& (markable.trusted() || isPrivateAndNonAnonymousMuc)
|
||||||
&& markable.getRemoteMsgId() != null
|
&& markable.getRemoteMsgId() != null) {
|
||||||
&& markable.getType() != Message.TYPE_PRIVATE) {
|
|
||||||
Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": sending read marker to " + markable.getCounterpart().toString());
|
Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": sending read marker to " + markable.getCounterpart().toString());
|
||||||
Account account = conversation.getAccount();
|
Account account = conversation.getAccount();
|
||||||
final Jid to = markable.getCounterpart();
|
final Jid to = markable.getCounterpart();
|
||||||
|
|
|
@ -1385,7 +1385,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
|
||||||
state = ChatState.PAUSED;
|
state = ChatState.PAUSED;
|
||||||
users = conversation.getMucOptions().getUsersWithChatState(state, 5);
|
users = conversation.getMucOptions().getUsersWithChatState(state, 5);
|
||||||
}
|
}
|
||||||
if (mucOptions.membersOnly() && mucOptions.nonanonymous()) {
|
if (mucOptions.isPrivateAndNonAnonymous()) {
|
||||||
for (int i = this.messageList.size() - 1; i >= 0; --i) {
|
for (int i = this.messageList.size() - 1; i >= 0; --i) {
|
||||||
final Set<ReadByMarker> markersForMessage = messageList.get(i).getReadByMarkers();
|
final Set<ReadByMarker> markersForMessage = messageList.get(i).getReadByMarkers();
|
||||||
final List<MucOptions.User> shownMarkers = new ArrayList<>();
|
final List<MucOptions.User> shownMarkers = new ArrayList<>();
|
||||||
|
|
Loading…
Reference in New Issue