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}