Rich text editor: improve performance when changing composer mode (#7691)
* Rich text editor: improve performance when changing composer mode * Add changelog * Make `MessageComposerMode.Quote` and `Reply` data classes * Re-arrange code to fix composer not being emptied when sneding a message
This commit is contained in:
parent
a12167077f
commit
c523e144b8
1
changelog.d/7691.bugfix
Normal file
1
changelog.d/7691.bugfix
Normal file
@ -0,0 +1 @@
|
|||||||
|
Rich Text Editor: improve performance when entering reply/edit/quote mode.
|
@ -285,7 +285,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
|
|||||||
else -> return
|
else -> return
|
||||||
}
|
}
|
||||||
|
|
||||||
(composer as? RichTextComposerLayout)?.setFullScreen(setFullScreen)
|
(composer as? RichTextComposerLayout)?.setFullScreen(setFullScreen, true)
|
||||||
|
|
||||||
messageComposerViewModel.handle(MessageComposerAction.SetFullScreen(setFullScreen))
|
messageComposerViewModel.handle(MessageComposerAction.SetFullScreen(setFullScreen))
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,6 @@ sealed interface MessageComposerMode {
|
|||||||
|
|
||||||
sealed class Special(open val event: TimelineEvent, open val defaultContent: CharSequence) : MessageComposerMode
|
sealed class Special(open val event: TimelineEvent, open val defaultContent: CharSequence) : MessageComposerMode
|
||||||
data class Edit(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
data class Edit(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
||||||
class Quote(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
data class Quote(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
||||||
class Reply(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
data class Reply(override val event: TimelineEvent, override val defaultContent: CharSequence) : Special(event, defaultContent)
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,7 @@ internal class RichTextComposerLayout @JvmOverloads constructor(
|
|||||||
// There is no need to persist these values since they're always updated by the parent fragment
|
// There is no need to persist these values since they're always updated by the parent fragment
|
||||||
private var isFullScreen = false
|
private var isFullScreen = false
|
||||||
private var hasRelatedMessage = false
|
private var hasRelatedMessage = false
|
||||||
|
private var composerMode: MessageComposerMode? = null
|
||||||
|
|
||||||
var isTextFormattingEnabled = true
|
var isTextFormattingEnabled = true
|
||||||
set(value) {
|
set(value) {
|
||||||
@ -114,9 +115,15 @@ internal class RichTextComposerLayout @JvmOverloads constructor(
|
|||||||
|
|
||||||
private val dimensionConverter = DimensionConverter(resources)
|
private val dimensionConverter = DimensionConverter(resources)
|
||||||
|
|
||||||
fun setFullScreen(isFullScreen: Boolean) {
|
fun setFullScreen(isFullScreen: Boolean, animated: Boolean) {
|
||||||
|
if (!animated && views.composerLayout.layoutParams != null) {
|
||||||
|
views.composerLayout.updateLayoutParams<ViewGroup.LayoutParams> {
|
||||||
|
height =
|
||||||
|
if (isFullScreen) ViewGroup.LayoutParams.MATCH_PARENT else ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
}
|
||||||
|
}
|
||||||
editText.updateLayoutParams<ViewGroup.LayoutParams> {
|
editText.updateLayoutParams<ViewGroup.LayoutParams> {
|
||||||
height = if (isFullScreen) 0 else ViewGroup.LayoutParams.WRAP_CONTENT
|
height = if (isFullScreen) ViewGroup.LayoutParams.MATCH_PARENT else ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTextFieldBorder(isFullScreen)
|
updateTextFieldBorder(isFullScreen)
|
||||||
@ -371,7 +378,11 @@ internal class RichTextComposerLayout @JvmOverloads constructor(
|
|||||||
override fun renderComposerMode(mode: MessageComposerMode) {
|
override fun renderComposerMode(mode: MessageComposerMode) {
|
||||||
if (mode is MessageComposerMode.Special) {
|
if (mode is MessageComposerMode.Special) {
|
||||||
views.composerModeGroup.isVisible = true
|
views.composerModeGroup.isVisible = true
|
||||||
|
if (isTextFormattingEnabled) {
|
||||||
replaceFormattedContent(mode.defaultContent)
|
replaceFormattedContent(mode.defaultContent)
|
||||||
|
} else {
|
||||||
|
views.plainTextComposerEditText.setText(mode.defaultContent)
|
||||||
|
}
|
||||||
hasRelatedMessage = true
|
hasRelatedMessage = true
|
||||||
editText.showKeyboard(andRequestFocus = true)
|
editText.showKeyboard(andRequestFocus = true)
|
||||||
} else {
|
} else {
|
||||||
@ -383,10 +394,14 @@ internal class RichTextComposerLayout @JvmOverloads constructor(
|
|||||||
views.plainTextComposerEditText.setText(text)
|
views.plainTextComposerEditText.setText(text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
views.sendButton.contentDescription = resources.getString(R.string.action_send)
|
|
||||||
hasRelatedMessage = false
|
hasRelatedMessage = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTextFieldBorder(isFullScreen)
|
||||||
|
|
||||||
|
if (this.composerMode == mode) return
|
||||||
|
this.composerMode = mode
|
||||||
|
|
||||||
views.sendButton.apply {
|
views.sendButton.apply {
|
||||||
if (mode is MessageComposerMode.Edit) {
|
if (mode is MessageComposerMode.Edit) {
|
||||||
contentDescription = resources.getString(R.string.action_save)
|
contentDescription = resources.getString(R.string.action_save)
|
||||||
@ -397,8 +412,6 @@ internal class RichTextComposerLayout @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTextFieldBorder(isFullScreen)
|
|
||||||
|
|
||||||
when (mode) {
|
when (mode) {
|
||||||
is MessageComposerMode.Edit -> {
|
is MessageComposerMode.Edit -> {
|
||||||
views.composerModeTitleView.setText(R.string.editing)
|
views.composerModeTitleView.setText(R.string.editing)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user