aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/services
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2019-04-26 23:12:05 +0200
committerChristian Schneppe <christian@pix-art.de>2019-04-26 23:12:22 +0200
commitf9f07063876ec5f3917ce72385b015e1b5f31d7e (patch)
tree093f9ded3021800b20e1e8dcb22d4d8ac17dc7db /src/main/java/de/pixart/messenger/services
parent35276c6519afa1da6042dd485ddae09b06c68aeb (diff)
implement channel discovery
refactor muc search to use http cache channel search results
Diffstat (limited to '')
-rw-r--r--src/main/java/de/pixart/messenger/services/AvatarService.java12
-rw-r--r--src/main/java/de/pixart/messenger/services/ChannelDiscoveryService.java103
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java16
3 files changed, 129 insertions, 2 deletions
diff --git a/src/main/java/de/pixart/messenger/services/AvatarService.java b/src/main/java/de/pixart/messenger/services/AvatarService.java
index b37811b7f..c38fdcc99 100644
--- a/src/main/java/de/pixart/messenger/services/AvatarService.java
+++ b/src/main/java/de/pixart/messenger/services/AvatarService.java
@@ -38,6 +38,7 @@ import de.pixart.messenger.entities.Conversational;
import de.pixart.messenger.entities.ListItem;
import de.pixart.messenger.entities.Message;
import de.pixart.messenger.entities.MucOptions;
+import de.pixart.messenger.http.services.MuclumbusService;
import de.pixart.messenger.utils.UIHelper;
import de.pixart.messenger.xmpp.OnAdvancedStreamFeaturesLoaded;
import de.pixart.messenger.xmpp.XmppConnection;
@@ -82,10 +83,21 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
return get((ListItem) avatarable, size, cachedOnly);
} else if (avatarable instanceof MucOptions.User) {
return get((MucOptions.User) avatarable, size, cachedOnly);
+ } else if (avatarable instanceof MuclumbusService.Room) {
+ return get((MuclumbusService.Room) avatarable, size, cachedOnly);
}
throw new AssertionError("AvatarService does not know how to generate avatar from "+avatarable.getClass().getName());
}
+ private Bitmap get(final MuclumbusService.Room result, final int size, boolean cacheOnly) {
+ final Jid room = result.getRoom();
+ Conversation conversation = room != null ? mXmppConnectionService.findFirstMuc(room) : null;
+ if (conversation != null) {
+ return get(conversation, size, cacheOnly);
+ }
+ return get(result.getName(), room != null ? room.asBareJid().toEscapedString() : result.getName(), size, cacheOnly);
+ }
+
private Bitmap get(final Contact contact, final int size, boolean cachedOnly) {
if (contact.isSelf()) {
return get(contact.getAccount(), size, cachedOnly);
diff --git a/src/main/java/de/pixart/messenger/services/ChannelDiscoveryService.java b/src/main/java/de/pixart/messenger/services/ChannelDiscoveryService.java
new file mode 100644
index 000000000..21711c647
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/services/ChannelDiscoveryService.java
@@ -0,0 +1,103 @@
+package de.pixart.messenger.services;
+
+import android.util.Log;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import de.pixart.messenger.Config;
+import de.pixart.messenger.http.services.MuclumbusService;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class ChannelDiscoveryService {
+
+ private final XmppConnectionService service;
+
+ private final MuclumbusService muclumbusService;
+
+ private final Cache<String, List<MuclumbusService.Room>> cache;
+
+ public ChannelDiscoveryService(XmppConnectionService service) {
+ this.service = service;
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl(Config.CHANNEL_DISCOVERY)
+ .addConverterFactory(GsonConverterFactory.create())
+ .callbackExecutor(Executors.newSingleThreadExecutor())
+ .build();
+ this.muclumbusService = retrofit.create(MuclumbusService.class);
+ this.cache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build();
+ }
+
+ public void discover(String query, OnChannelSearchResultsFound onChannelSearchResultsFound) {
+ final boolean all = query == null || query.trim().isEmpty();
+ Log.d(Config.LOGTAG, "discover channels. query=" + query);
+ List<MuclumbusService.Room> result = cache.getIfPresent(all ? "" : query);
+ if (result != null) {
+ onChannelSearchResultsFound.onChannelSearchResultsFound(result);
+ return;
+ }
+ if (all) {
+ discoverChannels(onChannelSearchResultsFound);
+ } else {
+ discoverChannels(query, onChannelSearchResultsFound);
+ }
+ }
+
+ private void discoverChannels(OnChannelSearchResultsFound listener) {
+ Call<MuclumbusService.Rooms> call = muclumbusService.getRooms(1);
+ try {
+ call.enqueue(new Callback<MuclumbusService.Rooms>() {
+ @Override
+ public void onResponse(Call<MuclumbusService.Rooms> call, Response<MuclumbusService.Rooms> response) {
+ final MuclumbusService.Rooms body = response.body();
+ if (body == null) {
+ return;
+ }
+ cache.put("", body.items);
+ listener.onChannelSearchResultsFound(body.items);
+ }
+
+ @Override
+ public void onFailure(Call<MuclumbusService.Rooms> call, Throwable throwable) {
+
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void discoverChannels(final String query, OnChannelSearchResultsFound listener) {
+ Call<MuclumbusService.SearchResult> searchResultCall = muclumbusService.search(new MuclumbusService.SearchRequest(query));
+
+ searchResultCall.enqueue(new Callback<MuclumbusService.SearchResult>() {
+ @Override
+ public void onResponse(Call<MuclumbusService.SearchResult> call, Response<MuclumbusService.SearchResult> response) {
+ System.out.println(response.message());
+ MuclumbusService.SearchResult body = response.body();
+ if (body == null) {
+ return;
+ }
+ cache.put(query, body.result.items);
+ listener.onChannelSearchResultsFound(body.result.items);
+ }
+
+ @Override
+ public void onFailure(Call<MuclumbusService.SearchResult> call, Throwable throwable) {
+ throwable.printStackTrace();
+ }
+ });
+ }
+
+ public interface OnChannelSearchResultsFound {
+ void onChannelSearchResultsFound(List<MuclumbusService.Room> results);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
index 5de9a7501..1456d5a8e 100644
--- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
+++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
@@ -78,6 +78,7 @@ import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
@@ -110,6 +111,7 @@ import de.pixart.messenger.generator.MessageGenerator;
import de.pixart.messenger.generator.PresenceGenerator;
import de.pixart.messenger.http.CustomURLStreamHandlerFactory;
import de.pixart.messenger.http.HttpConnectionManager;
+import de.pixart.messenger.http.services.MuclumbusService;
import de.pixart.messenger.parser.AbstractParser;
import de.pixart.messenger.parser.IqParser;
import de.pixart.messenger.parser.MessageParser;
@@ -162,13 +164,14 @@ import de.pixart.messenger.xmpp.stanzas.IqPacket;
import de.pixart.messenger.xmpp.stanzas.MessagePacket;
import de.pixart.messenger.xmpp.stanzas.PresencePacket;
import me.leolin.shortcutbadger.ShortcutBadger;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
import rocks.xmpp.addr.Jid;
import static de.pixart.messenger.ui.SettingsActivity.CHAT_STATES;
import static de.pixart.messenger.ui.SettingsActivity.CONFIRM_MESSAGES;
import static de.pixart.messenger.ui.SettingsActivity.ENABLE_MULTI_ACCOUNTS;
import static de.pixart.messenger.ui.SettingsActivity.INDICATE_RECEIVED;
-import static de.pixart.messenger.ui.SettingsActivity.ENABLE_MULTI_ACCOUNTS;
public class XmppConnectionService extends Service {
@@ -255,9 +258,11 @@ public class XmppConnectionService extends Service {
private long mLastActivity = 0;
private MemorizingTrustManager mMemorizingTrustManager;
private NotificationService mNotificationService = new NotificationService(this);
+ private ChannelDiscoveryService mChannelDiscoveryService = new ChannelDiscoveryService(this);
private ShortcutService mShortcutService = new ShortcutService(this);
private AtomicBoolean mInitialAddressbookSyncCompleted = new AtomicBoolean(false);
protected AtomicBoolean mForceForegroundService = new AtomicBoolean(false);
+ private AtomicBoolean mForceDuringOnCreate = new AtomicBoolean(false);
private OnMessagePacketReceived mMessageParser = new MessageParser(this);
private OnPresencePacketReceived mPresenceParser = new PresenceParser(this);
private IqParser mIqParser = new IqParser(this);
@@ -834,6 +839,10 @@ public class XmppConnectionService extends Service {
editor.commit();
}
+ public void discoverChannels(String query, ChannelDiscoveryService.OnChannelSearchResultsFound onChannelSearchResultsFound) {
+ mChannelDiscoveryService.discover(query, onChannelSearchResultsFound);
+ }
+
public boolean isDataSaverDisabled() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
@@ -1144,6 +1153,7 @@ public class XmppConnectionService extends Service {
if (Compatibility.runsTwentySix()) {
mNotificationService.initializeChannels();
}
+ mForceDuringOnCreate.set(Compatibility.runsAndTargetsTwentySix(this));
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
this.mBitmapCache = new LruCache<String, Bitmap>(cacheSize) {
@@ -1213,6 +1223,8 @@ public class XmppConnectionService extends Service {
intentFilter.addAction(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED);
registerReceiver(this.mInternalEventReceiver, intentFilter);
}
+ mForceDuringOnCreate.set(false);
+ toggleForegroundService();
//start export log service every day at given time
ScheduleAutomaticExport();
// cancel scheduled exporter
@@ -1307,7 +1319,7 @@ public class XmppConnectionService extends Service {
private void toggleForegroundService(boolean force) {
final boolean status;
- if (force || mForceForegroundService.get() || (Compatibility.keepForegroundService(this)/* && hasEnabledAccounts()*/)) {
+ if (force || mForceDuringOnCreate.get() || mForceForegroundService.get() || (Compatibility.keepForegroundService(this) && hasEnabledAccounts())) {
final Notification notification = this.mNotificationService.createForegroundNotification();
startForeground(NotificationService.FOREGROUND_NOTIFICATION_ID, notification);
if (!mForceForegroundService.get()) {