1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-06 00:02:48 +02:00

Compare commits

...

3 Commits

Author SHA1 Message Date
Jorge Martín
ed52469fc1 Update wysiwyg aar lib 2022-08-05 12:54:59 +02:00
Jorge Martín
af778ad925 Replace EditText with RichTextEditor (menu included) 2022-08-05 12:54:59 +02:00
Jorge Martín
48c02ac336 PoC integration of the very WIP WYSIWYG editor library. 2022-08-05 12:54:59 +02:00
8 changed files with 50 additions and 41 deletions

View File

@@ -368,6 +368,10 @@ android {
}
dependencies {
// WYSIWIG dependencies
implementation files("libs/wysiwyg-release.aar")
implementation "net.java.dev.jna:jna:5.7.0@aar"
implementation project(":vector-config")
implementation project(":matrix-sdk-android")
implementation project(":matrix-sdk-android-flow")

Binary file not shown.

View File

@@ -87,7 +87,7 @@
android:taskAffinity="${applicationId}.${appTaskAffinitySuffix}"
android:theme="@style/Theme.Vector.Light"
tools:ignore="UnusedAttribute"
tools:replace="android:allowBackup">
tools:replace="android:allowBackup,android:theme">
<!-- No limit for screen ratio: avoid black strips -->
<meta-data

View File

@@ -736,7 +736,7 @@ class TimelineFragment @Inject constructor(
setImageResource(R.drawable.ic_insert_emoji)
}
},
editText = views.composerLayout.views.composerEditText
editText = views.composerLayout.views.composerEditor.editText
)
}
@@ -1523,7 +1523,7 @@ class TimelineFragment @Inject constructor(
}
private fun setupComposer() {
val composerEditText = views.composerLayout.views.composerEditText
val composerEditText = views.composerLayout.views.composerEditor.editText
autoCompleter.setup(composerEditText)
observerUserTyping()
@@ -1554,7 +1554,7 @@ class TimelineFragment @Inject constructor(
if (isThreadTimeLine() && timelineArgs.threadTimelineArgs?.showKeyboard == true) {
// Show keyboard when the user started a thread
views.composerLayout.views.composerEditText.showKeyboard(andRequestFocus = true)
views.composerLayout.views.composerEditor.editText.showKeyboard(andRequestFocus = true)
}
views.composerLayout.callback = object : MessageComposerView.Callback {
override fun onAddAttachment() {
@@ -1605,7 +1605,7 @@ class TimelineFragment @Inject constructor(
private fun observerUserTyping() {
if (isThreadTimeLine()) return
views.composerLayout.views.composerEditText.textChanges()
views.composerLayout.views.composerEditor.editText.textChanges()
.skipInitialValue()
.debounce(300)
.map { it.isNotEmpty() }
@@ -1615,7 +1615,7 @@ class TimelineFragment @Inject constructor(
}
.launchIn(viewLifecycleOwner.lifecycleScope)
views.composerLayout.views.composerEditText.focusChanges()
views.composerLayout.views.composerEditor.editText.focusChanges()
.onEach {
timelineViewModel.handle(RoomDetailAction.ComposerFocusChange(it))
}
@@ -2443,8 +2443,8 @@ class TimelineFragment @Inject constructor(
if (startToCompose &&
userId == session.myUserId) {
// Empty composer, current user: start an emote
views.composerLayout.views.composerEditText.setText(Command.EMOTE.command + " ")
views.composerLayout.views.composerEditText.setSelection(Command.EMOTE.command.length + 1)
views.composerLayout.views.composerEditor.editText.setText(Command.EMOTE.command + " ")
views.composerLayout.views.composerEditor.editText.setSelection(Command.EMOTE.command.length + 1)
} else {
val roomMember = timelineViewModel.getMember(userId)
// TODO move logic outside of fragment
@@ -2460,7 +2460,7 @@ class TimelineFragment @Inject constructor(
requireContext(),
MatrixItem.UserItem(userId, displayName, roomMember?.avatarUrl)
)
.also { it.bind(views.composerLayout.views.composerEditText) },
.also { it.bind(views.composerLayout.views.composerEditor.editText) },
0,
displayName.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
@@ -2470,11 +2470,11 @@ class TimelineFragment @Inject constructor(
if (startToCompose) {
if (displayName.startsWith("/")) {
// Ensure displayName will not be interpreted as a Slash command
views.composerLayout.views.composerEditText.append("\\")
views.composerLayout.views.composerEditor.editText.append("\\")
}
views.composerLayout.views.composerEditText.append(pill)
views.composerLayout.views.composerEditor.editText.append(pill)
} else {
views.composerLayout.views.composerEditText.text?.insert(views.composerLayout.views.composerEditText.selectionStart, pill)
views.composerLayout.views.composerEditor.editText.text?.insert(views.composerLayout.views.composerEditor.editText.selectionStart, pill)
}
}
}
@@ -2484,7 +2484,7 @@ class TimelineFragment @Inject constructor(
private fun focusComposerAndShowKeyboard() {
if (views.composerLayout.isVisible) {
views.composerLayout.views.composerEditText.showKeyboard(andRequestFocus = true)
views.composerLayout.views.composerEditor.editText.showKeyboard(andRequestFocus = true)
}
}

View File

@@ -17,13 +17,13 @@
package im.vector.app.features.home.room.detail.composer
import android.content.Context
import android.net.Uri
import android.text.Editable
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.text.toSpannable
import androidx.core.widget.addTextChangedListener
import androidx.transition.ChangeBounds
import androidx.transition.Fade
import androidx.transition.Transition
@@ -57,7 +57,7 @@ class MessageComposerView @JvmOverloads constructor(
private val animationDuration = 100L
val text: Editable?
get() = views.composerEditText.text
get() = views.composerEditor.editText.text
init {
inflate(context, R.layout.composer_layout, this)
@@ -65,15 +65,21 @@ class MessageComposerView @JvmOverloads constructor(
collapse(false)
views.composerEditText.callback = object : ComposerEditText.Callback {
override fun onRichContentSelected(contentUri: Uri): Boolean {
return callback?.onRichContentSelected(contentUri) ?: false
}
// views.composerEditText.callback = object : ComposerEditText.Callback {
// override fun onRichContentSelected(contentUri: Uri): Boolean {
// return callback?.onRichContentSelected(contentUri) ?: false
// }
//
// override fun onTextChanged(text: CharSequence) {
// callback?.onTextChanged(text)
// }
// }
// Equivalent of ComposerEditText.Callback.onTextChanged
views.composerEditor.editText.addTextChangedListener(onTextChanged = { text, _, _, _ ->
text?.let { callback?.onTextChanged(it) }
})
override fun onTextChanged(text: CharSequence) {
callback?.onTextChanged(text)
}
}
views.composerRelatedMessageCloseButton.setOnClickListener {
collapse()
callback?.onCloseRelatedMessage()
@@ -108,7 +114,7 @@ class MessageComposerView @JvmOverloads constructor(
}
fun setTextIfDifferent(text: CharSequence?): Boolean {
return views.composerEditText.setTextIfDifferent(text)
return views.composerEditor.editText.setTextIfDifferent(text)
}
private fun applyNewConstraintSet(animate: Boolean, transitionComplete: (() -> Unit)?) {
@@ -149,9 +155,9 @@ class MessageComposerView @JvmOverloads constructor(
fun setRoomEncrypted(isEncrypted: Boolean) {
if (isEncrypted) {
views.composerEditText.setHint(R.string.room_message_placeholder)
views.composerEditor.setHint(R.string.room_message_placeholder)
} else {
views.composerEditText.setHint(R.string.room_message_placeholder)
views.composerEditor.setHint(R.string.room_message_placeholder)
}
}
}

View File

@@ -102,13 +102,13 @@
android:layout_height="0dp"
android:background="@drawable/bg_composer_edit_text" />
<im.vector.app.features.home.room.detail.composer.ComposerEditText
android:id="@+id/composerEditText"
<io.element.android.wysiwyg.RichTextEditor
android:id="@+id/composerEditor"
style="@style/Widget.Vector.EditText.Composer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:nextFocusLeft="@id/composerEditText"
android:nextFocusUp="@id/composerEditText"
android:nextFocusLeft="@id/composerEditor"
android:nextFocusUp="@id/composerEditor"
tools:hint="@string/room_message_placeholder"
tools:ignore="MissingConstraints" />

View File

@@ -133,16 +133,16 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginEnd="12dp" />
<im.vector.app.features.home.room.detail.composer.ComposerEditText
android:id="@+id/composerEditText"
<io.element.android.wysiwyg.RichTextEditor
android:id="@+id/composerEditor"
style="@style/Widget.Vector.EditText.Composer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/room_message_placeholder"
android:nextFocusLeft="@id/composerEditText"
android:nextFocusUp="@id/composerEditText"
android:nextFocusLeft="@id/composerEditor"
android:nextFocusUp="@id/composerEditor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/composerEmojiButton"
app:layout_constraintEnd_toStartOf="@id/sendButton"
app:layout_constraintStart_toStartOf="@id/composerEditTextOuterBorder"
app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/lorem/random" />
@@ -157,7 +157,6 @@
android:src="@drawable/ic_insert_emoji"
app:layout_constraintBottom_toBottomOf="@id/attachmentButton"
app:layout_constraintEnd_toEndOf="@id/composerEditTextOuterBorder"
app:layout_constraintStart_toEndOf="@id/composerEditText"
app:layout_constraintTop_toTopOf="@id/attachmentButton"
app:layout_goneMarginEnd="8dp"
app:tint="?vctr_content_quaternary"

View File

@@ -145,13 +145,13 @@
app:layout_constraintTop_toBottomOf="@id/composer_preview_barrier"
app:layout_goneMarginEnd="12dp" />
<im.vector.app.features.home.room.detail.composer.ComposerEditText
android:id="@+id/composerEditText"
<io.element.android.wysiwyg.RichTextEditor
android:id="@+id/composerEditor"
style="@style/Widget.Vector.EditText.Composer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:nextFocusLeft="@id/composerEditText"
android:nextFocusUp="@id/composerEditText"
android:nextFocusLeft="@id/composerEditor"
android:nextFocusUp="@id/composerEditor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/composerEmojiButton"
app:layout_constraintStart_toStartOf="@id/composerEditTextOuterBorder"
@@ -168,7 +168,7 @@
android:src="@drawable/ic_insert_emoji"
app:layout_constraintBottom_toBottomOf="@id/sendButton"
app:layout_constraintEnd_toEndOf="@id/composerEditTextOuterBorder"
app:layout_constraintStart_toEndOf="@id/composerEditText"
app:layout_constraintStart_toEndOf="@id/composerEditor"
app:layout_constraintTop_toTopOf="@id/sendButton"
app:layout_goneMarginBottom="52dp"
app:layout_goneMarginEnd="8dp"