join muc even if initial conference configuration fetch failed

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java             | 31 
src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java | 14 
2 files changed, 43 insertions(+), 2 deletions(-)

Detailed changes

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

@@ -1683,8 +1683,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 		if (account.getStatus() == Account.State.ONLINE || now) {
 			conversation.resetMucOptions();
 			fetchConferenceConfiguration(conversation, new OnConferenceConfigurationFetched() {
-				@Override
-				public void onConferenceConfigurationFetched(Conversation conversation) {
+
+				private void join(Conversation conversation) {
 					Account account = conversation.getAccount();
 					final String nick = conversation.getMucOptions().getProposedNick();
 					final Jid joinJid = conversation.getMucOptions().createJoinJid(nick);
@@ -1723,6 +1723,27 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 						getMessageArchiveService().catchupMUC(conversation);
 					}
 				}
+
+				@Override
+				public void onConferenceConfigurationFetched(Conversation conversation) {
+					join(conversation);
+				}
+
+				@Override
+				public void onFetchFailed(final Conversation conversation, Element error) {
+					conversation.getMucOptions().setOnJoinListener(new MucOptions.OnJoinListener() {
+						@Override
+						public void onSuccess() {
+							fetchConferenceConfiguration(conversation);
+						}
+
+						@Override
+						public void onFailure() {
+
+						}
+					});
+					join(conversation);
+				}
 			});
 
 		} else {
@@ -1913,6 +1934,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 						callback.onConferenceConfigurationFetched(conversation);
 					}
 					updateConversationUi();
+				} else if (packet.getType() == IqPacket.TYPE.ERROR) {
+					if (callback != null) {
+						callback.onFetchFailed(conversation, packet.getError());
+					}
 				}
 			}
 		});
@@ -2901,6 +2926,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 
 	public interface OnConferenceConfigurationFetched {
 		void onConferenceConfigurationFetched(Conversation conversation);
+
+		void onFetchFailed(Conversation conversation, Element error);
 	}
 
 	public interface OnConferenceOptionsPushed {

src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java 🔗

@@ -1,5 +1,7 @@
 package eu.siacs.conversations.xmpp.stanzas;
 
+import eu.siacs.conversations.xml.Element;
+
 abstract public class AbstractAcknowledgeableStanza extends AbstractStanza {
 
 	protected AbstractAcknowledgeableStanza(String name) {
@@ -14,4 +16,16 @@ abstract public class AbstractAcknowledgeableStanza extends AbstractStanza {
 	public void setId(final String id) {
 		setAttribute("id", id);
 	}
+
+	public Element getError() {
+		Element error = findChild("error");
+		if (error != null) {
+			for(Element element : error.getChildren()) {
+				if (!element.getName().equals("text")) {
+					return element;
+				}
+			}
+		}
+		return null;
+	}
 }