From 91260ac9cb9ef8d95801f91e1e8245f38da1d7b6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 21 Sep 2023 19:12:38 +0200 Subject: [PATCH 1/9] Save filter state Signed-off-by: tobiasKaminsky --- .../ConversationsListActivity.kt | 51 +++++++++++++++- .../ui/dialog/FilterConversationFragment.kt | 59 ++++--------------- .../utils/preferences/AppPreferences.java | 14 +++++ app/src/main/res/values/strings.xml | 3 + 4 files changed, 78 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index ce2766d6a..e12076c42 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -79,8 +79,10 @@ import com.nextcloud.talk.adapters.items.MessageResultItem import com.nextcloud.talk.adapters.items.MessagesTextHeaderItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.contacts.ContactsActivity +import com.nextcloud.talk.data.storage.model.ArbitraryStorage import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerConversationsRvBinding import com.nextcloud.talk.events.ConversationsListFetchDataEvent @@ -106,6 +108,7 @@ import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.FileUtils import com.nextcloud.talk.utils.Mimetype import com.nextcloud.talk.utils.ParticipantPermissions +import com.nextcloud.talk.utils.UserIdUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_HIDE_SOURCE_ROOM import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_FLAG @@ -120,6 +123,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isServerEOL import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUnifiedSearchAvailable import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUserStatusAvailable import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil +import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import eu.davidea.flexibleadapter.FlexibleAdapter @@ -272,6 +276,50 @@ class ConversationsListActivity : showSearchOrToolbar() } + fun filterConversation() { + filterState[FilterConversationFragment.UNREAD] = appPreferences.isUnreadFilterEnabled + filterState[FilterConversationFragment.MENTION] = appPreferences.isMentionFilterEnabled + + val newItems: MutableList> = ArrayList() + if (filterState[FilterConversationFragment.UNREAD] == false && + filterState[FilterConversationFragment.MENTION] == false) { + adapter!!.updateDataSet(conversationItems, true) + } else { + val items = conversationItems + for (i in items) { + val conversation = (i as ConversationItem).model + if (filter(conversation)) { + newItems.add(i) + } + } + adapter!!.updateDataSet(newItems, true) + setFilterableItems(newItems) + } + + updateFilterConversationButtonColor() + } + + private fun filter(conversation: Conversation): Boolean { + var result = true + for ((k, v) in filterState) { + if (v) { + when (k) { + FilterConversationFragment.MENTION -> result = (result && conversation.unreadMention) || + ( + result && + ( + conversation.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL || + conversation.type == Conversation.ConversationType.FORMER_ONE_TO_ONE + ) && + (conversation.unreadMessages > 0) + ) + FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0) + } + } + } + + return result + } private fun setupActionBar() { setSupportActionBar(binding.conversationListToolbar) @@ -578,6 +626,7 @@ class ConversationsListActivity : sortConversations(conversationItems) sortConversations(conversationItemsWithHeader) if (!filterState.containsValue(true)) filterableConversationItems = conversationItems + filterConversation() adapter!!.updateDataSet(filterableConversationItems, false) Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong()) fetchOpenConversations(apiVersion) @@ -788,8 +837,6 @@ class ConversationsListActivity : binding.filterConversationsButton.setOnClickListener { val newFragment: DialogFragment = FilterConversationFragment.newInstance( - adapter!!, - conversationItems, filterState, this ) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index 5cabc25e2..f8a2cef69 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -30,26 +30,26 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.R import com.nextcloud.talk.adapters.items.ConversationItem import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.conversationlist.ConversationsListActivity import com.nextcloud.talk.databinding.DialogFilterConversationBinding import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.utils.UserIdUtils +import com.nextcloud.talk.utils.UserIdUtils.getIdForUser +import com.nextcloud.talk.utils.preferences.AppPreferences import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class FilterConversationFragment( - adapter: FlexibleAdapter>, - currentConversations: MutableList>, savedFilterState: MutableMap, conversationsListActivity: ConversationsListActivity ) : DialogFragment() { lateinit var binding: DialogFilterConversationBinding private var dialogView: View? = null - private var currentAdapter: FlexibleAdapter> = adapter - private var currentItems = currentConversations private var filterState = savedFilterState private var conversationsList = conversationsListActivity @@ -58,6 +58,9 @@ class FilterConversationFragment( @Inject lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var appPreferences: AppPreferences override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { binding = DialogFilterConversationBinding.inflate(LayoutInflater.from(context)) dialogView = binding.root @@ -119,57 +122,19 @@ class FilterConversationFragment( } private fun processSubmit() { - val newItems: MutableList> = ArrayList() - if (!filterState.containsValue(true)) { - currentAdapter.updateDataSet(currentItems, true) - } else { - val items = currentItems - for (i in items) { - val conversation = (i as ConversationItem).model - if (filter(conversation)) { - newItems.add(i) - } - } - currentAdapter.updateDataSet(newItems, true) - conversationsList.setFilterableItems(newItems) - } - conversationsList.updateFilterState( - filterState[MENTION]!!, - filterState[UNREAD]!! - ) + // store + appPreferences.setMentionFilter(filterState[MENTION] == true) + appPreferences.setUnreadFilter(filterState[UNREAD] == true) - conversationsList.updateFilterConversationButtonColor() - } - private fun filter(conversation: Conversation): Boolean { - var result = true - for ((k, v) in filterState) { - if (v) { - when (k) { - MENTION -> result = (result && conversation.unreadMention) || - ( - result && - ( - conversation.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL || - conversation.type == Conversation.ConversationType.FORMER_ONE_TO_ONE - ) && - (conversation.unreadMessages > 0) - ) - UNREAD -> result = result && (conversation.unreadMessages > 0) - } - } - } - - return result + conversationsList.filterConversation() } companion object { @JvmStatic fun newInstance( - adapter: FlexibleAdapter>, - currentConversations: MutableList>, savedFilterState: MutableMap, conversationsListActivity: ConversationsListActivity - ) = FilterConversationFragment(adapter, currentConversations, savedFilterState, conversationsListActivity) + ) = FilterConversationFragment(savedFilterState, conversationsListActivity) val TAG: String = FilterConversationFragment::class.java.simpleName const val MENTION: String = "mention" const val UNREAD: String = "unread" diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 62cdd084d..9f136830e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -344,6 +344,20 @@ public interface AppPreferences { @KeyByResource(R.string.nc_file_browser_sort_by_key) @DefaultValue(R.string.nc_file_browser_sort_by_default) String getSorting(); + + @KeyByResource(R.string.nc_filter_unread) + @DefaultValue(R.bool.value_false) + boolean isUnreadFilterEnabled(); + + @KeyByResource(R.string.nc_filter_unread) + void setUnreadFilter(boolean value); + + @KeyByResource(R.string.nc_filter_mention) + @DefaultValue(R.bool.value_false) + boolean isMentionFilterEnabled(); + + @KeyByResource(R.string.nc_filter_mention) + void setMentionFilter(boolean value); @KeyByResource(R.string.nc_file_browser_sort_by_key) @RegisterChangeListenerMethod diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dca3644d0..1b142c5cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -416,6 +416,9 @@ How to translate with transifex: User Guest User following a public link + + nc_filter_unread + nc_filter_mention Back From e926feabc78c282df0d074a1d6dbe5c387a7566e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 21 Sep 2023 19:49:44 +0200 Subject: [PATCH 2/9] wip Signed-off-by: tobiasKaminsky --- .../ConversationsListActivity.kt | 17 ++++++++++++++-- .../ui/dialog/FilterConversationFragment.kt | 20 ++++++++++--------- .../utils/preferences/AppPreferences.java | 14 ------------- app/src/main/res/values/strings.xml | 1 + 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index e12076c42..090466e40 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -161,6 +161,9 @@ class ConversationsListActivity : @Inject lateinit var platformPermissionUtil: PlatformPermissionUtil + + @Inject + lateinit var arbitraryStorageManager: ArbitraryStorageManager override val appBarLayoutType: AppBarLayoutType get() = AppBarLayoutType.SEARCH_BAR @@ -277,8 +280,18 @@ class ConversationsListActivity : showSearchOrToolbar() } fun filterConversation() { - filterState[FilterConversationFragment.UNREAD] = appPreferences.isUnreadFilterEnabled - filterState[FilterConversationFragment.MENTION] = appPreferences.isMentionFilterEnabled + val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) + filterState[FilterConversationFragment.UNREAD] = (arbitraryStorageManager.getStorageSetting( + accountId, + FilterConversationFragment.UNREAD, + "" + ).blockingGet()?.value ?: "") == "true" + + filterState[FilterConversationFragment.MENTION] = (arbitraryStorageManager.getStorageSetting( + accountId, + FilterConversationFragment.MENTION, + "" + ).blockingGet()?.value ?: "") == "true" val newItems: MutableList> = ArrayList() if (filterState[FilterConversationFragment.UNREAD] == false && diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index f8a2cef69..5906a1c28 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -28,19 +28,14 @@ import androidx.fragment.app.DialogFragment import autodagger.AutoInjector import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.R -import com.nextcloud.talk.adapters.items.ConversationItem import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.conversationlist.ConversationsListActivity import com.nextcloud.talk.databinding.DialogFilterConversationBinding -import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.UserIdUtils -import com.nextcloud.talk.utils.UserIdUtils.getIdForUser import com.nextcloud.talk.utils.preferences.AppPreferences -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -60,7 +55,7 @@ class FilterConversationFragment( lateinit var viewThemeUtils: ViewThemeUtils @Inject - lateinit var appPreferences: AppPreferences + lateinit var arbitraryStorageManager: ArbitraryStorageManager override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { binding = DialogFilterConversationBinding.inflate(LayoutInflater.from(context)) dialogView = binding.root @@ -123,8 +118,15 @@ class FilterConversationFragment( private fun processSubmit() { // store - appPreferences.setMentionFilter(filterState[MENTION] == true) - appPreferences.setUnreadFilter(filterState[UNREAD] == true) + val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) + val mentionValue = filterState[MENTION] == true + val unreadValue = filterState[UNREAD] == true + + arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "") + arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "") + + val m = arbitraryStorageManager.getStorageSetting(accountId, MENTION, "") + val u = arbitraryStorageManager.getStorageSetting(accountId, UNREAD, "") conversationsList.filterConversation() } @@ -136,7 +138,7 @@ class FilterConversationFragment( conversationsListActivity: ConversationsListActivity ) = FilterConversationFragment(savedFilterState, conversationsListActivity) val TAG: String = FilterConversationFragment::class.java.simpleName - const val MENTION: String = "mention" + const val MENTION: String = "TestmentionTest" const val UNREAD: String = "unread" } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 9f136830e..62cdd084d 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -344,20 +344,6 @@ public interface AppPreferences { @KeyByResource(R.string.nc_file_browser_sort_by_key) @DefaultValue(R.string.nc_file_browser_sort_by_default) String getSorting(); - - @KeyByResource(R.string.nc_filter_unread) - @DefaultValue(R.bool.value_false) - boolean isUnreadFilterEnabled(); - - @KeyByResource(R.string.nc_filter_unread) - void setUnreadFilter(boolean value); - - @KeyByResource(R.string.nc_filter_mention) - @DefaultValue(R.bool.value_false) - boolean isMentionFilterEnabled(); - - @KeyByResource(R.string.nc_filter_mention) - void setMentionFilter(boolean value); @KeyByResource(R.string.nc_file_browser_sort_by_key) @RegisterChangeListenerMethod diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1b142c5cd..50162e077 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -709,5 +709,6 @@ How to translate with transifex: Custom Set Calendar + From 3c202510478898c5f79712be55bf8774e1ba3625 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 21 Sep 2023 21:18:00 +0200 Subject: [PATCH 3/9] primary key Signed-off-by: tobiasKaminsky --- .../9.json | 139 ++++++++++++++++++ .../ArbitraryStorageManager.kt | 7 +- .../talk/data/source/local/TalkDatabase.kt | 3 +- .../talk/data/storage/ArbitraryStoragesDao.kt | 6 + .../storage/ArbitraryStoragesRepository.kt | 2 + .../ArbitraryStoragesRepositoryImpl.kt | 5 + .../data/storage/model/ArbitraryStorage.kt | 4 +- .../storage/model/ArbitraryStorageEntity.kt | 5 +- .../ui/dialog/FilterConversationFragment.kt | 3 - 9 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/9.json diff --git a/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/9.json b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/9.json new file mode 100644 index 000000000..4b966b37e --- /dev/null +++ b/app/schemas/com.nextcloud.talk.data.source.local.TalkDatabase/9.json @@ -0,0 +1,139 @@ +{ + "formatVersion": 1, + "database": { + "version": 9, + "identityHash": "666fcc4bbbdf3ff121b8f1ace8fcbcb8", + "entities": [ + { + "tableName": "User", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userId` TEXT, `username` TEXT, `baseUrl` TEXT, `token` TEXT, `displayName` TEXT, `pushConfigurationState` TEXT, `capabilities` TEXT, `clientCertificate` TEXT, `externalSignalingServer` TEXT, `current` INTEGER NOT NULL, `scheduledForDeletion` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userId", + "columnName": "userId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "username", + "columnName": "username", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "baseUrl", + "columnName": "baseUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "token", + "columnName": "token", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "displayName", + "columnName": "displayName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "pushConfigurationState", + "columnName": "pushConfigurationState", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "capabilities", + "columnName": "capabilities", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "clientCertificate", + "columnName": "clientCertificate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "externalSignalingServer", + "columnName": "externalSignalingServer", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "current", + "columnName": "current", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "scheduledForDeletion", + "columnName": "scheduledForDeletion", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ArbitraryStorage", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountIdentifier` INTEGER NOT NULL, `key` TEXT NOT NULL, `object` TEXT, `value` TEXT, PRIMARY KEY(`accountIdentifier`, `key`))", + "fields": [ + { + "fieldPath": "accountIdentifier", + "columnName": "accountIdentifier", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "storageObject", + "columnName": "object", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "accountIdentifier", + "key" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '666fcc4bbbdf3ff121b8f1ace8fcbcb8')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt b/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt index 7ef4c5242..1ca21c094 100644 --- a/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt +++ b/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt @@ -22,10 +22,11 @@ package com.nextcloud.talk.arbitrarystorage import com.nextcloud.talk.data.storage.ArbitraryStoragesRepository import com.nextcloud.talk.data.storage.model.ArbitraryStorage +import com.nextcloud.talk.data.storage.model.ArbitraryStorageEntity import io.reactivex.Maybe class ArbitraryStorageManager(private val arbitraryStoragesRepository: ArbitraryStoragesRepository) { - fun storeStorageSetting(accountIdentifier: Long, key: String?, value: String?, objectString: String?) { + fun storeStorageSetting(accountIdentifier: Long, key: String, value: String?, objectString: String?) { arbitraryStoragesRepository.saveArbitraryStorage(ArbitraryStorage(accountIdentifier, key, objectString, value)) } @@ -36,4 +37,8 @@ class ArbitraryStorageManager(private val arbitraryStoragesRepository: Arbitrary fun deleteAllEntriesForAccountIdentifier(accountIdentifier: Long): Int { return arbitraryStoragesRepository.deleteArbitraryStorage(accountIdentifier) } + + fun getAll() : Maybe> { + return arbitraryStoragesRepository.getAll() + } } diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index de64a74d3..7ab112075 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.data.source.local import android.content.Context import android.util.Log +import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @@ -45,7 +46,7 @@ import java.util.Locale @Database( entities = [UserEntity::class, ArbitraryStorageEntity::class], - version = 8, + version = 9, exportSchema = true ) @TypeConverters( diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt index a5d0d08b9..9e728cf35 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt @@ -41,6 +41,12 @@ abstract class ArbitraryStoragesDao { objectString: String ): Maybe + + @Query( + "SELECT * FROM ArbitraryStorage" + ) + abstract fun getAll() : Maybe> + @Query("DELETE FROM ArbitraryStorage WHERE accountIdentifier = :accountIdentifier") abstract fun deleteArbitraryStorage(accountIdentifier: Long): Int diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepository.kt b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepository.kt index 8086c4d2a..ea5c3c9f8 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepository.kt @@ -21,10 +21,12 @@ package com.nextcloud.talk.data.storage import com.nextcloud.talk.data.storage.model.ArbitraryStorage +import com.nextcloud.talk.data.storage.model.ArbitraryStorageEntity import io.reactivex.Maybe interface ArbitraryStoragesRepository { fun getStorageSetting(accountIdentifier: Long, key: String, objectString: String): Maybe fun deleteArbitraryStorage(accountIdentifier: Long): Int fun saveArbitraryStorage(arbitraryStorage: ArbitraryStorage): Long + fun getAll(): Maybe> } diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepositoryImpl.kt index 9f04bfbd4..6eb07cf76 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesRepositoryImpl.kt @@ -21,6 +21,7 @@ package com.nextcloud.talk.data.storage import com.nextcloud.talk.data.storage.model.ArbitraryStorage +import com.nextcloud.talk.data.storage.model.ArbitraryStorageEntity import io.reactivex.Maybe class ArbitraryStoragesRepositoryImpl(private val arbitraryStoragesDao: ArbitraryStoragesDao) : @@ -35,6 +36,10 @@ class ArbitraryStoragesRepositoryImpl(private val arbitraryStoragesDao: Arbitrar .map { ArbitraryStorageMapper.toModel(it) } } + override fun getAll(): Maybe> { + return arbitraryStoragesDao.getAll() + } + override fun deleteArbitraryStorage(accountIdentifier: Long): Int { return arbitraryStoragesDao.deleteArbitraryStorage(accountIdentifier) } diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorage.kt b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorage.kt index baf5e9678..56b93b38b 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorage.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorage.kt @@ -25,8 +25,8 @@ import kotlinx.parcelize.Parcelize @Parcelize data class ArbitraryStorage( - var accountIdentifier: Long = 0, - var key: String? = null, + var accountIdentifier: Long, + var key: String, var storageObject: String? = null, var value: String? = null ) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt index 45e66e1f4..6f09eb818 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt @@ -27,14 +27,13 @@ import androidx.room.PrimaryKey import kotlinx.parcelize.Parcelize @Parcelize -@Entity(tableName = "ArbitraryStorage") +@Entity(tableName = "ArbitraryStorage", primaryKeys = ["accountIdentifier", "key"]) data class ArbitraryStorageEntity( - @PrimaryKey @ColumnInfo(name = "accountIdentifier") var accountIdentifier: Long = 0, @ColumnInfo(name = "key") - var key: String? = null, + var key: String = "", @ColumnInfo(name = "object") var storageObject: String? = null, diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index 5906a1c28..062116aa8 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -125,9 +125,6 @@ class FilterConversationFragment( arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "") arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "") - val m = arbitraryStorageManager.getStorageSetting(accountId, MENTION, "") - val u = arbitraryStorageManager.getStorageSetting(accountId, UNREAD, "") - conversationsList.filterConversation() } From 079e527f21f7ee031771c0c2b1424986c8788a1c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Sep 2023 22:48:53 +0200 Subject: [PATCH 4/9] Add DB migration Signed-off-by: Andy Scherzinger --- .../talk/data/source/local/Migrations.kt | 32 +++++++++++++++++++ .../talk/data/source/local/TalkDatabase.kt | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt index 4d675f0f5..11ce9552f 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/Migrations.kt @@ -40,6 +40,13 @@ object Migrations { } } + val MIGRATION_8_9 = object : Migration(8, 9) { + override fun migrate(database: SupportSQLiteDatabase) { + Log.i("Migrations", "Migrating 8 to 9") + migrateToDualPrimaryKeyArbitraryStorage(database) + } + } + fun migrateToRoom(database: SupportSQLiteDatabase) { database.execSQL( "CREATE TABLE User_new (" + @@ -92,4 +99,29 @@ object Migrations { database.execSQL("ALTER TABLE User_new RENAME TO User") database.execSQL("ALTER TABLE ArbitraryStorage_new RENAME TO ArbitraryStorage") } + + fun migrateToDualPrimaryKeyArbitraryStorage(database: SupportSQLiteDatabase) { + database.execSQL( + "CREATE TABLE ArbitraryStorage_dualPK (" + + "accountIdentifier INTEGER NOT NULL, " + + "\"key\" TEXT NOT NULL, " + + "object TEXT, " + + "value TEXT, " + + "PRIMARY KEY(accountIdentifier, \"key\")" + + ")" + ) + // Copy the data + database.execSQL( + "INSERT INTO ArbitraryStorage_dualPK (" + + "accountIdentifier, \"key\", object, value) " + + "SELECT " + + "accountIdentifier, \"key\", object, value " + + "FROM ArbitraryStorage" + ) + // Remove the old table + database.execSQL("DROP TABLE ArbitraryStorage") + + // Change the table name to the correct one + database.execSQL("ALTER TABLE ArbitraryStorage_dualPK RENAME TO ArbitraryStorage") + } } diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index 7ab112075..63d287751 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -97,7 +97,7 @@ abstract class TalkDatabase : RoomDatabase() { .databaseBuilder(context.applicationContext, TalkDatabase::class.java, dbName) // comment out openHelperFactory to view the database entries in Android Studio for debugging .openHelperFactory(factory) - .addMigrations(Migrations.MIGRATION_6_8, Migrations.MIGRATION_7_8) + .addMigrations(Migrations.MIGRATION_6_8, Migrations.MIGRATION_7_8, Migrations.MIGRATION_8_9) .allowMainThreadQueries() .addCallback( object : RoomDatabase.Callback() { From bb9925b12c3fa02b71d259512060cb89c465e804 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Sep 2023 23:06:56 +0200 Subject: [PATCH 5/9] Fix code formatting for kotlin files Signed-off-by: Andy Scherzinger --- .../ArbitraryStorageManager.kt | 5 --- .../ConversationsListActivity.kt | 35 ++++++++++--------- .../talk/data/source/local/TalkDatabase.kt | 1 - .../talk/data/storage/ArbitraryStoragesDao.kt | 3 +- .../storage/model/ArbitraryStorageEntity.kt | 1 - .../ui/dialog/FilterConversationFragment.kt | 5 ++- 6 files changed, 22 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt b/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt index 1ca21c094..27c2550e0 100644 --- a/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt +++ b/app/src/main/java/com/nextcloud/talk/arbitrarystorage/ArbitraryStorageManager.kt @@ -22,7 +22,6 @@ package com.nextcloud.talk.arbitrarystorage import com.nextcloud.talk.data.storage.ArbitraryStoragesRepository import com.nextcloud.talk.data.storage.model.ArbitraryStorage -import com.nextcloud.talk.data.storage.model.ArbitraryStorageEntity import io.reactivex.Maybe class ArbitraryStorageManager(private val arbitraryStoragesRepository: ArbitraryStoragesRepository) { @@ -37,8 +36,4 @@ class ArbitraryStorageManager(private val arbitraryStoragesRepository: Arbitrary fun deleteAllEntriesForAccountIdentifier(accountIdentifier: Long): Int { return arbitraryStoragesRepository.deleteArbitraryStorage(accountIdentifier) } - - fun getAll() : Maybe> { - return arbitraryStoragesRepository.getAll() - } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 090466e40..082af2eaa 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -82,7 +82,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.contacts.ContactsActivity -import com.nextcloud.talk.data.storage.model.ArbitraryStorage import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerConversationsRvBinding import com.nextcloud.talk.events.ConversationsListFetchDataEvent @@ -123,7 +122,6 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isServerEOL import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUnifiedSearchAvailable import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUserStatusAvailable import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil -import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import eu.davidea.flexibleadapter.FlexibleAdapter @@ -161,7 +159,7 @@ class ConversationsListActivity : @Inject lateinit var platformPermissionUtil: PlatformPermissionUtil - + @Inject lateinit var arbitraryStorageManager: ArbitraryStorageManager @@ -281,21 +279,26 @@ class ConversationsListActivity : } fun filterConversation() { val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) - filterState[FilterConversationFragment.UNREAD] = (arbitraryStorageManager.getStorageSetting( - accountId, - FilterConversationFragment.UNREAD, - "" - ).blockingGet()?.value ?: "") == "true" + filterState[FilterConversationFragment.UNREAD] = ( + arbitraryStorageManager.getStorageSetting( + accountId, + FilterConversationFragment.UNREAD, + "" + ).blockingGet()?.value ?: "" + ) == "true" + + filterState[FilterConversationFragment.MENTION] = ( + arbitraryStorageManager.getStorageSetting( + accountId, + FilterConversationFragment.MENTION, + "" + ).blockingGet()?.value ?: "" + ) == "true" - filterState[FilterConversationFragment.MENTION] = (arbitraryStorageManager.getStorageSetting( - accountId, - FilterConversationFragment.MENTION, - "" - ).blockingGet()?.value ?: "") == "true" - val newItems: MutableList> = ArrayList() - if (filterState[FilterConversationFragment.UNREAD] == false && - filterState[FilterConversationFragment.MENTION] == false) { + if (filterState[FilterConversationFragment.UNREAD] == false && + filterState[FilterConversationFragment.MENTION] == false + ) { adapter!!.updateDataSet(conversationItems, true) } else { val items = conversationItems diff --git a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt index 63d287751..4db51a3e7 100644 --- a/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt +++ b/app/src/main/java/com/nextcloud/talk/data/source/local/TalkDatabase.kt @@ -22,7 +22,6 @@ package com.nextcloud.talk.data.source.local import android.content.Context import android.util.Log -import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt index 9e728cf35..0941b6f9a 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/ArbitraryStoragesDao.kt @@ -41,11 +41,10 @@ abstract class ArbitraryStoragesDao { objectString: String ): Maybe - @Query( "SELECT * FROM ArbitraryStorage" ) - abstract fun getAll() : Maybe> + abstract fun getAll(): Maybe> @Query("DELETE FROM ArbitraryStorage WHERE accountIdentifier = :accountIdentifier") abstract fun deleteArbitraryStorage(accountIdentifier: Long): Int diff --git a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt index 6f09eb818..ab5f7dc62 100644 --- a/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/data/storage/model/ArbitraryStorageEntity.kt @@ -23,7 +23,6 @@ package com.nextcloud.talk.data.storage.model import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity -import androidx.room.PrimaryKey import kotlinx.parcelize.Parcelize @Parcelize diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index 062116aa8..e14783aa7 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -35,7 +35,6 @@ import com.nextcloud.talk.databinding.DialogFilterConversationBinding import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.UserIdUtils -import com.nextcloud.talk.utils.preferences.AppPreferences import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -121,10 +120,10 @@ class FilterConversationFragment( val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) val mentionValue = filterState[MENTION] == true val unreadValue = filterState[UNREAD] == true - + arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "") arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "") - + conversationsList.filterConversation() } From 94bdd22432f0deaf8958e55600265bb6e675f675 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Sep 2023 23:09:45 +0200 Subject: [PATCH 6/9] user proper id for mention Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt index e14783aa7..aa8061e42 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -134,7 +134,7 @@ class FilterConversationFragment( conversationsListActivity: ConversationsListActivity ) = FilterConversationFragment(savedFilterState, conversationsListActivity) val TAG: String = FilterConversationFragment::class.java.simpleName - const val MENTION: String = "TestmentionTest" + const val MENTION: String = "mention" const val UNREAD: String = "unread" } } From a20e4d9be9ca73361d061150a300bab66f71456c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Sep 2023 23:11:44 +0200 Subject: [PATCH 7/9] remove unused resources Signed-off-by: Andy Scherzinger --- app/src/main/res/values/strings.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50162e077..dca3644d0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -416,9 +416,6 @@ How to translate with transifex: User Guest User following a public link - - nc_filter_unread - nc_filter_mention Back @@ -709,6 +706,5 @@ How to translate with transifex: Custom Set Calendar - From 5b13e649c663043c80de6752444263de908ff794 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 21 Sep 2023 23:33:46 +0200 Subject: [PATCH 8/9] Use a layout_width of 0dp instead of wrap_content for better performance Signed-off-by: Andy Scherzinger --- app/src/main/res/layout/item_guest_access_settings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_guest_access_settings.xml b/app/src/main/res/layout/item_guest_access_settings.xml index 348d9bac2..ee60abfe0 100644 --- a/app/src/main/res/layout/item_guest_access_settings.xml +++ b/app/src/main/res/layout/item_guest_access_settings.xml @@ -1,7 +1,6 @@ From 935eb091c3e6e495a07b2f7aacbdfa67fb11246a Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 21 Sep 2023 21:43:14 +0000 Subject: [PATCH 9/9] Analysis: update lint results to reflect reduced error/warning count Signed-off-by: github-actions --- scripts/analysis/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 7a5728da3..2d857a44d 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 93 warnings + Lint Report: 92 warnings