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