From 930b54d596d57be5e4f92e2cd69d3a281802de82 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 2 May 2018 19:05:05 +0200
Subject: [PATCH] Avoid losing entered text on autocomplete or sharing

Signed-off-by: Janne Koschinski <janne@kuschku.de>
---
 .../quasseldroid/ui/chat/ChatActivity.kt      | 24 ++++++++++++++-----
 .../ui/chat/input/ChatlineFragment.kt         | 13 +++++++---
 .../ui/chat/input/EditorHelper.kt             |  4 +++-
 .../ui/chat/input/RichEditText.kt             |  9 ++++++-
 .../ui/chat/messages/MessageListFragment.kt   |  3 ++-
 5 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index d0727f628..c93283df5 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -117,12 +117,16 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     super.onNewIntent(intent)
     if (intent != null) {
       when {
-        intent.type == "text/plain" -> {
-          chatlineFragment?.editorHelper?.replaceText(intent.getStringExtra(Intent.EXTRA_TEXT))
+        intent.type == "text/plain"            -> {
+          chatlineFragment?.replaceText(intent.getStringExtra(Intent.EXTRA_TEXT))
           drawerLayout.closeDrawers()
         }
-        intent.hasExtra("bufferId") -> {
-          viewModel.buffer.onNext(intent.getIntExtra("bufferId", -1))
+        intent.hasExtra(KEY_BUFFER_ID)         -> {
+          viewModel.buffer.onNext(intent.getIntExtra(KEY_BUFFER_ID, -1))
+          drawerLayout.closeDrawers()
+        }
+        intent.hasExtra(KEY_AUTOCOMPLETE_TEXT) -> {
+          chatlineFragment?.editorHelper?.appendText(intent.getStringExtra(KEY_AUTOCOMPLETE_TEXT))
           drawerLayout.closeDrawers()
         }
       }
@@ -643,23 +647,31 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   }
 
   companion object {
+    private val KEY_AUTOCOMPLETE_TEXT = "autocomplete_text"
+    private val KEY_BUFFER_ID = "buffer_id"
+
     fun launch(
       context: Context,
       sharedText: CharSequence? = null,
+      autoCompleteText: CharSequence? = null,
       bufferId: Int? = null
-    ) = context.startActivity(intent(context, sharedText, bufferId))
+    ) = context.startActivity(intent(context, sharedText, autoCompleteText, bufferId))
 
     fun intent(
       context: Context,
       sharedText: CharSequence? = null,
+      autoCompleteText: CharSequence? = null,
       bufferId: Int? = null
     ) = Intent(context, ChatActivity::class.java).apply {
       if (sharedText != null) {
         type = "text/plain"
         putExtra(Intent.EXTRA_TEXT, sharedText)
       }
+      if (autoCompleteText != null) {
+        putExtra(KEY_AUTOCOMPLETE_TEXT, autoCompleteText)
+      }
       if (bufferId != null) {
-        putExtra("bufferId", bufferId)
+        putExtra(KEY_BUFFER_ID, bufferId)
       }
     }
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
index 97a05e65c..232e4b1e2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt
@@ -151,7 +151,7 @@ class ChatlineFragment : ServiceBoundFragment() {
     fun send() {
       if (chatline.text.isNotBlank()) {
         val lines = chatline.text.lineSequence().map {
-          it.toString() to ircFormatSerializer.toEscapeCodes(SpannableString(it))
+          it to ircFormatSerializer.toEscapeCodes(SpannableString(it))
         }
 
         viewModel.session { sessionOptional ->
@@ -159,8 +159,8 @@ class ChatlineFragment : ServiceBoundFragment() {
           viewModel.buffer { bufferId ->
             session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo ->
               val output = mutableListOf<IAliasManager.Command>()
-              for ((stripped, formatted) in lines) {
-                viewModel.addRecentlySentMessage(stripped)
+              for ((raw, formatted) in lines) {
+                viewModel.addRecentlySentMessage(raw)
                 session.aliasManager?.processInput(bufferInfo, formatted, output)
               }
               for (command in output) {
@@ -195,4 +195,11 @@ class ChatlineFragment : ServiceBoundFragment() {
 
     return view
   }
+
+  fun replaceText(text: CharSequence) {
+    if (chatline.text.isNotBlank()) {
+      chatline.text.lineSequence().forEach(viewModel::addRecentlySentMessage)
+    }
+    editorHelper.replaceText(text)
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/EditorHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/EditorHelper.kt
index d7cdac7d7..d71ceae2d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/EditorHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/EditorHelper.kt
@@ -189,7 +189,9 @@ class EditorHelper(
 
   fun setMultiLine(enabled: Boolean) = editText.setMultiLine(enabled)
 
-  fun replaceText(text: CharSequence?) = editText.replace(text)
+  fun replaceText(text: CharSequence?) = editText.replaceText(text)
+
+  fun appendText(text: CharSequence?) = editText.appendText(text)
 
   private fun showColorChooser(
     @StringRes title: Int,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/RichEditText.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/RichEditText.kt
index 1671d261f..a72f0dfd3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/RichEditText.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/RichEditText.kt
@@ -324,11 +324,18 @@ class RichEditText : EditTextSelectionChange {
     }
   }
 
-  fun replace(text: CharSequence?) {
+  fun replaceText(text: CharSequence?) {
     this.setText(text)
     this.setSelection(this.text.length)
   }
 
+  fun appendText(text: CharSequence?) {
+    if (!this.text.endsWith(" "))
+      this.text.append(" ")
+    this.text.append(text)
+    this.setSelection(this.text.length)
+  }
+
   private fun selectedFormattingChanged(range: IntRange = selection) {
     formattingListener?.invoke(
       isBold(range),
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
index a059ebbc6..a13c072de 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
@@ -224,7 +224,8 @@ class MessageListFragment : ServiceBoundFragment() {
     }
     if (autoCompleteSettings.senderDoubleClick)
       adapter.setOnDoubleClickListener { msg ->
-        ChatActivity.launch(requireContext(), sharedText = "${HostmaskHelper.nick(msg.sender)}: ")
+        ChatActivity.launch(requireContext(),
+                            autoCompleteText = "${HostmaskHelper.nick(msg.sender)}: ")
       }
     adapter.setOnUrlLongClickListener(LinkLongClickMenuHelper())
 
-- 
GitLab