Эх сурвалжийг харах

WIP filter conversations feature, UI more responsive
Signed-off-by: Julius Linus julius.linus@nextcloud.com

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>

rapterjet2004 2 жил өмнө
parent
commit
a60fce05cd

+ 4 - 7
app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

@@ -193,7 +193,6 @@ class ConversationsListActivity :
     private var searchViewDisposable: Disposable? = null
     private var filterState =
         mutableMapOf(
-            NONE to true,
             MENTION to false,
             UNREAD to false
         )
@@ -788,10 +787,10 @@ class ConversationsListActivity :
     }
 
     fun updateFilterConversationButtonColor() {
-        val colorInt: Int = if (filterState[NONE]!!) {
-            context.getColor(R.color.grey_200)
-        } else {
+        val colorInt: Int = if (filterState.containsValue(true)) {
             context.getColor(R.color.colorPrimary)
+        } else {
+            context.getColor(R.color.grey_200)
         }
 
         val csl = ColorStateList.valueOf(colorInt)
@@ -1487,8 +1486,7 @@ class ConversationsListActivity :
         showErrorDialog()
     }
 
-    fun updateFilterState(none: Boolean, mention: Boolean, unread: Boolean) {
-        filterState[NONE] = none
+    fun updateFilterState(mention: Boolean, unread: Boolean) {
         filterState[MENTION] = mention
         filterState[UNREAD] = unread
     }
@@ -1506,7 +1504,6 @@ 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"
     }

+ 21 - 50
app/src/main/java/com/nextcloud/talk/ui/dialog/FilterConversationFragment.kt

@@ -5,13 +5,11 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import androidx.core.content.ContextCompat
 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
@@ -36,9 +34,6 @@ class FilterConversationFragment(
     private var filterState = savedFilterState
     private var conversationsList = conversationsListActivity
 
-    @Inject
-    lateinit var ncApi: NcApi
-
     @Inject
     lateinit var userManager: UserManager
 
@@ -68,61 +63,39 @@ class FilterConversationFragment(
                 binding.root,
             )
         }.forEach(viewThemeUtils.platform::colorViewBackground)
-        updateFilters()
-    }
 
-    private fun setUpListeners() {
-        binding.noFilterButton.setOnClickListener {
-            filterState[NONE] = !filterState[NONE]!!
-            filterState[UNREAD] = false
-            filterState[MENTION] = false
-            updateFilters()
-        }
+        binding.run {
+            listOf(
+                unreadFilterChip,
+                mentionedFilterChip
+            )
+        }.forEach(viewThemeUtils.material::colorChipBackground)
 
-        binding.unreadFilterButton.setOnClickListener {
-            filterState[UNREAD] = !filterState[UNREAD]!!
-            changeUnreadFilter()
-            filterState[NONE] = false
-            changeNoneFilter()
-        }
+        setUpChips()
+    }
 
