diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt index be96c8d1a..6e1bc7584 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt @@ -48,8 +48,6 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.usecase.NotificationPolicyState import com.keylesspalace.tusky.usecase.NotificationPolicyUsecase import com.keylesspalace.tusky.usecase.TimelineCases -import com.keylesspalace.tusky.util.deserialize -import com.keylesspalace.tusky.util.serialize import com.keylesspalace.tusky.viewdata.NotificationViewData import com.keylesspalace.tusky.viewdata.StatusViewData import com.keylesspalace.tusky.viewdata.TranslationViewData @@ -87,8 +85,8 @@ class NotificationsViewModel @Inject constructor( private val refreshTrigger = MutableStateFlow(0L) val excludes: StateFlow> = activeAccountFlow - .map { account -> deserialize(account?.notificationsFilter ?: "[]") } - .stateIn(viewModelScope, SharingStarted.Eagerly, deserialize(activeAccountFlow.value?.notificationsFilter ?: "[]")) + .map { account -> account?.notificationsFilter.orEmpty() } + .stateIn(viewModelScope, SharingStarted.Eagerly, activeAccountFlow.value?.notificationsFilter.orEmpty()) /** Map from notification id to translation. */ private val translations = MutableStateFlow(mapOf()) @@ -155,7 +153,7 @@ class NotificationsViewModel @Inject constructor( if (newFilters != excludes.value && account != null) { viewModelScope.launch { accountManager.updateAccount(account) { - copy(notificationsFilter = serialize(newFilters)) + copy(notificationsFilter = newFilters) } db.notificationsDao().cleanupNotifications(accountId, 0) refreshTrigger.value++ diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt index faa6efbdb..ff66c9e6f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt @@ -32,9 +32,7 @@ import com.keylesspalace.tusky.settings.preferenceCategory import com.keylesspalace.tusky.settings.sliderPreference import com.keylesspalace.tusky.settings.switchPreference import com.keylesspalace.tusky.util.LocaleManager -import com.keylesspalace.tusky.util.deserialize import com.keylesspalace.tusky.util.icon -import com.keylesspalace.tusky.util.serialize import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import dagger.hilt.android.AndroidEntryPoint import de.c1710.filemojicompat_ui.views.picker.preference.EmojiPickerPreference @@ -245,9 +243,7 @@ class PreferencesFragment : PreferenceFragmentCompat() { key = PrefKeys.WELLBEING_LIMITED_NOTIFICATIONS setOnPreferenceChangeListener { _, value -> for (account in accountManager.accounts) { - val notificationFilter = deserialize( - account.notificationsFilter - ).toMutableSet() + val notificationFilter = account.notificationsFilter.toMutableSet() if (value == true) { notificationFilter.add(Notification.Type.FAVOURITE) @@ -260,7 +256,7 @@ class PreferencesFragment : PreferenceFragmentCompat() { } lifecycleScope.launch { - accountManager.updateAccount(account) { copy(notificationsFilter = serialize(notificationFilter)) } + accountManager.updateAccount(account) { copy(notificationsFilter = notificationFilter) } } } true diff --git a/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt b/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt index 41598d4a4..a5d8f6db6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt +++ b/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt @@ -26,6 +26,7 @@ import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.entity.FilterResult import com.keylesspalace.tusky.entity.HashTag import com.keylesspalace.tusky.entity.NewPoll +import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Poll import com.keylesspalace.tusky.entity.PreviewCard import com.keylesspalace.tusky.entity.Status @@ -37,6 +38,8 @@ import java.net.URLEncoder import java.util.Date import javax.inject.Inject import javax.inject.Singleton +import kotlin.collections.forEach +import org.json.JSONArray @OptIn(ExperimentalStdlibApi::class) @ProvidedTypeConverter @@ -224,4 +227,29 @@ class Converters @Inject constructor( fun jsonToApplication(applicationJson: String?): Status.Application? { return applicationJson?.let { moshi.adapter().fromJson(it) } } + + @TypeConverter + fun notificationTypeListToJson(data: Set?): String { + val array = JSONArray() + data?.forEach { + array.put(it.presentation) + } + return array.toString() + } + + @TypeConverter + fun jsonToNotificationTypeList(data: String?): Set { + val ret = HashSet() + data?.let { + val array = JSONArray(data) + for (i in 0 until array.length()) { + val item = array.getString(i) + val type = Notification.Type.byString(item) + if (type != Notification.Type.UNKNOWN) { + ret.add(type) + } + } + } + return ret + } } diff --git a/app/src/main/java/com/keylesspalace/tusky/db/entity/AccountEntity.kt b/app/src/main/java/com/keylesspalace/tusky/db/entity/AccountEntity.kt index fa12a38f3..59da40bd8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/entity/AccountEntity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/db/entity/AccountEntity.kt @@ -24,6 +24,7 @@ import com.keylesspalace.tusky.TabData import com.keylesspalace.tusky.db.Converters import com.keylesspalace.tusky.defaultTabs import com.keylesspalace.tusky.entity.Emoji +import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.settings.DefaultReplyVisibility @@ -93,7 +94,7 @@ data class AccountEntity( val notificationMarkerId: String = "0", val emojis: List = emptyList(), val tabPreferences: List = defaultTabs(), - val notificationsFilter: String = "[\"follow_request\"]", + val notificationsFilter: Set = setOf(Notification.Type.FOLLOW_REQUEST), // Scope cannot be changed without re-login, so store it in case // the scope needs to be changed in the future val oauthScopes: String = "", diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NotificationTypeConverter.kt b/app/src/main/java/com/keylesspalace/tusky/util/NotificationTypeConverter.kt deleted file mode 100644 index 969deba47..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/util/NotificationTypeConverter.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright 2019 Joel Pyska - * - * This file is a part of Tusky. - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Tusky; if not, - * see . */ - -package com.keylesspalace.tusky.util - -import com.keylesspalace.tusky.entity.Notification -import org.json.JSONArray - -/** - * Serialize to string array and deserialize notifications type - */ - -fun serialize(data: Set?): String { - val array = JSONArray() - data?.forEach { - array.put(it.presentation) - } - return array.toString() -} - -fun deserialize(data: String?): Set { - val ret = HashSet() - data?.let { - val array = JSONArray(data) - for (i in 0 until array.length()) { - val item = array.getString(i) - val type = Notification.Type.byString(item) - if (type != Notification.Type.UNKNOWN) { - ret.add(type) - } - } - } - return ret -}