Merge branch 'develop' of ssh://github.com/vector-im/element-x-android-poc into develop

This commit is contained in:
ganfra 2022-12-01 20:43:00 +01:00
commit 41c1e9fcaf
17 changed files with 212 additions and 39 deletions

View file

@ -34,3 +34,8 @@ val Melon = Color(0xFFFF812D)
val ElementGreen = Color(0xFF0DBD8B)
val ElementOrange = Color(0xFFD9B072)
val Vermilion = Color(0xFFFF5B55)
// TODO Update color
val MessageHighlightLight = Azure
// TODO Update color
val MessageHighlightDark = Azure

View file

@ -6,4 +6,6 @@ object VectorIcons {
val Copy = R.drawable.ic_content_copy
val ArrowForward = R.drawable.ic_content_arrow_forward
val Delete = R.drawable.ic_baseline_delete_outline_24
val Reply = R.drawable.ic_baseline_reply_24
val Edit = R.drawable.ic_baseline_edit_24
}

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,9V5l-7,7 7,7v-4.1c5,0 8.5,1.6 11,5.1 -1,-5 -4,-10 -11,-11z"/>
</vector>

View file

@ -82,6 +82,22 @@ class MatrixRoom(
}
}
suspend fun editMessage(originalEventId: String, message: String): Result<Unit> = withContext(coroutineDispatchers.io) {
val transactionId = genTransactionId()
val content = messageEventContentFromMarkdown(message)
runCatching {
room.edit(/* TODO use content */ message, originalEventId, transactionId)
}
}
suspend fun replyMessage(eventId: String, message: String): Result<Unit> = withContext(coroutineDispatchers.io) {
val transactionId = genTransactionId()
val content = messageEventContentFromMarkdown(message)
runCatching {
room.sendReply(/* TODO use content */ message, eventId, transactionId)
}
}
suspend fun redactEvent(eventId: String, reason: String? = null, ) = withContext(coroutineDispatchers.io) {
val transactionId = genTransactionId()
runCatching {

View file

@ -124,6 +124,14 @@ class MatrixTimeline(
return matrixRoom.sendMessage(message)
}
suspend fun editMessage(originalEventId: String, message: String): Result<Unit> {
return matrixRoom.editMessage(originalEventId, message = message)
}
suspend fun replyMessage(inReplyToEventId: String, message: String): Result<Unit> {
return matrixRoom.replyMessage(inReplyToEventId, message)
}
override fun onUpdate(update: TimelineDiff) {
coroutineScope.launch {
updateTimelineItems {

View file

@ -19,8 +19,18 @@ package io.element.android.x.textcomposer
sealed interface MessageComposerMode {
data class Normal(val content: CharSequence?) : MessageComposerMode
sealed class Special(open val event: Any /* TODO set correct type here */, open val defaultContent: CharSequence) : MessageComposerMode
data class Edit(override val event: Any, override val defaultContent: CharSequence) : Special(event, defaultContent)
class Quote(override val event: Any, override val defaultContent: CharSequence) : Special(event, defaultContent)
class Reply(override val event: Any, override val defaultContent: CharSequence) : Special(event, defaultContent)
sealed class Special(open val eventId: String, open val defaultContent: CharSequence) :
MessageComposerMode
data class Edit(override val eventId: String, override val defaultContent: CharSequence) :
Special(eventId, defaultContent)
class Quote(override val eventId: String, override val defaultContent: CharSequence) :
Special(eventId, defaultContent)
class Reply(
val senderName: String,
override val eventId: String,
override val defaultContent: CharSequence
) : Special(eventId, defaultContent)
}

View file

@ -133,7 +133,7 @@ class RichTextComposerLayout @JvmOverloads constructor(
if (isFullScreen) R.drawable.ic_composer_collapse else R.drawable.ic_composer_full_screen
)
views.bottomSheetHandle.isVisible = isFullScreen
views.bottomSheetHandle.isVisible = false // EAx: always gone, we do not have a bottom sheet here. // isFullScreen
if (manageKeyboard) {
if (isFullScreen) {
editText.showKeyboard(true)
@ -171,7 +171,7 @@ class RichTextComposerLayout @JvmOverloads constructor(
views.richTextComposerEditText.maxLines = maxLines
views.plainTextComposerEditText.maxLines = maxLines
views.bottomSheetHandle.isVisible = true
views.bottomSheetHandle.isVisible = false // EAx: always gone, we do not have a bottom sheet here.
}
init {
@ -506,10 +506,7 @@ class RichTextComposerLayout @JvmOverloads constructor(
views.composerModeIconView.setImageResource(R.drawable.ic_quote)
}
is MessageComposerMode.Reply -> {
// TODO We need sender info
// val senderInfo = mode.event.senderInfo
val userName =
"TODO Sender name" // senderInfo.displayName ?: senderInfo.disambiguatedDisplayName
val userName = mode.senderName
views.composerModeTitleView.text =
resources.getString(R.string.replying_to, userName)
views.composerModeIconView.setImageResource(R.drawable.ic_reply)

View file

@ -26,6 +26,8 @@ fun TextComposer(
modifier: Modifier = Modifier,
fullscreen: Boolean,
onFullscreenToggle: () -> Unit,
composerMode: MessageComposerMode,
onCloseSpecialMode: () -> Unit,
onComposerTextChange: (CharSequence) -> Unit,
composerCanSendMessage: Boolean,
composerText: String?,
@ -50,6 +52,7 @@ fun TextComposer(
}
override fun onCloseRelatedMessage() {
onCloseSpecialMode()
}
override fun onSendMessage(text: CharSequence) {
@ -70,7 +73,7 @@ fun TextComposer(
}
setFullScreen(fullscreen, true)
(this as MessageComposerView).apply {
setup(isInDarkMode)
setup(isInDarkMode, composerMode)
}
}
},
@ -83,6 +86,7 @@ fun TextComposer(
// Example of Compose -> View communication
val messageComposerView = (view as MessageComposerView)
view.setFullScreen(fullscreen, false)
// TODO messageComposerView.renderComposerMode(composerMode)
messageComposerView.sendButton.isInvisible = !composerCanSendMessage
messageComposerView.setTextIfDifferent(composerText ?: "")
}
@ -107,7 +111,7 @@ private fun FakeComposer(modifier: Modifier) {
}
}
private fun MessageComposerView.setup(isDarkMode: Boolean) {
private fun MessageComposerView.setup(isDarkMode: Boolean, composerMode: MessageComposerMode) {
val editTextColor = if (isDarkMode) {
Color.WHITE
} else {
@ -118,6 +122,7 @@ private fun MessageComposerView.setup(isDarkMode: Boolean) {
editText.setHint(ElementR.string.room_message_placeholder)
emojiButton?.isVisible = true
sendButton.isVisible = true
// TODO renderComposerMode(composerMode)
}
@Preview
@ -128,6 +133,8 @@ fun TextComposerPreview() {
fullscreen = false,
onFullscreenToggle = { },
onComposerTextChange = {},
composerMode = MessageComposerMode.Normal(""),
onCloseSpecialMode = {},
composerCanSendMessage = true,
composerText = "Message",
)

View file

@ -5,8 +5,19 @@
android:id="@+id/composerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bg_composer_rich_bottom_sheet">
android:orientation="vertical">
<!-- EAx: Remove android:background="@drawable/bg_composer_rich_bottom_sheet" from ^ -->
<!--
There are issues here:
View class androidx.appcompat.widget.AppCompatImageView is an AppCompat widget that can only be used with a Theme.AppCompat theme (or descendant).
View class io.element.android.wysiwyg.EditorEditText is an AppCompat widget that can only be used with a Theme.AppCompat theme (or descendant).
layout_constraintHeight_default="wrap" is deprecated. Use layout_height="WRAP_CONTENT" and layout_constrainedHeight="true" instead.
View class com.google.android.material.textfield.TextInputEditText is an AppCompat widget that can only be used with a Theme.AppCompat theme (or descendant).
layout_constraintHeight_default="wrap" is deprecated. Use layout_height="WRAP_CONTENT" and layout_constrainedHeight="true" instead.
-->
<FrameLayout
android:id="@+id/bottomSheetHandle"