smoothed out scrolling a bit

iNPUTmice created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 39 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        | 28 
src/main/res/values/strings.xml                                          |  1 
3 files changed, 45 insertions(+), 23 deletions(-)

Detailed changes

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() {

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();
+						}
 					});
 
 				}

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>