ganfra
3 months ago
18 changed files with 290 additions and 460 deletions
@ -0,0 +1,175 @@
@@ -0,0 +1,175 @@
|
||||
/* |
||||
* 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.ui.messages.reply |
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider |
||||
import io.element.android.libraries.matrix.api.core.EventId |
||||
import io.element.android.libraries.matrix.api.core.UserId |
||||
import io.element.android.libraries.matrix.api.media.MediaSource |
||||
import io.element.android.libraries.matrix.api.poll.PollKind |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.EventContent |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.ImageMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.LocationMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageContent |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.MessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.NoticeMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.ProfileTimelineDetails |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.RedactedContent |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.StickerMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType |
||||
import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType |
||||
import kotlinx.collections.immutable.persistentListOf |
||||
import kotlinx.collections.immutable.persistentMapOf |
||||
|
||||
open class InReplyToDetailsProvider : PreviewParameterProvider<InReplyToDetails> { |
||||
override val values: Sequence<InReplyToDetails> |
||||
get() = sequenceOf( |
||||
aMessageContent( |
||||
body = "Message which are being replied.", |
||||
type = TextMessageType("Message which are being replied.", null) |
||||
), |
||||
aMessageContent( |
||||
body = "Message which are being replied, and which was long enough to be displayed on two lines (only!).", |
||||
type = TextMessageType("Message which are being replied, and which was long enough to be displayed on two lines (only!).", null) |
||||
), |
||||
aMessageContent( |
||||
body = "Video", |
||||
type = VideoMessageType("Video", null, null, MediaSource("url"), null), |
||||
), |
||||
aMessageContent( |
||||
body = "Audio", |
||||
type = AudioMessageType("Audio", MediaSource("url"), null), |
||||
), |
||||
aMessageContent( |
||||
body = "Voice", |
||||
type = VoiceMessageType("Voice", MediaSource("url"), null, null), |
||||
), |
||||
aMessageContent( |
||||
body = "Image", |
||||
type = ImageMessageType("Image", null, null, MediaSource("url"), null), |
||||
), |
||||
aMessageContent( |
||||
body = "Sticker", |
||||
type = StickerMessageType("Image", MediaSource("url"), null), |
||||
), |
||||
aMessageContent( |
||||
body = "File", |
||||
type = FileMessageType("File", MediaSource("url"), null), |
||||
), |
||||
aMessageContent( |
||||
body = "Location", |
||||
type = LocationMessageType("Location", "geo:1,2", null), |
||||
), |
||||
aMessageContent( |
||||
body = "Notice", |
||||
type = NoticeMessageType("Notice", null), |
||||
), |
||||
aMessageContent( |
||||
body = "Emote", |
||||
type = EmoteMessageType("Emote", null), |
||||
), |
||||
PollContent( |
||||
question = "Poll which are being replied.", |
||||
kind = PollKind.Disclosed, |
||||
maxSelections = 1u, |
||||
answers = persistentListOf(), |
||||
votes = persistentMapOf(), |
||||
endTime = null, |
||||
isEdited = false, |
||||
), |
||||
).map { |
||||
aInReplyToDetails( |
||||
eventContent = it, |
||||
) |
||||
} |
||||
} |
||||
|
||||
class InReplyToDetailsDisambiguatedProvider : InReplyToDetailsProvider() { |
||||
override val values: Sequence<InReplyToDetails> |
||||
get() = sequenceOf( |
||||
aMessageContent( |
||||
body = "Message which are being replied.", |
||||
type = TextMessageType("Message which are being replied.", null) |
||||
), |
||||
).map { |
||||
aInReplyToDetails( |
||||
displayNameAmbiguous = true, |
||||
eventContent = it, |
||||
) |
||||
} |
||||
} |
||||
|
||||
class InReplyToDetailsInformativeProvider : InReplyToDetailsProvider() { |
||||
override val values: Sequence<InReplyToDetails> |
||||
get() = sequenceOf( |
||||
RedactedContent, |
||||
UnableToDecryptContent(UnableToDecryptContent.Data.Unknown), |
||||
).map { |
||||
aInReplyToDetails( |
||||
eventContent = it, |
||||
) |
||||
} |
||||
} |
||||
|
||||
class InReplyToDetailsOtherProvider : InReplyToDetailsProvider() { |
||||
override val values: Sequence<InReplyToDetails> |
||||
get() = sequenceOf( |
||||
InReplyToDetails.Loading(eventId = EventId("\$anEventId")), |
||||
InReplyToDetails.Error(eventId = EventId("\$anEventId"), message = "An error message."), |
||||
) |
||||
} |
||||
|
||||
|
||||
private fun aMessageContent( |
||||
body: String, |
||||
type: MessageType, |
||||
) = MessageContent( |
||||
body = body, |
||||
inReplyTo = null, |
||||
isEdited = false, |
||||
isThreaded = false, |
||||
type = type, |
||||
) |
||||
|
||||
private fun aInReplyToDetails( |
||||
eventContent: EventContent, |
||||
displayNameAmbiguous: Boolean = false, |
||||
) = InReplyToDetails.Ready( |
||||
eventId = EventId("\$event"), |
||||
eventContent = eventContent, |
||||
senderId = UserId("@Sender:domain"), |
||||
senderProfile = aProfileTimelineDetailsReady( |
||||
displayNameAmbiguous = displayNameAmbiguous, |
||||
), |
||||
textContent = (eventContent as? MessageContent)?.body.orEmpty(), |
||||
) |
||||
|
||||
fun aProfileTimelineDetailsReady( |
||||
displayName: String? = "Sender", |
||||
displayNameAmbiguous: Boolean = false, |
||||
avatarUrl: String? = null, |
||||
) = ProfileTimelineDetails.Ready( |
||||
displayName = displayName, |
||||
displayNameAmbiguous = displayNameAmbiguous, |
||||
avatarUrl = avatarUrl, |
||||
) |
Loading…
Reference in new issue