diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/AutoCompleteAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/AutoCompleteAdapter.kt index b722544e707394d141977abece3ba21a123d9492..6c3b8a1e3647345e086123b7a65d6c5e1ff67dc4 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/AutoCompleteAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/AutoCompleteAdapter.kt @@ -25,7 +25,7 @@ import de.kuschku.quasseldroid_ng.util.helper.visibleIf class AutoCompleteAdapter( lifecycleOwner: LifecycleOwner, - liveData: LiveData<List<AutoCompleteItem>?>, + liveData: LiveData<Pair<String, List<AutoCompleteItem>>?>, runInBackground: (() -> Unit) -> Any, runOnUiThread: (Runnable) -> Any, private val clickListener: ((String) -> Unit)? = null @@ -34,10 +34,11 @@ class AutoCompleteAdapter( init { liveData.observe( - lifecycleOwner, Observer { it: List<AutoCompleteItem>? -> + lifecycleOwner, Observer { it: Pair<String, List<AutoCompleteItem>>? -> runInBackground { - val list = it ?: emptyList() - val old: List<AutoCompleteItem> = data + val word = it?.first ?: "" + val list = it?.second ?: emptyList() + val old: List<AutoCompleteItem> = if (word.length >= 3) list else emptyList() val new: List<AutoCompleteItem> = list val result = DiffUtil.calculateDiff( object : DiffUtil.Callback() { @@ -50,16 +51,13 @@ class AutoCompleteAdapter( old[oldItemPosition] == new[newItemPosition] }, true ) - runOnUiThread( - Runnable { - data.clear() - data.addAll(new) - result.dispatchUpdatesTo(this@AutoCompleteAdapter) - } - ) + runOnUiThread(Runnable { + data.clear() + data.addAll(new) + result.dispatchUpdatesTo(this@AutoCompleteAdapter) + }) } - } - ) + }) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt index 8d18fac04a80a7e261bb6e989b8f9255e1d24453..23c844a41dd9daa1b5065fd03c8c47926e183225 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt @@ -304,7 +304,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc val previous = autocompletionState if (!originalWord.second.isEmpty()) { - val autoCompletedWords = viewModel.autoCompleteData.value.orEmpty() + val autoCompletedWords = viewModel.autoCompleteData.value?.second.orEmpty() if (previous != null && lastWord.value.first == previous.originalWord && lastWord.value.second.start == previous.range.start) { val previousIndex = autoCompletedWords.indexOf(previous.completion) val autoCompletedWord = if (previousIndex != -1) { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/viewmodel/QuasselViewModel.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/viewmodel/QuasselViewModel.kt index 32baa2206aff31d10ef24c3b8336a9d12c4621f9..bf21f0e79b46f08ee56a71e9274b936db0013da9 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/viewmodel/QuasselViewModel.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/viewmodel/QuasselViewModel.kt @@ -197,16 +197,16 @@ class QuasselViewModel : ViewModel() { val lastWord = MutableLiveData<Observable<Pair<String, IntRange>>>() - val autoCompleteData: LiveData<List<AutoCompleteAdapter.AutoCompleteItem>?> = session.zip( + val autoCompleteData: LiveData<Pair<String, List<AutoCompleteAdapter.AutoCompleteItem>>?> = session.zip( buffer, lastWord ).switchMapRx { (session, id, lastWordWrapper) -> lastWordWrapper .distinctUntilChanged() - .debounce(16, TimeUnit.MILLISECONDS) + .debounce(300, TimeUnit.MILLISECONDS) .switchMap { lastWord -> val bufferSyncer = session?.bufferSyncer val bufferInfo = bufferSyncer?.bufferInfo(id) - if (bufferSyncer != null && lastWord.second.length >= 3) { + if (bufferSyncer != null) { bufferSyncer.liveBufferInfos().switchMap { infos -> if (bufferInfo?.type?.hasFlag( Buffer_Type.ChannelBuffer @@ -276,30 +276,32 @@ class QuasselViewModel : ViewModel() { val ignoredStartingCharacters = charArrayOf( '-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\' ) - list - .filter { + Pair( + lastWord.first, + list.filter { it.name.trimStart(*ignoredStartingCharacters) .startsWith( lastWord.first.trimStart(*ignoredStartingCharacters), ignoreCase = true ) }.sorted() + ) } } } else { Observable.just( - emptyList() + Pair(lastWord.first, emptyList()) ) } } else { Observable.just( - emptyList() + Pair(lastWord.first, emptyList()) ) } } } else { Observable.just( - emptyList() + Pair(lastWord.first, emptyList()) ) } }