From 3fbf96538ec1b594177cdebe3852f8cbef0e7080 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 19 Dec 2018 12:34:22 +0100
Subject: [PATCH] Allow swiping away notifications without marking channel as
 read

---
 .../service/QuasselNotificationBackend.kt     |  3 ++-
 .../quasseldroid/service/QuasselService.kt    | 22 +++++++++++++++-
 .../QuasseldroidNotificationManager.kt        |  5 ++--
 .../settings/NotificationSettings.kt          |  3 ++-
 .../kuschku/quasseldroid/settings/Settings.kt | 26 +++++++++++--------
 .../res/values-de/strings_preferences.xml     |  3 +++
 .../main/res/values/strings_preferences.xml   |  4 +++
 app/src/main/res/xml/preferences.xml          |  6 +++++
 .../persistence/QuasselDatabase.kt            | 20 +++++++++++---
 9 files changed, 71 insertions(+), 21 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 be8f99404..823e0715b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -240,7 +240,8 @@ class QuasselNotificationBackend @Inject constructor(
         ownNick = me?.nick() ?: "",
         ownIdent = me?.user() ?: "",
         ownRealName = me?.realName() ?: "",
-        ownAvatarUrl = ""
+        ownAvatarUrl = "",
+        hidden = false
       )
     }
     database.notifications().save(*results.toTypedArray())
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index 06d643d8f..14a94f3fa 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -51,6 +51,7 @@ import de.kuschku.quasseldroid.persistence.QuasselBacklogStorage
 import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.settings.ConnectionSettings
 import de.kuschku.quasseldroid.settings.MessageSettings
+import de.kuschku.quasseldroid.settings.NotificationSettings
 import de.kuschku.quasseldroid.settings.Settings
 import de.kuschku.quasseldroid.ssl.QuasselHostnameVerifier
 import de.kuschku.quasseldroid.ssl.QuasselTrustManager
@@ -72,6 +73,9 @@ class QuasselService : DaggerLifecycleService(),
   @Inject
   lateinit var connectionSettings: ConnectionSettings
 
+  @Inject
+  lateinit var notificationSettings: NotificationSettings
+
   private lateinit var translatedLocale: Context
 
   override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
@@ -197,6 +201,18 @@ class QuasselService : DaggerLifecycleService(),
         sessionManager.session.value?.bufferSyncer?.requestSetLastSeenMsg(bufferId, clearMessageId)
         sessionManager.session.value?.bufferSyncer?.requestMarkBufferAsRead(bufferId)
       }
+
+      val hideMessageId = intent.getLongExtra("hide_message", -1)
+      if (bufferId != -1 && hideMessageId != -1L) {
+        if (notificationSettings.markReadOnSwipe) {
+          sessionManager.session.value?.bufferSyncer?.requestSetLastSeenMsg(bufferId, hideMessageId)
+          sessionManager.session.value?.bufferSyncer?.requestMarkBufferAsRead(bufferId)
+        } else {
+          handlerService.backend {
+            database.notifications().markHidden(bufferId, clearMessageId)
+          }
+        }
+      }
     }
   }
 
@@ -496,7 +512,8 @@ class QuasselService : DaggerLifecycleService(),
       context: Context,
       disconnect: Boolean? = null,
       bufferId: BufferId? = null,
-      markReadMessage: MsgId? = null
+      markReadMessage: MsgId? = null,
+      hideMessage: MsgId? = null
     ) = Intent(context, QuasselService::class.java).apply {
       if (disconnect != null) {
         putExtra("disconnect", disconnect)
@@ -507,6 +524,9 @@ class QuasselService : DaggerLifecycleService(),
       if (markReadMessage != null) {
         putExtra("mark_read_message", markReadMessage)
       }
+      if (hideMessage != null) {
+        putExtra("hide_message", hideMessage)
+      }
     }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
index 6a0042a5a..2d8f71121 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasseldroidNotificationManager.kt
@@ -130,8 +130,7 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
       System.currentTimeMillis().toInt(),
       QuasselService.intent(
         context,
-        bufferId = bufferInfo.bufferId,
-        markReadMessage = notifications.last().messageId
+        bufferId = bufferInfo.bufferId
       ),
       0
     )
