From 023ec9582272c92b36d08787b797bbf239065b74 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 18 Feb 2018 21:40:07 +0100
Subject: [PATCH] Correctly handle highlights set via the core

---
 .../ui/chat/BufferViewConfigFragment.kt       | 17 +++++----
 .../quassel/syncables/BufferSyncer.kt         | 35 +++++++++++++++++++
 .../syncables/interfaces/IBufferSyncer.kt     |  7 ++++
 3 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
index 4c618ac33..f35587207 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
@@ -99,13 +99,16 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
                     it to network
                   }
                 }.map { (info, network) ->
-                  bufferSyncer.liveActivity(info.bufferId).map { activity ->
-                    when {
-                      activity.hasFlag(Message.MessageType.Plain) ||
-                      activity.hasFlag(Message.MessageType.Notice) ||
-                      activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage
-                      activity.isNotEmpty()                        -> Buffer_Activity.OtherActivity
-                      else                                         -> Buffer_Activity.NoActivity
+                  bufferSyncer.liveActivity(info.bufferId).switchMap { activity ->
+                    bufferSyncer.liveHighlightCount(info.bufferId).map { highlights ->
+                      when {
+                        highlights > 0                               -> Buffer_Activity.Highlight
+                        activity.hasFlag(Message.MessageType.Plain) ||
+                        activity.hasFlag(Message.MessageType.Notice) ||
+                        activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage
+                        activity.isNotEmpty()                        -> Buffer_Activity.OtherActivity
+                        else                                         -> Buffer_Activity.NoActivity
+                      }
                     }
                   }.switchMap { activity ->
                     when (info.type.toInt()) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
index 3b578132a..0e0bbb12c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
@@ -17,14 +17,20 @@ class BufferSyncer constructor(
   fun liveActivity(buffer: BufferId): Observable<Message_Types>
     = live_bufferActivities.map { activity(buffer) }.distinctUntilChanged()
 
+  fun highlightCount(buffer: BufferId): Int = _highlightCounts[buffer] ?: 0
+  fun liveHighlightCount(buffer: BufferId): Observable<Int>
+    = live_highlightCounts.map { highlightCount(buffer) }.distinctUntilChanged()
+
   override fun toVariantMap(): QVariantMap = mapOf(
     "Activities" to QVariant_(initActivities(), Type.QVariantList),
+    "HighlightCounts" to QVariant_(initHighlightCounts(), Type.QVariantList),
     "LastSeenMsg" to QVariant_(initLastSeenMsg(), Type.QVariantList),
     "MarkerLines" to QVariant_(initMarkerLines(), Type.QVariantList)
   )
 
   override fun fromVariantMap(properties: QVariantMap) {
     initSetActivities(properties["Activities"].valueOr(::emptyList))
+    initSetHighlightCounts(properties["HighlightCounts"].valueOr(::emptyList))
     initSetLastSeenMsg(properties["LastSeenMsg"].valueOr(::emptyList))
     initSetMarkerLines(properties["MarkerLines"].valueOr(::emptyList))
   }
@@ -38,6 +44,15 @@ class BufferSyncer constructor(
     return list
   }
 
+  override fun initHighlightCounts(): QVariantList {
+    val list: MutableList<QVariant_> = mutableListOf()
+    for ((key, value) in _highlightCounts) {
+      list.add(QVariant_(key, QType.BufferId))
+      list.add(QVariant_(value, Type.Int))
+    }
+    return list
+  }
+
   override fun initLastSeenMsg(): QVariantList {
     val list: MutableList<QVariant_> = mutableListOf()
     for ((key, value) in _bufferActivities) {
@@ -64,6 +79,14 @@ class BufferSyncer constructor(
     }
   }
 
+  override fun initSetHighlightCounts(data: QVariantList) {
+    (0 until data.size step 2).map {
+      data[it].value(0) to data[it + 1].value(0)
+    }.forEach { (buffer, count) ->
+      setHighlightCount(buffer, count)
+    }
+  }
+
   override fun initSetLastSeenMsg(data: QVariantList) {
     (0 until data.size step 2).map {
       data[it].value(0) to data[it + 1].value(0)
@@ -90,6 +113,7 @@ class BufferSyncer constructor(
     _lastSeenMsg.remove(buffer2)
     _markerLines.remove(buffer2)
     _bufferActivities.remove(buffer2)
+    _highlightCounts.remove(buffer2)
     live_bufferInfos.onNext(_bufferInfos)
   }
 
@@ -97,6 +121,7 @@ class BufferSyncer constructor(
     _lastSeenMsg.remove(buffer)
     _markerLines.remove(buffer)
     _bufferActivities.remove(buffer)
+    _highlightCounts.remove(buffer)
     _bufferInfos.remove(buffer)
     live_bufferInfos.onNext(_bufferInfos)
   }
@@ -147,12 +172,22 @@ class BufferSyncer constructor(
     live_bufferActivities.onNext(_bufferActivities)
   }
 
+  override fun setHighlightCount(buffer: BufferId, count: Int) {
+    super.setHighlightCount(buffer, count)
+    _highlightCounts[buffer] = count
+    live_highlightCounts.onNext(_highlightCounts)
+  }
+
   private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf()
   private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf()
   private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf()
   private val live_bufferActivities = BehaviorSubject.createDefault(
     mutableMapOf<BufferId, Message_Types>()
   )
+  private val _highlightCounts: MutableMap<BufferId, Int> = mutableMapOf()
+  private val live_highlightCounts = BehaviorSubject.createDefault(
+    mutableMapOf<BufferId, Int>()
+  )
   private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>()
   val live_bufferInfos = BehaviorSubject.createDefault(mutableMapOf<BufferId, BufferInfo>())
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
index 26d510445..75a40f5ed 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
@@ -8,9 +8,11 @@ import de.kuschku.libquassel.protocol.Type
 @Syncable(name = "BufferSyncer")
 interface IBufferSyncer : ISyncableObject {
   fun initActivities(): QVariantList
+  fun initHighlightCounts(): QVariantList
   fun initLastSeenMsg(): QVariantList
   fun initMarkerLines(): QVariantList
   fun initSetActivities(data: QVariantList)
+  fun initSetHighlightCounts(data: QVariantList)
   fun initSetLastSeenMsg(data: QVariantList)
   fun initSetMarkerLines(data: QVariantList)
 
@@ -71,6 +73,11 @@ interface IBufferSyncer : ISyncableObject {
     SYNC("setBufferActivity", ARG(buffer, QType.BufferId), ARG(activity, Type.Int))
   }
 
+  @Slot
+  fun setHighlightCount(buffer: BufferId, count: Int) {
+    SYNC("setHighlightCount", ARG(buffer, QType.BufferId), ARG(count, Type.Int))
+  }
+
   @Slot
   fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) {
     SYNC("setLastSeenMsg", ARG(buffer, QType.BufferId), ARG(msgId, QType.MsgId))
-- 
GitLab