Skip to content
Snippets Groups Projects
Verified Commit 7c37d285 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Fixed issue where unhiding buffers would sort them wrongly

parent fafd18f3
No related branches found
No related tags found
No related merge requests found
Pipeline #513 canceled
Showing
with 101 additions and 56 deletions
...@@ -497,7 +497,7 @@ class QuasselService : DaggerLifecycleService(), ...@@ -497,7 +497,7 @@ class QuasselService : DaggerLifecycleService(),
session.bufferViewManager.requestCreateBufferView( session.bufferViewManager.requestCreateBufferView(
Defaults.bufferViewConfigInitial(translatedLocale).apply { Defaults.bufferViewConfigInitial(translatedLocale).apply {
for (info in session.bufferSyncer.bufferInfos()) { for (info in session.bufferSyncer.bufferInfos()) {
handleBuffer(info, session.bufferSyncer) handleBuffer(info, session.bufferSyncer, session.networks)
} }
}.toVariantMap() }.toVariantMap()
) )
......
...@@ -191,7 +191,7 @@ object BufferContextPresenter { ...@@ -191,7 +191,7 @@ object BufferContextPresenter {
true true
} }
R.id.action_unhide -> { R.id.action_unhide -> {
bufferViewConfig?.insertBufferSorted(info, bufferSyncer) bufferViewConfig?.insertBufferSorted(info, bufferSyncer, session.networks)
actionMode.finish() actionMode.finish()
true true
} }
......
...@@ -245,7 +245,7 @@ class BufferSyncer constructor( ...@@ -245,7 +245,7 @@ class BufferSyncer constructor(
live_bufferInfos.onNext(Unit) live_bufferInfos.onNext(Unit)
if (oldInfo == null) { if (oldInfo == null) {
session.bufferViewManager.handleBuffer(info, this) session.bufferViewManager.handleBuffer(info, this, session.networks)
} }
} }
} }
...@@ -282,7 +282,7 @@ class BufferSyncer constructor( ...@@ -282,7 +282,7 @@ class BufferSyncer constructor(
activity hasFlag Message_Type.Notice || activity hasFlag Message_Type.Notice ||
activity hasFlag Message_Type.Action) { activity hasFlag Message_Type.Action) {
bufferInfo(buffer)?.let { bufferInfo(buffer)?.let {
session.bufferViewManager.handleBuffer(it, this, true) session.bufferViewManager.handleBuffer(it, this, session.networks, true)
} }
} }
_bufferActivities[buffer] = activity _bufferActivities[buffer] = activity
......
...@@ -26,7 +26,6 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig ...@@ -26,7 +26,6 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig
import de.kuschku.libquassel.session.SignalProxy import de.kuschku.libquassel.session.SignalProxy
import de.kuschku.libquassel.util.flag.hasFlag import de.kuschku.libquassel.util.flag.hasFlag
import de.kuschku.libquassel.util.helper.clampOf import de.kuschku.libquassel.util.helper.clampOf
import de.kuschku.libquassel.util.irc.IrcCaseMappers
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.subjects.BehaviorSubject import io.reactivex.subjects.BehaviorSubject
...@@ -326,28 +325,33 @@ class BufferViewConfig constructor( ...@@ -326,28 +325,33 @@ class BufferViewConfig constructor(
(a?.bufferViewName() ?: "").compareTo((b?.bufferViewName() ?: ""), true) (a?.bufferViewName() ?: "").compareTo((b?.bufferViewName() ?: ""), true)
} }
fun insertBufferSorted(info: BufferInfo, bufferSyncer: BufferSyncer) { fun insertBufferSorted(info: BufferInfo, bufferSyncer: BufferSyncer,
networks: Map<NetworkId, Network>) {
if (!_buffers.contains(info.bufferId)) { if (!_buffers.contains(info.bufferId)) {
val element = IrcCaseMappers.unicode.toLowerCaseNullable(info.bufferName) requestAddBuffer(
val position = info.bufferId,
if (_sortAlphabetically) -_buffers.mapNotNull { sortBuffers(
IrcCaseMappers.unicode.toLowerCaseNullable(bufferSyncer.bufferInfo(it)?.bufferName) _buffers.mapNotNull { bufferSyncer.bufferInfo(it) } + info,
}.binarySearch(element) - 1 sortAlphabetically(),
else _buffers.size { it.bufferName ?: "" },
requestAddBuffer(info.bufferId, position) { networks[it.networkId]?.networkName() ?: "" },
{ it.type }
).indexOf(info)
)
} }
} }
fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, unhide: Boolean = false) { fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, networks: Map<NetworkId, Network>,
unhide: Boolean = false) {
if (_addNewBuffersAutomatically && if (_addNewBuffersAutomatically &&
!_buffers.contains(info.bufferId) && !_buffers.contains(info.bufferId) &&
!_temporarilyRemovedBuffers.contains(info.bufferId) && !_temporarilyRemovedBuffers.contains(info.bufferId) &&
!_removedBuffers.contains(info.bufferId) && !_removedBuffers.contains(info.bufferId) &&
!info.type.hasFlag(Buffer_Type.StatusBuffer)) { !info.type.hasFlag(Buffer_Type.StatusBuffer)) {
insertBufferSorted(info, bufferSyncer) insertBufferSorted(info, bufferSyncer, networks)
} else if (unhide && !_buffers.contains(info.bufferId) && } else if (unhide && !_buffers.contains(info.bufferId) &&
_temporarilyRemovedBuffers.contains(info.bufferId)) { _temporarilyRemovedBuffers.contains(info.bufferId)) {
insertBufferSorted(info, bufferSyncer) insertBufferSorted(info, bufferSyncer, networks)
} }
} }
...@@ -365,4 +369,18 @@ class BufferViewConfig constructor( ...@@ -365,4 +369,18 @@ class BufferViewConfig constructor(
override fun toString(): String { override fun toString(): String {
return "BufferViewConfig(_bufferViewId=$_bufferViewId, _bufferViewName='$_bufferViewName', _networkId=$_networkId, _addNewBuffersAutomatically=$_addNewBuffersAutomatically, _sortAlphabetically=$_sortAlphabetically, _hideInactiveBuffers=$_hideInactiveBuffers, _hideInactiveNetworks=$_hideInactiveNetworks, _disableDecoration=$_disableDecoration, _allowedBufferTypes=$_allowedBufferTypes, _minimumActivity=$_minimumActivity, _showSearch=$_showSearch)" return "BufferViewConfig(_bufferViewId=$_bufferViewId, _bufferViewName='$_bufferViewName', _networkId=$_networkId, _addNewBuffersAutomatically=$_addNewBuffersAutomatically, _sortAlphabetically=$_sortAlphabetically, _hideInactiveBuffers=$_hideInactiveBuffers, _hideInactiveNetworks=$_hideInactiveNetworks, _disableDecoration=$_disableDecoration, _allowedBufferTypes=$_allowedBufferTypes, _minimumActivity=$_minimumActivity, _showSearch=$_showSearch)"
} }
companion object {
inline fun <T> sortBuffers(list: List<T>, sortAlphabetically: Boolean,
crossinline bufferName: (T) -> String,
crossinline networkName: (T) -> String,
crossinline type: (T) -> Buffer_Types) =
list.let {
if (sortAlphabetically) list.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER,
bufferName))
else list
}.sortedBy {
!type(it).hasFlag(Buffer_Type.StatusBuffer)
}.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, networkName))
}
} }
...@@ -90,12 +90,13 @@ class BufferViewManager constructor( ...@@ -90,12 +90,13 @@ class BufferViewManager constructor(
private val _bufferViewConfigs: MutableMap<Int, BufferViewConfig> = mutableMapOf() private val _bufferViewConfigs: MutableMap<Int, BufferViewConfig> = mutableMapOf()
private val live_bufferViewConfigs: BehaviorSubject<Set<Int>> = BehaviorSubject.createDefault<Set<Int>>( private val live_bufferViewConfigs: BehaviorSubject<Set<Int>> = BehaviorSubject.createDefault(
emptySet()) emptySet())
fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, unhide: Boolean = false) { fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, networks: Map<NetworkId, Network>,
unhide: Boolean = false) {
for (bufferViewConfig in bufferViewConfigs()) { for (bufferViewConfig in bufferViewConfigs()) {
bufferViewConfig.handleBuffer(info, bufferSyncer, unhide) bufferViewConfig.handleBuffer(info, bufferSyncer, networks, unhide)
} }
} }
......
...@@ -280,7 +280,7 @@ class Session( ...@@ -280,7 +280,7 @@ class Session(
initCallback?.invoke(this) initCallback?.invoke(this)
for (config in bufferViewManager.bufferViewConfigs()) { for (config in bufferViewManager.bufferViewConfigs()) {
for (info in bufferSyncer.bufferInfos()) { for (info in bufferSyncer.bufferInfos()) {
config.handleBuffer(info, bufferSyncer) config.handleBuffer(info, bufferSyncer, networks)
} }
} }
notificationManager?.init(this) notificationManager?.init(this)
......
...@@ -43,7 +43,7 @@ class BufferViewConfigTest { ...@@ -43,7 +43,7 @@ class BufferViewConfigTest {
val bufferViewConfig = bufferViewManager.bufferViewConfig(0)!! val bufferViewConfig = bufferViewManager.bufferViewConfig(0)!!
ensure { ensure {
bufferViewConfig.insertBufferSorted(bufferSyncer.bufferInfo(BufferId(4))!!, bufferSyncer) bufferViewConfig.insertBufferSorted(bufferSyncer.bufferInfo(BufferId(4))!!, bufferSyncer, networks)
}.does { }.does {
callSync(bufferViewConfig, "requestAddBuffer", listOf( callSync(bufferViewConfig, "requestAddBuffer", listOf(
QVariant_.of(BufferId(4), QType.BufferId), QVariant_.of(BufferId(4), QType.BufferId),
......
...@@ -60,5 +60,5 @@ open class ArchiveViewModelHelper @Inject constructor( ...@@ -60,5 +60,5 @@ open class ArchiveViewModelHelper @Inject constructor(
showHandle showHandle
) )
val selectedBuffer = processSelectedBuffer(archive.selectedBufferId) val selectedBuffer = processSelectedBuffer(bufferViewConfig, archive.selectedBufferId)
} }
...@@ -170,7 +170,7 @@ open class ChatViewModelHelper @Inject constructor( ...@@ -170,7 +170,7 @@ open class ChatViewModelHelper @Inject constructor(
val nickDataThrottled = val nickDataThrottled =
nickData.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS) nickData.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS)
val selectedBuffer = processSelectedBuffer(chat.selectedBufferId) val selectedBuffer = processSelectedBuffer(bufferViewConfig, chat.selectedBufferId)
fun processChatBufferList( fun processChatBufferList(
filtered: Observable<Pair<Map<BufferId, Int>, Int>> filtered: Observable<Pair<Map<BufferId, Int>, Int>>
......
...@@ -456,12 +456,15 @@ open class QuasselViewModelHelper @Inject constructor( ...@@ -456,12 +456,15 @@ open class QuasselViewModelHelper @Inject constructor(
} }
fun processSelectedBuffer( fun processSelectedBuffer(
bufferViewConfigObservable: Observable<Optional<BufferViewConfig>>,
selectedBufferId: Observable<BufferId> selectedBufferId: Observable<BufferId>
) = combineLatest(connectedSession, selectedBufferId) ) = combineLatest(connectedSession, selectedBufferId, bufferViewConfigObservable)
.safeSwitchMap { (sessionOptional, buffer) -> .safeSwitchMap { (sessionOptional, buffer, bufferViewConfigOptional) ->
val session = sessionOptional.orNull() val session = sessionOptional.orNull()
val bufferViewConfig = bufferViewConfigOptional.orNull()
val bufferSyncer = session?.bufferSyncer val bufferSyncer = session?.bufferSyncer
if (bufferSyncer != null) { if (bufferSyncer != null && bufferViewConfig != null) {
bufferHiddenState(bufferViewConfig, buffer).safeSwitchMap { bufferHiddenState ->
session.liveNetworks().safeSwitchMap { networks -> session.liveNetworks().safeSwitchMap { networks ->
val info = if (!buffer.isValidId()) networks[NetworkId(-buffer.id)]?.let { val info = if (!buffer.isValidId()) networks[NetworkId(-buffer.id)]?.let {
BufferInfo( BufferInfo(
...@@ -479,7 +482,8 @@ open class QuasselViewModelHelper @Inject constructor( ...@@ -479,7 +482,8 @@ open class QuasselViewModelHelper @Inject constructor(
network?.liveConnectionState()?.map { network?.liveConnectionState()?.map {
SelectedBufferItem( SelectedBufferItem(
info, info,
connectionState = it connectionState = it,
hiddenState = bufferHiddenState
) )
} ?: Observable.just(SelectedBufferItem(info)) } ?: Observable.just(SelectedBufferItem(info))
} }
...@@ -487,19 +491,41 @@ open class QuasselViewModelHelper @Inject constructor( ...@@ -487,19 +491,41 @@ open class QuasselViewModelHelper @Inject constructor(
network?.liveIrcChannel(info.bufferName)?.mapNullable(IrcChannel.NULL) { network?.liveIrcChannel(info.bufferName)?.mapNullable(IrcChannel.NULL) {
SelectedBufferItem( SelectedBufferItem(
info, info,
joined = it != null joined = it != null,
hiddenState = bufferHiddenState
) )
} ?: Observable.just(SelectedBufferItem(info)) } ?: Observable.just(SelectedBufferItem(
info,
hiddenState = bufferHiddenState
))
} }
else -> else ->
Observable.just(SelectedBufferItem(info)) Observable.just(SelectedBufferItem(
info,
hiddenState = bufferHiddenState
))
} }
} else { } else {
Observable.just(SelectedBufferItem()) Observable.just(SelectedBufferItem())
} }
} }
}
} else { } else {
Observable.just(SelectedBufferItem()) Observable.just(SelectedBufferItem())
} }
} }
fun bufferHiddenState(bufferViewConfig: BufferViewConfig,
bufferId: BufferId): Observable<BufferHiddenState> =
combineLatest(bufferViewConfig.liveBuffers(),
bufferViewConfig.liveTemporarilyRemovedBuffers(),
bufferViewConfig.liveRemovedBuffers())
.map { (visible, temp, perm) ->
when (bufferId) {
in visible -> BufferHiddenState.VISIBLE
in temp -> BufferHiddenState.HIDDEN_TEMPORARY
in perm -> BufferHiddenState.HIDDEN_PERMANENT
else -> BufferHiddenState.HIDDEN_PERMANENT
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment