try to recover conversation by shortcut id

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 22 
src/main/java/eu/siacs/conversations/services/AvatarService.java      | 10 
src/main/java/eu/siacs/conversations/services/ShortcutService.java    | 13 
src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java        | 26 
4 files changed, 56 insertions(+), 15 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -1656,6 +1656,28 @@ public class DatabaseBackend extends SQLiteOpenHelper {
         }
     }
 
+    public String findConversationUuid(final Jid account, final Jid jid) {
+        final SQLiteDatabase db = this.getReadableDatabase();
+        final String[] selectionArgs = {
+            account.getLocal(),
+            account.getDomain().toString(),
+            jid.asBareJid().toString() + "/%",
+            jid.asBareJid().toString()
+        };
+        try (final Cursor cursor =
+                db.rawQuery(
+                        "SELECT conversations.uuid FROM conversations JOIN accounts ON"
+                            + " conversations.accountUuid=accounts.uuid WHERE accounts.username=?"
+                            + " AND accounts.server=? AND (contactJid=? OR contactJid LIKE ?)",
+                        selectionArgs)) {
+            if (cursor.getCount() == 0) {
+                return null;
+            }
+            cursor.moveToFirst();
+            return cursor.getString(0);
+        }
+    }
+
     public void updateConversation(final Conversation conversation) {
         final SQLiteDatabase db = this.getWritableDatabase();
         final String[] args = {conversation.getUuid()};

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

@@ -342,7 +342,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
         return get(conversation, size, false);
     }
 
-    public Bitmap get(Conversation conversation, int size, boolean cachedOnly) {
+    public Bitmap get(final Conversation conversation, final int size, final boolean cachedOnly) {
         if (conversation.getMode() == Conversation.MODE_SINGLE) {
             return get(conversation.getContact(), size, cachedOnly);
         } else {
@@ -350,14 +350,6 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
         }
     }
 
-    public void clear(final Conversation conversation) {
-        if (conversation.getMode() == Conversation.MODE_SINGLE) {
-            clear(conversation.getContact());
-        } else {
-            clear(conversation.getMucOptions());
-        }
-    }
-
     private Bitmap get(final MucOptions mucOptions, final int size, final boolean cachedOnly) {
         final String KEY = key(mucOptions, size);
         Bitmap bitmap = this.mXmppConnectionService.getBitmapCache().get(KEY);

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

@@ -12,6 +12,7 @@ import androidx.annotation.NonNull;
 import androidx.core.content.pm.ShortcutInfoCompat;
 import androidx.core.content.pm.ShortcutManagerCompat;
 import androidx.core.graphics.drawable.IconCompat;
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -29,6 +30,8 @@ import java.util.List;
 
 public class ShortcutService {
 
+    public static final char ID_SEPARATOR = '#';
+
     private final XmppConnectionService xmppConnectionService;
     private final ReplacingSerialSingleThreadExecutor replacingSerialSingleThreadExecutor =
             new ReplacingSerialSingleThreadExecutor(ShortcutService.class.getSimpleName());
@@ -159,15 +162,17 @@ public class ShortcutService {
     }
 
     private static String getShortcutId(final Contact contact) {
-        return contact.getAccount().getJid().asBareJid().toString()
-                + "#"
-                + contact.getJid().asBareJid().toString();
+        return Joiner.on(ID_SEPARATOR)
+                .join(
+                        contact.getAccount().getJid().asBareJid().toString(),
+                        contact.getJid().asBareJid().toString());
     }
 
     private static String getShortcutId(final MucOptions mucOptions) {
         final Account account = mucOptions.getAccount();
         final Jid jid = mucOptions.getConversation().getJid();
-        return account.getJid().asBareJid().toString() + "#" + jid.asBareJid().toString();
+        return Joiner.on(ID_SEPARATOR)
+                .join(account.getJid().asBareJid().toString(), jid.asBareJid().toString());
     }
 
     private Intent getShortcutIntent(final MucOptions mucOptions) {

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

@@ -12,12 +12,16 @@ import androidx.annotation.NonNull;
 import androidx.core.content.pm.ShortcutManagerCompat;
 import androidx.databinding.DataBindingUtil;
 import androidx.recyclerview.widget.LinearLayoutManager;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.databinding.ActivityShareWithBinding;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.persistance.DatabaseBackend;
+import eu.siacs.conversations.services.ShortcutService;
 import eu.siacs.conversations.services.XmppConnectionService;
 import eu.siacs.conversations.ui.adapter.ConversationAdapter;
 import eu.siacs.conversations.xmpp.Jid;
@@ -132,10 +136,28 @@ public class ShareWithActivity extends XmppActivity
         if (shortcut.isPresent()) {
             final var extras = shortcut.get().getExtras();
             if (extras == null) {
-                return null;
+                return shortcutIdToConversationFallback(shortcutId);
             } else {
-                return extras.getString(ConversationsActivity.EXTRA_CONVERSATION);
+                final var conversation = extras.getString(ConversationsActivity.EXTRA_CONVERSATION);
+                if (Strings.isNullOrEmpty(conversation)) {
+                    return shortcutIdToConversationFallback(shortcutId);
+                } else {
+                    return conversation;
+                }
             }
+        } else {
+            return shortcutIdToConversationFallback(shortcutId);
+        }
+    }
+
+    private String shortcutIdToConversationFallback(final String shortcutId) {
+        final var parts =
+                Splitter.on(ShortcutService.ID_SEPARATOR).limit(2).splitToList(shortcutId);
+        if (parts.size() == 2) {
+            final var account = Jid.of(parts.get(0));
+            final var jid = Jid.of(parts.get(1));
+            final var database = DatabaseBackend.getInstance(getApplicationContext());
+            return database.findConversationUuid(account, jid);
         } else {
             return null;
         }