Sfoglia il codice sorgente

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

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

rapterjet2004 2 anni fa
parent
commit
d209083700

+ 6 - 0
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(

+ 119 - 0
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<AbstractFlexibleItem<*>>) : DialogFragment() {
+    lateinit var binding: DialogFilterConversationBinding
+    private var dialogView: View? = null
+    private var currentAdapter: FlexibleAdapter<AbstractFlexibleItem<*>> = 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<AbstractFlexibleItem<*>>) = FilterConversationFragment(adapter)
+        val TAG: String = FilterConversationFragment::class.java.simpleName
+        const val NONE: String = "none"
+        const val MENTION: String = "mention"
+        const val UNREAD: String = "unread"
+    }
+}

+ 5 - 0
app/src/main/res/drawable/ic_baseline_filter_list_24.xml

@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#000000"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z"/>
+</vector>

+ 18 - 1
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" />
 
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/filter_conversations_button"
+                    style="@style/Widget.AppTheme.Button.IconButton"
+                    android:layout_width="48dp"
+                    android:layout_height="48dp"
+                    android:layout_gravity="start"
+                    android:contentDescription="@string/nc_filter"
+                    android:scaleType="fitCenter"
+                    android:transitionName="userAvatar.transitionTag"
+                    app:cornerRadius="@dimen/button_corner_radius"
+                    app:icon="@drawable/ic_baseline_filter_list_24"
+                    app:iconTint="@color/disabled_text"
+                    app:iconSize="@dimen/avatar_size_app_bar"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toStartOf="@id/rightContainer"
+                    tools:visibility="visible" />
+
                 <FrameLayout
                     android:id="@+id/rightContainer"
                     android:layout_width="wrap_content"

+ 73 - 0
app/src/main/res/layout/dialog_filter_conversation.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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">
+
+    <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: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"/>
+
+    <com.google.android.flexbox.FlexboxLayout
+        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"/>
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/unread_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:backgroundTint="@color/grey_200"
+            android:text="@string/unread"/>
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/mentioned_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:backgroundTint="@color/grey_200"
+            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>
+
+</LinearLayout>

+ 5 - 0
app/src/main/res/values/strings.xml

@@ -680,5 +680,10 @@ How to translate with transifex:
     <string name="translation_error_title">Translation failed</string>
     <string name="translation_error_message">Could not detect language</string>
     <string name="translation_copy_translated_text">Copy translated text</string>
+    <string name="nc_filter">Filter Conversations</string>
+    <string name="nc_filter_short">Filter</string>
+    <string name="mentioned">Mentioned</string>
+    <string name="unread">Unread</string>
+    <string name="no_filter">No Filter</string>
 
 </resources>