From daf4fc0f6db5b13f4711549a4cc7cf1dea09546f Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 29 Sep 2022 10:29:08 +0200 Subject: [PATCH] Add basic timeline voice broadcast item --- .../timeline/factory/MessageItemFactory.kt | 30 +++----- .../item/MessageVoiceBroadcastItem.kt | 72 +++++++++++++++++++ ...em_timeline_event_view_stubs_container.xml | 7 ++ ...em_timeline_event_voice_broadcast_stub.xml | 62 ++++++++++++++++ 4 files changed, 149 insertions(+), 22 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt create mode 100644 vector/src/main/res/layout/item_timeline_event_voice_broadcast_stub.xml diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index ecd34208f6..0fbd1033c7 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -55,6 +55,8 @@ import im.vector.app.features.home.room.detail.timeline.item.MessageLocationItem import im.vector.app.features.home.room.detail.timeline.item.MessageLocationItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageTextItem import im.vector.app.features.home.room.detail.timeline.item.MessageTextItem_ +import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastItem +import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceBroadcastItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceItem import im.vector.app.features.home.room.detail.timeline.item.MessageVoiceItem_ import im.vector.app.features.home.room.detail.timeline.item.PollItem @@ -200,7 +202,7 @@ class MessageItemFactory @Inject constructor( is MessagePollContent -> buildPollItem(messageContent, informationData, highlight, callback, attributes) is MessageLocationContent -> buildLocationItem(messageContent, informationData, highlight, attributes) is MessageBeaconInfoContent -> liveLocationShareMessageItemFactory.create(params.event, highlight, attributes) - is MessageVoiceBroadcastInfoContent -> buildVoiceBroadcastItem(messageContent, informationData, highlight, callback, attributes) + is MessageVoiceBroadcastInfoContent -> buildVoiceBroadcastItem(messageContent, highlight, callback, attributes) else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes) } return messageItem?.apply { @@ -723,32 +725,16 @@ class MessageItemFactory @Inject constructor( private fun buildVoiceBroadcastItem( messageContent: MessageVoiceBroadcastInfoContent, - @Suppress("UNUSED_PARAMETER") - informationData: MessageInformationData, highlight: Boolean, callback: TimelineEventController.Callback?, attributes: AbsMessageItem.Attributes, - ): MessageTextItem? { - val htmlBody = "voice broadcast state: ${messageContent.voiceBroadcastState}" - val formattedBody = span { - text = htmlBody - textColor = colorProvider.getColorFromAttribute(R.attr.vctr_content_secondary) - textStyle = "italic" - } - - val bindingOptions = spanUtils.getBindingOptions(htmlBody) - val message = formattedBody.linkify(callback) - - return MessageTextItem_() - .leftGuideline(avatarSizeProvider.leftGuideline) - .previewUrlRetriever(callback?.getPreviewUrlRetriever()) - .imageContentRenderer(imageContentRenderer) - .previewUrlCallback(callback) + ): MessageVoiceBroadcastItem? { + return MessageVoiceBroadcastItem_() .attributes(attributes) - .message(message.toEpoxyCharSequence()) - .bindingOptions(bindingOptions) .highlighted(highlight) - .movementMethod(createLinkMovementMethod(callback)) + .playingState(messageContent.voiceBroadcastStateStr.toEpoxyCharSequence()) + .leftGuideline(avatarSizeProvider.leftGuideline) + .callback(callback) } private fun List?.toFft(): List? { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt new file mode 100644 index 0000000000..0476ea2a93 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceBroadcastItem.kt @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2022 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 im.vector.app.features.home.room.detail.timeline.item + +import android.annotation.SuppressLint +import android.widget.ImageButton +import android.widget.TextView +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.app.R +import im.vector.app.features.home.room.detail.RoomDetailAction +import im.vector.app.features.home.room.detail.timeline.TimelineEventController +import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState +import im.vector.lib.core.utils.epoxy.charsequence.EpoxyCharSequence + +@EpoxyModelClass +abstract class MessageVoiceBroadcastItem : AbsMessageItem() { + + @EpoxyAttribute + var callback: TimelineEventController.Callback? = null + + @EpoxyAttribute + var playingState: EpoxyCharSequence? = null + + override fun bind(holder: Holder) { + super.bind(holder) + bindVoiceBroadcastItem(holder) + } + + @SuppressLint("SetTextI18n") // Temporary text + private fun bindVoiceBroadcastItem(holder: Holder) { + with(holder) { + currentStateText.text = "Voice Broadcast state: ${playingState?.charSequence ?: "None"}" + val voiceBroadcastState = VoiceBroadcastState.values().find { it.value == playingState?.charSequence } + playButton.isEnabled = voiceBroadcastState == VoiceBroadcastState.PAUSED + pauseButton.isEnabled = voiceBroadcastState == VoiceBroadcastState.STARTED || voiceBroadcastState == VoiceBroadcastState.RESUMED + stopButton.isEnabled = voiceBroadcastState == VoiceBroadcastState.STARTED || + voiceBroadcastState == VoiceBroadcastState.RESUMED || + voiceBroadcastState == VoiceBroadcastState.PAUSED + playButton.setOnClickListener { attributes.callback?.onTimelineItemAction(RoomDetailAction.VoiceBroadcastAction.Resume) } + pauseButton.setOnClickListener { attributes.callback?.onTimelineItemAction(RoomDetailAction.VoiceBroadcastAction.Pause) } + stopButton.setOnClickListener { attributes.callback?.onTimelineItemAction(RoomDetailAction.VoiceBroadcastAction.Stop) } + } + } + + override fun getViewStubId() = STUB_ID + + class Holder : AbsMessageLocationItem.Holder(STUB_ID) { + val currentStateText by bind(R.id.currentStateText) + val playButton by bind(R.id.playButton) + val pauseButton by bind(R.id.pauseButton) + val stopButton by bind(R.id.stopButton) + } + + companion object { + private val STUB_ID = R.id.messageVoiceBroadcastStub + } +} diff --git a/vector/src/main/res/layout/item_timeline_event_view_stubs_container.xml b/vector/src/main/res/layout/item_timeline_event_view_stubs_container.xml index 0d45a48b9b..6fcf5711f7 100644 --- a/vector/src/main/res/layout/item_timeline_event_view_stubs_container.xml +++ b/vector/src/main/res/layout/item_timeline_event_view_stubs_container.xml @@ -47,6 +47,13 @@ android:layout="@layout/item_timeline_event_audio_stub" tools:visibility="gone" /> + + + + + + + + + + + + +