Improvements to search

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-01-24 19:32:01 +01:00
parent 9a8eacecb8
commit 6fa059919f
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
4 changed files with 40 additions and 15 deletions

View File

@ -23,18 +23,21 @@
package com.nextcloud.talk.newarch.features.contactsflow package com.nextcloud.talk.newarch.features.contactsflow
import android.content.Context import android.content.Context
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.text.InputType
import android.view.View import android.view.*
import android.view.ViewGroup import android.view.inputmethod.EditorInfo
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.observe import androidx.lifecycle.observe
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider
import com.nextcloud.talk.R
import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.newarch.features.contactsflow.source.FixedListSource import com.nextcloud.talk.newarch.features.contactsflow.source.FixedListSource
import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher
import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.BaseView
import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView
import com.nextcloud.talk.newarch.utils.ElementPayload import com.nextcloud.talk.newarch.utils.ElementPayload
@ -45,21 +48,24 @@ import kotlinx.android.synthetic.main.contacts_list_view.view.*
import kotlinx.android.synthetic.main.conversations_list_view.view.recyclerView import kotlinx.android.synthetic.main.conversations_list_view.view.recyclerView
import kotlinx.android.synthetic.main.message_state.view.* import kotlinx.android.synthetic.main.message_state.view.*
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import com.nextcloud.talk.R
class ContactsView<T : Any>(private val bundle: Bundle? = null) : BaseView() { class ContactsView<T : Any>(private val bundle: Bundle? = null) : BaseView() {
override val scopeProvider: LifecycleScopeProvider<*> = ControllerScopeProvider.from(this) override val scopeProvider: LifecycleScopeProvider<*> = ControllerScopeProvider.from(this)
private lateinit var viewModel: ContactsViewModel private lateinit var viewModel: ContactsViewModel
val factory: ContactsViewModelFactory by inject() val factory: ContactsViewModelFactory by inject()
lateinit var participantsAdapter: Adapter private lateinit var participantsAdapter: Adapter
lateinit var selectedParticipantsAdapter: Adapter private lateinit var selectedParticipantsAdapter: Adapter
override fun getLayoutId(): Int {
return R.layout.contacts_list_view
}
private val isGroupConversation = bundle?.containsKey(BundleKeys.KEY_CONVERSATION_NAME) == true private val isGroupConversation = bundle?.containsKey(BundleKeys.KEY_CONVERSATION_NAME) == true
private val hasToken = bundle?.containsKey(BundleKeys.KEY_CONVERSATION_TOKEN) == true private val hasToken = bundle?.containsKey(BundleKeys.KEY_CONVERSATION_TOKEN) == true
private var searchMenuItem: MenuItem? = null
override fun getLayoutId(): Int {
return R.layout.contacts_list_view
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup container: ViewGroup
@ -180,6 +186,25 @@ class ContactsView<T : Any>(private val bundle: Bundle? = null) : BaseView() {
} }
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.menu_contacts, menu);
searchMenuItem = menu.findItem(R.id.action_search)
val searchView = MenuItemCompat.getActionView(menu.findItem(R.id.action_search)) as SearchView
searchView.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
var imeOptions = EditorInfo.IME_ACTION_SEARCH or EditorInfo.IME_FLAG_NO_FULLSCREEN
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
}
searchView.imeOptions = imeOptions;
searchView.queryHint = resources?.getString(R.string.nc_search)
searchView.setOnQueryTextListener(DebouncingTextWatcher(lifecycle, ::setSearchQuery))
}
private fun setSearchQuery(query: CharSequence?) {
viewModel.setSearchQuery(query.toString())
}
override fun getTitle(): String? { override fun getTitle(): String? {
return when { return when {
isGroupConversation -> { isGroupConversation -> {

View File

@ -57,9 +57,11 @@ class ContactsViewModel constructor(
} }
fun setSearchQuery(query: String?) { fun setSearchQuery(query: String?) {
if (query != searchQuery) {
searchQuery = query searchQuery = query
loadContacts() loadContacts()
} }
}
fun selectParticipant(participant: Participant) { fun selectParticipant(participant: Participant) {
selectedParticipants.add(participant) selectedParticipants.add(participant)

View File

@ -24,8 +24,7 @@ package com.nextcloud.talk.newarch.features.search
import android.text.Editable import android.text.Editable
import android.text.TextWatcher import android.text.TextWatcher
import android.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.databinding.adapters.SearchViewBindingAdapter
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope import androidx.lifecycle.coroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
@ -35,7 +34,7 @@ import kotlinx.coroutines.launch
class DebouncingTextWatcher( class DebouncingTextWatcher(
lifecycle: Lifecycle, lifecycle: Lifecycle,
private val onDebouncingTextWatcherChange: (CharSequence?) -> Unit private val onDebouncingTextWatcherChange: (CharSequence?) -> Unit
) : TextWatcher, SearchView.OnQueryTextListener() { ) : TextWatcher, SearchView.OnQueryTextListener {
private var debouncePeriod: Long = 500 private var debouncePeriod: Long = 500
private val coroutineScope = lifecycle.coroutineScope private val coroutineScope = lifecycle.coroutineScope

View File

@ -26,7 +26,6 @@
android:animateLayoutChanges="true" android:animateLayoutChanges="true"
android:icon="@drawable/ic_search_white_24dp" android:icon="@drawable/ic_search_white_24dp"
android:title="@string/nc_search" android:title="@string/nc_search"
android:visible="false"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom" /> app:showAsAction="collapseActionView|ifRoom" />