diff --git a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java index 4982a4463406e91fb9901fe39b0ea65be61b82dc..0ff55672cff82c01c0ad574cc62799fc0d91bc5e 100644 --- a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java +++ b/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()}; diff --git a/src/main/java/eu/siacs/conversations/services/AvatarService.java b/src/main/java/eu/siacs/conversations/services/AvatarService.java index 4f2bdc2d69ae128f2db524f28ceb61c60cb65d79..941914a92ea7b7a6abde01eda8b7615ba5aae6e6 100644 --- a/src/main/java/eu/siacs/conversations/services/AvatarService.java +++ b/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); diff --git a/src/main/java/eu/siacs/conversations/services/ShortcutService.java b/src/main/java/eu/siacs/conversations/services/ShortcutService.java index 132f7091200d3df424b50086f1bf8c2f6e84a008..b77020a231a40e39e8c94c3d1889aeaad2999931 100644 --- a/src/main/java/eu/siacs/conversations/services/ShortcutService.java +++ b/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) { diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index a081f3755a7db211a1a9334a58efe7831431afe7..b6937cbebc935c91fad3fa289790b4d5d2919a24 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/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; }