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