mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-14 16:25:05 +01:00
Improvements to search
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
9a8eacecb8
commit
6fa059919f
@ -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 -> {
|
||||||
|
@ -57,8 +57,10 @@ class ContactsViewModel constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setSearchQuery(query: String?) {
|
fun setSearchQuery(query: String?) {
|
||||||
searchQuery = query
|
if (query != searchQuery) {
|
||||||
loadContacts()
|
searchQuery = query
|
||||||
|
loadContacts()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectParticipant(participant: Participant) {
|
fun selectParticipant(participant: Participant) {
|
||||||
|
@ -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
|
||||||
|
@ -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" />
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user