Show voice broadcast events in the room list
fix factory
This commit is contained in:
parent
1a3ca7b1a0
commit
69beef4648
@ -134,6 +134,8 @@
|
|||||||
<string name="notice_crypto_unable_to_decrypt">** Unable to decrypt: %s **</string>
|
<string name="notice_crypto_unable_to_decrypt">** Unable to decrypt: %s **</string>
|
||||||
<string name="notice_crypto_error_unknown_inbound_session_id">The sender\'s device has not sent us the keys for this message.</string>
|
<string name="notice_crypto_error_unknown_inbound_session_id">The sender\'s device has not sent us the keys for this message.</string>
|
||||||
|
|
||||||
|
<string name="notice_voice_broadcast_ended">%1$s ended a voice broadcast.</string>
|
||||||
|
|
||||||
<!-- Messages -->
|
<!-- Messages -->
|
||||||
|
|
||||||
<!-- Room Screen -->
|
<!-- Room Screen -->
|
||||||
@ -3101,6 +3103,7 @@
|
|||||||
<string name="audio_message_file_size">(%1$s)</string>
|
<string name="audio_message_file_size">(%1$s)</string>
|
||||||
|
|
||||||
<string name="voice_broadcast_live">Live</string>
|
<string name="voice_broadcast_live">Live</string>
|
||||||
|
<string name="voice_broadcast_live_broadcast">Live broadcast</string>
|
||||||
<!-- TODO Rename id to voice_broadcast_buffering -->
|
<!-- TODO Rename id to voice_broadcast_buffering -->
|
||||||
<string name="a11y_voice_broadcast_buffering">Buffering…</string>
|
<string name="a11y_voice_broadcast_buffering">Buffering…</string>
|
||||||
<string name="a11y_resume_voice_broadcast_record">Resume voice broadcast record</string>
|
<string name="a11y_resume_voice_broadcast_record">Resume voice broadcast record</string>
|
||||||
|
@ -48,6 +48,7 @@ import im.vector.app.features.analytics.AnalyticsTracker
|
|||||||
import im.vector.app.features.analytics.VectorAnalytics
|
import im.vector.app.features.analytics.VectorAnalytics
|
||||||
import im.vector.app.features.analytics.impl.DefaultVectorAnalytics
|
import im.vector.app.features.analytics.impl.DefaultVectorAnalytics
|
||||||
import im.vector.app.features.analytics.metrics.VectorPlugins
|
import im.vector.app.features.analytics.metrics.VectorPlugins
|
||||||
|
import im.vector.app.features.configuration.VectorCustomEventTypesProvider
|
||||||
import im.vector.app.features.invite.AutoAcceptInvites
|
import im.vector.app.features.invite.AutoAcceptInvites
|
||||||
import im.vector.app.features.invite.CompileTimeAutoAcceptInvites
|
import im.vector.app.features.invite.CompileTimeAutoAcceptInvites
|
||||||
import im.vector.app.features.navigation.DefaultNavigator
|
import im.vector.app.features.navigation.DefaultNavigator
|
||||||
@ -141,6 +142,7 @@ import javax.inject.Singleton
|
|||||||
vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider,
|
vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider,
|
||||||
flipperProxy: FlipperProxy,
|
flipperProxy: FlipperProxy,
|
||||||
vectorPlugins: VectorPlugins,
|
vectorPlugins: VectorPlugins,
|
||||||
|
vectorCustomEventTypesProvider: VectorCustomEventTypesProvider,
|
||||||
): MatrixConfiguration {
|
): MatrixConfiguration {
|
||||||
return MatrixConfiguration(
|
return MatrixConfiguration(
|
||||||
applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION,
|
applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION,
|
||||||
@ -150,6 +152,7 @@ import javax.inject.Singleton
|
|||||||
flipperProxy.networkInterceptor(),
|
flipperProxy.networkInterceptor(),
|
||||||
),
|
),
|
||||||
metricPlugins = vectorPlugins.plugins(),
|
metricPlugins = vectorPlugins.plugins(),
|
||||||
|
customEventTypesProvider = vectorCustomEventTypesProvider,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* 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.configuration
|
||||||
|
|
||||||
|
import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants
|
||||||
|
import org.matrix.android.sdk.api.provider.CustomEventTypesProvider
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class VectorCustomEventTypesProvider @Inject constructor() : CustomEventTypesProvider {
|
||||||
|
|
||||||
|
override val customPreviewableEventTypes = listOf(
|
||||||
|
VoiceBroadcastConstants.STATE_ROOM_VOICE_BROADCAST_INFO
|
||||||
|
)
|
||||||
|
}
|
@ -21,8 +21,14 @@ import im.vector.app.EmojiSpanify
|
|||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.extensions.getVectorLastMessageContent
|
import im.vector.app.core.extensions.getVectorLastMessageContent
|
||||||
import im.vector.app.core.resources.ColorProvider
|
import im.vector.app.core.resources.ColorProvider
|
||||||
|
import im.vector.app.core.resources.DrawableProvider
|
||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.core.resources.StringProvider
|
||||||
import im.vector.app.features.html.EventHtmlRenderer
|
import im.vector.app.features.html.EventHtmlRenderer
|
||||||
|
import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants
|
||||||
|
import im.vector.app.features.voicebroadcast.isLive
|
||||||
|
import im.vector.app.features.voicebroadcast.model.VoiceBroadcastEvent
|
||||||
|
import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent
|
||||||
|
import me.gujun.android.span.image
|
||||||
import me.gujun.android.span.span
|
import me.gujun.android.span.span
|
||||||
import org.commonmark.node.Document
|
import org.commonmark.node.Document
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
@ -41,6 +47,7 @@ import javax.inject.Inject
|
|||||||
class DisplayableEventFormatter @Inject constructor(
|
class DisplayableEventFormatter @Inject constructor(
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
private val colorProvider: ColorProvider,
|
private val colorProvider: ColorProvider,
|
||||||
|
private val drawableProvider: DrawableProvider,
|
||||||
private val emojiSpanify: EmojiSpanify,
|
private val emojiSpanify: EmojiSpanify,
|
||||||
private val noticeEventFormatter: NoticeEventFormatter,
|
private val noticeEventFormatter: NoticeEventFormatter,
|
||||||
private val htmlRenderer: Lazy<EventHtmlRenderer>
|
private val htmlRenderer: Lazy<EventHtmlRenderer>
|
||||||
@ -135,6 +142,9 @@ class DisplayableEventFormatter @Inject constructor(
|
|||||||
in EventType.STATE_ROOM_BEACON_INFO.values -> {
|
in EventType.STATE_ROOM_BEACON_INFO.values -> {
|
||||||
simpleFormat(senderName, stringProvider.getString(R.string.sent_live_location), appendAuthor)
|
simpleFormat(senderName, stringProvider.getString(R.string.sent_live_location), appendAuthor)
|
||||||
}
|
}
|
||||||
|
VoiceBroadcastConstants.STATE_ROOM_VOICE_BROADCAST_INFO -> {
|
||||||
|
formatVoiceBroadcastEvent(timelineEvent.root.asVoiceBroadcastEvent(), senderName)
|
||||||
|
}
|
||||||
else -> {
|
else -> {
|
||||||
span {
|
span {
|
||||||
text = noticeEventFormatter.format(timelineEvent, isDm) ?: ""
|
text = noticeEventFormatter.format(timelineEvent, isDm) ?: ""
|
||||||
@ -252,4 +262,20 @@ class DisplayableEventFormatter @Inject constructor(
|
|||||||
body
|
body
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun formatVoiceBroadcastEvent(voiceBroadcastEvent: VoiceBroadcastEvent?, senderName: String): CharSequence {
|
||||||
|
return if (voiceBroadcastEvent?.isLive == true) {
|
||||||
|
span {
|
||||||
|
drawableProvider.getDrawable(R.drawable.ic_voice_broadcast, colorProvider.getColor(R.color.palette_vermilion))?.let {
|
||||||
|
image(it)
|
||||||
|
+" "
|
||||||
|
}
|
||||||
|
span(stringProvider.getString(R.string.voice_broadcast_live_broadcast)) {
|
||||||
|
textColor = colorProvider.getColor(R.color.palette_vermilion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stringProvider.getString(R.string.notice_voice_broadcast_ended, senderName)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import com.airbnb.mvrx.Loading
|
|||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.date.DateFormatKind
|
import im.vector.app.core.date.DateFormatKind
|
||||||
import im.vector.app.core.date.VectorDateFormatter
|
import im.vector.app.core.date.VectorDateFormatter
|
||||||
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||||
import im.vector.app.core.error.ErrorFormatter
|
import im.vector.app.core.error.ErrorFormatter
|
||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.core.resources.StringProvider
|
||||||
@ -29,21 +30,30 @@ import im.vector.app.features.home.AvatarRenderer
|
|||||||
import im.vector.app.features.home.RoomListDisplayMode
|
import im.vector.app.features.home.RoomListDisplayMode
|
||||||
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
||||||
import im.vector.app.features.home.room.typing.TypingHelper
|
import im.vector.app.features.home.room.typing.TypingHelper
|
||||||
|
import im.vector.app.features.voicebroadcast.isVoiceBroadcast
|
||||||
|
import im.vector.app.features.voicebroadcast.usecase.GetOngoingVoiceBroadcastsUseCase
|
||||||
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
||||||
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
|
import org.matrix.android.sdk.api.session.getRoom
|
||||||
|
import org.matrix.android.sdk.api.session.room.getTimelineEvent
|
||||||
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
|
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.message.asMessageAudioEvent
|
||||||
|
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
||||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class RoomSummaryItemFactory @Inject constructor(
|
class RoomSummaryItemFactory @Inject constructor(
|
||||||
|
private val sessionHolder: ActiveSessionHolder,
|
||||||
private val displayableEventFormatter: DisplayableEventFormatter,
|
private val displayableEventFormatter: DisplayableEventFormatter,
|
||||||
private val dateFormatter: VectorDateFormatter,
|
private val dateFormatter: VectorDateFormatter,
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
private val typingHelper: TypingHelper,
|
private val typingHelper: TypingHelper,
|
||||||
private val avatarRenderer: AvatarRenderer,
|
private val avatarRenderer: AvatarRenderer,
|
||||||
private val errorFormatter: ErrorFormatter
|
private val errorFormatter: ErrorFormatter,
|
||||||
|
private val getOngoingVoiceBroadcastsUseCase: GetOngoingVoiceBroadcastsUseCase,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun create(
|
fun create(
|
||||||
@ -129,7 +139,7 @@ class RoomSummaryItemFactory @Inject constructor(
|
|||||||
val showSelected = selectedRoomIds.contains(roomSummary.roomId)
|
val showSelected = selectedRoomIds.contains(roomSummary.roomId)
|
||||||
var latestFormattedEvent: CharSequence = ""
|
var latestFormattedEvent: CharSequence = ""
|
||||||
var latestEventTime = ""
|
var latestEventTime = ""
|
||||||
val latestEvent = roomSummary.latestPreviewableEvent
|
val latestEvent = roomSummary.getVectorLatestPreviewableEvent()
|
||||||
if (latestEvent != null) {
|
if (latestEvent != null) {
|
||||||
latestFormattedEvent = displayableEventFormatter.format(latestEvent, roomSummary.isDirect, roomSummary.isDirect.not())
|
latestFormattedEvent = displayableEventFormatter.format(latestEvent, roomSummary.isDirect, roomSummary.isDirect.not())
|
||||||
latestEventTime = dateFormatter.format(latestEvent.root.originServerTs, DateFormatKind.ROOM_LIST)
|
latestEventTime = dateFormatter.format(latestEvent.root.originServerTs, DateFormatKind.ROOM_LIST)
|
||||||
@ -225,4 +235,13 @@ class RoomSummaryItemFactory @Inject constructor(
|
|||||||
else -> stringProvider.getQuantityString(R.plurals.search_space_multiple_parents, size - 1, directParentNames[0], size - 1)
|
else -> stringProvider.getQuantityString(R.plurals.search_space_multiple_parents, size - 1, directParentNames[0], size - 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun RoomSummary.getVectorLatestPreviewableEvent(): TimelineEvent? {
|
||||||
|
val room = sessionHolder.getSafeActiveSession()?.getRoom(roomId) ?: return latestPreviewableEvent
|
||||||
|
val liveVoiceBroadcastTimelineEvent = getOngoingVoiceBroadcastsUseCase.execute(roomId).lastOrNull()
|
||||||
|
?.root?.eventId?.let { room.getTimelineEvent(it) }
|
||||||
|
return liveVoiceBroadcastTimelineEvent
|
||||||
|
?: latestPreviewableEvent
|
||||||
|
?.takeUnless { it.root.asMessageAudioEvent()?.isVoiceBroadcast().orFalse() } // Skip voice messages related to voice broadcast
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,8 @@ package im.vector.app.features.voicebroadcast.usecase
|
|||||||
|
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants
|
import im.vector.app.features.voicebroadcast.VoiceBroadcastConstants
|
||||||
|
import im.vector.app.features.voicebroadcast.isLive
|
||||||
import im.vector.app.features.voicebroadcast.model.VoiceBroadcastEvent
|
import im.vector.app.features.voicebroadcast.model.VoiceBroadcastEvent
|
||||||
import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState
|
|
||||||
import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent
|
import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent
|
||||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
import org.matrix.android.sdk.api.query.QueryStringValue
|
||||||
import org.matrix.android.sdk.api.session.getRoom
|
import org.matrix.android.sdk.api.session.getRoom
|
||||||
@ -44,6 +44,6 @@ class GetOngoingVoiceBroadcastsUseCase @Inject constructor(
|
|||||||
QueryStringValue.IsNotEmpty
|
QueryStringValue.IsNotEmpty
|
||||||
)
|
)
|
||||||
.mapNotNull { it.asVoiceBroadcastEvent() }
|
.mapNotNull { it.asVoiceBroadcastEvent() }
|
||||||
.filter { it.content?.voiceBroadcastState != null && it.content?.voiceBroadcastState != VoiceBroadcastState.STOPPED }
|
.filter { it.isLive }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user