Skip to content

Commit d9e7d74

Browse files
authored
Upgrade Rust SDK bindings to v25.09.15 (#5353)
* Upgrade Rust SDK bindings to `v25.09.15`: This contains important changes to the APIs used to build the EC widget. * Use the new `intent` parameter correctly, by calculating locally its behaviour based on whether the room is a DM and there is an ongoing call or not. Using just the `intent` parameter is our end goal, but sadly this is not fully supported by the current EC embedded `v0.15.0`, so we need to add a workaround using the `skipLobby` and `preload` parameters.
1 parent b8db02e commit d9e7d74

File tree

9 files changed

+43
-27
lines changed

9 files changed

+43
-27
lines changed

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,14 @@ class DefaultCallWidgetProvider(
4545
val customBaseUrl = appPreferencesStore.getCustomElementCallBaseUrlFlow().firstOrNull()
4646
val baseUrl = customBaseUrl ?: EMBEDDED_CALL_WIDGET_BASE_URL
4747

48-
val isEncrypted = room.info().isEncrypted ?: room.getUpdatedIsEncrypted().getOrThrow()
49-
val widgetSettings = callWidgetSettingsProvider.provide(baseUrl, encrypted = isEncrypted, direct = room.isDm())
48+
val roomInfo = room.info()
49+
val isEncrypted = roomInfo.isEncrypted ?: room.getUpdatedIsEncrypted().getOrThrow()
50+
val widgetSettings = callWidgetSettingsProvider.provide(
51+
baseUrl = baseUrl,
52+
encrypted = isEncrypted,
53+
direct = room.isDm(),
54+
hasActiveCall = roomInfo.hasRoomCall,
55+
)
5056
val callUrl = room.generateWidgetWebViewUrl(
5157
widgetSettings = widgetSettings,
5258
clientId = clientId,

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ class MessagesPresenterTest {
160160
@Test
161161
fun `present - handle toggling a reaction`() = runTest {
162162
val coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true)
163-
val toggleReactionSuccess = lambdaRecorder { _: String, _: EventOrTransactionId -> Result.success(Unit) }
163+
val toggleReactionSuccess = lambdaRecorder { _: String, _: EventOrTransactionId -> Result.success(true) }
164164
val toggleReactionFailure =
165-
lambdaRecorder { _: String, _: EventOrTransactionId -> Result.failure<Unit>(IllegalStateException("Failed to send reaction")) }
165+
lambdaRecorder { _: String, _: EventOrTransactionId -> Result.failure<Boolean>(IllegalStateException("Failed to send reaction")) }
166166

167167
val timeline = FakeTimeline().apply {
168168
this.toggleReactionLambda = toggleReactionSuccess
@@ -200,7 +200,11 @@ class MessagesPresenterTest {
200200
@Test
201201
fun `present - handle toggling a reaction twice`() = runTest {
202202
val coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true)
203-
val toggleReactionSuccess = lambdaRecorder { _: String, _: EventOrTransactionId -> Result.success(Unit) }
203+
var toggle = false
204+
val toggleReactionSuccess = lambdaRecorder { _: String, _: EventOrTransactionId ->
205+
toggle = !toggle
206+
Result.success(toggle)
207+
}
204208

205209
val timeline = FakeTimeline().apply {
206210
this.toggleReactionLambda = toggleReactionSuccess

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ jsoup = "org.jsoup:jsoup:1.21.2"
176176
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
177177
molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0"
178178
timber = "com.jakewharton.timber:timber:5.0.1"
179-
matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.9.10"
179+
matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.9.15"
180180
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
181181
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
182182
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ interface Timeline : AutoCloseable {
151151

152152
suspend fun redactEvent(eventOrTransactionId: EventOrTransactionId, reason: String?): Result<Unit>
153153

154-
suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Unit>
154+
suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Boolean>
155155

156156
suspend fun forwardEvent(eventId: EventId, roomIds: List<RoomId>): Result<Unit>
157157

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/widget/CallWidgetSettingsProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ interface CallWidgetSettingsProvider {
1515
widgetId: String = UUID.randomUUID().toString(),
1616
encrypted: Boolean,
1717
direct: Boolean,
18+
hasActiveCall: Boolean,
1819
): MatrixWidgetSettings
1920
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ class RustTimeline(
431431
}
432432
}
433433

434-
override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Unit> = withContext(dispatcher) {
434+
override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Boolean> = withContext(dispatcher) {
435435
runCatchingExceptions {
436436
inner.toggleReaction(
437437
key = emoji,

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
1818
import io.element.android.services.analytics.api.AnalyticsService
1919
import kotlinx.coroutines.flow.first
2020
import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget
21+
import timber.log.Timber
2122
import uniffi.matrix_sdk.EncryptionSystem
22-
import uniffi.matrix_sdk.HeaderStyle
23-
import uniffi.matrix_sdk.NotificationType
2423
import uniffi.matrix_sdk.VirtualElementCallWidgetConfig
2524
import uniffi.matrix_sdk.VirtualElementCallWidgetProperties
2625
import uniffi.matrix_sdk.Intent as CallIntent
@@ -32,7 +31,7 @@ class DefaultCallWidgetSettingsProvider(
3231
private val callAnalyticsCredentialsProvider: CallAnalyticCredentialsProvider,
3332
private val analyticsService: AnalyticsService,
3433
) : CallWidgetSettingsProvider {
35-
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean, direct: Boolean): MatrixWidgetSettings {
34+
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean, direct: Boolean, hasActiveCall: Boolean): MatrixWidgetSettings {
3635
val isAnalyticsEnabled = analyticsService.userConsentFlow.first()
3736
val properties = VirtualElementCallWidgetProperties(
3837
elementCallUrl = baseUrl,
@@ -49,18 +48,18 @@ class DefaultCallWidgetSettingsProvider(
4948
parentUrl = null,
5049
)
5150
val config = VirtualElementCallWidgetConfig(
52-
preload = null,
53-
appPrompt = false,
54-
confineToRoom = true,
55-
// TODO We probably want to provide different values for this field.
56-
intent = CallIntent.START_CALL,
57-
hideScreensharing = false,
58-
// For backwards compatibility, it'll be ignored in recent versions of Element Call
59-
hideHeader = true,
60-
controlledAudioDevices = true,
61-
header = HeaderStyle.APP_BAR,
62-
sendNotificationType = if (direct) NotificationType.RING else NotificationType.NOTIFICATION,
51+
// TODO remove this once we have the next EC version
52+
preload = false,
53+
// TODO remove this once we have the next EC version
6354
skipLobby = null,
55+
intent = when {
56+
direct && hasActiveCall -> CallIntent.JOIN_EXISTING_DM
57+
hasActiveCall -> CallIntent.JOIN_EXISTING
58+
direct -> CallIntent.START_CALL_DM
59+
else -> CallIntent.START_CALL
60+
}.also {
61+
Timber.d("Starting/joining call with intent: $it")
62+
}
6463
)
6564
val rustWidgetSettings = newVirtualElementCallWidget(
6665
props = properties,

libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ class FakeTimeline(
304304
)
305305
}
306306

307-
var toggleReactionLambda: (emoji: String, eventOrTransactionId: EventOrTransactionId) -> Result<Unit> = { _, _ -> lambdaError() }
307+
var toggleReactionLambda: (emoji: String, eventOrTransactionId: EventOrTransactionId) -> Result<Boolean> = { _, _ -> lambdaError() }
308308

309-
override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Unit> = simulateLongTask {
309+
override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result<Boolean> = simulateLongTask {
310310
toggleReactionLambda(
311311
emoji,
312312
eventOrTransactionId,

libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/widget/FakeCallWidgetSettingsProvider.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@ import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider
1111
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
1212

1313
class FakeCallWidgetSettingsProvider(
14-
private val provideFn: (String, String, Boolean, Boolean) -> MatrixWidgetSettings = { _, _, _, _ -> MatrixWidgetSettings("id", true, "url") }
14+
private val provideFn: (String, String, Boolean, Boolean, Boolean) -> MatrixWidgetSettings = { _, _, _, _, _ -> MatrixWidgetSettings("id", true, "url") }
1515
) : CallWidgetSettingsProvider {
1616
val providedBaseUrls = mutableListOf<String>()
1717

18-
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean, direct: Boolean): MatrixWidgetSettings {
18+
override suspend fun provide(
19+
baseUrl: String,
20+
widgetId: String,
21+
encrypted: Boolean,
22+
direct: Boolean,
23+
hasActiveCall: Boolean
24+
): MatrixWidgetSettings {
1925
providedBaseUrls += baseUrl
20-
return provideFn(baseUrl, widgetId, encrypted, direct)
26+
return provideFn(baseUrl, widgetId, encrypted, direct, hasActiveCall)
2127
}
2228
}

0 commit comments

Comments
 (0)