Fixes FS#157: Trigger loading messages from MAM in MUC does not end
This commit is contained in:
parent
58ddfef266
commit
27c9c0aa21
3 changed files with 45 additions and 37 deletions
|
@ -96,18 +96,25 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
return this.query(conversation,conversation.getLastMessageTransmitted(),end);
|
||||
}
|
||||
|
||||
public Query query(Conversation conversation, long start, long end) {
|
||||
synchronized (this.queries) {
|
||||
if (start > end) {
|
||||
return null;
|
||||
}
|
||||
final Query query = new Query(conversation, start, end,PagingOrder.REVERSE);
|
||||
query.reference = conversation.getFirstMamReference();
|
||||
this.queries.add(query);
|
||||
this.execute(query);
|
||||
return query;
|
||||
}
|
||||
}
|
||||
public Query query(Conversation conversation, long start, long end) {
|
||||
return this.query(conversation, start, end, null);
|
||||
}
|
||||
|
||||
public Query query(Conversation conversation, long start, long end, XmppConnectionService.OnMoreMessagesLoaded callback) {
|
||||
synchronized (this.queries) {
|
||||
if (start > end) {
|
||||
return null;
|
||||
}
|
||||
final Query query = new Query(conversation, start, end,PagingOrder.REVERSE);
|
||||
query.reference = conversation.getFirstMamReference();
|
||||
this.queries.add(query);
|
||||
if (null != callback) {
|
||||
query.setCallback(callback);
|
||||
}
|
||||
this.execute(query);
|
||||
return query;
|
||||
}
|
||||
}
|
||||
|
||||
public void executePendingQueries(final Account account) {
|
||||
List<Query> pending = new ArrayList<>();
|
||||
|
@ -137,7 +144,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
synchronized (MessageArchiveService.this.queries) {
|
||||
MessageArchiveService.this.queries.remove(query);
|
||||
if (query.hasCallback()) {
|
||||
query.callback(false);
|
||||
query.callback();
|
||||
}
|
||||
}
|
||||
} else if (packet.getType() != IqPacket.TYPE.RESULT) {
|
||||
|
@ -169,7 +176,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
}
|
||||
}
|
||||
if (query.hasCallback()) {
|
||||
query.callback(done);
|
||||
query.callback();
|
||||
} else {
|
||||
if (null != conversation) {
|
||||
conversation.setHasMessagesLeftOnServer(query.getMessageCount() > 0);
|
||||
|
@ -335,10 +342,10 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
|
|||
this.callback = callback;
|
||||
}
|
||||
|
||||
public void callback(boolean done) {
|
||||
public void callback() {
|
||||
if (this.callback != null) {
|
||||
this.callback.onMoreMessagesLoaded(messageCount,conversation);
|
||||
if (done) {
|
||||
if (messageCount <= 0) {
|
||||
this.callback.informUser(R.string.no_more_history_on_server);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1218,19 +1218,19 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
|
|||
}
|
||||
}
|
||||
Collections.sort(list, new Comparator<Conversation>() {
|
||||
@Override
|
||||
public int compare(Conversation lhs, Conversation rhs) {
|
||||
Message left = lhs.getLatestMessage();
|
||||
Message right = rhs.getLatestMessage();
|
||||
if (left.getTimeSent() > right.getTimeSent()) {
|
||||
return -1;
|
||||
} else if (left.getTimeSent() < right.getTimeSent()) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public int compare(Conversation lhs, Conversation rhs) {
|
||||
Message left = lhs.getLatestMessage();
|
||||
Message right = rhs.getLatestMessage();
|
||||
if (left.getTimeSent() > right.getTimeSent()) {
|
||||
return -1;
|
||||
} else if (left.getTimeSent() < right.getTimeSent()) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void loadMoreMessages(final Conversation conversation, final long timestamp, final OnMoreMessagesLoaded callback) {
|
||||
|
@ -1260,15 +1260,17 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
|
|||
callback.onMoreMessagesLoaded(messages.size(), conversation);
|
||||
} else if (conversation.hasMessagesLeftOnServer()
|
||||
&& account.isOnlineAndConnected()) {
|
||||
Logging.d("mam", "mam activate, account online and connected and messages left on server");
|
||||
Logging.d("mam", "account online and connected and messages left on server");
|
||||
//TODO Check if this needs to be checked before trying anything with regards to MAM
|
||||
if ((conversation.getMode() == Conversation.MODE_SINGLE && account.getXmppConnection().getFeatures().mam())
|
||||
|| (conversation.getMode() == Conversation.MODE_MULTI && conversation.getMucOptions().mamSupport())) {
|
||||
MessageArchiveService.Query query = getMessageArchiveService().query(conversation, 0, timestamp - 1);
|
||||
if (query != null) {
|
||||
query.setCallback(callback);
|
||||
}
|
||||
Logging.d("mam", "mam active");
|
||||
getMessageArchiveService().query(conversation, 0, timestamp - 1, callback);
|
||||
callback.informUser(R.string.fetching_history_from_server);
|
||||
}
|
||||
} else {
|
||||
Logging.d("mam", "mam inactive");
|
||||
callback.onMoreMessagesLoaded(0, conversation);
|
||||
}
|
||||
} else {
|
||||
Logging.d("mam", ((!conversation.hasMessagesLeftOnServer()) ? "no" : "") + " more messages left on server, mam " + ((account.getXmppConnection().getFeatures().mam()) ? "" : "not") + " activated, account is " + ((account.isOnlineAndConnected()) ? "" : "not") + " online or connected)");
|
||||
callback.onMoreMessagesLoaded(0, conversation);
|
||||
|
|
|
@ -52,10 +52,9 @@ public class ConversationSwipeRefreshListener implements SwipyRefreshLayout.OnRe
|
|||
long lastSessionEstablished = this.getTimestampOfLastSessionEstablished(activity.getSelectedConversation());
|
||||
long lastReceivedMessage = this.getTimestampOfLastReceivedOrTransmittedMessage();
|
||||
long startTimestamp = Math.min(lastSessionEstablished, lastReceivedMessage);
|
||||
MessageArchiveService.Query query = activity.xmppConnectionService.getMessageArchiveService().query(activity.getSelectedConversation(), startTimestamp, System.currentTimeMillis());
|
||||
MessageArchiveService.Query query = activity.xmppConnectionService.getMessageArchiveService().query(activity.getSelectedConversation(), startTimestamp, System.currentTimeMillis(), this.listener);
|
||||
if (query != null) {
|
||||
this.listener.setLoadHistory(false);
|
||||
query.setCallback(this.listener);
|
||||
} else {
|
||||
Logging.d("mam", "no query built - no messages loaded");
|
||||
this.listener.onMoreMessagesLoaded(0, activity.getSelectedConversation());
|
||||
|
|
Loading…
Reference in a new issue