From e2d6689d6d32c751039aafd3a5f3985a674c43b2 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Tue, 1 May 2018 06:14:42 +0200
Subject: [PATCH] Fixed notification handling

Signed-off-by: Janne Koschinski <janne@kuschku.de>
---
 .../service/QuasselNotificationBackend.kt     | 23 ++++++++++++-
 .../quassel/syncables/BacklogManager.kt       | 20 +++++++++++
 .../syncables/interfaces/IBacklogManager.kt   | 33 +++++++++++++++++++
 .../de/kuschku/libquassel/session/Session.kt  |  2 +-
 4 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
index 13221cd6a..ee640fe44 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -60,9 +60,30 @@ class QuasselNotificationBackend @Inject constructor(
   private val selfColor = context.getColorCompat(android.R.color.background_dark)
 
   override fun init(session: Session) {
-    for (buffer in session.bufferSyncer.bufferInfos()) {
+    val buffers = session.bufferSyncer.bufferInfos()
+    for (buffer in buffers) {
       val lastSeenId = session.bufferSyncer.lastSeenMsg(buffer.bufferId)
       database.notifications().markRead(buffer.bufferId, lastSeenId)
+
+      if (buffer.type.hasFlag(Buffer_Type.QueryBuffer)) {
+        val activity = session.bufferSyncer.activity(buffer.bufferId)
+        if (activity.hasFlag(Message_Type.Plain) ||
+            activity.hasFlag(Message_Type.Action) ||
+            activity.hasFlag(Message_Type.Notice))
+          session.backlogManager.requestBacklogFiltered(
+            buffer.bufferId, lastSeenId, -1, 20, 0,
+            Message_Type.of(Message_Type.Plain, Message_Type.Action, Message_Type.Notice).toInt(),
+            0
+          )
+      } else {
+        if (session.bufferSyncer.highlightCount(buffer.bufferId) != 0) {
+          session.backlogManager.requestBacklogFiltered(
+            buffer.bufferId, lastSeenId, -1, 20, 0,
+            Message_Type.of(Message_Type.Plain, Message_Type.Action, Message_Type.Notice).toInt(),
+            Message_Flag.of(Message_Flag.Highlight).toInt()
+          )
+        }
+      }
     }
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
index 39fba3469..9fbe72f27 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
@@ -25,12 +25,32 @@ package de.kuschku.libquassel.quassel.syncables
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.syncables.interfaces.IBacklogManager
 import de.kuschku.libquassel.session.BacklogStorage
+import de.kuschku.libquassel.session.NotificationManager
 import de.kuschku.libquassel.session.Session
+import de.kuschku.libquassel.util.compatibility.LoggingHandler
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 
 class BacklogManager(
   private val session: Session,
+  private val notificationManager: NotificationManager?,
   private val backlogStorage: BacklogStorage
 ) : SyncableObject(session, "BacklogManager"), IBacklogManager {
+  override fun receiveBacklogFiltered(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
+                                      additional: Int, type: Int, flags: Int,
+                                      messages: QVariantList) {
+    log(LoggingHandler.LogLevel.ERROR, "DEBUG", "$messages")
+    val actualMessages = messages.mapNotNull { it.value<Message?>(null) }
+    log(LoggingHandler.LogLevel.ERROR, "DEBUG", "$actualMessages")
+    notificationManager?.processMessages(
+      session, *actualMessages.toTypedArray()
+    )
+  }
+
+  override fun receiveBacklogAllFiltered(first: MsgId, last: MsgId, limit: Int, additional: Int,
+                                         type: Int, flags: Int, messages: QVariantList) {
+    // TODO: Not implemented
+  }
+
   init {
     initialized = true
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
index 655f90f55..f01ac037c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
@@ -26,6 +26,8 @@ import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.util.compatibility.LoggingHandler
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 
 @Syncable(name = "BacklogManager")
 interface IBacklogManager : ISyncableObject {
@@ -38,6 +40,20 @@ interface IBacklogManager : ISyncableObject {
     )
   }
 
+  @Slot
+  fun requestBacklogFiltered(bufferId: BufferId, first: MsgId = -1, last: MsgId = -1,
+                             limit: Int = -1, additional: Int = 0, type: Int = -1,
+                             flags: Int = -1) {
+    log(LoggingHandler.LogLevel.ERROR,
+        "DEBUG",
+        "bufferId: $bufferId, first: $first, last: $last, limit: $limit, additional: $additional, type: $type, flags: $flags")
+    REQUEST(
+      "requestBacklogFiltered", ARG(bufferId, QType.BufferId), ARG(first, QType.MsgId),
+      ARG(last, QType.MsgId), ARG(limit, Type.Int), ARG(additional, Type.Int), ARG(type, Type.Int),
+      ARG(flags, Type.Int)
+    )
+  }
+
   @Slot
   fun requestBacklogAll(first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
                         additional: Int = 0) {
@@ -47,14 +63,31 @@ interface IBacklogManager : ISyncableObject {
     )
   }
 
+  @Slot
+  fun requestBacklogAllFiltered(first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
+                                additional: Int = 0, type: Int = -1, flags: Int = -1) {
+    REQUEST(
+      "requestBacklogAllFiltered", ARG(first, QType.MsgId), ARG(last, QType.MsgId),
+      ARG(limit, Type.Int), ARG(additional, Type.Int), ARG(type, Type.Int), ARG(flags, Type.Int)
+    )
+  }
+
   @Slot
   fun receiveBacklog(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int, additional: Int,
                      messages: QVariantList)
 
+  @Slot
+  fun receiveBacklogFiltered(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
+                             additional: Int, type: Int, flags: Int, messages: QVariantList)
+
   @Slot
   fun receiveBacklogAll(first: MsgId, last: MsgId, limit: Int, additional: Int,
                         messages: QVariantList)
 
+  @Slot
+  fun receiveBacklogAllFiltered(first: MsgId, last: MsgId, limit: Int, additional: Int,
+                                type: Int, flags: Int, messages: QVariantList)
+
   @Slot
   override fun update(properties: QVariantMap) {
     super.update(properties)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
index 09cfb79cf..29ce292e2 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -65,7 +65,7 @@ class Session(
   override val error = _error.toFlowable(BackpressureStrategy.BUFFER)
 
   override val aliasManager = AliasManager(this)
-  override val backlogManager = BacklogManager(this, backlogStorage)
+  override val backlogManager = BacklogManager(this, notificationManager, backlogStorage)
   override val bufferViewManager = BufferViewManager(this)
   override val bufferSyncer = BufferSyncer(this, notificationManager)
   override val certManagers = mutableMapOf<IdentityId, CertManager>()
-- 
GitLab