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

Fixes autocomplete issues mentioned by SoniEx2

- Use correct suffix for sender autocomplete
- Use empty suffix for channel autocomplete
parent f4a1036c
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -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)
......
......@@ -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
......
......@@ -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,
......
......@@ -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)
}
......
......@@ -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())
......
......@@ -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)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment