From 924b23a4e2ca0cf50d09452e9b65fb906c4a6ad4 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Thu, 30 Nov 2023 18:44:59 +0200 Subject: [PATCH] Add mentions links to editor --- .../org/futo/circles/view/PreviewPostView.kt | 32 +++++++------------ .../mentions/MentionsLinkDisplayHandler.kt | 22 +++++++++++++ 2 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 core/src/main/java/org/futo/circles/core/feature/markdown/mentions/MentionsLinkDisplayHandler.kt diff --git a/app/src/main/java/org/futo/circles/view/PreviewPostView.kt b/app/src/main/java/org/futo/circles/view/PreviewPostView.kt index 3ab89926c..f18fd33c2 100644 --- a/app/src/main/java/org/futo/circles/view/PreviewPostView.kt +++ b/app/src/main/java/org/futo/circles/view/PreviewPostView.kt @@ -1,16 +1,12 @@ package org.futo.circles.view -import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.ColorDrawable import android.net.Uri import android.text.Editable import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.LinearLayout import androidx.annotation.DrawableRes @@ -21,6 +17,8 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.widget.doAfterTextChanged import io.element.android.wysiwyg.EditorEditText +import io.element.android.wysiwyg.display.LinkDisplayHandler +import io.element.android.wysiwyg.display.TextDisplay import io.element.android.wysiwyg.view.models.InlineFormat import org.futo.circles.R import org.futo.circles.core.extensions.loadEncryptedThumbOrFullIntoWithAspect @@ -30,7 +28,9 @@ import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.core.feature.autocomplete.Autocomplete import org.futo.circles.core.feature.autocomplete.AutocompleteCallback import org.futo.circles.core.feature.autocomplete.CharPolicy +import org.futo.circles.core.feature.markdown.mentions.MentionsLinkDisplayHandler import org.futo.circles.core.feature.markdown.mentions.MentionsPresenter +import org.futo.circles.core.feature.markdown.span.MentionSpan import org.futo.circles.core.model.MediaContent import org.futo.circles.core.model.MediaType import org.futo.circles.core.model.UserListItem @@ -46,7 +46,9 @@ import org.futo.circles.feature.timeline.post.create.PreviewPostListener import org.futo.circles.model.CreatePostContent import org.futo.circles.model.MediaPostContent import org.futo.circles.model.TextPostContent +import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.permalinks.PermalinkService.Companion.MATRIX_TO_URL_BASE import org.matrix.android.sdk.api.session.user.model.User import uniffi.wysiwyg_composer.ActionState import uniffi.wysiwyg_composer.ComposerAction @@ -88,6 +90,7 @@ class PreviewPostView( doAfterTextChanged { binding.btnSend.isEnabled = it?.toString()?.isNotBlank() == true } + linkDisplayHandler = MentionsLinkDisplayHandler(context) } setupRichTextMenu() } @@ -226,8 +229,10 @@ class PreviewPostView( ) .with(object : AutocompleteCallback<UserListItem> { override fun onPopupItemClicked(editable: Editable, item: UserListItem): Boolean { - val range = CharPolicy.getQueryRange(editable) ?: return false - //insertMentionSpan(editable, item.user.name, range[0]) + binding.etTextPost.setLinkSuggestion( + MATRIX_TO_URL_BASE + item.id, + "@${item.user.name}@" + ) return true } @@ -328,21 +333,6 @@ class PreviewPostView( } } - @SuppressLint("ClickableViewAccessibility") - private fun disallowParentInterceptTouchEvent(view: View) { - view.setOnTouchListener { v, event -> - if (v.hasFocus()) { - v.parent?.requestDisallowInterceptTouchEvent(true) - val action = event.actionMasked - if (action == MotionEvent.ACTION_SCROLL) { - v.parent?.requestDisallowInterceptTouchEvent(false) - return@setOnTouchListener true - } - } - false - } - } - private fun addMenuItem( container: LinearLayout, @DrawableRes iconId: Int, diff --git a/core/src/main/java/org/futo/circles/core/feature/markdown/mentions/MentionsLinkDisplayHandler.kt b/core/src/main/java/org/futo/circles/core/feature/markdown/mentions/MentionsLinkDisplayHandler.kt new file mode 100644 index 000000000..3e61d3e8b --- /dev/null +++ b/core/src/main/java/org/futo/circles/core/feature/markdown/mentions/MentionsLinkDisplayHandler.kt @@ -0,0 +1,22 @@ +package org.futo.circles.core.feature.markdown.mentions + +import android.content.Context +import io.element.android.wysiwyg.display.LinkDisplayHandler +import io.element.android.wysiwyg.display.TextDisplay +import org.futo.circles.core.feature.markdown.span.MentionSpan +import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.session.permalinks.PermalinkService + +class MentionsLinkDisplayHandler(private val context: Context) : LinkDisplayHandler { + + override fun resolveLinkDisplay(text: String, url: String): TextDisplay { + val userId = url.removePrefix(PermalinkService.MATRIX_TO_URL_BASE) + return if (MatrixPatterns.isUserId(userId)) + TextDisplay.Custom( + MentionSpan( + context, + text.replace("@", "") + ) + ) else TextDisplay.Plain + } +} \ No newline at end of file -- GitLab