From df899606ec23df9aa98237baaae31221bf77c3ca Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 29 Mar 2018 16:52:18 +0200 Subject: [PATCH] Only show new errors when reopening window, restore state correctly --- .../quasseldroid/ui/chat/ChatActivity.kt | 4 ++-- .../ui/chat/buffers/BufferViewConfigFragment.kt | 17 +++++++++++++++++ .../ui/chat/messages/MessageListFragment.kt | 17 +++++++++++++++++ .../ui/chat/nicks/NickListFragment.kt | 13 +++++++++++++ .../de/kuschku/libquassel/session/ISession.kt | 5 ++++- .../de/kuschku/libquassel/session/Session.kt | 13 ++++++++----- .../libquassel/session/SessionManager.kt | 6 ++++-- .../quasseldroid/viewmodel/QuasselViewModel.kt | 6 ++++-- 8 files changed, 69 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 9a7e2e178..0895d8c0e 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -167,8 +167,8 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc drawerToggle.syncState() } - viewModel.errors_liveData.observe(this, Observer { optional -> - optional?.orNull().let { + viewModel.errors.observe(this, Observer { error -> + error?.let { when (it) { is HandshakeMessage.ClientInitReject -> MaterialDialog.Builder(this) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt index 6e4aaf735..048cd05ff 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt @@ -300,9 +300,21 @@ class BufferViewConfigFragment : ServiceBoundFragment() { } chatList.itemAnimator = DefaultItemAnimator() chatList.setItemViewCacheSize(10) + + savedInstanceState?.run { + chatList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST)) + chatListSpinner.onRestoreInstanceState(getParcelable(KEY_STATE_SPINNER)) + } + return view } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(KEY_STATE_LIST, chatList.layoutManager.onSaveInstanceState()) + outState.putParcelable(KEY_STATE_SPINNER, chatListSpinner.onSaveInstanceState()) + } + private val clickListener: ((BufferId) -> Unit)? = { if (actionMode != null) { longClickListener?.invoke(it) @@ -319,4 +331,9 @@ class BufferViewConfigFragment : ServiceBoundFragment() { actionMode?.finish() } } + + companion object { + private const val KEY_STATE_LIST = "KEY_STATE_LIST" + private const val KEY_STATE_SPINNER = "KEY_STATE_SPINNER" + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index 0764b7984..60e006d67 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -225,6 +225,10 @@ class MessageListFragment : ServiceBoundFragment() { database.message().lastMsgId(it) } + viewModel.buffer.toLiveData().observe(this, Observer { bufferId -> + swipeRefreshLayout.isEnabled = (bufferId != null || bufferId != -1) + }) + var previousVisible = -1 viewModel.buffer.toFlowable(BackpressureStrategy.LATEST).switchMap { buffer -> database.filtered().listenRx(accountId, buffer).switchMap { filtered -> @@ -296,9 +300,19 @@ class MessageListFragment : ServiceBoundFragment() { }) scrollDown.hide() scrollDown.setOnClickListener { messageList.scrollToPosition(0) } + + savedInstanceState?.run { + messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST)) + } + return view } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(KEY_STATE_LIST, messageList.layoutManager.onSaveInstanceState()) + } + private fun markAsRead(bufferSyncer: BufferSyncer, buffer: BufferId, lastMessageId: MsgId?) { bufferSyncer.requestMarkBufferAsRead(buffer) if (lastMessageId != null) @@ -346,4 +360,7 @@ class MessageListFragment : ServiceBoundFragment() { } } + companion object { + private const val KEY_STATE_LIST = "KEY_STATE_LIST" + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt index 03d7c06ef..fd7b6b274 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt @@ -65,9 +65,18 @@ class NickListFragment : ServiceBoundFragment() { } }.toLiveData().observe(this, Observer(nickListAdapter::submitList)) + savedInstanceState?.run { + nickList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST)) + } + return view } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(KEY_STATE_LIST, nickList.layoutManager.onSaveInstanceState()) + } + private val clickListener: ((String) -> Unit)? = { nick -> viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId -> val intent = Intent(requireContext(), InfoActivity::class.java) @@ -79,4 +88,8 @@ class NickListFragment : ServiceBoundFragment() { startActivity(intent) } } + + companion object { + private const val KEY_STATE_LIST = "KEY_STATE_LIST" + } } \ No newline at end of file diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt index a729f609f..42338ad78 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt @@ -5,6 +5,8 @@ import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.libquassel.protocol.message.HandshakeMessage import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.quassel.syncables.* +import io.reactivex.BackpressureStrategy +import io.reactivex.Flowable import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject import java.io.Closeable @@ -30,7 +32,7 @@ interface ISession : Closeable { val rpcHandler: RpcHandler? val initStatus: Observable<Pair<Int, Int>> - val error: Observable<HandshakeMessage> + val error: Flowable<HandshakeMessage> val lag: Observable<Long> @@ -39,6 +41,7 @@ interface ISession : Closeable { companion object { val NULL = object : ISession { override val error = BehaviorSubject.create<HandshakeMessage>() + .toFlowable(BackpressureStrategy.BUFFER) override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED) override val features: Features = Features(QuasselFeatures.empty(), QuasselFeatures.empty()) override val sslSession: SSLSession? = null diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt index 07a3af97a..991ff35a5 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt @@ -7,7 +7,9 @@ import de.kuschku.libquassel.quassel.ExtendedFeature import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.quassel.syncables.* import de.kuschku.libquassel.util.compatibility.HandlerService +import io.reactivex.BackpressureStrategy import io.reactivex.subjects.BehaviorSubject +import io.reactivex.subjects.PublishSubject import org.threeten.bp.Instant import javax.net.ssl.X509TrustManager @@ -31,7 +33,8 @@ class Session( ) override val state = coreConnection.state - override val error = BehaviorSubject.create<HandshakeMessage>() + private val _error = PublishSubject.create<HandshakeMessage>() + override val error = _error.toFlowable(BackpressureStrategy.BUFFER) override val aliasManager = AliasManager(this) override val backlogManager = BacklogManager(this, backlogStorage) @@ -62,7 +65,7 @@ class Session( if (f.coreConfigured == true) { login() } else { - error.onNext(f) + _error.onNext(f) } return true } @@ -87,17 +90,17 @@ class Session( } override fun handle(f: HandshakeMessage.ClientInitReject): Boolean { - error.onNext(f) + _error.onNext(f) return true } override fun handle(f: HandshakeMessage.CoreSetupReject): Boolean { - error.onNext(f) + _error.onNext(f) return true } override fun handle(f: HandshakeMessage.ClientLoginReject): Boolean { - error.onNext(f) + _error.onNext(f) return true } diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt index 02e993639..84cf52dad 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt @@ -10,6 +10,8 @@ import de.kuschku.libquassel.util.compatibility.HandlerService import de.kuschku.libquassel.util.compatibility.LoggingHandler import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log import de.kuschku.libquassel.util.helpers.or +import io.reactivex.BackpressureStrategy +import io.reactivex.Flowable import io.reactivex.Observable import io.reactivex.functions.BiFunction import io.reactivex.subjects.BehaviorSubject @@ -75,8 +77,8 @@ class SessionManager( else lastSession } - override val error: Observable<HandshakeMessage> - get() = inProgressSession.switchMap(ISession::error) + override val error: Flowable<HandshakeMessage> + get() = inProgressSession.toFlowable(BackpressureStrategy.LATEST).switchMap(ISession::error) val connectionProgress: Observable<Triple<ConnectionState, Int, Int>> = Observable.combineLatest( state, initStatus, diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt index f3647a90f..22c94253c 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -19,6 +19,7 @@ import de.kuschku.libquassel.util.and import de.kuschku.libquassel.util.hasFlag import de.kuschku.libquassel.util.helpers.* import de.kuschku.quasseldroid.util.helper.combineLatest +import de.kuschku.quasseldroid.util.helper.switchMapNotNull import de.kuschku.quasseldroid.util.helper.toLiveData import de.kuschku.quasseldroid.viewmodel.data.* import io.reactivex.Observable @@ -71,8 +72,9 @@ class QuasselViewModel : ViewModel() { } } - val errors = sessionManager.mapSwitchMap(SessionManager::error) - val errors_liveData = errors.toLiveData() + val errors = sessionManager.toLiveData().switchMapNotNull { + it.orNull()?.error?.toLiveData() + } /** * An observable of the changes of the markerline, as pairs of `(old, new)` -- GitLab