From d20908370028a3975a85f622b0c6af2e734e0670 Mon Sep 17 00:00:00 2001 From: rapterjet2004 Date: Mon, 12 Jun 2023 15:36:59 -0500 Subject: [PATCH] WIP filter conversations feature, UI finished Signed-off-by: Julius Linus julius.linus@nextcloud.com Signed-off-by: Andy Scherzinger --- .../ConversationsListActivity.kt | 6 + .../ui/dialog/FilterConversationFragment.kt | 119 ++++++++++++++++++ .../drawable/ic_baseline_filter_list_24.xml | 5 + .../layout/controller_conversations_rv.xml | 19 ++- .../res/layout/dialog_filter_conversation.xml | 73 +++++++++++ app/src/main/res/values/strings.xml | 5 + 6 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt create mode 100644 app/src/main/res/drawable/ic_baseline_filter_list_24.xml create mode 100644 app/src/main/res/layout/dialog_filter_conversation.xml 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 abd41f837..313bc4306 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -97,6 +97,7 @@ import com.nextcloud.talk.settings.SettingsActivity import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment import com.nextcloud.talk.ui.dialog.ChooseAccountShareToDialogFragment import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog +import com.nextcloud.talk.ui.dialog.FilterConversationFragment import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ClosedInterfaceImpl @@ -758,6 +759,11 @@ class ConversationsListActivity : } } + binding.filterConversationsButton.setOnClickListener { + val newFragment: DialogFragment = FilterConversationFragment.newInstance(adapter!!) + newFragment.show(supportFragmentManager, FilterConversationFragment.TAG) + } + binding?.newMentionPopupBubble?.hide() binding?.newMentionPopupBubble?.setPopupBubbleListener { binding?.recyclerView?.smoothScrollToPosition( 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 new file mode 100644 index 000000000..a28fd757d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt @@ -0,0 +1,119 @@ +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 +import androidx.fragment.app.DialogFragment +import autodagger.AutoInjector +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.nextcloud.talk.R +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.databinding.DialogFilterConversationBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils +import com.nextcloud.talk.users.UserManager +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import javax.inject.Inject + +@AutoInjector(NextcloudTalkApplication::class) +class FilterConversationFragment(adapter: FlexibleAdapter>) : 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) + + @Inject + lateinit var ncApi: NcApi + + @Inject + lateinit var userManager: UserManager + + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + binding = DialogFilterConversationBinding.inflate(LayoutInflater.from(context)) + dialogView = binding.root + + return MaterialAlertDialogBuilder(requireContext()).setView(dialogView).create() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + setUpColors() + setUpListeners() + return inflater.inflate(R.layout.dialog_filter_conversation, container, false) + } + + private fun setUpColors() { + binding.run { + listOf( + binding.root, + ) + }.forEach(viewThemeUtils.platform::colorViewBackground) + } + + private fun setUpListeners() { + binding.noFilterButton.setOnClickListener { + Log.i(TAG, "no filter clicked") + filterState[NONE] = !filterState[NONE]!! + if (filterState[NONE]!!) { + binding.noFilterButton.setBackgroundColor(resources.getColor(R.color.colorPrimary)) + } else + binding.noFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + + filterState[UNREAD] = false + binding.unreadFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + filterState[MENTION] = false + binding.mentionedFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + } + + binding.unreadFilterButton.setOnClickListener { + Log.i(TAG, "unread filter clicked") + filterState[UNREAD] = !filterState[UNREAD]!! + if (filterState[UNREAD]!!) { + binding.unreadFilterButton.setBackgroundColor( + resources.getColor( + R.color + .colorPrimary + ) + ) + } else binding.unreadFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + filterState[NONE] = false + binding.noFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + } + + binding.mentionedFilterButton.setOnClickListener { + Log.i(TAG, "mentioned filter clicked") + filterState[MENTION] = !filterState[MENTION]!! + if (filterState[MENTION]!!) { + binding.mentionedFilterButton.setBackgroundColor(resources.getColor(R.color.colorPrimary)) + } else + binding.mentionedFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + + filterState[NONE] = false + binding.noFilterButton.setBackgroundColor(resources.getColor(R.color.grey_200)) + } + + binding.filterButton.setOnClickListener { + Log.i(TAG, "submit clicked") + dismiss() + } + } + + companion object { + @JvmStatic + fun newInstance(adapter: FlexibleAdapter>) = FilterConversationFragment(adapter) + val TAG: String = FilterConversationFragment::class.java.simpleName + const val NONE: String = "none" + const val MENTION: String = "mention" + const val UNREAD: String = "unread" + } +} diff --git a/app/src/main/res/drawable/ic_baseline_filter_list_24.xml b/app/src/main/res/drawable/ic_baseline_filter_list_24.xml new file mode 100644 index 000000000..b8090430e --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_filter_list_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index c4de69564..7d383783e 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -83,10 +83,27 @@ android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@id/menu_button" - app:layout_constraintEnd_toStartOf="@id/rightContainer" + app:layout_constraintEnd_toStartOf="@id/filter_conversations_button" app:layout_constraintTop_toTopOf="parent" tools:text="Search in Nextcloud" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 46a285c05..4685c1b96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -680,5 +680,10 @@ How to translate with transifex: Translation failed Could not detect language Copy translated text + Filter Conversations + Filter + Mentioned + Unread + No Filter