Skip to content
Snippets Groups Projects
Verified Commit dca90fd1 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Always keep scroll state

parent 11840d2d
Branches
Tags
No related merge requests found
......@@ -48,6 +48,7 @@ import de.kuschku.libquassel.quassel.syncables.BufferSyncer
import de.kuschku.libquassel.session.SessionManager
import de.kuschku.libquassel.util.flag.hasFlag
import de.kuschku.libquassel.util.helpers.mapSwitchMap
import de.kuschku.libquassel.util.helpers.nullIf
import de.kuschku.libquassel.util.helpers.value
import de.kuschku.libquassel.util.irc.HostmaskHelper
import de.kuschku.quasseldroid.GlideApp
......@@ -110,6 +111,7 @@ class MessageListFragment : ServiceBoundFragment() {
private var lastBuffer: BufferId? = null
private var previousMessageId: MsgId? = null
private var previousLoadKey: Int? = null
private var actionMode: ActionMode? = null
......@@ -318,7 +320,6 @@ class MessageListFragment : ServiceBoundFragment() {
}
}
var previousLoadKey: Int? = null
val data = combineLatest(viewModel.buffer,
viewModel.selectedMessages,
viewModel.expandedMessages,
......@@ -387,10 +388,18 @@ class MessageListFragment : ServiceBoundFragment() {
}
})
var hasLoaded = false
fun checkScroll() {
if (hasLoaded) {
if (linearLayoutManager.findFirstVisibleItemPosition() < 2 && !isScrolling) {
messageList.scrollToPosition(0)
}
} else {
savedInstanceState?.apply {
messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
}
hasLoaded = true
}
}
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
......@@ -398,27 +407,6 @@ class MessageListFragment : ServiceBoundFragment() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = checkScroll()
})
var lastBuffer = -1
data.observe(this, Observer { list ->
previousLoadKey = list?.lastKey as? Int
val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId
runInBackground {
activity?.runOnUiThread {
list?.let(adapter::submitList)
}
val buffer = viewModel.buffer.value ?: -1
if (buffer != lastBuffer) {
adapter.clearCache()
viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
onBufferChange(lastBuffer, buffer, firstVisibleMessageId, bufferSyncer)
}
lastBuffer = buffer
}
}
})
scrollDown.hide(object : FloatingActionButton.OnVisibilityChangedListener() {
override fun onHidden(fab: FloatingActionButton) {
fab.visibility = View.VISIBLE
......@@ -426,10 +414,6 @@ class MessageListFragment : ServiceBoundFragment() {
})
scrollDown.setOnClickListener { messageList.scrollToPosition(0) }
savedInstanceState?.run {
messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
}
val avatarSize = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
messageSettings.textSize * 2.5f,
......@@ -454,12 +438,40 @@ class MessageListFragment : ServiceBoundFragment() {
adapter, requireContext(), R.dimen.markerline_height, R.attr.colorMarkerLine
))
savedInstanceState?.run {
messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
previousLoadKey = getInt(KEY_STATE_PAGING).nullIf { it == -1 }
lastBuffer = getInt(KEY_STATE_BUFFER).nullIf { it == -1 }
}
data.observe(this, Observer { list ->
previousLoadKey = list?.lastKey as? Int
val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId
runInBackground {
activity?.runOnUiThread {
list?.let(adapter::submitList)
}
val buffer = viewModel.buffer.value ?: -1
if (buffer != lastBuffer) {
adapter.clearCache()
viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
onBufferChange(lastBuffer, buffer, firstVisibleMessageId, bufferSyncer)
}
lastBuffer = buffer
}
}
})
return view
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable(KEY_STATE_LIST, messageList.layoutManager.onSaveInstanceState())
outState.putInt(KEY_STATE_PAGING, previousLoadKey ?: -1)
outState.putInt(KEY_STATE_BUFFER, lastBuffer ?: -1)
}
private fun markAsRead(bufferSyncer: BufferSyncer, buffer: BufferId, lastMessageId: MsgId?) {
......@@ -528,5 +540,7 @@ class MessageListFragment : ServiceBoundFragment() {
companion object {
private const val KEY_STATE_LIST = "KEY_STATE_LIST"
private const val KEY_STATE_PAGING = "KEY_STATE_PAGING"
private const val KEY_STATE_BUFFER = "KEY_STATE_BUFFER"
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment