From 91260ac9cb9ef8d95801f91e1e8245f38da1d7b6 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 21 Sep 2023 19:12:38 +0200 Subject: [PATCH] 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