@@ -153,7 +152,7 @@ class QuasseldroidNotificationManager @Inject constructor(private val context: C
       QuasselService.intent(
         context,
         bufferId = bufferInfo.bufferId,
-        markReadMessage = notifications.last().messageId
+        hideMessage = notifications.last().messageId
       ),
       0
     )
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/NotificationSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/NotificationSettings.kt
index af07daba1..b3a04918e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/NotificationSettings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/NotificationSettings.kt
@@ -25,7 +25,8 @@ data class NotificationSettings(
   val other: Level = Level.NONE,
   val sound: String = "content://settings/system/notification_sound",
   val vibrate: Boolean = true,
-  val light: Boolean = true
+  val light: Boolean = true,
+  val markReadOnSwipe: Boolean = true
 ) {
   enum class Level {
     ALL,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
index 1a05908ea..68878da3e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/Settings.kt
@@ -32,13 +32,13 @@ object Settings {
         getString(
           context.getString(R.string.preference_theme_key),
           ""
-        )
+        ) ?: ""
       ) ?: AppearanceSettings.DEFAULT.theme,
       inputEnter = InputEnterMode.of(
         getString(
           context.getString(R.string.preference_input_enter_key),
           ""
-        )
+        ) ?: ""
       ) ?: AppearanceSettings.DEFAULT.inputEnter,
       showLag = getBoolean(
         context.getString(R.string.preference_show_lag_key),
@@ -51,7 +51,7 @@ object Settings {
       language = getString(
         context.getString(R.string.preference_language_key),
         AppearanceSettings.DEFAULT.language
-      )
+      ) ?: ""
     )
   }
 
@@ -77,13 +77,13 @@ object Settings {
         getString(
           context.getString(R.string.preference_show_prefix_key),
           ""
-        )
+        ) ?: ""
       ) ?: MessageSettings.DEFAULT.showPrefix,
       colorizeNicknames = MessageSettings.ColorizeNicknamesMode.of(
         getString(
           context.getString(R.string.preference_colorize_nicknames_key),
           ""
-        )
+        ) ?: ""
       ) ?: MessageSettings.DEFAULT.colorizeNicknames,
       colorizeMirc = getBoolean(
         context.getString(R.string.preference_colorize_mirc_key),
@@ -142,24 +142,24 @@ object Settings {
         getString(
           context.getString(R.string.preference_notification_query_key),
           ""
-        )
+        ) ?: ""
       ) ?: NotificationSettings.DEFAULT.query,
       channel = NotificationSettings.Level.of(
         getString(
           context.getString(R.string.preference_notification_channel_key),
           ""
-        )
+        ) ?: ""
       ) ?: NotificationSettings.DEFAULT.channel,
       other = NotificationSettings.Level.of(
         getString(
           context.getString(R.string.preference_notification_other_key),
           ""
-        )
+        ) ?: ""
       ) ?: NotificationSettings.DEFAULT.other,
       sound = getString(
         context.getString(R.string.preference_notification_sound_key),
         NotificationSettings.DEFAULT.sound
-      ),
+      ) ?: "",
       vibrate = getBoolean(
         context.getString(R.string.preference_notification_vibration_key),
         NotificationSettings.DEFAULT.vibrate
@@ -167,6 +167,10 @@ object Settings {
       light = getBoolean(
         context.getString(R.string.preference_notification_light_key),
         NotificationSettings.DEFAULT.light
+      ),
+      markReadOnSwipe = getBoolean(
+        context.getString(R.string.preference_notification_mark_read_on_swipe_key),
+        NotificationSettings.DEFAULT.markReadOnSwipe
       )
     )
   }
@@ -213,11 +217,11 @@ object Settings {
       initialAmount = getString(
         context.getString(R.string.preference_initial_amount_key),
         BacklogSettings.DEFAULT.initialAmount.toString()
-      ).toIntOrNull() ?: BacklogSettings.DEFAULT.initialAmount,
+      )?.toIntOrNull() ?: BacklogSettings.DEFAULT.initialAmount,
       pageSize = getString(
         context.getString(R.string.preference_page_size_key),
         BacklogSettings.DEFAULT.pageSize.toString()
-      ).toIntOrNull() ?: BacklogSettings.DEFAULT.pageSize
+      )?.toIntOrNull() ?: BacklogSettings.DEFAULT.pageSize
     )
   }
 
diff --git a/app/src/main/res/values-de/strings_preferences.xml b/app/src/main/res/values-de/strings_preferences.xml
index 1a37bef61..ae6f7daed 100644
--- a/app/src/main/res/values-de/strings_preferences.xml
+++ b/app/src/main/res/values-de/strings_preferences.xml
@@ -60,6 +60,9 @@
 
   <string name="preference_notification_light_title">LED</string>
 
