From b4719bcad3b28d0ca3dadc2834fb0d332ae88672 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Tue, 13 Jun 2023 15:41:04 -0500 Subject: [PATCH] WIP filter conversations feature, functionality finished Signed-off-by: Julius Linus julius.linus@nextcloud.com Signed-off-by: Andy Scherzinger --- .../ConversationsListActivity.kt | 22 +++- .../ui/dialog/FilterConversationFragment.kt | 117 +++++++++++++----- .../res/layout/dialog_filter_conversation.xml | 2 - 3 files changed, 108 insertions(+), 33 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 313bc4306..175048e68 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -190,6 +190,12 @@ class ConversationsListActivity : private var conversationsListBottomDialog: ConversationsListBottomDialog? = null private var searchHelper: MessageSearchHelper? = null private var searchViewDisposable: Disposable? = null + private var filterState = + mutableMapOf( + NONE to true, + MENTION to false, + UNREAD to false + ) private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -760,7 +766,12 @@ class ConversationsListActivity : } binding.filterConversationsButton.setOnClickListener { - val newFragment: DialogFragment = FilterConversationFragment.newInstance(adapter!!) + val newFragment: DialogFragment = FilterConversationFragment.newInstance( + adapter!!, + conversationItems, + filterState, + this + ) newFragment.show(supportFragmentManager, FilterConversationFragment.TAG) } @@ -1462,6 +1473,12 @@ class ConversationsListActivity : showErrorDialog() } + fun updateFilterState(none: Boolean, mention: Boolean, unread: Boolean) { + filterState[NONE] = none + filterState[MENTION] = mention + filterState[UNREAD] = unread + } + companion object { const val TAG = "ConvListController" const val UNREAD_BUBBLE_DELAY = 2500 @@ -1475,5 +1492,8 @@ class ConversationsListActivity : const val CLIENT_UPGRADE_GPLAY_LINK = "https://play.google.com/store/apps/details?id=" const val HTTP_SERVICE_UNAVAILABLE = 503 const val MAINTENANCE_MODE_HEADER_KEY = "X-Nextcloud-Maintenance-Mode" + const val NONE: String = "none" + const val MENTION: String = "mention" + const val UNREAD: String = "unread" } } 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 a28fd757d..940edcb89 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 @@ -2,7 +2,6 @@ package com.nextcloud.talk.ui.dialog import android.app.Dialog import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,9 +9,12 @@ 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.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication +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 eu.davidea.flexibleadapter.FlexibleAdapter @@ -20,11 +22,18 @@ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class FilterConversationFragment(adapter: FlexibleAdapter>) : DialogFragment() { +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 filterState = mutableMapOf(NONE to true, MENTION to false, UNREAD to false) + private var currentItems = currentConversations + private var filterState = savedFilterState + private var conversationsList = conversationsListActivity @Inject lateinit var ncApi: NcApi @@ -58,59 +67,107 @@ class FilterConversationFragment(adapter: FlexibleAdapter> = ArrayList() + if (filterState[NONE]!!) { + 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.updateFilterState( + filterState[NONE]!!, + filterState[MENTION]!!, + filterState[UNREAD]!! + ) + } + private fun filter(conversation: Conversation): Boolean { + var result = true + for ((k, v) in filterState) { + if (k != NONE && v) { + when (k) { + MENTION -> result = result && conversation.unreadMention + UNREAD -> result = result && (conversation.unreadMessages > 0) + } + } + } + + return result + } + companion object { @JvmStatic - fun newInstance(adapter: FlexibleAdapter>) = FilterConversationFragment(adapter) + fun newInstance( + adapter: FlexibleAdapter>, + currentConversations: MutableList>, + savedFilterState: MutableMap, + conversationsListActivity: ConversationsListActivity + ) = FilterConversationFragment(adapter, currentConversations, savedFilterState, conversationsListActivity) val TAG: String = FilterConversationFragment::class.java.simpleName const val NONE: String = "none" const val MENTION: String = "mention" diff --git a/app/src/main/res/layout/dialog_filter_conversation.xml b/app/src/main/res/layout/dialog_filter_conversation.xml index e26e38090..d227b495c 100644 --- a/app/src/main/res/layout/dialog_filter_conversation.xml +++ b/app/src/main/res/layout/dialog_filter_conversation.xml @@ -39,7 +39,6 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/standard_half_margin" android:padding="@dimen/standard_half_padding" - app:backgroundTint="@color/grey_200" android:text="@string/unread"/>