ChannelDiscoveryService.java

  1package eu.siacs.conversations.services;
  2
  3import android.util.Log;
  4
  5import com.google.common.cache.Cache;
  6import com.google.common.cache.CacheBuilder;
  7import com.google.common.cache.CacheLoader;
  8import com.google.common.cache.LoadingCache;
  9
 10import java.util.List;
 11import java.util.concurrent.Executors;
 12import java.util.concurrent.TimeUnit;
 13
 14import eu.siacs.conversations.Config;
 15import eu.siacs.conversations.http.services.MuclumbusService;
 16import retrofit2.Call;
 17import retrofit2.Callback;
 18import retrofit2.Response;
 19import retrofit2.Retrofit;
 20import retrofit2.converter.gson.GsonConverterFactory;
 21
 22public class ChannelDiscoveryService {
 23
 24    private final XmppConnectionService service;
 25
 26
 27    private final MuclumbusService muclumbusService;
 28
 29    private final Cache<String, List<MuclumbusService.Room>> cache;
 30
 31    public ChannelDiscoveryService(XmppConnectionService service) {
 32        this.service = service;
 33        Retrofit retrofit = new Retrofit.Builder()
 34                .baseUrl(Config.CHANNEL_DISCOVERY)
 35                .addConverterFactory(GsonConverterFactory.create())
 36                .callbackExecutor(Executors.newSingleThreadExecutor())
 37                .build();
 38        this.muclumbusService = retrofit.create(MuclumbusService.class);
 39        this.cache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build();
 40    }
 41
 42    public void discover(String query, OnChannelSearchResultsFound onChannelSearchResultsFound) {
 43        final boolean all = query == null || query.trim().isEmpty();
 44        Log.d(Config.LOGTAG, "discover channels. query=" + query);
 45        List<MuclumbusService.Room> result = cache.getIfPresent(all ? "" : query);
 46        if (result != null) {
 47            onChannelSearchResultsFound.onChannelSearchResultsFound(result);
 48            return;
 49        }
 50        if (all) {
 51            discoverChannels(onChannelSearchResultsFound);
 52        } else {
 53            discoverChannels(query, onChannelSearchResultsFound);
 54        }
 55    }
 56
 57    private void discoverChannels(OnChannelSearchResultsFound listener) {
 58        Call<MuclumbusService.Rooms> call = muclumbusService.getRooms(1);
 59        try {
 60            call.enqueue(new Callback<MuclumbusService.Rooms>() {
 61                @Override
 62                public void onResponse(Call<MuclumbusService.Rooms> call, Response<MuclumbusService.Rooms> response) {
 63                    final MuclumbusService.Rooms body = response.body();
 64                    if (body == null) {
 65                        return;
 66                    }
 67                    cache.put("", body.items);
 68                    listener.onChannelSearchResultsFound(body.items);
 69                }
 70
 71                @Override
 72                public void onFailure(Call<MuclumbusService.Rooms> call, Throwable throwable) {
 73
 74                }
 75            });
 76        } catch (Exception e) {
 77            e.printStackTrace();
 78        }
 79    }
 80
 81    private void discoverChannels(final String query, OnChannelSearchResultsFound listener) {
 82        Call<MuclumbusService.SearchResult> searchResultCall = muclumbusService.search(new MuclumbusService.SearchRequest(query));
 83
 84        searchResultCall.enqueue(new Callback<MuclumbusService.SearchResult>() {
 85            @Override
 86            public void onResponse(Call<MuclumbusService.SearchResult> call, Response<MuclumbusService.SearchResult> response) {
 87                System.out.println(response.message());
 88                MuclumbusService.SearchResult body = response.body();
 89                if (body == null) {
 90                    return;
 91                }
 92                cache.put(query, body.result.items);
 93                listener.onChannelSearchResultsFound(body.result.items);
 94            }
 95
 96            @Override
 97            public void onFailure(Call<MuclumbusService.SearchResult> call, Throwable throwable) {
 98                throwable.printStackTrace();
 99            }
100        });
101    }
102
103    public interface OnChannelSearchResultsFound {
104        void onChannelSearchResultsFound(List<MuclumbusService.Room> results);
105    }
106}