make it easier to disable muclumbus in Config

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java | 208 
src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java      |   5 
src/main/java/eu/siacs/conversations/ui/SettingsActivity.java              |  18 
3 files changed, 142 insertions(+), 89 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/ChannelDiscoveryService.java 🔗

@@ -4,6 +4,7 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.google.common.base.Strings;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 
@@ -39,7 +40,6 @@ public class ChannelDiscoveryService {
 
     private final XmppConnectionService service;
 
-
     private MuclumbusService muclumbusService;
 
     private final Cache<String, List<Room>> cache;
@@ -50,16 +50,21 @@ public class ChannelDiscoveryService {
     }
 
     void initializeMuclumbusService() {
+        if (Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) {
+            this.muclumbusService = null;
+            return;
+        }
         final OkHttpClient.Builder builder = HttpConnectionManager.OK_HTTP_CLIENT.newBuilder();
         if (service.useTorToConnect()) {
             builder.proxy(HttpConnectionManager.getProxy());
         }
-        Retrofit retrofit = new Retrofit.Builder()
-                .client(builder.build())
-                .baseUrl(Config.CHANNEL_DISCOVERY)
-                .addConverterFactory(GsonConverterFactory.create())
-                .callbackExecutor(Executors.newSingleThreadExecutor())
-                .build();
+        final Retrofit retrofit =
+                new Retrofit.Builder()
+                        .client(builder.build())
+                        .baseUrl(Config.CHANNEL_DISCOVERY)
+                        .addConverterFactory(GsonConverterFactory.create())
+                        .callbackExecutor(Executors.newSingleThreadExecutor())
+                        .build();
         this.muclumbusService = retrofit.create(MuclumbusService.class);
     }
 
@@ -67,7 +72,10 @@ public class ChannelDiscoveryService {
         cache.invalidateAll();
     }
 
-    void discover(@NonNull final String query, Method method, OnChannelSearchResultsFound onChannelSearchResultsFound) {
+    void discover(
+            @NonNull final String query,
+            Method method,
+            OnChannelSearchResultsFound onChannelSearchResultsFound) {
         final List<Room> result = cache.getIfPresent(key(method, query));
         if (result != null) {
             onChannelSearchResultsFound.onChannelSearchResultsFound(result);
@@ -84,59 +92,82 @@ public class ChannelDiscoveryService {
         }
     }
 
-    private void discoverChannelsJabberNetwork(OnChannelSearchResultsFound listener) {
-        Call<MuclumbusService.Rooms> call = muclumbusService.getRooms(1);
-        try {
-            call.enqueue(new Callback<MuclumbusService.Rooms>() {
-                @Override
-                public void onResponse(@NonNull Call<MuclumbusService.Rooms> call, @NonNull Response<MuclumbusService.Rooms> response) {
-                    final MuclumbusService.Rooms body = response.body();
-                    if (body == null) {
-                        listener.onChannelSearchResultsFound(Collections.emptyList());
-                        logError(response);
-                        return;
+    private void discoverChannelsJabberNetwork(final OnChannelSearchResultsFound listener) {
+        if (muclumbusService == null) {
+            listener.onChannelSearchResultsFound(Collections.emptyList());
+            return;
+        }
+        final Call<MuclumbusService.Rooms> call = muclumbusService.getRooms(1);
+        call.enqueue(
+                new Callback<MuclumbusService.Rooms>() {
+                    @Override
+                    public void onResponse(
+                            @NonNull Call<MuclumbusService.Rooms> call,
+                            @NonNull Response<MuclumbusService.Rooms> response) {
+                        final MuclumbusService.Rooms body = response.body();
+                        if (body == null) {
+                            listener.onChannelSearchResultsFound(Collections.emptyList());
+                            logError(response);
+                            return;
+                        }
+                        cache.put(key(Method.JABBER_NETWORK, ""), body.items);
+                        listener.onChannelSearchResultsFound(body.items);
                     }
-                    cache.put(key(Method.JABBER_NETWORK, ""), body.items);
-                    listener.onChannelSearchResultsFound(body.items);
-                }
 
-                @Override
-                public void onFailure(@NonNull Call<MuclumbusService.Rooms> call, @NonNull Throwable throwable) {
-                    Log.d(Config.LOGTAG, "Unable to query muclumbus on " + Config.CHANNEL_DISCOVERY, throwable);
-                    listener.onChannelSearchResultsFound(Collections.emptyList());
-                }
-            });
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+                    @Override
+                    public void onFailure(
+                            @NonNull Call<MuclumbusService.Rooms> call,
+                            @NonNull Throwable throwable) {
+                        Log.d(
+                                Config.LOGTAG,
+                                "Unable to query muclumbus on " + Config.CHANNEL_DISCOVERY,
+                                throwable);
+                        listener.onChannelSearchResultsFound(Collections.emptyList());
+                    }
+                });
     }
 
-    private void discoverChannelsJabberNetwork(final String query, OnChannelSearchResultsFound listener) {
-        MuclumbusService.SearchRequest searchRequest = new MuclumbusService.SearchRequest(query);
-        Call<MuclumbusService.SearchResult> searchResultCall = muclumbusService.search(searchRequest);
-
-        searchResultCall.enqueue(new Callback<MuclumbusService.SearchResult>() {
-            @Override
-            public void onResponse(@NonNull Call<MuclumbusService.SearchResult> call, @NonNull Response<MuclumbusService.SearchResult> response) {
-                final MuclumbusService.SearchResult body = response.body();
-                if (body == null) {
-                    listener.onChannelSearchResultsFound(Collections.emptyList());
-                    logError(response);
-                    return;
-                }
-                cache.put(key(Method.JABBER_NETWORK, query), body.result.items);
-                listener.onChannelSearchResultsFound(body.result.items);
-            }
+    private void discoverChannelsJabberNetwork(
+            final String query, final OnChannelSearchResultsFound listener) {
+        if (muclumbusService == null) {
+            listener.onChannelSearchResultsFound(Collections.emptyList());
+            return;
+        }
+        final MuclumbusService.SearchRequest searchRequest =
+                new MuclumbusService.SearchRequest(query);
+        final Call<MuclumbusService.SearchResult> searchResultCall =
+                muclumbusService.search(searchRequest);
+        searchResultCall.enqueue(
+                new Callback<MuclumbusService.SearchResult>() {
+                    @Override
+                    public void onResponse(
+                            @NonNull Call<MuclumbusService.SearchResult> call,
+                            @NonNull Response<MuclumbusService.SearchResult> response) {
+                        final MuclumbusService.SearchResult body = response.body();
+                        if (body == null) {
+                            listener.onChannelSearchResultsFound(Collections.emptyList());
+                            logError(response);
+                            return;
+                        }
+                        cache.put(key(Method.JABBER_NETWORK, query), body.result.items);
+                        listener.onChannelSearchResultsFound(body.result.items);
+                    }
 
-            @Override
-            public void onFailure(@NonNull Call<MuclumbusService.SearchResult> call, @NonNull Throwable throwable) {
-                Log.d(Config.LOGTAG, "Unable to query muclumbus on " + Config.CHANNEL_DISCOVERY, throwable);
-                listener.onChannelSearchResultsFound(Collections.emptyList());
-            }
-        });
+                    @Override
+                    public void onFailure(
+                            @NonNull Call<MuclumbusService.SearchResult> call,
+                            @NonNull Throwable throwable) {
+                        Log.d(
+                                Config.LOGTAG,
+                                "Unable to query muclumbus on " + Config.CHANNEL_DISCOVERY,
+                                throwable);
+                        listener.onChannelSearchResultsFound(Collections.emptyList());
+                    }
+                });
     }
 
-    private void discoverChannelsLocalServers(final String query, final OnChannelSearchResultsFound listener) {
+    private void discoverChannelsLocalServers(
+            final String query, final OnChannelSearchResultsFound listener) {
         final Map<Jid, Account> localMucService = getLocalMucServices();
         Log.d(Config.LOGTAG, "checking with " + localMucService.size() + " muc services");
         if (localMucService.size() == 0) {
@@ -156,38 +187,49 @@ public class ChannelDiscoveryService {
         for (Map.Entry<Jid, Account> entry : localMucService.entrySet()) {
             IqPacket itemsRequest = service.getIqGenerator().queryDiscoItems(entry.getKey());
             queriesInFlight.incrementAndGet();
-            service.sendIqPacket(entry.getValue(), itemsRequest, (account, itemsResponse) -> {
-                if (itemsResponse.getType() == IqPacket.TYPE.RESULT) {
-                    final List<Jid> items = IqParser.items(itemsResponse);
-                    for (Jid item : items) {
-                        IqPacket infoRequest = service.getIqGenerator().queryDiscoInfo(item);
-                        queriesInFlight.incrementAndGet();
-                        service.sendIqPacket(account, infoRequest, new OnIqPacketReceived() {
-                            @Override
-                            public void onIqPacketReceived(Account account, IqPacket infoResponse) {
-                                if (infoResponse.getType() == IqPacket.TYPE.RESULT) {
-                                    final Room room = IqParser.parseRoom(infoResponse);
-                                    if (room != null) {
-                                        rooms.add(room);
-                                    }
-                                    if (queriesInFlight.decrementAndGet() <= 0) {
-                                        finishDiscoSearch(rooms, query, listener);
-                                    }
-                                } else {
-                                    queriesInFlight.decrementAndGet();
-                                }
+            service.sendIqPacket(
+                    entry.getValue(),
+                    itemsRequest,
+                    (account, itemsResponse) -> {
+                        if (itemsResponse.getType() == IqPacket.TYPE.RESULT) {
+                            final List<Jid> items = IqParser.items(itemsResponse);
+                            for (Jid item : items) {
+                                IqPacket infoRequest =
+                                        service.getIqGenerator().queryDiscoInfo(item);
+                                queriesInFlight.incrementAndGet();
+                                service.sendIqPacket(
+                                        account,
+                                        infoRequest,
+                                        new OnIqPacketReceived() {
+                                            @Override
+                                            public void onIqPacketReceived(
+                                                    Account account, IqPacket infoResponse) {
+                                                if (infoResponse.getType()
+                                                        == IqPacket.TYPE.RESULT) {
+                                                    final Room room =
+                                                            IqParser.parseRoom(infoResponse);
+                                                    if (room != null) {
+                                                        rooms.add(room);
+                                                    }
+                                                    if (queriesInFlight.decrementAndGet() <= 0) {
+                                                        finishDiscoSearch(rooms, query, listener);
+                                                    }
+                                                } else {
+                                                    queriesInFlight.decrementAndGet();
+                                                }
+                                            }
+                                        });
                             }
-                        });
-                    }
-                }
-                if (queriesInFlight.decrementAndGet() <= 0) {
-                    finishDiscoSearch(rooms, query, listener);
-                }
-            });
+                        }
+                        if (queriesInFlight.decrementAndGet() <= 0) {
+                            finishDiscoSearch(rooms, query, listener);
+                        }
+                    });
         }
     }
 
-    private void finishDiscoSearch(List<Room> rooms, String query, OnChannelSearchResultsFound listener) {
+    private void finishDiscoSearch(
+            List<Room> rooms, String query, OnChannelSearchResultsFound listener) {
         Collections.sort(rooms);
         cache.put(key(Method.LOCAL_SERVER, ""), rooms);
         if (query.isEmpty()) {
@@ -241,7 +283,7 @@ public class ChannelDiscoveryService {
         try {
             Log.d(Config.LOGTAG, "error body=" + errorBody.string());
         } catch (IOException e) {
-            //ignored
+            // ignored
         }
     }
 

src/main/java/eu/siacs/conversations/ui/ChannelDiscoveryActivity.java 🔗

@@ -20,6 +20,8 @@ import android.widget.Toast;
 
 import androidx.databinding.DataBindingUtil;
 
+import com.google.common.base.Strings;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
@@ -90,6 +92,9 @@ public class ChannelDiscoveryActivity extends XmppActivity implements MenuItem.O
     }
 
     private static ChannelDiscoveryService.Method getMethod(final Context c) {
+        if ( Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) {
+            return ChannelDiscoveryService.Method.LOCAL_SERVER;
+        }
         if (QuickConversationsService.isQuicksy()) {
             return ChannelDiscoveryService.Method.JABBER_NETWORK;
         }

src/main/java/eu/siacs/conversations/ui/SettingsActivity.java 🔗

@@ -23,6 +23,8 @@ import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.core.content.ContextCompat;
 
+import com.google.common.base.Strings;
+
 import java.io.File;
 import java.security.KeyStoreException;
 import java.util.ArrayList;
@@ -96,20 +98,24 @@ public class SettingsActivity extends XmppActivity implements OnSharedPreference
 
         changeOmemoSettingSummary();
 
-        if (QuickConversationsService.isQuicksy()) {
-            final PreferenceCategory connectionOptions =
-                    (PreferenceCategory) mSettingsFragment.findPreference("connection_options");
+        if (QuickConversationsService.isQuicksy()
+                || Strings.isNullOrEmpty(Config.CHANNEL_DISCOVERY)) {
             final PreferenceCategory groupChats =
                     (PreferenceCategory) mSettingsFragment.findPreference("group_chats");
             final Preference channelDiscoveryMethod =
                     mSettingsFragment.findPreference("channel_discovery_method");
+            if (groupChats != null && channelDiscoveryMethod != null) {
+                groupChats.removePreference(channelDiscoveryMethod);
+            }
+        }
+
+        if (QuickConversationsService.isQuicksy()) {
+            final PreferenceCategory connectionOptions =
+                    (PreferenceCategory) mSettingsFragment.findPreference("connection_options");
             PreferenceScreen expert = (PreferenceScreen) mSettingsFragment.findPreference("expert");
             if (connectionOptions != null) {
                 expert.removePreference(connectionOptions);
             }
-            if (groupChats != null && channelDiscoveryMethod != null) {
-                groupChats.removePreference(channelDiscoveryMethod);
-            }
         }
 
         PreferenceScreen mainPreferenceScreen =