Prechádzať zdrojové kódy

Merge pull request #4471 from nextcloud/issue-4452-search-join-conversation

Added a search bar to the "Join Open Conversations" screen
Marcel Hibbe 7 mesiacov pred
rodič
commit
47004b8f4b

+ 3 - 0
.idea/inspectionProfiles/ktlint.xml

@@ -38,6 +38,9 @@
       <option name="composableFile" value="true" />
       <option name="previewFile" value="true" />
     </inspection_tool>
+    <inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+    </inspection_tool>
     <inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="composableFile" value="true" />
       <option name="previewFile" value="true" />

+ 31 - 1
app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt

@@ -10,9 +10,11 @@ import android.content.Intent
 import android.graphics.drawable.ColorDrawable
 import android.os.Bundle
 import android.view.View
+import androidx.core.widget.doOnTextChanged
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
 import com.google.android.material.snackbar.Snackbar
+import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.api.NcApi
@@ -23,6 +25,7 @@ import com.nextcloud.talk.openconversations.adapters.OpenConversationsAdapter
 import com.nextcloud.talk.openconversations.data.OpenConversation
 import com.nextcloud.talk.openconversations.viewmodels.OpenConversationsViewModel
 import com.nextcloud.talk.utils.bundle.BundleKeys
+import com.vanniktech.ui.showKeyboardAndFocus
 import javax.inject.Inject
 
 @AutoInjector(NextcloudTalkApplication::class)
@@ -40,6 +43,8 @@ class ListOpenConversationsActivity : BaseActivity() {
 
     lateinit var adapter: OpenConversationsAdapter
 
+    var searching = false
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -52,15 +57,35 @@ class ListOpenConversationsActivity : BaseActivity() {
         setupActionBar()
         setContentView(binding.root)
         setupSystemColors()
+        viewThemeUtils.platform.colorImageView(binding.searchOpenConversations, ColorRole.ON_SURFACE)
+        viewThemeUtils.platform.colorEditText(binding.searchEdit)
 
         val user = currentUserProvider.currentUser.blockingGet()
 
         adapter = OpenConversationsAdapter(user) { conversation -> adapterOnClick(conversation) }
         binding.openConversationsRecyclerView.adapter = adapter
+        binding.searchOpenConversations.setOnClickListener {
+            searching = !searching
+            handleSearchUI(searching)
+        }
+        binding.searchEdit.doOnTextChanged { text, _, _, count ->
+            adapter.filter(text.toString())
+        }
 
         initObservers()
     }
 
+    private fun handleSearchUI(show: Boolean) {
+        if (show) {
+            binding.searchOpenConversations.visibility = View.GONE
+            binding.searchEdit.visibility = View.VISIBLE
+            binding.searchEdit.showKeyboardAndFocus()
+        } else {
+            binding.searchOpenConversations.visibility = View.VISIBLE
+            binding.searchEdit.visibility = View.GONE
+        }
+    }
+
     private fun adapterOnClick(conversation: OpenConversation) {
         val bundle = Bundle()
         bundle.putString(BundleKeys.KEY_ROOM_TOKEN, conversation.roomToken)
@@ -105,7 +130,12 @@ class ListOpenConversationsActivity : BaseActivity() {
     private fun setupActionBar() {
         setSupportActionBar(binding.openConversationsToolbar)
         binding.openConversationsToolbar.setNavigationOnClickListener {
-            onBackPressedDispatcher.onBackPressed()
+            if (searching) {
+                handleSearchUI(false)
+                searching = false
+            } else {
+                onBackPressedDispatcher.onBackPressed()
+            }
         }
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)

+ 32 - 0
app/src/main/java/com/nextcloud/talk/openconversations/adapters/OpenConversationsAdapter.kt

@@ -21,6 +21,8 @@ import com.nextcloud.talk.openconversations.data.OpenConversation
 
 class OpenConversationsAdapter(val user: User, private val onClick: (OpenConversation) -> Unit) :
     ListAdapter<OpenConversation, OpenConversationsAdapter.OpenConversationsViewHolder>(ConversationsCallback) {
+    private var originalList: List<OpenConversation> = emptyList()
+    private var isFiltering = false
 
     inner class OpenConversationsViewHolder(val itemBinding: RvItemOpenConversationBinding) :
         RecyclerView.ViewHolder(itemBinding.root) {
@@ -68,6 +70,36 @@ class OpenConversationsAdapter(val user: User, private val onClick: (OpenConvers
         val conversation = getItem(position)
         holder.bindItem(conversation)
     }
+
+    fun filter(text: String) {
+        if (text == "") {
+            submitList(originalList)
+            isFiltering = false
+            return
+        }
+
+        isFiltering = true
+        val newList = mutableListOf<OpenConversation>()
+        for (conversation in originalList) {
+            if (conversation.displayName.contains(text, true) || conversation.description!!.contains(text, true)) {
+                newList.add(conversation)
+            }
+        }
+
+        if (newList.isNotEmpty()) {
+            submitList(newList)
+        }
+    }
+
+    override fun onCurrentListChanged(
+        previousList: MutableList<OpenConversation>,
+        currentList: MutableList<OpenConversation>
+    ) {
+        if (!isFiltering) {
+            originalList = currentList
+        }
+        super.onCurrentListChanged(previousList, currentList)
+    }
 }
 
 object ConversationsCallback : DiffUtil.ItemCallback<OpenConversation>() {

+ 19 - 1
app/src/main/res/layout/activity_open_conversations.xml

@@ -16,6 +16,7 @@
         android:id="@+id/open_conversations_appbar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
+
         <com.google.android.material.appbar.MaterialToolbar
             android:id="@+id/open_conversations_toolbar"
             android:layout_width="match_parent"
@@ -26,7 +27,24 @@
             app:layout_scrollFlags="scroll|enterAlways"
             app:navigationIconTint="@color/fontAppbar"
             app:popupTheme="@style/appActionBarPopupMenu"
-            app:titleTextColor="@color/fontAppbar" />
+            app:titleTextColor="@color/fontAppbar" >
+
+            <ImageView
+                android:id="@+id/search_open_conversations"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:contentDescription="@string/search_icon"
+                android:layout_gravity="end"
+                android:layout_marginHorizontal="@dimen/standard_margin"
+                android:src="@drawable/ic_search_white_24dp" />
+
+            <com.google.android.material.textfield.TextInputEditText
+                android:id="@+id/search_edit"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="gone"
+                />
+        </com.google.android.material.appbar.MaterialToolbar>
     </com.google.android.material.appbar.AppBarLayout>
 
     <androidx.recyclerview.widget.RecyclerView