handle app links for conferences

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                             |  3 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 10 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java   | 21 
src/main/java/eu/siacs/conversations/utils/XmppUri.java                  |  1 
4 files changed, 28 insertions(+), 7 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -82,7 +82,8 @@
                 <category android:name="android.intent.category.BROWSABLE" />
                 <data android:scheme="https" />
                 <data android:host="conversations.im" />
-                <data android:pathPrefix="/i/"/>
+                <data android:pathPrefix="/i/" />
+                <data android:pathPrefix="/j/" />
             </intent-filter>
 
         </activity>

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

@@ -3124,6 +3124,16 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 		return contacts;
 	}
 
+	public Conversation findFirstMuc(Jid jid) {
+		for(Conversation conversation : getConversations()) {
+			if (conversation.getJid().toBareJid().equals(jid.toBareJid())
+					&& conversation.getMode() == Conversation.MODE_MULTI) {
+				return conversation;
+			}
+		}
+		return null;
+	}
+
 	public NotificationService getNotificationService() {
 		return this.mNotificationService;
 	}

src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java 🔗

@@ -846,7 +846,16 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 
 	private boolean handleJid(Invite invite) {
 		List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid());
-		if (contacts.size() == 0) {
+		if (invite.isMuc()) {
+			Conversation muc = xmppConnectionService.findFirstMuc(invite.getJid());
+			if (muc != null) {
+				switchToConversation(muc);
+				return true;
+			} else {
+				showJoinConferenceDialog(invite.getJid().toBareJid().toString());
+				return false;
+			}
+		} else if (contacts.size() == 0) {
 			showCreateContactDialog(invite.getJid().toString(),invite.getFingerprint());
 			return false;
 		} else if (contacts.size() == 1) {
@@ -1020,13 +1029,13 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 
 		boolean invite() {
 			if (jid != null) {
-				if (muc) {
-					showJoinConferenceDialog(jid);
-				} else {
-					return handleJid(this);
-				}
+				return handleJid(this);
 			}
 			return false;
 		}
+
+		public boolean isMuc() {
+			return muc;
+		}
 	}
 }

src/main/java/eu/siacs/conversations/utils/XmppUri.java 🔗

@@ -47,6 +47,7 @@ public class XmppUri {
 				// sample : https://conversations.im/i/foo/bar.com
 				jid = segments.get(1) + "@" + segments.get(2);
 			}
+			muc = segments.size() > 1 && "j".equalsIgnoreCase(segments.get(0));
 		} else if ("xmpp".equalsIgnoreCase(scheme)) {
 			// sample: xmpp:foo@bar.com
 			muc = "join".equalsIgnoreCase(uri.getQuery());