Delegate call notifications to Element Call, upgrade SDK and EC embedded (#5119)
* Stop sending call notifications manually: the Element Call widget can now assume responsibility for sending them when you start a call. * Upgrade SDK version to `v25.8.5`, fix API breaks * Upgrade Element Call embedded to `v0.14.1` * Fix tests and lint issues * Add `RoomListEntriesDynamicFilterKind.NonSpace` to avoid displaying spaces in the room list --------- Co-authored-by: Robin <robin@robin.town>
This commit is contained in:
parent
bfdcc97985
commit
dff295eadf
17 changed files with 64 additions and 174 deletions
|
|
@ -428,12 +428,6 @@ class JoinedRustRoom(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun sendCallNotificationIfNeeded(): Result<Boolean> = withContext(roomDispatcher) {
|
||||
runCatchingExceptions {
|
||||
innerRoom.sendCallNotificationIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun setSendQueueEnabled(enabled: Boolean) {
|
||||
withContext(roomDispatcher) {
|
||||
Timber.d("setSendQueuesEnabled: $enabled")
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import org.matrix.rustcomponents.sdk.RoomList as InnerRoomList
|
|||
|
||||
private val ROOM_LIST_RUST_FILTERS = listOf(
|
||||
RoomListEntriesDynamicFilterKind.NonLeft,
|
||||
RoomListEntriesDynamicFilterKind.NonSpace,
|
||||
RoomListEntriesDynamicFilterKind.DeduplicateVersions
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ import kotlinx.coroutines.flow.MutableSharedFlow
|
|||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import org.matrix.rustcomponents.sdk.TimelineChange
|
||||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
||||
import org.matrix.rustcomponents.sdk.TimelineItem
|
||||
import timber.log.Timber
|
||||
|
|
@ -49,13 +48,13 @@ internal class MatrixTimelineDiffProcessor(
|
|||
}
|
||||
|
||||
private fun MutableList<MatrixTimelineItem>.applyDiff(diff: TimelineDiff) {
|
||||
when (diff.change()) {
|
||||
TimelineChange.APPEND -> {
|
||||
val items = diff.append()?.map { it.asMatrixTimelineItem() } ?: return
|
||||
when (diff) {
|
||||
is TimelineDiff.Append -> {
|
||||
val items = diff.values.map { it.asMatrixTimelineItem() }
|
||||
addAll(items)
|
||||
}
|
||||
TimelineChange.PUSH_BACK -> {
|
||||
val item = diff.pushBack()?.asMatrixTimelineItem() ?: return
|
||||
is TimelineDiff.PushBack -> {
|
||||
val item = diff.value.asMatrixTimelineItem()
|
||||
if (item is MatrixTimelineItem.Event && item.event.content is RoomMembershipContent) {
|
||||
// TODO - This is a temporary solution to notify the room screen about membership changes
|
||||
// Ideally, this should be implemented by the Rust SDK
|
||||
|
|
@ -63,41 +62,37 @@ internal class MatrixTimelineDiffProcessor(
|
|||
}
|
||||
add(item)
|
||||
}
|
||||
TimelineChange.PUSH_FRONT -> {
|
||||
val item = diff.pushFront()?.asMatrixTimelineItem() ?: return
|
||||
is TimelineDiff.PushFront -> {
|
||||
val item = diff.value.asMatrixTimelineItem()
|
||||
add(0, item)
|
||||
}
|
||||
TimelineChange.SET -> {
|
||||
val updateAtData = diff.set() ?: return
|
||||
val item = updateAtData.item.asMatrixTimelineItem()
|
||||
set(updateAtData.index.toInt(), item)
|
||||
is TimelineDiff.Set -> {
|
||||
val item = diff.value.asMatrixTimelineItem()
|
||||
set(diff.index.toInt(), item)
|
||||
}
|
||||
TimelineChange.INSERT -> {
|
||||
val insertAtData = diff.insert() ?: return
|
||||
val item = insertAtData.item.asMatrixTimelineItem()
|
||||
add(insertAtData.index.toInt(), item)
|
||||
is TimelineDiff.Insert -> {
|
||||
val item = diff.value.asMatrixTimelineItem()
|
||||
add(diff.index.toInt(), item)
|
||||
}
|
||||
TimelineChange.REMOVE -> {
|
||||
val removeAtData = diff.remove() ?: return
|
||||
removeAt(removeAtData.toInt())
|
||||
is TimelineDiff.Remove -> {
|
||||
removeAt(diff.index.toInt())
|
||||
}
|
||||
TimelineChange.RESET -> {
|
||||
is TimelineDiff.Reset -> {
|
||||
clear()
|
||||
val items = diff.reset()?.map { it.asMatrixTimelineItem() } ?: return
|
||||
val items = diff.values.map { it.asMatrixTimelineItem() }
|
||||
addAll(items)
|
||||
}
|
||||
TimelineChange.POP_FRONT -> {
|
||||
TimelineDiff.PopFront -> {
|
||||
removeFirstOrNull()
|
||||
}
|
||||
TimelineChange.POP_BACK -> {
|
||||
TimelineDiff.PopBack -> {
|
||||
removeLastOrNull()
|
||||
}
|
||||
TimelineChange.CLEAR -> {
|
||||
TimelineDiff.Clear -> {
|
||||
clear()
|
||||
}
|
||||
TimelineChange.TRUNCATE -> {
|
||||
val index = diff.truncate() ?: return
|
||||
subList(index.toInt(), size).clear()
|
||||
is TimelineDiff.Truncate -> {
|
||||
subList(diff.length.toInt(), size).clear()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
package io.element.android.libraries.matrix.impl.timeline
|
||||
|
||||
import org.matrix.rustcomponents.sdk.TimelineChange
|
||||
import org.matrix.rustcomponents.sdk.TimelineDiff
|
||||
import org.matrix.rustcomponents.sdk.TimelineItem
|
||||
import uniffi.matrix_sdk_ui.EventItemOrigin
|
||||
|
|
@ -17,25 +16,13 @@ import uniffi.matrix_sdk_ui.EventItemOrigin
|
|||
* If there is multiple events in the diff, uses the first one as it should be a good indicator.
|
||||
*/
|
||||
internal fun TimelineDiff.eventOrigin(): EventItemOrigin? {
|
||||
return when (change()) {
|
||||
TimelineChange.APPEND -> {
|
||||
append()?.firstOrNull()?.eventOrigin()
|
||||
}
|
||||
TimelineChange.PUSH_BACK -> {
|
||||
pushBack()?.eventOrigin()
|
||||
}
|
||||
TimelineChange.PUSH_FRONT -> {
|
||||
pushFront()?.eventOrigin()
|
||||
}
|
||||
TimelineChange.SET -> {
|
||||
set()?.item?.eventOrigin()
|
||||
}
|
||||
TimelineChange.INSERT -> {
|
||||
insert()?.item?.eventOrigin()
|
||||
}
|
||||
TimelineChange.RESET -> {
|
||||
reset()?.firstOrNull()?.eventOrigin()
|
||||
}
|
||||
return when (this) {
|
||||
is TimelineDiff.Append -> values.firstOrNull()?.eventOrigin()
|
||||
is TimelineDiff.PushBack -> value.eventOrigin()
|
||||
is TimelineDiff.PushFront -> value.eventOrigin()
|
||||
is TimelineDiff.Set -> value.eventOrigin()
|
||||
is TimelineDiff.Insert -> value.eventOrigin()
|
||||
is TimelineDiff.Reset -> values.firstOrNull()?.eventOrigin()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import kotlinx.coroutines.flow.first
|
|||
import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget
|
||||
import uniffi.matrix_sdk.EncryptionSystem
|
||||
import uniffi.matrix_sdk.HeaderStyle
|
||||
import uniffi.matrix_sdk.NotificationType
|
||||
import uniffi.matrix_sdk.VirtualElementCallWidgetOptions
|
||||
import javax.inject.Inject
|
||||
import uniffi.matrix_sdk.Intent as CallIntent
|
||||
|
|
@ -29,7 +30,7 @@ class DefaultCallWidgetSettingsProvider @Inject constructor(
|
|||
private val callAnalyticsCredentialsProvider: CallAnalyticCredentialsProvider,
|
||||
private val analyticsService: AnalyticsService,
|
||||
) : CallWidgetSettingsProvider {
|
||||
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings {
|
||||
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean, direct: Boolean): MatrixWidgetSettings {
|
||||
val isAnalyticsEnabled = analyticsService.userConsentFlow.first()
|
||||
val options = VirtualElementCallWidgetOptions(
|
||||
elementCallUrl = baseUrl,
|
||||
|
|
@ -53,6 +54,7 @@ class DefaultCallWidgetSettingsProvider @Inject constructor(
|
|||
hideHeader = true,
|
||||
controlledMediaDevices = true,
|
||||
header = HeaderStyle.APP_BAR,
|
||||
sendNotificationType = if (direct) NotificationType.RING else NotificationType.NOTIFICATION,
|
||||
)
|
||||
val rustWidgetSettings = newVirtualElementCallWidget(options)
|
||||
return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue