From d420c34a3175cbd5ea59480cf39ba597368b086d Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Sat, 24 Jun 2023 20:20:04 -0500 Subject: [PATCH] Allow exploring other channels on the same service as this channel --- .../services/ChannelDiscoveryService.java | 40 +++++++++---------- .../services/XmppConnectionService.java | 4 +- .../ui/ChannelDiscoveryActivity.java | 29 ++++++++++---- .../ui/ConferenceDetailsActivity.java | 5 +++ src/main/res/layout/activity_muc_details.xml | 26 +++++++++--- 5 files changed, 70 insertions(+), 34 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java b/src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java index 2f9553bfce714bda47f3e438da7fa96c76e65ebf..413b41ccee08aa27115a8014297103bfe759cc28 100644 --- a/src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java +++ b/src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java @@ -75,14 +75,15 @@ public class ChannelDiscoveryService { void discover( @NonNull final String query, Method method, + Map mucServices, OnChannelSearchResultsFound onChannelSearchResultsFound) { - final List result = cache.getIfPresent(key(method, query)); + final List result = cache.getIfPresent(key(method, mucServices, query)); if (result != null) { onChannelSearchResultsFound.onChannelSearchResultsFound(result); return; } if (method == Method.LOCAL_SERVER) { - discoverChannelsLocalServers(query, onChannelSearchResultsFound); + discoverChannelsLocalServers(query, mucServices, onChannelSearchResultsFound); } else { if (query.isEmpty()) { discoverChannelsJabberNetwork(onChannelSearchResultsFound); @@ -110,7 +111,7 @@ public class ChannelDiscoveryService { logError(response); return; } - cache.put(key(Method.JABBER_NETWORK, ""), body.items); + cache.put(key(Method.JABBER_NETWORK, null, ""), body.items); listener.onChannelSearchResultsFound(body.items); } @@ -149,7 +150,7 @@ public class ChannelDiscoveryService { logError(response); return; } - cache.put(key(Method.JABBER_NETWORK, query), body.result.items); + cache.put(key(Method.JABBER_NETWORK, null, query), body.result.items); listener.onChannelSearchResultsFound(body.result.items); } @@ -167,18 +168,18 @@ public class ChannelDiscoveryService { } private void discoverChannelsLocalServers( - final String query, final OnChannelSearchResultsFound listener) { - final Map localMucService = getLocalMucServices(); + final String query, Map mucServices, final OnChannelSearchResultsFound listener) { + final Map localMucService = mucServices == null ? getLocalMucServices() : mucServices; Log.d(Config.LOGTAG, "checking with " + localMucService.size() + " muc services"); if (localMucService.size() == 0) { listener.onChannelSearchResultsFound(Collections.emptyList()); return; } if (!query.isEmpty()) { - final List cached = cache.getIfPresent(key(Method.LOCAL_SERVER, "")); + final List cached = cache.getIfPresent(key(Method.LOCAL_SERVER, mucServices, "")); if (cached != null) { final List results = copyMatching(cached, query); - cache.put(key(Method.LOCAL_SERVER, query), results); + cache.put(key(Method.LOCAL_SERVER, mucServices, query), results); listener.onChannelSearchResultsFound(results); } } @@ -211,32 +212,30 @@ public class ChannelDiscoveryService { if (room != null) { rooms.add(room); } - if (queriesInFlight.decrementAndGet() <= 0) { - finishDiscoSearch(rooms, query, listener); - } - } else { - queriesInFlight.decrementAndGet(); + } + if (queriesInFlight.decrementAndGet() <= 0) { + finishDiscoSearch(rooms, query, mucServices, listener); } } - }); + }, 20L); } } if (queriesInFlight.decrementAndGet() <= 0) { - finishDiscoSearch(rooms, query, listener); + finishDiscoSearch(rooms, query, mucServices, listener); } }); } } private void finishDiscoSearch( - List rooms, String query, OnChannelSearchResultsFound listener) { + List rooms, String query, Map mucServices, OnChannelSearchResultsFound listener) { Collections.sort(rooms); - cache.put(key(Method.LOCAL_SERVER, ""), rooms); + cache.put(key(Method.LOCAL_SERVER, mucServices, ""), rooms); if (query.isEmpty()) { listener.onChannelSearchResultsFound(rooms); } else { List results = copyMatching(rooms, query); - cache.put(key(Method.LOCAL_SERVER, query), results); + cache.put(key(Method.LOCAL_SERVER, mucServices, query), results); listener.onChannelSearchResultsFound(rooms); } } @@ -270,8 +269,9 @@ public class ChannelDiscoveryService { return localMucServices; } - private static String key(Method method, String query) { - return String.format("%s\00%s", method, query); + private static String key(Method method, Map mucServices, String query) { + final String servicesKey = mucServices == null ? "\00" : String.join("\00", mucServices.keySet()); + return String.format("%s\00%s\00%s", method, servicesKey, query); } private static void logError(final Response response) { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 28c128254fd806a88a2a5bd76daf621736a8ee9d..4c2821c9110a61bcddd6a6e38eb3aa7e0f564a53 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1045,8 +1045,8 @@ public class XmppConnectionService extends Service { mChannelDiscoveryService.initializeMuclumbusService(); } - public void discoverChannels(String query, ChannelDiscoveryService.Method method, ChannelDiscoveryService.OnChannelSearchResultsFound onChannelSearchResultsFound) { - mChannelDiscoveryService.discover(Strings.nullToEmpty(query).trim(), method, onChannelSearchResultsFound); + public void discoverChannels(String query, ChannelDiscoveryService.Method method, Map mucServices, ChannelDiscoveryService.OnChannelSearchResultsFound onChannelSearchResultsFound) { + mChannelDiscoveryService.discover(Strings.nullToEmpty(query).trim(), method, mucServices, onChannelSearchResultsFound); } public boolean isDataSaverDisabled() { diff --git a/src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java b/src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java index 5cf9417e9f1b130ffc654beeeeefa42374bad168..b1d88fad479f379d81704c7e2fb45ce4c7f2bfbb 100644 --- a/src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java @@ -23,6 +23,7 @@ import androidx.databinding.DataBindingUtil; import com.google.common.base.Strings; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -52,7 +53,9 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O private MenuItem mMenuSearchView; private EditText mSearchEditText; + private String[] pendingServices = null; private ChannelDiscoveryService.Method method = ChannelDiscoveryService.Method.LOCAL_SERVER; + private HashMap mucServices = null; private boolean optedIn = false; @@ -63,6 +66,15 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O @Override void onBackendConnected() { + if (pendingServices != null) { + mucServices = new HashMap<>(); + for (int i = 0; i < pendingServices.length; i += 2) { + mucServices.put(Jid.of(pendingServices[i]), xmppConnectionService.findAccountByJid(Jid.of(pendingServices[i+1]))); + } + } + + this.method = getMethod(this); + if (optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) { final String query; if (mMenuSearchView != null && mMenuSearchView.isActionViewExpanded()) { @@ -71,7 +83,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O query = mInitialSearchValue.peek(); } toggleLoadingScreen(); - xmppConnectionService.discoverChannels(query, this.method, this); + xmppConnectionService.discoverChannels(query, this.method, this.mucServices, this); } } @@ -89,9 +101,12 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O if (search != null) { mInitialSearchValue.push(search); } + + pendingServices = getIntent().getStringArrayExtra("services"); } - private static ChannelDiscoveryService.Method getMethod(final Context c) { + private ChannelDiscoveryService.Method getMethod(final Context c) { + if (this.mucServices != null) return ChannelDiscoveryService.Method.LOCAL_SERVER; if ( Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) { return ChannelDiscoveryService.Method.LOCAL_SERVER; } @@ -121,7 +136,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O mSearchEditText.append(initialSearchValue); mSearchEditText.requestFocus(); if ((optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) && xmppConnectionService != null) { - xmppConnectionService.discoverChannels(initialSearchValue, this.method, this); + xmppConnectionService.discoverChannels(initialSearchValue, this.method, this.mucServices, this); } } mSearchEditText.setOnEditorActionListener(this); @@ -146,7 +161,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O mSearchEditText.setText(""); toggleLoadingScreen(); if (optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) { - xmppConnectionService.discoverChannels(null, this.method, this); + xmppConnectionService.discoverChannels(null, this.method, this.mucServices, this); } return true; } @@ -161,7 +176,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O public void onStart() { super.onStart(); this.method = getMethod(this); - if (!optedIn && method == ChannelDiscoveryService.Method.JABBER_NETWORK) { + if (pendingServices == null && !optedIn && method == ChannelDiscoveryService.Method.JABBER_NETWORK) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.channel_discovery_opt_in_title); builder.setMessage(Html.fromHtml(getString(R.string.channel_discover_opt_in_message))); @@ -201,7 +216,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O preferences.edit().putBoolean(CHANNEL_DISCOVERY_OPT_IN, true).apply(); optedIn = true; toggleLoadingScreen(); - xmppConnectionService.discoverChannels(null, this.method, this); + xmppConnectionService.discoverChannels(null, this.method, this.mucServices, this); } @Override @@ -209,7 +224,7 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O if (optedIn || method == ChannelDiscoveryService.Method.LOCAL_SERVER) { toggleLoadingScreen(); SoftKeyboardUtils.hideSoftKeyboard(this); - xmppConnectionService.discoverChannels(v.getText().toString(), this.method, this); + xmppConnectionService.discoverChannels(v.getText().toString(), this.method, this.mucServices, this); } return true; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 306d55fe6ba0cfb57c81258941ae106623576c58..305350afd8b2dc8afb20d57e75e1438f8e45cf20 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -229,6 +229,11 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers intent.putExtra("uuid", mConversation.getUuid()); startActivity(intent); }); + this.binding.relatedMucs.setOnClickListener(v -> { + final Intent intent = new Intent(this, ChannelDiscoveryActivity.class); + intent.putExtra("services", new String[]{ mConversation.getJid().getDomain().toEscapedString(), mConversation.getAccount().getJid().toEscapedString() }); + startActivity(intent); + }); } @Override diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml index 48b9d1a429741316880bf49c81e90d5f1bb15aed..e9febe0d360eefdefadc3387f086a4e85e0a0907 100644 --- a/src/main/res/layout/activity_muc_details.xml +++ b/src/main/res/layout/activity_muc_details.xml @@ -34,13 +34,14 @@ + android:paddingVertical="@dimen/card_padding_regular" + android:orientation="vertical"> + android:layout_marginBottom="32dp" + android:paddingHorizontal="@dimen/card_padding_regular"> + android:layout_height="wrap_content" + android:paddingHorizontal="@dimen/card_padding_regular"> @@ -226,12 +229,24 @@ +