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
@@ -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()};
@@ -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);
@@ -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) {
@@ -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;
}