From 8cddd45948ef9525ebbb5c66e8758f3b324fcef4 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 14 Jun 2018 14:48:16 +0200
Subject: [PATCH] Uses yet another, more reliable solution for restoring
 selected buffer state

---
 .../quasseldroid/ui/chat/ChatActivity.kt      | 66 ++++++++++---------
 .../chat/buffers/BufferViewConfigFragment.kt  | 10 +--
 .../viewmodel/QuasselViewModel.kt             |  1 -
 3 files changed, 40 insertions(+), 37 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 875e91278..97fd0b1e1 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
@@ -55,6 +55,7 @@ import de.kuschku.libquassel.protocol.Message_Type
 import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.session.Error
+import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.util.Optional
 import de.kuschku.libquassel.util.flag.and
 import de.kuschku.libquassel.util.flag.hasFlag
@@ -140,7 +141,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
 
   override fun onNewIntent(intent: Intent?) {
     super.onNewIntent(intent)
-    if (intent != null && (intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
+    if (intent != null) {
       when {
         intent.type == "text/plain"                                     -> {
           chatlineFragment?.replaceText(intent.getStringExtra(Intent.EXTRA_TEXT))
@@ -172,39 +173,39 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
           val networkId = intent.getIntExtra(KEY_NETWORK_ID, -1)
           val channel = intent.getStringExtra(KEY_CHANNEL)
 
-          viewModel.session.value?.orNull()?.also { session ->
-            val info = session.bufferSyncer?.find(
-              bufferName = channel,
-              networkId = networkId,
-              type = Buffer_Type.of(Buffer_Type.ChannelBuffer)
-            )
+          viewModel.session.filter(Optional<ISession>::isPresent).firstElement().subscribe {
+            it.orNull()?.also { session ->
+              val info = session.bufferSyncer?.find(
+                bufferName = channel,
+                networkId = networkId,
+                type = Buffer_Type.of(Buffer_Type.ChannelBuffer)
+              )
 
-            if (info != null) {
-              viewModel.buffer.onNext(info.bufferId)
-              viewModel.bufferOpened.onNext(Unit)
-            } else {
-              viewModel.allBuffers.map {
-                listOfNotNull(it.find {
-                  it.networkId == networkId &&
-                  it.bufferName == channel &&
-                  it.type.hasFlag(Buffer_Type.ChannelBuffer)
-                })
-              }.filter {
-                it.isNotEmpty()
-              }.firstElement().toLiveData().observe(this, Observer {
-                it?.firstOrNull()?.let { info ->
-                  viewModel.buffer.onNext(info.bufferId)
-                  viewModel.bufferOpened.onNext(Unit)
+              if (info != null) {
+                ChatActivity.launch(this, bufferId = info.bufferId)
+              } else {
+                viewModel.allBuffers.map {
+                  listOfNotNull(it.find {
+                    it.networkId == networkId &&
+                    it.bufferName == channel &&
+                    it.type.hasFlag(Buffer_Type.ChannelBuffer)
+                  })
+                }.filter {
+                  it.isNotEmpty()
+                }.firstElement().subscribe {
+                  it?.firstOrNull()?.let { info ->
+                    ChatActivity.launch(this, bufferId = info.bufferId)
+                  }
                 }
-              })
 
-              session.bufferSyncer?.find(
-                networkId = networkId,
-                type = Buffer_Type.of(Buffer_Type.StatusBuffer)
-              )?.let { statusInfo ->
-                session.rpcHandler?.sendInput(
-                  statusInfo, "/join $channel"
-                )
+                session.bufferSyncer?.find(
+                  networkId = networkId,
+                  type = Buffer_Type.of(Buffer_Type.StatusBuffer)
+                )?.let { statusInfo ->
+                  session.rpcHandler?.sendInput(
+                    statusInfo, "/join $channel"
+                  )
+                }
               }
             }
           }
@@ -281,7 +282,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       })
     }.toLiveData().observe(this, Observer { info ->
       info?.orNull()?.let {
-        viewModel.buffer.onNext(it.bufferId)
+        ChatActivity.launch(this, bufferId = it.bufferId)
       }
     })
 
@@ -926,6 +927,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     startedSelection = true
     connectedAccount = -1L
     restoredDrawerState = false
+    ChatActivity.launch(this, bufferId = Int.MAX_VALUE)
     viewModel.resetAccount()
   }
 
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 a23db1f5f..893caf240 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
@@ -44,6 +44,7 @@ import de.kuschku.quasseldroid.persistence.AccountDatabase
 import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.MessageSettings
+import de.kuschku.quasseldroid.ui.chat.ChatActivity
 import de.kuschku.quasseldroid.ui.coresettings.network.NetworkEditActivity
 import de.kuschku.quasseldroid.util.ColorContext
 import de.kuschku.quasseldroid.util.avatars.AvatarHelper
@@ -457,12 +458,13 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     outState.putParcelable(KEY_STATE_LIST, chatList.layoutManager.onSaveInstanceState())
   }
 
-  private fun clickListener(it: BufferId) {
+  private fun clickListener(bufferId: BufferId) {
     if (actionMode != null) {
-      longClickListener(it)
+      longClickListener(bufferId)
     } else {
-      viewModel.buffer.onNext(it)
-      viewModel.bufferOpened.onNext(Unit)
+      context?.let {
+        ChatActivity.launch(it, bufferId = bufferId)
+      }
     }
   }
 
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 a04c36e95..25ada760b 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -44,7 +44,6 @@ import java.util.concurrent.TimeUnit
 
 class QuasselViewModel : ViewModel() {
   fun resetAccount() {
-    buffer.onNext(Int.MAX_VALUE)
     bufferViewConfigId.onNext(-1)
     selectedMessages.onNext(emptyMap())
     expandedMessages.onNext(emptySet())
-- 
GitLab