-        binding.mentionedFilterButton.setOnClickListener {
-            filterState[MENTION] = !filterState[MENTION]!!
-            changeMentionFilter()
-            filterState[NONE] = false
-            changeNoneFilter()
+    private fun setUpListeners() {
+        binding.unreadFilterChip.setOnCheckedChangeListener { _, isChecked ->
+            filterState[UNREAD] = isChecked
+            binding.unreadFilterChip.isChecked = isChecked
+            processSubmit()
         }
 
-        binding.filterButton.setOnClickListener {
+        binding.mentionedFilterChip.setOnCheckedChangeListener { _, isChecked ->
+            filterState[MENTION] = isChecked
+            binding.mentionedFilterChip.isChecked = isChecked
             processSubmit()
-            dismiss()
         }
     }
 
-    private fun updateFilters() {
-        changeNoneFilter()
-        changeUnreadFilter()
-        changeMentionFilter()
-    }
-
-    private fun changeMentionFilter() {
-        val colorInt = if (filterState[MENTION]!!) R.color.colorPrimary else R.color.grey_200
-        binding.mentionedFilterButton.setBackgroundColor(ContextCompat.getColor(requireContext(), colorInt))
-    }
-
-    private fun changeUnreadFilter() {
-        val colorInt = if (filterState[UNREAD]!!) R.color.colorPrimary else R.color.grey_200
-        binding.unreadFilterButton.setBackgroundColor(ContextCompat.getColor(requireContext(), colorInt))
-    }
-
-    private fun changeNoneFilter() {
-        val colorInt = if (filterState[NONE]!!) R.color.colorPrimary else R.color.grey_200
-        binding.noFilterButton.setBackgroundColor(ContextCompat.getColor(requireContext(), colorInt))
+    private fun setUpChips() {
+        binding.unreadFilterChip.isChecked = filterState[UNREAD]!!
+        binding.mentionedFilterChip.isChecked = filterState[MENTION]!!
     }
 
     private fun processSubmit() {
         val newItems: MutableList<AbstractFlexibleItem<*>> = ArrayList()
-        if (filterState[NONE]!!) {
+        if (!filterState.containsValue(true)) {
             currentAdapter.updateDataSet(currentItems, true)
         } else {
             val items = currentItems
@@ -135,7 +108,6 @@ class FilterConversationFragment(
             currentAdapter.updateDataSet(newItems, true)
         }
         conversationsList.updateFilterState(
-            filterState[NONE]!!,
             filterState[MENTION]!!,
             filterState[UNREAD]!!
         )
@@ -145,7 +117,7 @@ class FilterConversationFragment(
     private fun filter(conversation: Conversation): Boolean {
         var result = true
         for ((k, v) in filterState) {
-            if (k != NONE && v) {
+            if (v) {
                 when (k) {
                     MENTION -> result = result && conversation.unreadMention
                     UNREAD -> result = result && (conversation.unreadMessages > 0)
@@ -165,7 +137,6 @@ class FilterConversationFragment(
             conversationsListActivity: ConversationsListActivity
         ) = FilterConversationFragment(adapter, currentConversations, savedFilterState, conversationsListActivity)
         val TAG: String = FilterConversationFragment::class.java.simpleName
-        const val NONE: String = "none"
         const val MENTION: String = "mention"
         const val UNREAD: String = "unread"
     }

+ 17 - 45
app/src/main/res/layout/dialog_filter_conversation.xml

@@ -2,70 +2,42 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
-    tools:background="@color/white"
-    android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:background="@color/white"
+    tools:visibility="visible">
 
     <com.google.android.material.textview.MaterialTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_margin="@dimen/standard_margin"
         android:layout_gravity="center"
+        android:layout_margin="@dimen/standard_margin"
         android:text="@string/nc_filter"
         android:textSize="@dimen/md_title_textsize" />
 
     <com.google.android.material.divider.MaterialDivider
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
+        android:layout_height="wrap_content" />
 
-    <com.google.android.flexbox.FlexboxLayout
+    <com.google.android.material.chip.ChipGroup
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:flexWrap="wrap">
-
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/no_filter_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="@dimen/standard_half_margin"
-            android:padding="@dimen/standard_half_padding"
-            app:icon="@drawable/ic_cancel_black_24dp"
-            android:text="@string/no_filter"/>
+        android:layout_margin="@dimen/standard_margin">
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/unread_filter_button"
+        <com.google.android.material.chip.Chip
+            android:id="@+id/unread_filter_chip"
+            style="@style/Widget.Material3.Chip.Filter"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_margin="@dimen/standard_half_margin"
-            android:padding="@dimen/standard_half_padding"
-            android:text="@string/unread"/>
+            android:text="@string/unread" />
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/mentioned_filter_button"
+        <com.google.android.material.chip.Chip
+            android:id="@+id/mentioned_filter_chip"
+            style="@style/Widget.Material3.Chip.Filter"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_margin="@dimen/standard_half_margin"
-            android:padding="@dimen/standard_half_padding"
-            android:text="@string/mentioned"/>
-
-    </com.google.android.flexbox.FlexboxLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/standard_margin"
-        android:orientation="horizontal"
-        android:gravity="end">
-
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/filter_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_margin="@dimen/standard_quarter_margin"
-            android:padding="@dimen/standard_half_padding"
-            android:text="@string/nc_filter_short"/>
-
-    </LinearLayout>
+            android:text="@string/mentioned" />
 
+    </com.google.android.material.chip.ChipGroup>
 </LinearLayout>