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 51dace5c3fbdad858002a949eb6db456e46b46b6..7bed5e754fad77ac8436b25a51cee9954c319fc2 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 @@ -134,7 +134,10 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc drawerLayout.closeDrawers() } intent.hasExtra(KEY_AUTOCOMPLETE_TEXT) -> { - chatlineFragment?.editorHelper?.appendText(intent.getStringExtra(KEY_AUTOCOMPLETE_TEXT)) + chatlineFragment?.editorHelper?.appendText( + intent.getStringExtra(KEY_AUTOCOMPLETE_TEXT), + intent.getStringExtra(KEY_AUTOCOMPLETE_SUFFIX) + ) drawerLayout.closeDrawers() } } @@ -715,19 +718,24 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc companion object { private val KEY_AUTOCOMPLETE_TEXT = "autocomplete_text" + private val KEY_AUTOCOMPLETE_SUFFIX = "autocomplete_suffix" private val KEY_BUFFER_ID = "buffer_id" fun launch( context: Context, sharedText: CharSequence? = null, autoCompleteText: CharSequence? = null, + autoCompleteSuffix: String? = null, bufferId: Int? = null - ) = context.startActivity(intent(context, sharedText, autoCompleteText, bufferId)) + ) = context.startActivity( + intent(context, sharedText, autoCompleteText, autoCompleteSuffix, bufferId) + ) fun intent( context: Context, sharedText: CharSequence? = null, autoCompleteText: CharSequence? = null, + autoCompleteSuffix: String? = null, bufferId: Int? = null ) = Intent(context, ChatActivity::class.java).apply { if (sharedText != null) { @@ -736,6 +744,9 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc } if (autoCompleteText != null) { putExtra(KEY_AUTOCOMPLETE_TEXT, autoCompleteText) + if (autoCompleteSuffix != null) { + putExtra(KEY_AUTOCOMPLETE_SUFFIX, autoCompleteSuffix) + } } if (bufferId != null) { putExtra(KEY_BUFFER_ID, bufferId) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteAdapter.kt index 7bb373c4885aa4b95ae12dfd9d76c30d19dda990..943ff633a5dfe2c7b577ef1d5a56432a77831e1f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteAdapter.kt @@ -49,9 +49,9 @@ class AutoCompleteAdapter @Inject constructor( override fun areContentsTheSame(oldItem: AutoCompleteItem, newItem: AutoCompleteItem) = oldItem == newItem }) { - private var clickListener: ((String) -> Unit)? = null + private var clickListener: ((String, String) -> Unit)? = null - fun setOnClickListener(listener: ((String) -> Unit)?) { + fun setOnClickListener(listener: ((String, String) -> Unit)?) { this.clickListener = listener } @@ -110,7 +110,7 @@ class AutoCompleteAdapter @Inject constructor( class NickViewHolder( itemView: View, - private val clickListener: ((String) -> Unit)? = null + private val clickListener: ((String, String) -> Unit)? = null ) : AutoCompleteViewHolder(itemView) { @BindView(R.id.avatar) lateinit var avatar: ImageView @@ -121,19 +121,19 @@ class AutoCompleteAdapter @Inject constructor( @BindView(R.id.realname) lateinit var realname: TextView - var value: String? = null + var value: AutoCompleteItem? = null init { ButterKnife.bind(this, itemView) itemView.setOnClickListener { val value = value if (value != null) - clickListener?.invoke(value) + clickListener?.invoke(value.name, value.suffix) } } fun bindImpl(data: AutoCompleteItem.UserItem) { - value = data.name + value = data nick.text = SpanFormatter.format("%s%s", data.modes, data.displayNick ?: data.nick) realname.text = data.realname @@ -144,7 +144,7 @@ class AutoCompleteAdapter @Inject constructor( class ChannelViewHolder( itemView: View, - private val clickListener: ((String) -> Unit)? = null + private val clickListener: ((String, String) -> Unit)? = null ) : AutoCompleteViewHolder(itemView) { @BindView(R.id.status) lateinit var status: ImageView @@ -155,7 +155,7 @@ class AutoCompleteAdapter @Inject constructor( @BindView(R.id.description) lateinit var description: TextView - var value: String? = null + var value: AutoCompleteItem? = null private val online: Drawable? private val offline: Drawable? @@ -165,7 +165,7 @@ class AutoCompleteAdapter @Inject constructor( itemView.setOnClickListener { val value = value if (value != null) - clickListener?.invoke(value) + clickListener?.invoke(value.name, value.suffix) } online = itemView.context.getVectorDrawableCompat(R.drawable.ic_status_channel)?.mutate() @@ -180,7 +180,7 @@ class AutoCompleteAdapter @Inject constructor( } fun bindImpl(data: AutoCompleteItem.ChannelItem) { - value = data.name + value = data name.text = data.info.bufferName description.text = data.description @@ -198,7 +198,7 @@ class AutoCompleteAdapter @Inject constructor( class AliasViewHolder( itemView: View, - private val clickListener: ((String) -> Unit)? = null + private val clickListener: ((String, String) -> Unit)? = null ) : AutoCompleteViewHolder(itemView) { @BindView(R.id.alias) lateinit var alias: TextView @@ -206,19 +206,19 @@ class AutoCompleteAdapter @Inject constructor( @BindView(R.id.expansion) lateinit var expansion: TextView - var value: String? = null + var value: AutoCompleteItem? = null init { ButterKnife.bind(this, itemView) itemView.setOnClickListener { val value = value if (value != null) - clickListener?.invoke(value) + clickListener?.invoke(value.name, value.suffix) } } fun bindImpl(data: AutoCompleteItem.AliasItem) { - value = data.name + value = data alias.text = data.alias expansion.text = data.expansion 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 d71ceae2d647a7292972da9be0ba8315944d4eaf..0c759f91e2ee7f16232c6f4e190e7b666f0361c4 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 @@ -60,13 +60,13 @@ class EditorHelper( getColor(0, 0) } - val lastWord: BehaviorSubject<Pair<String, IntRange>> = BehaviorSubject.createDefault(Pair("", - IntRange.EMPTY)) + val lastWord: BehaviorSubject<Pair<String, IntRange>> = + BehaviorSubject.createDefault(Pair("", IntRange.EMPTY)) private val textWatcher = object : TextWatcher { override fun afterTextChanged(s: Editable?) { val previous = autoCompleteHelper.autoCompletionState val next = if (previous != null && s != null) { - val suffix = if (previous.range.start == 0) ": " else " " + val suffix = if (previous.range.start == 0) previous.completion.suffix else " " val sequence = if (s.length < previous.range.start) "" else s.substring(previous.range.start) if (sequence == previous.completion.name + suffix) { @@ -191,7 +191,7 @@ class EditorHelper( fun replaceText(text: CharSequence?) = editText.replaceText(text) - fun appendText(text: CharSequence?) = editText.appendText(text) + fun appendText(text: CharSequence?, suffix: String?) = editText.appendText(text, suffix) 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 b7340045672b8c44f03e40a28c022b2688f5c33f..6b859773c1338659b73e62a343bfe092bf48c329 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 @@ -287,10 +287,10 @@ class RichEditText : EditTextSelectionChange { setSelection(selectionStart, selectionEnd) } - fun autoComplete(text: CharSequence) { + fun autoComplete(text: CharSequence, suffix: String) { val range = this.text.lastWordIndices(this.selection.start, true) val replacement = if (range?.start == 0) { - "$text: " + "$text$suffix" } else { "$text " } @@ -305,7 +305,7 @@ class RichEditText : EditTextSelectionChange { } fun autoComplete(item: AutoCompletionState) { - val suffix = if (item.range.start == 0) ": " else " " + val suffix = if (item.range.start == 0) item.completion.suffix else " " val replacement = "${item.completion.name}$suffix" val previousReplacement = item.lastCompletion?.let { "${item.lastCompletion.name}$suffix" } @@ -329,10 +329,13 @@ class RichEditText : EditTextSelectionChange { this.setSelection(this.text.length) } - fun appendText(text: CharSequence?) { + fun appendText(text: CharSequence?, suffix: String?) { + val shouldAddSuffix = this.text.isEmpty() if (!this.text.endsWith(" ")) this.text.append(" ") this.text.append(text) + if (shouldAddSuffix) + this.text.append(suffix) this.setSelection(this.text.length) } 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 07fbae84786f0af4ed70788c5e5d0d7790a8c26b..17ee1a1babce23ab1269ab202619f57e4fc67f1a 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 @@ -232,8 +232,11 @@ class MessageListFragment : ServiceBoundFragment() { } if (autoCompleteSettings.senderDoubleClick) adapter.setOnDoubleClickListener { msg -> - ChatActivity.launch(requireContext(), - autoCompleteText = "${HostmaskHelper.nick(msg.sender)}: ") + ChatActivity.launch( + requireContext(), + autoCompleteText = HostmaskHelper.nick(msg.sender), + autoCompleteSuffix = ": " + ) } adapter.setOnUrlLongClickListener(LinkLongClickMenuHelper()) diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/AutoCompleteItem.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/AutoCompleteItem.kt index 2e7d7fc7b741ac082532de286edac0c9b01686f2..c292aabad0a4d5eac923a2520600c902d25e851a 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/AutoCompleteItem.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/AutoCompleteItem.kt @@ -23,7 +23,7 @@ import android.graphics.drawable.Drawable import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork -sealed class AutoCompleteItem(open val name: String, private val type: Int) : +sealed class AutoCompleteItem(open val name: String, val suffix: String, private val type: Int) : Comparable<AutoCompleteItem> { override fun compareTo(other: AutoCompleteItem) = when { this.type != other.type -> this.type.compareTo(other.type) @@ -41,17 +41,17 @@ sealed class AutoCompleteItem(open val name: String, private val type: Int) : val avatarUrls: List<Avatar> = emptyList(), val fallbackDrawable: Drawable? = null, val displayNick: CharSequence? = null - ) : AutoCompleteItem(nick, 0) + ) : AutoCompleteItem(nick, ": ", 0) data class AliasItem( val alias: String, val expansion: String - ) : AutoCompleteItem(alias, 1) + ) : AutoCompleteItem("/$alias", " ", 1) data class ChannelItem( val info: BufferInfo, val network: INetwork.NetworkInfo, val bufferStatus: BufferStatus, val description: CharSequence - ) : AutoCompleteItem(info.bufferName ?: "", 2) + ) : AutoCompleteItem(info.bufferName ?: "", " ", 2) }