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 85eab327ccdaaef0f4b881415ef406f3ddcb5095..9cf69497b68ffd752831893b0d16d6b5017624e3 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 cf8f38aac45f317dbae616ccbd2a6cb4029c606e..5508883a28edcb903f3d7777ab409381ec421524 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 612aa5b9d3906f087bdeb673a2ad58ebfcaaf631..d6950b889660d09fb9e0441710e40fb3aa55908f 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 65e4b00e48b2a66762d57a9c84750cf3979e3e03..a804785d7cd1f82f0234f3d06ce0734eda6f4ac7 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 9745742c33158c9f2baa62809a311f464d9fad30..a8304f5231c86c478b09f382ab7bac210922f528 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 d64c71158c6b0f21d9deeede1bcf94ce69be3d2f..c531de60452824d232ba67cf45409ca9b19d838d 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))