handle app links

Daniel Gultsch created

invites in the form of https://conversations/i/localpart/domainpart

Change summary

src/main/AndroidManifest.xml                            |  9 ++++++++
src/main/java/eu/siacs/conversations/utils/XmppUri.java | 12 ++++++++--
2 files changed, 18 insertions(+), 3 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -76,6 +76,15 @@
 
                 <data android:scheme="xmpp"/>
             </intent-filter>
+            <intent-filter android:autoVerify="true">
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="https" />
+                <data android:host="conversations.im" />
+                <data android:pathPrefix="/i/"/>
+            </intent-filter>
+
         </activity>
         <activity
             android:name=".ui.WelcomeActivity"

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

@@ -4,6 +4,7 @@ import android.net.Uri;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.util.List;
 
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
@@ -32,8 +33,13 @@ public class XmppUri {
 
 	protected void parse(Uri uri) {
 		String scheme = uri.getScheme();
-		if ("xmpp".equalsIgnoreCase(scheme)) {
-			// sample: xmpp:jid@foo.com
+		String host = uri.getHost();
+		List<String> segments = uri.getPathSegments();
+		if ("https".equalsIgnoreCase(scheme) && "conversations.im".equalsIgnoreCase(host) && segments.size() >= 3) {
+			// sample : https://conversations.im/i/foo/bar.com
+			jid = segments.get(1)+"@"+segments.get(2);
+		} else if ("xmpp".equalsIgnoreCase(scheme)) {
+			// sample: xmpp:foo@bar.com
 			muc = "join".equalsIgnoreCase(uri.getQuery());
 			if (uri.getAuthority() != null) {
 				jid = uri.getAuthority();
@@ -42,7 +48,7 @@ public class XmppUri {
 			}
 			fingerprint = parseFingerprint(uri.getQuery());
 		} else if ("imto".equalsIgnoreCase(scheme)) {
-			// sample: imto://xmpp/jid@foo.com
+			// sample: imto://xmpp/foo@bar.com
 			try {
 				jid = URLDecoder.decode(uri.getEncodedPath(), "UTF-8").split("/")[1];
 			} catch (final UnsupportedEncodingException ignored) {