self ping (xep-0410) after receiving invite to muc
This commit is contained in:
		
							parent
							
								
									e432710a3f
								
							
						
					
					
						commit
						6862b60c3f
					
				|  | @ -869,7 +869,10 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece | ||||||
|         public boolean execute(Account account) { |         public boolean execute(Account account) { | ||||||
|             if (jid != null) { |             if (jid != null) { | ||||||
|                 Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid, true, false); |                 Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid, true, false); | ||||||
|                 if (!conversation.getMucOptions().online()) { |                 if (conversation.getMucOptions().online()) { | ||||||
|  |                     Log.d(Config.LOGTAG,account.getJid().asBareJid()+": received invite to "+jid+" but muc is considered to be online"); | ||||||
|  |                     mXmppConnectionService.mucSelfPingAndRejoin(conversation); | ||||||
|  |                 } else { | ||||||
|                     conversation.getMucOptions().setPassword(password); |                     conversation.getMucOptions().setPassword(password); | ||||||
|                     mXmppConnectionService.databaseBackend.updateConversation(conversation); |                     mXmppConnectionService.databaseBackend.updateConversation(conversation); | ||||||
|                     mXmppConnectionService.joinMuc(conversation, inviter != null && inviter.mutualPresenceSubscription()); |                     mXmppConnectionService.joinMuc(conversation, inviter != null && inviter.mutualPresenceSubscription()); | ||||||
|  |  | ||||||
|  | @ -1974,7 +1974,7 @@ public class XmppConnectionService extends Service { | ||||||
| 	    archiveConversation(conversation, true); | 	    archiveConversation(conversation, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 	private void archiveConversation(Conversation conversation, final boolean maySyncronizeWithBookmarks) { | 	private void archiveConversation(Conversation conversation, final boolean maySynchronizeWithBookmarks) { | ||||||
| 		getNotificationService().clear(conversation); | 		getNotificationService().clear(conversation); | ||||||
| 		conversation.setStatus(Conversation.STATUS_ARCHIVED); | 		conversation.setStatus(Conversation.STATUS_ARCHIVED); | ||||||
| 		conversation.setNextMessage(null); | 		conversation.setNextMessage(null); | ||||||
|  | @ -1983,7 +1983,7 @@ public class XmppConnectionService extends Service { | ||||||
| 			if (conversation.getMode() == Conversation.MODE_MULTI) { | 			if (conversation.getMode() == Conversation.MODE_MULTI) { | ||||||
| 				if (conversation.getAccount().getStatus() == Account.State.ONLINE) { | 				if (conversation.getAccount().getStatus() == Account.State.ONLINE) { | ||||||
| 					Bookmark bookmark = conversation.getBookmark(); | 					Bookmark bookmark = conversation.getBookmark(); | ||||||
| 					if (maySyncronizeWithBookmarks && bookmark != null && synchronizeWithBookmarks()) { | 					if (maySynchronizeWithBookmarks && bookmark != null && synchronizeWithBookmarks()) { | ||||||
| 						if (conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) { | 						if (conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) { | ||||||
| 							Account account = bookmark.getAccount(); | 							Account account = bookmark.getAccount(); | ||||||
| 							bookmark.setConversation(null); | 							bookmark.setConversation(null); | ||||||
|  | @ -2431,6 +2431,26 @@ public class XmppConnectionService extends Service { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public void mucSelfPingAndRejoin(final Conversation conversation) { | ||||||
|  | 	    final Jid self = conversation.getMucOptions().getSelf().getFullJid(); | ||||||
|  | 	    final IqPacket ping = new IqPacket(IqPacket.TYPE.GET); | ||||||
|  | 	    ping.setTo(self); | ||||||
|  | 	    ping.addChild("ping", Namespace.PING); | ||||||
|  | 	    sendIqPacket(conversation.getAccount(), ping, (account, response) -> { | ||||||
|  | 	        if (response.getType() == IqPacket.TYPE.ERROR) { | ||||||
|  | 	            Element error = response.findChild("error"); | ||||||
|  | 	            if (error == null || error.hasChild("service-unavailable") || error.hasChild("feature-not-implemented") || error.hasChild("item-not-found")) { | ||||||
|  | 	                Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ping to "+self+" came back as ignorable error"); | ||||||
|  |                 } else { | ||||||
|  | 	                Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ping to "+self+" failed. attempting rejoin"); | ||||||
|  | 	                joinMuc(conversation); | ||||||
|  |                 } | ||||||
|  |             } else if (response.getType() == IqPacket.TYPE.RESULT) { | ||||||
|  | 	            Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ping to "+self+" came back fine"); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| 	public void joinMuc(Conversation conversation) { | 	public void joinMuc(Conversation conversation) { | ||||||
| 		joinMuc(conversation, null, false); | 		joinMuc(conversation, null, false); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -27,4 +27,5 @@ public final class Namespace { | ||||||
| 	public static final String AVATAR_CONVERSION = "urn:xmpp:pep-vcard-conversion:0"; | 	public static final String AVATAR_CONVERSION = "urn:xmpp:pep-vcard-conversion:0"; | ||||||
| 	public static final String JINGLE_TRANSPORTS_S5B = "urn:xmpp:jingle:transports:s5b:1"; | 	public static final String JINGLE_TRANSPORTS_S5B = "urn:xmpp:jingle:transports:s5b:1"; | ||||||
| 	public static final String JINGLE_TRANSPORTS_IBB = "urn:xmpp:jingle:transports:ibb:1"; | 	public static final String JINGLE_TRANSPORTS_IBB = "urn:xmpp:jingle:transports:ibb:1"; | ||||||
|  | 	public static final String PING = "urn:xmpp:ping"; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1417,7 +1417,7 @@ public class XmppConnection implements Runnable { | ||||||
|         if (!r()) { |         if (!r()) { | ||||||
|             final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); |             final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); | ||||||
|             iq.setFrom(account.getJid()); |             iq.setFrom(account.getJid()); | ||||||
|             iq.addChild("ping", "urn:xmpp:ping"); |             iq.addChild("ping", Namespace.PING); | ||||||
|             this.sendIqPacket(iq, null); |             this.sendIqPacket(iq, null); | ||||||
|         } |         } | ||||||
|         this.lastPingSent = SystemClock.elapsedRealtime(); |         this.lastPingSent = SystemClock.elapsedRealtime(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Daniel Gultsch
						Daniel Gultsch