From b8ca5ab5577fb4a7efdc9ec43e6f1b27fad1fb2c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 20 Nov 2018 13:36:57 -0200 Subject: [PATCH] [android] Only scroll conversation list to bottom, when already at bottom Closes #1467 --- .../android/conversation/ConversationActivity.java | 14 +++++++++----- .../android/conversation/ConversationAdapter.java | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 80d21d65b..754e8f06a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -148,6 +148,7 @@ public class ConversationActivity extends BriarActivity private ImageView toolbarStatus; private TextView toolbarTitle; private BriarRecyclerView list; + private LinearLayoutManager layoutManager; private TextInputView textInputView; // Fields that are accessed from background threads must be volatile @@ -227,7 +228,8 @@ public class ConversationActivity extends BriarActivity viewModel.getContactDisplayName()); adapter = new ConversationAdapter(this, this); list = findViewById(R.id.conversationView); - list.setLayoutManager(new LinearLayoutManager(this)); + layoutManager = new LinearLayoutManager(this); + list.setLayoutManager(layoutManager); list.setAdapter(adapter); list.setEmptyText(getString(R.string.no_private_messages)); @@ -434,8 +436,9 @@ public class ConversationActivity extends BriarActivity adapter.getMessageItem(m); if (pair != null) { pair.getSecond().setText(text); + boolean bottom = adapter.isScrolledToBottom(layoutManager); adapter.notifyItemChanged(pair.getFirst()); - list.scrollToPosition(adapter.getItemCount() - 1); + if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); } }); } @@ -464,8 +467,9 @@ public class ConversationActivity extends BriarActivity adapter.getMessageItem(m); if (pair != null) { pair.getSecond().setAttachments(items); + boolean bottom = adapter.isScrolledToBottom(layoutManager); adapter.notifyItemChanged(pair.getFirst()); - list.scrollToPosition(adapter.getItemCount() - 1); + if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); } }); } @@ -514,10 +518,10 @@ public class ConversationActivity extends BriarActivity private void addConversationItem(ConversationItem item) { runOnUiThreadUnlessDestroyed(() -> { + boolean bottom = adapter.isScrolledToBottom(layoutManager); adapter.incrementRevision(); adapter.add(item); - // Scroll to the bottom - list.scrollToPosition(adapter.getItemCount() - 1); + if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java index 5ddc1650a..e185db386 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java @@ -2,6 +2,7 @@ package org.briarproject.briar.android.conversation; import android.content.Context; import android.support.annotation.LayoutRes; +import android.support.v7.widget.LinearLayoutManager; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; @@ -112,4 +113,8 @@ class ConversationAdapter return null; } + boolean isScrolledToBottom(LinearLayoutManager layoutManager) { + return layoutManager.findLastVisibleItemPosition() == items.size() - 1; + } + }