M src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java => src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java +20 -20
@@ 75,14 75,15 @@ public class ChannelDiscoveryService {
void discover(
@NonNull final String query,
Method method,
+ Map<Jid, Account> mucServices,
OnChannelSearchResultsFound onChannelSearchResultsFound) {
- final List<Room> result = cache.getIfPresent(key(method, query));
+ final List<Room> 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<Jid, Account> localMucService = getLocalMucServices();
+ final String query, Map<Jid, Account> mucServices, final OnChannelSearchResultsFound listener) {
+ final Map<Jid, Account> 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<Room> cached = cache.getIfPresent(key(Method.LOCAL_SERVER, ""));
+ final List<Room> cached = cache.getIfPresent(key(Method.LOCAL_SERVER, mucServices, ""));
if (cached != null) {
final List<Room> 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<Room> rooms, String query, OnChannelSearchResultsFound listener) {
+ List<Room> rooms, String query, Map<Jid, Account> 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<Room> 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<Jid, Account> 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) {
M src/main/java/eu/siacs/conversations/services/XmppConnectionService.java => src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +2 -2
@@ 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<Jid, Account> mucServices, ChannelDiscoveryService.OnChannelSearchResultsFound onChannelSearchResultsFound) {
+ mChannelDiscoveryService.discover(Strings.nullToEmpty(query).trim(), method, mucServices, onChannelSearchResultsFound);
}
public boolean isDataSaverDisabled() {
M src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java => src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java +22 -7
@@ 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<Jid, Account> 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;
}
M src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java => src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +5 -0
@@ 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
M src/main/res/layout/activity_muc_details.xml => src/main/res/layout/activity_muc_details.xml +21 -5
@@ 34,13 34,14 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="@dimen/card_padding_regular">
+ android:paddingVertical="@dimen/card_padding_regular"
+ android:orientation="vertical">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="32dp">
+ android:layout_marginBottom="32dp"
+ android:paddingHorizontal="@dimen/card_padding_regular">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/your_photo"
@@ 166,7 167,8 @@
<RelativeLayout
android:id="@+id/muc_settings"
android:layout_width="fill_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:paddingHorizontal="@dimen/card_padding_regular">
<TextView
android:id="@+id/muc_conference_type"
@@ 198,6 200,7 @@
android:id="@+id/muc_info_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:paddingHorizontal="@dimen/card_padding_regular"
android:shrinkColumns="0"
android:stretchColumns="1"
android:visibility="gone">
@@ 226,12 229,24 @@
</TableLayout>
+ <Button
+ android:id="@+id/relatedMucs"
+ style="@style/Widget.Conversations.Button.Borderless"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end"
+ android:minWidth="0dp"
+ android:layout_marginTop="32dp"
+ android:layout_marginRight="4dp"
+ android:text="Related Chats"
+ android:textColor="?attr/colorAccent" />
+
<TextView
android:id="@+id/jid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
- android:layout_marginTop="32dp"
+ android:paddingHorizontal="@dimen/card_padding_regular"
android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
<TextView
@@ 240,6 255,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
+ android:paddingHorizontal="@dimen/card_padding_regular"
android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
</LinearLayout>
</androidx.cardview.widget.CardView>