From 6cb2b0b5d1654c0a91aca09d791568b12850f9c9 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 12 Sep 2016 21:18:56 +0200 Subject: remember scroll position on rotate. fixes #2011 --- .../conversations/ui/ConversationActivity.java | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'src/main/java/eu/siacs/conversations/ui/ConversationActivity.java') diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index e891f00b..2c8b27b0 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -67,8 +67,6 @@ import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; -import static eu.siacs.conversations.crypto.axolotl.AxolotlService.AxolotlCapability.MISSING_PRESENCE; - public class ConversationActivity extends XmppActivity implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast { @@ -94,9 +92,12 @@ public class ConversationActivity extends XmppActivity private static final String STATE_OPEN_CONVERSATION = "state_open_conversation"; private static final String STATE_PANEL_OPEN = "state_panel_open"; private static final String STATE_PENDING_URI = "state_pending_uri"; + private static final String STATE_FIRST_VISIBLE = "first_visible"; + private static final String STATE_OFFSET_FROM_TOP = "offset_from_top"; - private String mOpenConverstaion = null; + private String mOpenConversation = null; private boolean mPanelOpen = true; + private Pair mScrollPosition = null; final private List mPendingImageUris = new ArrayList<>(); final private List mPendingFileUris = new ArrayList<>(); private Uri mPendingGeoUri = null; @@ -172,8 +173,16 @@ public class ConversationActivity extends XmppActivity protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - mOpenConverstaion = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null); + mOpenConversation = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null); mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true); + int pos = savedInstanceState.getInt(STATE_FIRST_VISIBLE, -1); + int offset = savedInstanceState.getInt(STATE_OFFSET_FROM_TOP, 1); + if (pos >= 0 && offset <= 0) { + Log.d(Config.LOGTAG,"retrieved scroll position from instanceState "+pos+":"+offset); + mScrollPosition = new Pair<>(pos,offset); + } else { + mScrollPosition = null; + } String pending = savedInstanceState.getString(STATE_PENDING_URI, null); if (pending != null) { mPendingImageUris.clear(); @@ -1081,7 +1090,7 @@ public class ConversationActivity extends XmppActivity @Override protected void onNewIntent(final Intent intent) { if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) { - mOpenConverstaion = null; + mOpenConversation = null; if (xmppConnectionServiceBound) { handleViewConversationIntent(intent); intent.setAction(Intent.ACTION_MAIN); @@ -1131,6 +1140,11 @@ public class ConversationActivity extends XmppActivity Conversation conversation = getSelectedConversation(); if (conversation != null) { savedInstanceState.putString(STATE_OPEN_CONVERSATION, conversation.getUuid()); + Pair scrollPosition = mConversationFragment.getScrollPosition(); + if (scrollPosition != null) { + savedInstanceState.putInt(STATE_FIRST_VISIBLE, scrollPosition.first); + savedInstanceState.putInt(STATE_OFFSET_FROM_TOP, scrollPosition.second); + } } else { savedInstanceState.remove(STATE_OPEN_CONVERSATION); } @@ -1190,7 +1204,7 @@ public class ConversationActivity extends XmppActivity } finish(); } - } else if (selectConversationByUuid(mOpenConverstaion)) { + } else if (selectConversationByUuid(mOpenConversation)) { if (mPanelOpen) { showConversationsOverview(); } else { @@ -1199,8 +1213,11 @@ public class ConversationActivity extends XmppActivity updateActionBarTitle(true); } } - this.mConversationFragment.reInit(getSelectedConversation()); - mOpenConverstaion = null; + if (this.mConversationFragment.reInit(getSelectedConversation())) { + Log.d(Config.LOGTAG,"setting scroll position on fragment"); + this.mConversationFragment.setScrollPosition(mScrollPosition); + } + mOpenConversation = null; } else if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) { clearPending(); handleViewConversationIntent(intent); -- cgit v1.2.3