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