diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsView.kt index 896191982..8f04d56b1 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsView.kt @@ -23,18 +23,21 @@ package com.nextcloud.talk.newarch.features.contactsflow import android.content.Context +import android.os.Build import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.text.InputType +import android.view.* +import android.view.inputmethod.EditorInfo +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuItemCompat import androidx.core.view.isVisible import androidx.lifecycle.observe import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider -import com.nextcloud.talk.R import com.nextcloud.talk.models.json.participants.Participant 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.ext.initRecyclerView 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.message_state.view.* import org.koin.android.ext.android.inject +import com.nextcloud.talk.R class ContactsView(private val bundle: Bundle? = null) : BaseView() { override val scopeProvider: LifecycleScopeProvider<*> = ControllerScopeProvider.from(this) private lateinit var viewModel: ContactsViewModel val factory: ContactsViewModelFactory by inject() - lateinit var participantsAdapter: Adapter - lateinit var selectedParticipantsAdapter: Adapter - override fun getLayoutId(): Int { - return R.layout.contacts_list_view - } + private lateinit var participantsAdapter: Adapter + private lateinit var selectedParticipantsAdapter: Adapter private val isGroupConversation = bundle?.containsKey(BundleKeys.KEY_CONVERSATION_NAME) == 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( inflater: LayoutInflater, container: ViewGroup @@ -180,6 +186,25 @@ class ContactsView(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? { return when { isGroupConversation -> { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsViewModel.kt index 86225d7e9..6deff8de4 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsViewModel.kt @@ -57,8 +57,10 @@ class ContactsViewModel constructor( } fun setSearchQuery(query: String?) { - searchQuery = query - loadContacts() + if (query != searchQuery) { + searchQuery = query + loadContacts() + } } fun selectParticipant(participant: Participant) { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingTextWatcher.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingTextWatcher.kt index 543124ce1..57ea8ebf5 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingTextWatcher.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingTextWatcher.kt @@ -24,8 +24,7 @@ package com.nextcloud.talk.newarch.features.search import android.text.Editable import android.text.TextWatcher -import android.widget.SearchView -import androidx.databinding.adapters.SearchViewBindingAdapter +import androidx.appcompat.widget.SearchView import androidx.lifecycle.Lifecycle import androidx.lifecycle.coroutineScope import kotlinx.coroutines.Job @@ -35,7 +34,7 @@ import kotlinx.coroutines.launch class DebouncingTextWatcher( lifecycle: Lifecycle, private val onDebouncingTextWatcherChange: (CharSequence?) -> Unit -) : TextWatcher, SearchView.OnQueryTextListener() { +) : TextWatcher, SearchView.OnQueryTextListener { private var debouncePeriod: Long = 500 private val coroutineScope = lifecycle.coroutineScope diff --git a/app/src/main/res/menu/menu_contacts.xml b/app/src/main/res/menu/menu_contacts.xml index 905899341..b61e63a9a 100644 --- a/app/src/main/res/menu/menu_contacts.xml +++ b/app/src/main/res/menu/menu_contacts.xml @@ -26,7 +26,6 @@ android:animateLayoutChanges="true" android:icon="@drawable/ic_search_white_24dp" android:title="@string/nc_search" - android:visible="false" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="collapseActionView|ifRoom" />