+  <string name="preference_notification_mark_read_on_swipe_title">Wegwischen einer Benachrichtigung markiert den Channel als gelesen</string>
+  <string name="preference_notification_mark_read_on_swipe_summary">Markiert alle Nachrichten in einem Channel als gelesen wenn eine Benachrichtigung für den Channel weggewischt wird</string>
+
   <string name="preference_notification_configure_title">Benachrichtigungen konfigurieren</string>
 
   <string name="preference_notifications_level_all">Alle Nachrichten</string>
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index 3a3f47cb2..55539f463 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -131,6 +131,10 @@
   <string name="preference_notification_light_key" translatable="false">notification_light</string>
   <string name="preference_notification_light_title">LED</string>
 
+  <string name="preference_notification_mark_read_on_swipe_key" translatable="false">mark_read_on_swipe</string>
+  <string name="preference_notification_mark_read_on_swipe_title">Mark channel read when swiping notifications</string>
+  <string name="preference_notification_mark_read_on_swipe_summary">Marks all messages in a channel as read when a notification for the channel is swiped away</string>
+
   <string name="preference_notification_configure_key" translatable="false">notification_configure</string>
   <string name="preference_notification_configure_title">Configure Notifications</string>
 
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index fdbfde9ed..1eea34448 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -84,6 +84,12 @@
       android:key="@string/preference_notification_other_key"
       android:title="@string/preference_notification_other_title" />
 
+    <SwitchPreference
+      android:defaultValue="true"
+      android:key="@string/preference_notification_mark_read_on_swipe_key"
+      android:summary="@string/preference_notification_mark_read_on_swipe_summary"
+      android:title="@string/preference_notification_mark_read_on_swipe_title" />
+
     <de.kuschku.quasseldroid.util.ui.settings.RingtonePreference
       android:defaultValue="content://settings/system/notification_sound"
       android:key="@string/preference_notification_sound_key"
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
index a8292ea0b..2be90b1b8 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -32,7 +32,7 @@ import io.reactivex.Flowable
 import org.threeten.bp.Instant
 
 @Database(entities = [MessageData::class, Filtered::class, SslValidityWhitelistEntry::class, SslHostnameWhitelistEntry::class, NotificationData::class],
-          version = 17)
+          version = 18)
 @TypeConverters(MessageTypeConverter::class)
 abstract class QuasselDatabase : RoomDatabase() {
   abstract fun message(): MessageDao
@@ -218,7 +218,8 @@ abstract class QuasselDatabase : RoomDatabase() {
     var ownNick: String,
     var ownIdent: String,
     var ownRealName: String,
-    var ownAvatarUrl: String
+    var ownAvatarUrl: String,
+    var hidden: Boolean
   )
 
   @Dao
@@ -229,12 +230,18 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Query("SELECT DISTINCT bufferId FROM notification")
     fun buffers(): List<BufferId>
 
-    @Query("SELECT * FROM notification ORDER BY time ASC")
+    @Query("SELECT * FROM notification WHERE hidden = 0 ORDER BY time ASC")
     fun all(): List<NotificationData>
 
-    @Query("SELECT * FROM notification WHERE bufferId = :bufferId ORDER BY time ASC")
+    @Query("SELECT * FROM notification WHERE bufferId = :bufferId AND hidden = 0 ORDER BY time ASC")
     fun all(bufferId: BufferId): List<NotificationData>
 
+    @Query("UPDATE notification SET hidden = 1 WHERE bufferId = :bufferId AND messageId <= :messageId")
+    fun markHidden(bufferId: BufferId, messageId: MsgId)
+
+    @Query("UPDATE notification SET hidden = 1 WHERE bufferId = :bufferId AND flag & 2 = 0")
+    fun markHiddenNormal(bufferId: BufferId)
+
     @Query("DELETE FROM notification WHERE bufferId = :bufferId AND messageId <= :messageId")
     fun markRead(bufferId: BufferId, messageId: MsgId)
 
@@ -352,6 +359,11 @@ abstract class QuasselDatabase : RoomDatabase() {
                   database.execSQL("ALTER TABLE `notification` ADD `ownRealName` TEXT DEFAULT '' NOT NULL;")
                   database.execSQL("ALTER TABLE `notification` ADD `ownAvatarUrl` TEXT DEFAULT '' NOT NULL;")
                 }
+              },
+              object : Migration(17, 18) {
+                override fun migrate(database: SupportSQLiteDatabase) {
+                  database.execSQL("ALTER TABLE `notification` ADD `hidden` INT DEFAULT 0 NOT NULL;")
+                }
               }
             ).build()
           }
-- 
GitLab