From 9ea3623c85b4c8baef7110ce3c7b8a5892f5e988 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Dec 2018 13:08:26 -0200 Subject: [PATCH] [android] Save and restore list position of conversation across restarts --- .../conversation/ConversationActivity.java | 38 +++++++++++++++---- .../main/res/layout/activity_conversation.xml | 3 +- 2 files changed, 33 insertions(+), 8 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 5e4ef63a5..6f0a9bd1d 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 @@ -8,6 +8,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.design.widget.Snackbar; @@ -107,7 +108,6 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn import static android.support.v4.view.ViewCompat.setTransitionName; import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.view.Gravity.RIGHT; -import static android.widget.Toast.LENGTH_LONG; import static android.widget.Toast.LENGTH_SHORT; import static java.util.Collections.emptyList; import static java.util.Collections.sort; @@ -121,9 +121,9 @@ import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_IMAGE_ATTACHMENTS; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_ATTACH_IMAGE; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_INTRODUCTION; +import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENTS; import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENT_POSITION; import static org.briarproject.briar.android.conversation.ImageActivity.DATE; -import static org.briarproject.briar.android.conversation.ImageActivity.ATTACHMENTS; import static org.briarproject.briar.android.conversation.ImageActivity.NAME; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.briar.android.util.UiUtils.getAvatarTransitionName; @@ -194,6 +194,8 @@ public class ConversationActivity extends BriarActivity ViewModelProvider.Factory viewModelFactory; private volatile ContactId contactId; + @Nullable + private Parcelable layoutManagerState; private final Observer contactNameObserver = name -> { requireNonNull(name); @@ -309,6 +311,21 @@ public class ConversationActivity extends BriarActivity list.stopPeriodicUpdate(); } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (layoutManager != null) { + layoutManagerState = layoutManager.onSaveInstanceState(); + outState.putParcelable("layoutManager", layoutManagerState); + } + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + layoutManagerState = savedInstanceState.getParcelable("layoutManager"); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar @@ -428,8 +445,12 @@ public class ConversationActivity extends BriarActivity List items = createItems(headers); adapter.addAll(items); list.showData(); - // Scroll to the bottom - list.scrollToPosition(adapter.getItemCount() - 1); + if (layoutManagerState == null) { + // Scroll to the bottom + list.scrollToPosition(adapter.getItemCount() - 1); + } else { + layoutManager.onRestoreInstanceState(layoutManagerState); + } } else { LOG.info("Concurrent update, reloading"); loadMessages(); @@ -471,7 +492,8 @@ public class ConversationActivity extends BriarActivity adapter.getMessageItem(m); if (pair != null) { pair.getSecond().setText(text); - boolean bottom = adapter.isScrolledToBottom(layoutManager); + boolean bottom = layoutManagerState == null && + adapter.isScrolledToBottom(layoutManager); adapter.notifyItemChanged(pair.getFirst()); if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); } @@ -502,7 +524,8 @@ public class ConversationActivity extends BriarActivity adapter.getMessageItem(m); if (pair != null) { pair.getSecond().setAttachments(items); - boolean bottom = adapter.isScrolledToBottom(layoutManager); + boolean bottom = layoutManagerState == null && + adapter.isScrolledToBottom(layoutManager); adapter.notifyItemChanged(pair.getFirst()); if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); } @@ -553,7 +576,8 @@ public class ConversationActivity extends BriarActivity private void addConversationItem(ConversationItem item) { runOnUiThreadUnlessDestroyed(() -> { - boolean bottom = adapter.isScrolledToBottom(layoutManager); + boolean bottom = layoutManagerState == null && + adapter.isScrolledToBottom(layoutManager); adapter.incrementRevision(); adapter.add(item); if (bottom) list.scrollToPosition(adapter.getItemCount() - 1); diff --git a/briar-android/src/main/res/layout/activity_conversation.xml b/briar-android/src/main/res/layout/activity_conversation.xml index f27144b06..ed9083dbc 100644 --- a/briar-android/src/main/res/layout/activity_conversation.xml +++ b/briar-android/src/main/res/layout/activity_conversation.xml @@ -49,7 +49,8 @@ android:id="@+id/conversationView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="2"/> + android:layout_weight="2" + app:scrollToEnd="false"/>