From d8051973a5f9f1e439c6f7263a6b24ba8adf289e Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 31 May 2022 09:53:41 -0500 Subject: [PATCH] Default to conversation tab if there are unread messages --- .../siacs/conversations/entities/Contact.java | 7 ++++ .../conversations/entities/Conversation.java | 9 ++++ .../conversations/entities/Presences.java | 12 ++++++ .../ui/ConversationFragment.java | 41 ++++++++----------- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Contact.java b/src/main/java/eu/siacs/conversations/entities/Contact.java index ffdd73cf3bec626686b99b4a5500ff90d592ae21..cb66538c55ea8ffb13968334997d26cfe23cc8f7 100644 --- a/src/main/java/eu/siacs/conversations/entities/Contact.java +++ b/src/main/java/eu/siacs/conversations/entities/Contact.java @@ -292,6 +292,13 @@ public class Contact implements ListItem, Blockable { return this.presences.getShownStatus(); } + public Jid resourceWhichSupport(final String namespace) { + final String resource = getPresences().firstWhichSupport(namespace); + if (resource == null) return null; + + return resource.equals("") ? getJid() : getJid().withResource(resource); + } + public boolean setPhotoUri(String uri) { if (uri != null && !uri.equals(this.photoUri)) { this.photoUri = uri; diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 8bb65cc0f57ab3f0992f80c8f3ce41d0baba12c8..3e6cdcaf8d57c6f9a9e520b8636cb9ea2efa7589 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -30,6 +30,7 @@ import eu.siacs.conversations.services.QuickConversationsService; import eu.siacs.conversations.utils.JidHelper; import eu.siacs.conversations.utils.MessageUtils; import eu.siacs.conversations.utils.UIHelper; +import eu.siacs.conversations.xml.Namespace; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.mam.MamReference; @@ -1109,6 +1110,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl return getName().toString(); } + public int getCurrentTab() { + if (!isRead() || getContact().resourceWhichSupport(Namespace.COMMANDS) == null) { + return 0; + } + + return 1; + } + public interface OnMessageFound { void onMessageFound(final Message message); } diff --git a/src/main/java/eu/siacs/conversations/entities/Presences.java b/src/main/java/eu/siacs/conversations/entities/Presences.java index 4753e2138f7e4949a00d2180e2253f5434c2a78f..97560bd2d1dd9809011a6a10995dace11ef07361 100644 --- a/src/main/java/eu/siacs/conversations/entities/Presences.java +++ b/src/main/java/eu/siacs/conversations/entities/Presences.java @@ -149,6 +149,18 @@ public class Presences { return false; } + public String firstWhichSupport(final String namespace) { + for (Map.Entry entry : this.presences.entrySet()) { + String resource = entry.getKey(); + Presence presence = entry.getValue(); + if (presence.getServiceDiscoveryResult().getFeatures().contains(namespace)) { + return resource; + } + } + + return null; + } + public boolean anyIdentity(final String category, final String type) { synchronized (this.presences) { if (this.presences.size() == 0) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index da24f5a344dcf024e0ed21fadbcee821b9807b78..6d450de861e6094ceb232e4aa983a81b4aaa2ab6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1247,33 +1247,26 @@ public class ConversationFragment extends XmppFragment binding.conversationViewPager )); binding.tabLayout.setupWithViewPager(binding.conversationViewPager); + binding.conversationViewPager.setCurrentItem(conversation.getCurrentTab()); commandAdapter = new CommandAdapter((XmppActivity) getActivity()); binding.commandsView.setAdapter(commandAdapter); - Presences presences = conversation.getContact().getPresences(); - for (Map.Entry entry : presences.getPresencesMap().entrySet()) { - String resource = entry.getKey(); - Presence presence = entry.getValue(); - if (presence.getServiceDiscoveryResult().getFeatures().contains("http://jabber.org/protocol/commands")) { - binding.tabLayout.setVisibility(View.VISIBLE); - binding.conversationViewPager.setCurrentItem(1); - Jid jid = conversation.getContact().getJid(); - if (resource != null && !resource.equals("")) jid = jid.withResource(resource); - activity.xmppConnectionService.fetchCommands(conversation.getAccount(), jid, (a, iq) -> { - if (iq.getType() == IqPacket.TYPE.RESULT) { - activity.runOnUiThread(() -> { - for (Element child : iq.query().getChildren()) { - if (!"item".equals(child.getName()) || !Namespace.DISCO_ITEMS.equals(child.getNamespace())) continue; - commandAdapter.add(child); - } - }); - } else { - binding.tabLayout.setVisibility(View.GONE); - binding.conversationViewPager.setCurrentItem(0); - } - }); - break; - } + Jid commandJid = conversation.getContact().resourceWhichSupport(Namespace.COMMANDS); + if (commandJid != null) { + binding.tabLayout.setVisibility(View.VISIBLE); + activity.xmppConnectionService.fetchCommands(conversation.getAccount(), commandJid, (a, iq) -> { + if (iq.getType() == IqPacket.TYPE.RESULT) { + activity.runOnUiThread(() -> { + for (Element child : iq.query().getChildren()) { + if (!"item".equals(child.getName()) || !Namespace.DISCO_ITEMS.equals(child.getNamespace())) continue; + commandAdapter.add(child); + } + }); + } else { + binding.tabLayout.setVisibility(View.GONE); + binding.conversationViewPager.setCurrentItem(0); + } + }); } return binding.getRoot();