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 9a7e2e17836172b8cf546b912f6d182c3babce3a..0895d8c0eda6254d45a533fc2c336784f7f6bc39 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 6e4aaf7351ec4ecde8cb5287c6bfb0b706cfc5fa..048cd05ff528ed8250a99071ddc6a8f6fc5a0386 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 0764b79844719e2ae12ddce99b9de2c3a67a2eae..60e006d67d6f5869394254aa31c383977564d8ce 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 03d7c06efac3a60386bd82b026d26ff8aedb3714..fd7b6b274bce6fc087f924ed06a6241e6b30879f 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 a729f609fda40e1641452cb7c2773147411cbe78..42338ad78746c9ecdc11a4f4b5d0155e9e0934ca 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 07a3af97ad3f3485beb7f55156468d0d2994a4ab..991ff35a591f3a64e80e7f3453519c96b186485a 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 02e993639095ef12b26cdcc8d3b713df5f8c2a0c..84cf52dadaea34bdf0379c9ef4ec0199f50227d9 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 f3647a90f47b435dfd87f1058e7da92eba5fdb92..22c94253c4ec2e57e4c209dff3160f0d04e224f5 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)`