From 709a157bd300d4c54af5ee217effef98b96181f9 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 6 Jan 2019 22:34:11 +0100
Subject: [PATCH] Fixes issue where missing feature warnings were mistakenly
 shown

Previously, when disconnected, even on the latest version missing
feature warnings used to be shown.
---
 .../chat/buffers/BufferViewConfigFragment.kt  |  4 ++--
 .../ui/chat/info/core/CoreInfoFragment.kt     |  6 ++---
 .../ui/coresettings/CoreSettingsFragment.kt   |  4 ++--
 .../highlightlist/HighlightListFragment.kt    |  4 ++--
 .../kuschku/libquassel/connection/Features.kt |  5 ++++
 .../viewmodel/QuasselViewModel.kt             | 24 +++++++++++++++----
 6 files changed, 34 insertions(+), 13 deletions(-)

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 85eab327c..9cf69497b 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
@@ -285,9 +285,9 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       }
     }
 
-    viewModel.features.toLiveData().observe(this, Observer {
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       featureContextBufferActivitySync.setMode(
-        if (it.hasFeature(ExtendedFeature.BufferActivitySync)) WarningBarView.MODE_NONE
+        if (!connected || features.hasFeature(ExtendedFeature.BufferActivitySync)) WarningBarView.MODE_NONE
         else WarningBarView.MODE_ICON
       )
     })
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
index cf8f38aac..5508883a2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
@@ -102,12 +102,12 @@ class CoreInfoFragment : ServiceBoundFragment() {
           data?.quasselBuildDate?.let(Html::fromHtml)
         versionDate.text = formattedVersionTime
 
-        val features = viewModel.session.value?.orNull()?.features?.core
-                       ?: QuasselFeatures.empty()
+        val (connected, features) = viewModel.coreFeatures.value ?: Pair(false,
+                                                                         QuasselFeatures.empty())
         missingFeatureList = RequiredFeatures.features.filter {
           it.feature !in features.enabledFeatures
         }
-        missingFeatures.visibleIf(missingFeatureList.isNotEmpty())
+        missingFeatures.visibleIf(connected && missingFeatureList.isNotEmpty())
 
         val startTime = data?.startTime?.atZone(ZoneId.systemDefault())?.let(dateTimeFormatter::format)
         uptime.text = requireContext().getString(R.string.label_core_online_since,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
index 612aa5b9d..d6950b889 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
@@ -170,11 +170,11 @@ class CoreSettingsFragment : ServiceBoundFragment() {
     })
 
     var missingFeatureList: List<MissingFeature> = emptyList()
-    viewModel.features.toLiveData().observe(this, Observer { features ->
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       missingFeatureList = RequiredFeatures.features.filter {
         it.feature !in features.enabledFeatures
       }
-      featureContextMissing.visibleIf(missingFeatureList.isNotEmpty())
+      featureContextMissing.visibleIf(connected && missingFeatureList.isNotEmpty())
     })
 
     featureContextMissing.setOnClickListener {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
index 65e4b00e4..a804785d7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
@@ -145,9 +145,9 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable,
         }
       })
 
-    viewModel.features.toLiveData().observe(this, Observer {
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       featureContextCoreSideHighlights.setMode(
-        if (it.hasFeature(ExtendedFeature.CoreSideHighlights)) WarningBarView.MODE_NONE
+        if (!connected || features.hasFeature(ExtendedFeature.CoreSideHighlights)) WarningBarView.MODE_NONE
         else WarningBarView.MODE_ICON
       )
     })
diff --git a/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt b/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
index 9745742c3..a8304f523 100644
--- a/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
@@ -30,4 +30,9 @@ data class Features(
       core.enabledFeatures intersect client.enabledFeatures,
       core.unknownFeatures union client.unknownFeatures
     )
+
+  companion object {
+    fun empty() = Features(QuasselFeatures.empty(), QuasselFeatures.empty())
+    fun all() = Features(QuasselFeatures.all(), QuasselFeatures.all())
+  }
 }
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 d64c71158..c531de604 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -24,7 +24,6 @@ import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.connection.Features
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.BufferInfo
-import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.session.Backend
@@ -85,9 +84,26 @@ class QuasselViewModel : ViewModel() {
   val sessionManager = backend.mapMap(Backend::sessionManager)
   val session = sessionManager.mapSwitchMap(SessionManager::session)
   val rpcHandler = session.mapMapNullable(ISession::rpcHandler)
-  val features = session.mapMap(ISession::features)
-    .mapMap(Features::negotiated)
-    .mapOrElse(QuasselFeatures.empty())
+  val features = sessionManager.mapSwitchMap { manager ->
+    manager.state.switchMap { state ->
+      if (state != ConnectionState.CONNECTED) {
+        Observable.just(Pair(false, Features.empty()))
+      } else {
+        manager.session.map {
+          Pair(true, it.features)
+        }
+      }
+    }
+  }.mapOrElse(Pair(false, Features.empty()))
+  val clientFeatures = features.map { (connected, features) ->
+    Pair(connected, features.client)
+  }
+  val negotiatedFeatures = features.map { (connected, features) ->
+    Pair(connected, features.negotiated)
+  }
+  val coreFeatures = features.map { (connected, features) ->
+    Pair(connected, features.core)
+  }
 
   val connectionProgress = sessionManager.mapSwitchMap(SessionManager::connectionProgress)
     .mapOrElse(Triple(ConnectionState.DISCONNECTED, 0, 0))
-- 
GitLab