Show status message when contact requests presence

Sam Whited created

Remove presence when conversation closed

Change summary

src/main/java/eu/siacs/conversations/entities/Message.java               |  2 
src/main/java/eu/siacs/conversations/parser/PresenceParser.java          | 16 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  7 
3 files changed, 22 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -171,7 +171,7 @@ public class Message extends AbstractEntity {
 	}
 
 	public static Message createStatusMessage(Conversation conversation, String body) {
-		Message message = new Message();
+		final Message message = new Message();
 		message.setType(Message.TYPE_STATUS);
 		message.setConversation(conversation);
 		message.setBody(body);

src/main/java/eu/siacs/conversations/parser/PresenceParser.java 🔗

@@ -6,6 +6,7 @@ import eu.siacs.conversations.crypto.PgpEngine;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.entities.MucOptions;
 import eu.siacs.conversations.entities.Presences;
 import eu.siacs.conversations.generator.PresenceGenerator;
@@ -44,8 +45,8 @@ public class PresenceParser extends AbstractParser implements
 		}
 	}
 
-	public void parseContactPresence(PresencePacket packet, Account account) {
-		PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator();
+	public void parseContactPresence(final PresencePacket packet, final Account account) {
+		final PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator();
 		final Jid from = packet.getFrom();
 		if (from == null) {
 			return;
@@ -93,6 +94,17 @@ public class PresenceParser extends AbstractParser implements
 						mPresenceGenerator.sendPresenceUpdatesTo(contact));
 			} else {
 				contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
+				final String statusMessage = packet.findChildContent("status");
+				if (statusMessage != null && !statusMessage.isEmpty()) {
+					final Conversation conversation = mXmppConnectionService.findOrCreateConversation(
+							account, contact.getJid().toBareJid(), false);
+					conversation.add(new Message(
+							conversation,
+							statusMessage,
+							Message.ENCRYPTION_NONE,
+							Message.STATUS_RECEIVED
+					));
+				}
 			}
 		}
 		mXmppConnectionService.updateRosterUi();

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -1322,6 +1322,13 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 				leaveMuc(conversation);
 			} else {
 				conversation.endOtrIfNeeded();
+				if (conversation.getContact().getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
+					Log.d(Config.LOGTAG, "Canceling presence request from " + conversation.getJid().toString());
+					sendPresencePacket(
+							conversation.getAccount(),
+							mPresenceGenerator.stopPresenceUpdatesTo(conversation.getContact())
+					);
+				}
 			}
 			this.databaseBackend.updateConversation(conversation);
 			this.conversations.remove(conversation);