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 09fdfcc61701708278b833f0a0be8799b2df8511..8223f982528d530405ab9e1d23e599d37bb785fd 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 @@ -585,7 +585,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc }) // Only show nick list when we’re in a channel buffer - viewModel.bufferData.distinctUntilChanged().toLiveData().observe(this, Observer { + viewModel.bufferData.toLiveData().observe(this, Observer { bufferData = it if (bufferData?.info?.type?.hasFlag(Buffer_Type.ChannelBuffer) == true) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END) @@ -700,12 +700,9 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc bufferData?.info?.type?.hasFlag(Buffer_Type.QueryBuffer) ?: false) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O menu?.retint(toolbar.context) - viewModel.nickData.toLiveData().observe(this, Observer { - val count = it?.count() ?: 0 - menu?.findItem(R.id.action_nicklist)?.icon = NickCountDrawable(count, - nickCountDrawableSize, - nickCountDrawableColor) - }) + menu?.findItem(R.id.action_nicklist)?.icon = NickCountDrawable(bufferData?.userCount ?: 0, + nickCountDrawableSize, + nickCountDrawableColor) return super.onCreateOptionsMenu(menu) } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt index 418e7f5054e1b9445da6b90c172961be8be05039..543925d72fd576e5c5e2d05b36eaa5b1e4f0030d 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt @@ -140,6 +140,8 @@ class IrcChannel( _userModes.getOr(ircUser, "") } + fun userCount() = _userCount + fun userModes(): Map<IrcUser, String> = _userModes fun userModes(nick: String) = network().ircUser(nick)?.let { userModes(it) } ?: "" fun liveUserModes(nick: String) = network().ircUser(nick)?.let { userModes(it) } ?: "" @@ -256,7 +258,7 @@ class IrcChannel( _userModes[user] = modes user.joinChannel(this, true) } - live_userModes.onNext(_userModes) + updateUsers() } override fun joinIrcUser(ircuser: IrcUser) { @@ -278,7 +280,7 @@ class IrcChannel( network().removeIrcChannel(this) proxy.stopSynchronize(this) } - live_userModes.onNext(_userModes) + updateUsers() } override fun part(nick: String) { @@ -289,7 +291,7 @@ class IrcChannel( if (ircuser == null || !isKnownUser(ircuser)) return _userModes[ircuser] = modes - live_userModes.onNext(_userModes) + updateUsers() } override fun setUserModes(nick: String, modes: String) { @@ -306,7 +308,7 @@ class IrcChannel( if (_userModes.getOr(ircuser, "").contains(mode, ignoreCase = true)) return _userModes[ircuser] = _userModes.getOr(ircuser, "") + mode - live_userModes.onNext(_userModes) + updateUsers() } override fun addUserMode(nick: String, mode: String) { @@ -320,7 +322,7 @@ class IrcChannel( return _userModes[ircuser] = _userModes.getOr(ircuser, "") .replace(mode, "", ignoreCase = true) - live_userModes.onNext(_userModes) + updateUsers() } override fun removeUserMode(nick: String, mode: String) { @@ -368,6 +370,12 @@ class IrcChannel( live_updates.onNext(Unit) } + private var _userCount: Int = 0 + set(value) { + field = value + live_updates.onNext(Unit) + } + private var _topic: String = "" set(value) { field = value @@ -386,10 +394,17 @@ class IrcChannel( live_updates.onNext(Unit) } + private fun updateUsers() { + _userCount = _userModes.size + live_userModes.onNext(_userModes) + } + private val live_userModes = BehaviorSubject.createDefault(mutableMapOf<IrcUser, String>()) private var _userModes: MutableMap<IrcUser, String> get() = live_userModes.value - set(value) = live_userModes.onNext(value) + set(value) { + updateUsers() + } private var _network: Network = network 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 2c12beb4a5c884a5fd43c6d2c897922499b3d24e..17e9e0e0a17275744757374756765edace3287b9 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -176,7 +176,8 @@ class QuasselViewModel : ViewModel() { BufferData( info = info, network = network, - description = it.topic() + description = it.topic(), + userCount = it.userCount() ) } } @@ -201,7 +202,7 @@ class QuasselViewModel : ViewModel() { } else { Observable.just(BufferData()) } - } + }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS) val nickData: Observable<List<IrcUserItem>> = combineLatest(session, buffer) .switchMap { (sessionOptional, buffer) -> @@ -242,7 +243,7 @@ class QuasselViewModel : ViewModel() { } else { Observable.just(emptyList()) } - } + }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS) val bufferViewConfigs = bufferViewManager.mapSwitchMap { manager -> manager.liveBufferViewConfigs().map { ids -> @@ -331,7 +332,6 @@ class QuasselViewModel : ViewModel() { if (bufferSyncer != null && config != null) { session.liveNetworks().switchMap { networks -> config.liveUpdates() - .debounce(16, TimeUnit.MILLISECONDS) .switchMap { currentConfig -> combineLatest<Collection<BufferId>>( listOf( @@ -517,5 +517,5 @@ class QuasselViewModel : ViewModel() { } else { Observable.just(Pair<BufferViewConfig?, List<BufferProps>>(null, emptyList())) } - } + }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS) } diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt index f3a175577ef3059e7211816a11ea32f1b37756c0..700c453f1407c5a37397a5b92c5295db0178d033 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt @@ -25,5 +25,6 @@ import de.kuschku.libquassel.quassel.syncables.Network data class BufferData( val info: BufferInfo? = null, val network: Network? = null, - val description: String? = null + val description: String? = null, + val userCount: Int = 0 )