Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Voice Broadcast - Listening #7387

Merged
merged 11 commits into from
Oct 18, 2022
Prev Previous commit
Next Next commit
Voice Broadcast - Get voice messages events related to a given VB
  • Loading branch information
Florian Renaud committed Oct 18, 2022
commit 16c27ba174bf3eea3a426a4d316f12847ab86e87
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,9 @@ interface TimelineService {
* Returns a snapshot list of TimelineEvent with EventType.MESSAGE and MessageType.MSGTYPE_IMAGE or MessageType.MSGTYPE_VIDEO.
*/
fun getAttachmentMessages(): List<TimelineEvent>

/**
* Returns a snapshot list of TimelineEvent with a content relation of the given type to the given eventId.
*/
fun getTimelineEventsRelatedTo(relationType: String, eventId: String): List<TimelineEvent>
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,8 @@ internal class DefaultTimelineService @AssistedInject constructor(
override fun getAttachmentMessages(): List<TimelineEvent> {
return timelineEventDataSource.getAttachmentMessages(roomId)
}

override fun getTimelineEventsRelatedTo(relationType: String, eventId: String): List<TimelineEvent> {
return timelineEventDataSource.getTimelineEventsRelatedTo(roomId, relationType, eventId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.session.room.timeline
import androidx.lifecycle.LiveData
import com.zhuinden.monarchy.Monarchy
import io.realm.Sort
import org.matrix.android.sdk.api.session.events.model.getRelationContent
import org.matrix.android.sdk.api.session.events.model.isImageMessage
import org.matrix.android.sdk.api.session.events.model.isVideoMessage
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
Expand Down Expand Up @@ -63,4 +64,18 @@ internal class TimelineEventDataSource @Inject constructor(
.orEmpty()
}
}

fun getTimelineEventsRelatedTo(roomId: String, eventType: String, eventId: String): List<TimelineEvent> {
// TODO Remove this trick and call relations API
// see https://spec.matrix.org/latest/client-server-api/#get_matrixclientv1roomsroomidrelationseventidreltypeeventtype
return realmSessionProvider.withRealm { realm ->
TimelineEventEntity.whereRoomId(realm, roomId)
.sort(TimelineEventEntityFields.ROOT.ORIGIN_SERVER_TS, Sort.ASCENDING)
.distinct(TimelineEventEntityFields.EVENT_ID)
.findAll()
.mapNotNull {
timelineEventMapper.map(it).takeIf { it.root.getRelationContent()?.takeIf { it.type == eventType && it.eventId == eventId } != null }
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.RelationType
import org.matrix.android.sdk.api.session.events.model.getRelationContent
import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.Room
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioEvent
import org.matrix.android.sdk.api.session.room.model.message.asMessageAudioEvent
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
Expand Down Expand Up @@ -80,9 +82,10 @@ class VoiceBroadcastPlayer @Inject constructor(
currentPlayingIndex = -1
}

@Suppress("UNUSED_PARAMETER")
private fun updatePlaylist(room: Room, eventId: String) {
// TODO get the list of voice messages
val timelineEvents = room.timelineService().getTimelineEventsRelatedTo(RelationType.REFERENCE, eventId)
val audioEvents = timelineEvents.mapNotNull { it.root.asMessageAudioEvent() }
playlist = audioEvents.sortedBy { it.root.originServerTs }
}

private fun startPlayback() {
Expand Down