From dc331640f98327f6350336437128dbfb8c809afc Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 19 Jun 2024 15:28:41 +0200 Subject: [PATCH] Draft : expose new apis from sdk --- .../libraries/matrix/api/room/MatrixRoom.kt | 16 ++++++ .../matrix/api/room/draft/ComposerDraft.kt | 29 ++++++++++ .../api/room/draft/ComposerDraftType.kt | 25 +++++++++ .../matrix/impl/room/RustMatrixRoom.kt | 17 ++++++ .../impl/room/draft/ComposerDraftMapper.kt | 55 +++++++++++++++++++ .../matrix/test/room/FakeMatrixRoom.kt | 10 ++++ 6 files changed, 152 insertions(+) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraft.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraftType.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/draft/ComposerDraftMapper.kt diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 4cfc303974..3ff91996d3 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -29,6 +29,7 @@ import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.media.MediaUploadHandler import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.poll.PollKind +import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.location.AssetType import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange @@ -337,5 +338,20 @@ interface MatrixRoom : Closeable { suspend fun setSendQueueEnabled(enabled: Boolean) + /** + * Store the given `ComposerDraft` in the state store of this room. + */ + suspend fun saveComposerDraft(composerDraft: ComposerDraft): Result + + /** + * Retrieve the `ComposerDraft` stored in the state store for this room. + */ + suspend fun loadComposerDraft(): Result + + /** + * Clear the `ComposerDraft` stored in the state store for this room. + */ + suspend fun clearComposerDraft(): Result + override fun close() = destroy() } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraft.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraft.kt new file mode 100644 index 0000000000..661764fc9a --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraft.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.api.room.draft + +/** + * A draft of a message composed by the user. + * @param plainText The draft content in plain text. + * @param htmlText If the message is formatted in HTML, the HTML representation of the message. + * @param draftType The type of draft. + */ +data class ComposerDraft( + val plainText: String, + val htmlText: String?, + val draftType: ComposerDraftType +) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraftType.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraftType.kt new file mode 100644 index 0000000000..632efab36f --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/draft/ComposerDraftType.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.api.room.draft + +import io.element.android.libraries.matrix.api.core.EventId + +sealed class ComposerDraftType { + data object NewMessage : ComposerDraftType() + data class Reply(val eventId: EventId) : ComposerDraftType() + data class Edit(val eventId: EventId) : ComposerDraftType() +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 1a14c7a860..1bb983db11 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -41,6 +41,7 @@ import io.element.android.libraries.matrix.api.room.Mention import io.element.android.libraries.matrix.api.room.MessageEventType import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.StateEventType +import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.location.AssetType import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange @@ -49,6 +50,7 @@ import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.widget.MatrixWidgetDriver import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings +import io.element.android.libraries.matrix.impl.room.draft.into import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsMapper @@ -605,6 +607,21 @@ class RustMatrixRoom( innerRoom.enableSendQueue(enabled) } + override suspend fun saveComposerDraft(composerDraft: ComposerDraft): Result = runCatching { + Timber.d("saveComposerDraft: $composerDraft into $roomId") + innerRoom.saveComposerDraft(composerDraft.into()) + } + + override suspend fun loadComposerDraft(): Result = runCatching { + Timber.d("loadComposerDraft for $roomId") + innerRoom.loadComposerDraft()?.into() + } + + override suspend fun clearComposerDraft(): Result = runCatching { + Timber.d("clearComposerDraft: for $roomId") + innerRoom.clearComposerDraft() + } + private fun createTimeline( timeline: InnerTimeline, isLive: Boolean, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/draft/ComposerDraftMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/draft/ComposerDraftMapper.kt new file mode 100644 index 0000000000..d3726d75c5 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/draft/ComposerDraftMapper.kt @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.room.draft + +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.room.draft.ComposerDraft +import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType +import uniffi.matrix_sdk_base.ComposerDraft as RustComposerDraft +import uniffi.matrix_sdk_base.ComposerDraftType as RustComposerDraftType + +internal fun ComposerDraft.into(): RustComposerDraft { + return RustComposerDraft( + plainText = plainText, + htmlText = htmlText, + draftType = draftType.into() + ) +} + +internal fun RustComposerDraft.into(): ComposerDraft { + return ComposerDraft( + plainText = plainText, + htmlText = htmlText, + draftType = draftType.into() + ) +} + +private fun RustComposerDraftType.into(): ComposerDraftType { + return when (this) { + RustComposerDraftType.NewMessage -> ComposerDraftType.NewMessage + is RustComposerDraftType.Reply -> ComposerDraftType.Reply(EventId(eventId)) + is RustComposerDraftType.Edit -> ComposerDraftType.Edit(EventId(eventId)) + } +} + +private fun ComposerDraftType.into(): RustComposerDraftType { + return when (this) { + ComposerDraftType.NewMessage -> RustComposerDraftType.NewMessage + is ComposerDraftType.Reply -> RustComposerDraftType.Reply(eventId.value) + is ComposerDraftType.Edit -> RustComposerDraftType.Edit(eventId.value) + } +} diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index 5583f6b11e..b0ae832d8f 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -40,6 +40,7 @@ import io.element.android.libraries.matrix.api.room.MessageEventType import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.StateEventType +import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.location.AssetType import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange @@ -527,6 +528,15 @@ class FakeMatrixRoom( var setSendQueueEnabledLambda = { _: Boolean -> } override suspend fun setSendQueueEnabled(enabled: Boolean) = setSendQueueEnabledLambda(enabled) + var saveComposerDraftLambda = { _: ComposerDraft -> Result.success(Unit) } + override suspend fun saveComposerDraft(composerDraft: ComposerDraft) = saveComposerDraftLambda(composerDraft) + + var loadComposerDraftLambda = { Result.success(null) } + override suspend fun loadComposerDraft() = loadComposerDraftLambda() + + var clearComposerDraftLambda = { Result.success(Unit) } + override suspend fun clearComposerDraft() = clearComposerDraftLambda() + override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result = getWidgetDriverResult fun givenRoomMembersState(state: MatrixRoomMembersState) {