Skip to content
Snippets Groups Projects
Commit acde6228 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Improved autocomplete

parent 931fa0fb
Branches
Tags
No related merge requests found
...@@ -25,7 +25,7 @@ import de.kuschku.quasseldroid_ng.util.helper.visibleIf ...@@ -25,7 +25,7 @@ import de.kuschku.quasseldroid_ng.util.helper.visibleIf
class AutoCompleteAdapter( class AutoCompleteAdapter(
lifecycleOwner: LifecycleOwner, lifecycleOwner: LifecycleOwner,
liveData: LiveData<List<AutoCompleteItem>?>, liveData: LiveData<Pair<String, List<AutoCompleteItem>>?>,
runInBackground: (() -> Unit) -> Any, runInBackground: (() -> Unit) -> Any,
runOnUiThread: (Runnable) -> Any, runOnUiThread: (Runnable) -> Any,
private val clickListener: ((String) -> Unit)? = null private val clickListener: ((String) -> Unit)? = null
...@@ -34,10 +34,11 @@ class AutoCompleteAdapter( ...@@ -34,10 +34,11 @@ class AutoCompleteAdapter(
init { init {
liveData.observe( liveData.observe(
lifecycleOwner, Observer { it: List<AutoCompleteItem>? -> lifecycleOwner, Observer { it: Pair<String, List<AutoCompleteItem>>? ->
runInBackground { runInBackground {
val list = it ?: emptyList() val word = it?.first ?: ""
val old: List<AutoCompleteItem> = data val list = it?.second ?: emptyList()
val old: List<AutoCompleteItem> = if (word.length >= 3) list else emptyList()
val new: List<AutoCompleteItem> = list val new: List<AutoCompleteItem> = list
val result = DiffUtil.calculateDiff( val result = DiffUtil.calculateDiff(
object : DiffUtil.Callback() { object : DiffUtil.Callback() {
...@@ -50,16 +51,13 @@ class AutoCompleteAdapter( ...@@ -50,16 +51,13 @@ class AutoCompleteAdapter(
old[oldItemPosition] == new[newItemPosition] old[oldItemPosition] == new[newItemPosition]
}, true }, true
) )
runOnUiThread( runOnUiThread(Runnable {
Runnable {
data.clear() data.clear()
data.addAll(new) data.addAll(new)
result.dispatchUpdatesTo(this@AutoCompleteAdapter) result.dispatchUpdatesTo(this@AutoCompleteAdapter)
})
} }
) })
}
}
)
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) {
......
...@@ -304,7 +304,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc ...@@ -304,7 +304,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
val previous = autocompletionState val previous = autocompletionState
if (!originalWord.second.isEmpty()) { 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) { if (previous != null && lastWord.value.first == previous.originalWord && lastWord.value.second.start == previous.range.start) {
val previousIndex = autoCompletedWords.indexOf(previous.completion) val previousIndex = autoCompletedWords.indexOf(previous.completion)
val autoCompletedWord = if (previousIndex != -1) { val autoCompletedWord = if (previousIndex != -1) {
......
...@@ -197,16 +197,16 @@ class QuasselViewModel : ViewModel() { ...@@ -197,16 +197,16 @@ class QuasselViewModel : ViewModel() {
val lastWord = MutableLiveData<Observable<Pair<String, IntRange>>>() 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 buffer, lastWord
).switchMapRx { (session, id, lastWordWrapper) -> ).switchMapRx { (session, id, lastWordWrapper) ->
lastWordWrapper lastWordWrapper
.distinctUntilChanged() .distinctUntilChanged()
.debounce(16, TimeUnit.MILLISECONDS) .debounce(300, TimeUnit.MILLISECONDS)
.switchMap { lastWord -> .switchMap { lastWord ->
val bufferSyncer = session?.bufferSyncer val bufferSyncer = session?.bufferSyncer
val bufferInfo = bufferSyncer?.bufferInfo(id) val bufferInfo = bufferSyncer?.bufferInfo(id)
if (bufferSyncer != null && lastWord.second.length >= 3) { if (bufferSyncer != null) {
bufferSyncer.liveBufferInfos().switchMap { infos -> bufferSyncer.liveBufferInfos().switchMap { infos ->
if (bufferInfo?.type?.hasFlag( if (bufferInfo?.type?.hasFlag(
Buffer_Type.ChannelBuffer Buffer_Type.ChannelBuffer
...@@ -276,30 +276,32 @@ class QuasselViewModel : ViewModel() { ...@@ -276,30 +276,32 @@ class QuasselViewModel : ViewModel() {
val ignoredStartingCharacters = charArrayOf( val ignoredStartingCharacters = charArrayOf(
'-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\' '-', '_', '[', ']', '{', '}', '|', '`', '^', '.', '\\'
) )
list Pair(
.filter { lastWord.first,
list.filter {
it.name.trimStart(*ignoredStartingCharacters) it.name.trimStart(*ignoredStartingCharacters)
.startsWith( .startsWith(
lastWord.first.trimStart(*ignoredStartingCharacters), lastWord.first.trimStart(*ignoredStartingCharacters),
ignoreCase = true ignoreCase = true
) )
}.sorted() }.sorted()
)
} }
} }
} else { } else {
Observable.just( Observable.just(
emptyList() Pair(lastWord.first, emptyList())
) )
} }
} else { } else {
Observable.just( Observable.just(
emptyList() Pair(lastWord.first, emptyList())
) )
} }
} }
} else { } else {
Observable.just( Observable.just(
emptyList() Pair(lastWord.first, emptyList())
) )
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment