From 87a9fa742a59259a8f7de0802b695eb581a60d6f Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 8 Mar 2018 19:37:40 +0100 Subject: [PATCH] Corrects further autocomplete issues --- .../quasseldroid_ng/ui/chat/InputEditor.kt | 21 ++++++++------ .../util/helper/CharSequenceHelper.kt | 28 +++++++++++++++---- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt index d096c6aa9..8b00f4c4d 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt @@ -11,6 +11,7 @@ import android.text.style.UnderlineSpan import android.view.MenuItem import android.widget.EditText import de.kuschku.quasseldroid_ng.R +import de.kuschku.quasseldroid_ng.util.helper.lastWordIndices import de.kuschku.quasseldroid_ng.util.helper.selection import de.kuschku.quasseldroid_ng.util.irc.format.IrcFormatSerializer import de.kuschku.quasseldroid_ng.util.irc.format.spans.* @@ -206,17 +207,19 @@ class InputEditor(private val editText: EditText) { } fun autoComplete(text: CharSequence) { - val beginningOfWord = editText.text.lastIndexOf(' ', editText.selectionStart) - val endOfWord = editText.text.indexOf(' ', editText.selectionEnd) - val start = beginningOfWord + 1 - val end = if (endOfWord != -1) { - endOfWord + val range = editText.text.lastWordIndices(editText.selectionStart, true) + val replacement = if (range?.start == 0) { + "$text: " } else { - editText.text.length + "$text " } - val replacement = "$text: " - editText.text.replace(start, end, replacement) - editText.setSelection(start + replacement.length) + if (range != null) { + editText.text.replace(range.start, range.endInclusive + 1, replacement) + editText.setSelection(range.start + replacement.length) + } else { + editText.text.append(replacement) + editText.setSelection(editText.text.length) + } } } \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/CharSequenceHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/CharSequenceHelper.kt index f7ce68880..319f3a608 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/CharSequenceHelper.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/CharSequenceHelper.kt @@ -2,14 +2,30 @@ package de.kuschku.quasseldroid_ng.util.helper fun CharSequence.lastWord(cursor: Int = this.length, onlyBeforeCursor: Boolean = false): CharSequence { - val beginningOfWord = lastIndexOf(' ', cursor) - val endOfWord = indexOf(' ', cursor) - val start = beginningOfWord + 1 - val end = if (endOfWord != -1) { - endOfWord + return lastWordIndices(cursor, onlyBeforeCursor)?.let { subSequence(it) } ?: "" +} + +fun CharSequence.lastWordIndices(cursor: Int = this.length, + onlyBeforeCursor: Boolean = false): IntRange? { + val cursorPosition = if (cursor != -1) { + cursor } else { length } - return subSequence(start, if (onlyBeforeCursor) cursor else end) + val beginningOfWord = lastIndexOf(' ', cursorPosition - 1) + val endOfWord = indexOf(' ', cursorPosition) + + val start = beginningOfWord + 1 + val end = when { + onlyBeforeCursor -> cursorPosition + endOfWord == -1 -> cursorPosition + else -> endOfWord + } + + return if (end - start > 0 && start >= 0 && end <= length) { + start..end + } else { + null + } } \ No newline at end of file -- GitLab