aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java39
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationFragment.java28
-rw-r--r--src/main/res/values/strings.xml1
3 files changed, 45 insertions, 23 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index 4b09ac9d..e66f7110 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -961,29 +961,32 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
});
}
- public void loadMoreMessages(Conversation conversation, long timestamp, final OnMoreMessagesLoaded callback) {
- if (this.getMessageArchiveService().queryInProgress(conversation)) {
- Log.d(Config.LOGTAG,"query in progress");
- return;
- }
- List<Message> messages = databaseBackend.getMessages(conversation, 50,timestamp);
- if (messages.size() == 0 && (conversation.getAccount().getXmppConnection() != null && conversation.getAccount().getXmppConnection().getFeatures().mam())) {
- Log.d(Config.LOGTAG,"load more messages with mam");
- MessageArchiveService.Query query = getMessageArchiveService().query(conversation,0,timestamp - 1);
- if (query != null) {
- query.setCallback(callback);
+ public void loadMoreMessages(final Conversation conversation, final long timestamp, final OnMoreMessagesLoaded callback) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ if (XmppConnectionService.this.getMessageArchiveService().queryInProgress(conversation)) {
+ return;
+ }
+ final Account account = conversation.getAccount();
+ List<Message> messages = databaseBackend.getMessages(conversation, 50,timestamp);
+ if (messages.size() > 0) {
+ conversation.addAll(0, messages);
+ callback.onMoreMessagesLoaded(messages.size(), conversation);
+ } else if (account.getStatus() == Account.State.ONLINE && account.getXmppConnection() != null && account.getXmppConnection().getFeatures().mam()) {
+ MessageArchiveService.Query query = getMessageArchiveService().query(conversation,0,timestamp - 1);
+ if (query != null) {
+ query.setCallback(callback);
+ }
+ callback.informUser(R.string.fetching_history_from_server);
+ }
}
- return;
- }
- for (Message message : messages) {
- message.setConversation(conversation);
- }
- conversation.addAll(0, messages);
- callback.onMoreMessagesLoaded(messages.size(),conversation);
+ }).start();
}
public interface OnMoreMessagesLoaded {
public void onMoreMessagesLoaded(int count,Conversation conversation);
+ public void informUser(int r);
}
public List<Account> getAccounts() {
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index c333bab7..d0b3e022 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -106,6 +106,7 @@ public class ConversationFragment extends Fragment {
private TextView snackbarMessage;
private TextView snackbarAction;
private boolean messagesLoaded = false;
+ private Toast messageLoaderToast;
private OnScrollListener mOnScrollListener = new OnScrollListener() {
@@ -119,10 +120,9 @@ public class ConversationFragment extends Fragment {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
synchronized (ConversationFragment.this.messageList) {
- if (firstVisibleItem == 0 && messagesLoaded) {
+ if (firstVisibleItem < 5 && messagesLoaded) {
long timestamp = ConversationFragment.this.messageList.get(0).getTimeSent();
messagesLoaded = false;
- Log.d(Config.LOGTAG,"load more messages");
activity.xmppConnectionService.loadMoreMessages(conversation, timestamp, new XmppConnectionService.OnMoreMessagesLoaded() {
@Override
public void onMoreMessagesLoaded(final int count, Conversation conversation) {
@@ -132,18 +132,36 @@ public class ConversationFragment extends Fragment {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
- int firstItem = messagesView.getFirstVisiblePosition();
- Log.d(Config.LOGTAG, "done loading more messages. first item: " + firstItem);
+ int oldPosition = messagesView.getFirstVisiblePosition();
ConversationFragment.this.conversation.populateWithMessages(ConversationFragment.this.messageList);
updateStatusMessages();
messageListAdapter.notifyDataSetChanged();
if (count != 0) {
+ final int newPosition = oldPosition + count;
+ Message tmpMessage = messageList.get(newPosition);
+ int offset = 0;
+ while(tmpMessage.wasMergedIntoPrevious()) {
+ offset++;
+ tmpMessage = tmpMessage.prev();
+ }
+ messagesView.setSelectionFromTop(newPosition - offset, 0);
messagesLoaded = true;
+ if (messageLoaderToast != null) {
+ messageLoaderToast.cancel();
+ }
}
- messagesView.setSelectionFromTop(firstItem + count, 0);
}
});
}
+
+ @Override
+ public void informUser(int resId) {
+ if (messageLoaderToast != null) {
+ messageLoaderToast.cancel();
+ }
+ messageLoaderToast = Toast.makeText(activity,resId,Toast.LENGTH_LONG);
+ messageLoaderToast.show();
+ }
});
}
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 02be6348..5288466f 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -366,4 +366,5 @@
<string name="reset">Reset</string>
<string name="account_image_description">Account avatar</string>
<string name="copy_otr_clipboard_description">Copy OTR fingerprint to clipboard</string>
+ <string name="fetching_history_from_server">Fetching history from server</string>
</resources>