diff --git a/.github/renovate.json5 b/.github/renovate.json5
index 17e1fa0f1c..c16310cf43 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -34,6 +34,13 @@
"/^org.jetbrains.kotlinx:kotlinx-datetime/",
],
},
+ {
+ // Keep Guava on the Android variant and ignore jre-only upgrades.
+ "matchPackageNames": [
+ "com.google.guava:guava",
+ ],
+ "allowedVersions": "/-android$/",
+ },
{
// Limit PostHog Android upgrade to one PR per month, the first day of the month
"matchPackageNames": [
diff --git a/.github/workflows/generate_github_pages.yml b/.github/workflows/generate_github_pages.yml
index 55a300dd88..8de21b3ef1 100644
--- a/.github/workflows/generate_github_pages.yml
+++ b/.github/workflows/generate_github_pages.yml
@@ -36,7 +36,7 @@ jobs:
mkdir -p screenshots/en
cp tests/uitests/src/test/snapshots/images/* screenshots/en
- name: Deploy GitHub Pages
- uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
+ uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4.1.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./screenshots
diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
index 9b4a5e3689..f0c8fd1e6f 100644
--- a/.github/workflows/pull_request.yml
+++ b/.github/workflows/pull_request.yml
@@ -32,7 +32,7 @@ jobs:
steps:
- name: Check membership
if: github.event.pull_request.user.login != 'renovate[bot]'
- uses: tspascoal/get-user-teams-membership@b1480b119326dde04ceffbeccd98e41892539c74 # v4.0.0
+ uses: tspascoal/get-user-teams-membership@818140d631d5f29f26b151afbe4179f87d9ceb5e # v4.0.1
id: teams
with:
username: ${{ github.event.pull_request.user.login }}
diff --git a/.maestro/tests/roomList/createAndDeleteDM.yaml b/.maestro/tests/roomList/createAndDeleteDM.yaml
index a6279151ea..eed576c04f 100644
--- a/.maestro/tests/roomList/createAndDeleteDM.yaml
+++ b/.maestro/tests/roomList/createAndDeleteDM.yaml
@@ -7,7 +7,7 @@ appId: ${MAESTRO_APP_ID}
- tapOn:
text: ${MAESTRO_INVITEE1_MXID}
index: 1
-- tapOn: "Send invite"
+- tapOn: "Continue"
- takeScreenshot: build/maestro/330-createAndDeleteDM
- tapOn: "maestroelement2"
- scroll
diff --git a/.maestro/tests/roomList/createAndDeleteRoom.yaml b/.maestro/tests/roomList/createAndDeleteRoom.yaml
index b53066ccd5..adf9d7cf29 100644
--- a/.maestro/tests/roomList/createAndDeleteRoom.yaml
+++ b/.maestro/tests/roomList/createAndDeleteRoom.yaml
@@ -24,8 +24,16 @@ appId: ${MAESTRO_APP_ID}
text: ${MAESTRO_INVITEE2_MXID}
index: 1
- tapOn: "Invite"
+- runFlow:
+ when:
+ visible: 'Invite new contact to this room?'
+ commands:
+ - tapOn:
+ id: "confirm_invite_unknown"
+# Close the keyboard if it's still open
+- tapOn: "Back"
+# Go back to the room details screen
- tapOn: "Back"
-- tapOn: "aRoomName"
- scrollUntilVisible:
direction: DOWN
element:
diff --git a/CHANGES.md b/CHANGES.md
index a57395b833..9775c2fea5 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,86 @@
+Changes in Element X v26.05.2
+=============================
+
+
+
+## What's Changed
+### ✨ Features
+* Remove SignInWithClassic FeatureFlag to enable the feature. by @bmarty in https://github.com/element-hq/element-x-android/pull/6698
+* Create a new room when inviting people in a DM by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6756
+* Remove LiveLocationSharing feature flag by @ganfra in https://github.com/element-hq/element-x-android/pull/6811
+### 🙌 Improvements
+* Disable biometric unlock when we disable pin code unlock by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6781
+### 🐛 Bugfixes
+* Fix room list duplicate-detection telemetry crashing before it can report by @jennaharris7 in https://github.com/element-hq/element-x-android/pull/6791
+* Only load full media on media viewer when it's the visible item by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6794
+* Attempt to fix room list item duplicates at midnight by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6793
+### 🗣 Translations
+* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/6798
+### 🧱 Build
+* Fix Maestro again after changes to the invite flow by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6796
+* Renovate: Keep Guava on the Android variant and ignore jre-only upgrades by @bmarty in https://github.com/element-hq/element-x-android/pull/6776
+### Dependency upgrades
+* Update dependency androidx.compose:compose-bom to v2026.05.00 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6784
+* Update dependency io.sentry:sentry-android to v8.41.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6787
+* Update kotlin by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6790
+* Update camera to v1.6.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6783
+* Update dependency androidx.webkit:webkit to v1.16.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6786
+* Update dependency com.google.firebase:firebase-bom to v34.13.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6789
+* Update dependency org.matrix.rustcomponents:sdk-android to v26.05.18 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6805
+### Others
+* Add MIDI playback by @cizra in https://github.com/element-hq/element-x-android/pull/6770
+* Show error message when using "Sign in with QR code" with a QR from a device that is also not signed in by @hughns in https://github.com/element-hq/element-x-android/pull/6802
+
+## New Contributors
+* @jennaharris7 made their first contribution in https://github.com/element-hq/element-x-android/pull/6791
+* @cizra made their first contribution in https://github.com/element-hq/element-x-android/pull/6770
+
+**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v26.05.1...v26.05.2
+
+Changes in Element X v26.05.1
+=============================
+
+
+
+## What's Changed
+### ✨ Features
+* Make Element Call screen work edge-to-edge by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6634
+### 🙌 Improvements
+* Stop removing the `logs` dir when clearing cache by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6765
+* Adapt to new DM definition changes in the SDK by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6748
+* feat: Update call started timeline item + declined support by @BillCarsonFr in https://github.com/element-hq/element-x-android/pull/6649
+### 🐛 Bugfixes
+* Improve pin code UX by @bmarty in https://github.com/element-hq/element-x-android/pull/6744
+* Use just the other user's avatar for DM details by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6738
+* Improve `FetchPushForegroundService`'s reliability by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6757
+* Prevent user from starting Live Location Sharing in thread by @bmarty in https://github.com/element-hq/element-x-android/pull/6767
+* Fix media playback from the timeline broken when exiting a thread by @bmarty in https://github.com/element-hq/element-x-android/pull/6771
+* Pin code: remove the key if there is no pin code by @bmarty in https://github.com/element-hq/element-x-android/pull/6780
+### 🗣 Translations
+* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/6761
+### 🚧 In development 🚧
+* Feature : share live location by @ganfra in https://github.com/element-hq/element-x-android/pull/6741
+### Dependency upgrades
+* Update dependency org.matrix.rustcomponents:sdk-android to v26.05.7 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6746
+* Update actions/add-to-project action to v2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6758
+* Update dependency io.github.sergio-sastre.ComposablePreviewScanner:android to v0.9.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6759
+* Update dependency io.element.android:element-call-embedded to v0.19.3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6766
+* Update metro to v1 (major) by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6720
+* Update tspascoal/get-user-teams-membership action to v4.0.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6750
+* Update plugin sonarqube to v7.3.0.8198 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6743
+* Update plugin dependencycheck to v12.2.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6760
+* Update dependency com.google.guava:guava to v33.6.0-android by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6646
+* Update dependency org.matrix.rustcomponents:sdk-android to v26.05.13 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6779
+### Others
+* Render media captions formatting in the media viewer by @bxdxnn in https://github.com/element-hq/element-x-android/pull/6729
+* Reduce FeatureFlag `Knock` effect on room creation and room edition forms by @bmarty in https://github.com/element-hq/element-x-android/pull/6768
+* Use the right analytics span as a parent in `checkNetworkConnection` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6751
+* Add missing strings `theme.black` by @bmarty in https://github.com/element-hq/element-x-android/pull/6772
+* Map back button in web view to esc (revive fixed version of: https://github.com/element-hq/element-x-android/pull/6724) by @toger5 in https://github.com/element-hq/element-x-android/pull/6725
+
+
+**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v26.05.0...v26.05.1
+
Changes in Element X v26.05.0
=============================
diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
index f2120038a6..14230d7c5a 100644
--- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
+++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
@@ -382,9 +382,13 @@ class LoggedInFlowNode(
}
is NavTarget.Room -> {
val joinedRoomCallback = object : JoinedRoomLoadedFlowNode.Callback {
- override fun navigateToRoom(roomId: RoomId, serverNames: List) {
+ override fun onDone() {
+ backstack.pop()
+ }
+
+ override fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean) {
lifecycleScope.launch {
- attachRoom(roomIdOrAlias = roomId.toRoomIdOrAlias(), serverNames = serverNames, clearBackstack = false)
+ attachRoom(roomIdOrAlias = roomId.toRoomIdOrAlias(), serverNames = serverNames, clearBackstack = clearBackStack)
}
}
diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt
index febd15e9c2..dbe53b75ac 100644
--- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt
+++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt
@@ -82,7 +82,8 @@ class JoinedRoomLoadedFlowNode(
plugins = plugins,
), DependencyInjectionGraphOwner {
interface Callback : Plugin {
- fun navigateToRoom(roomId: RoomId, serverNames: List)
+ fun onDone()
+ fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean = false)
fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
fun navigateToGlobalNotificationSettings()
fun navigateToDeveloperSettings()
@@ -142,6 +143,10 @@ class JoinedRoomLoadedFlowNode(
private fun createRoomDetailsNode(buildContext: BuildContext, initialTarget: RoomDetailsEntryPoint.InitialTarget): Node {
val callback = object : RoomDetailsEntryPoint.Callback {
+ override fun onDone() {
+ callback.onDone()
+ }
+
override fun navigateToGlobalNotificationSettings() {
callback.navigateToGlobalNotificationSettings()
}
@@ -150,7 +155,7 @@ class JoinedRoomLoadedFlowNode(
callback.navigateToDeveloperSettings()
}
- override fun navigateToRoom(roomId: RoomId, serverNames: List) {
+ override fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean) {
callback.navigateToRoom(roomId, serverNames)
}
diff --git a/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt b/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt
index 2f17071870..ec36f3d32d 100644
--- a/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt
+++ b/appnav/src/test/kotlin/io/element/android/appnav/room/joined/FakeJoinedRoomLoadedFlowNodeCallback.kt
@@ -13,7 +13,8 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkData
import io.element.android.tests.testutils.lambda.lambdaError
class FakeJoinedRoomLoadedFlowNodeCallback : JoinedRoomLoadedFlowNode.Callback {
- override fun navigateToRoom(roomId: RoomId, serverNames: List) = lambdaError()
+ override fun onDone() = lambdaError()
+ override fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean) = lambdaError()
override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError()
override fun navigateToGlobalNotificationSettings() = lambdaError()
override fun navigateToDeveloperSettings() = lambdaError()
diff --git a/enterprise b/enterprise
index fb7e9287d9..6781da90aa 160000
--- a/enterprise
+++ b/enterprise
@@ -1 +1 @@
-Subproject commit fb7e9287d9d446012925139842d9aaa8e99a74dc
+Subproject commit 6781da90aae61cf77dcdbc543e18d76411d578b4
diff --git a/fastlane/metadata/android/en-US/changelogs/202605010.txt b/fastlane/metadata/android/en-US/changelogs/202605010.txt
new file mode 100644
index 0000000000..0ad08f5b4d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/202605010.txt
@@ -0,0 +1,2 @@
+Main changes in this version: improvements in Element Call, room knocking and room directory are now available, improvements on DMs.
+Full changelog: https://github.com/element-hq/element-x-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/202605020.txt b/fastlane/metadata/android/en-US/changelogs/202605020.txt
new file mode 100644
index 0000000000..a4b397f1bb
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/202605020.txt
@@ -0,0 +1,2 @@
+Main changes in this version: bug fixes and improvements.
+Full changelog: https://github.com/element-hq/element-x-android/releases
\ No newline at end of file
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenBackPressPolicy.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenBackPressPolicy.kt
new file mode 100644
index 0000000000..cd47cd8bb1
--- /dev/null
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenBackPressPolicy.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.call.impl.ui
+internal sealed interface CallScreenBackPressAction {
+ data object DispatchEscapeToWebView : CallScreenBackPressAction
+ data object EnterPictureInPicture : CallScreenBackPressAction
+}
+
+internal object CallScreenBackPressPolicy {
+ fun resolve(
+ supportPip: Boolean,
+ hasWebView: Boolean,
+ fromNative: Boolean,
+ ): CallScreenBackPressAction? {
+ return when {
+ hasWebView && fromNative -> CallScreenBackPressAction.DispatchEscapeToWebView
+ hasWebView && supportPip -> CallScreenBackPressAction.EnterPictureInPicture
+ else -> null
+ }
+ }
+}
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt
index 1c68a62f55..2537eb739c 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenView.kt
@@ -17,9 +17,10 @@ import android.webkit.WebChromeClient
import android.webkit.WebView
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.systemBars
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -45,7 +46,6 @@ import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
import timber.log.Timber
@@ -64,94 +64,93 @@ internal fun CallScreenView(
requestPermissions: (Array, RequestPermissionCallback) -> Unit,
modifier: Modifier = Modifier,
) {
- fun handleBack() {
- if (pipState.supportPip) {
- pipState.eventSink.invoke(PictureInPictureEvent.EnterPictureInPicture)
- } else {
- state.eventSink(CallScreenEvent.Hangup)
+ var callWebView by remember { mutableStateOf(null) }
+
+ fun handleBack(fromNative: Boolean = false) {
+ when (CallScreenBackPressPolicy.resolve(supportPip = pipState.supportPip, hasWebView = callWebView != null, fromNative)) {
+ CallScreenBackPressAction.EnterPictureInPicture ->
+ pipState.eventSink(PictureInPictureEvent.EnterPictureInPicture)
+ CallScreenBackPressAction.DispatchEscapeToWebView ->
+ callWebView?.dispatchEscKeyEvent()
+ null -> Timber.d("Back press with unsupported pip is a no-op")
}
}
- Scaffold(
- modifier = modifier,
- ) { padding ->
- BackHandler {
- handleBack()
+ BackHandler {
+ handleBack(fromNative = true)
+ }
+ if (state.webViewError != null) {
+ ErrorDialog(
+ content = buildString {
+ append(stringResource(CommonStrings.error_unknown))
+ state.webViewError.takeIf { it.isNotEmpty() }?.let { append("\n\n").append(it) }
+ },
+ onSubmit = { state.eventSink(CallScreenEvent.Hangup) },
+ )
+ } else {
+ var webViewAudioManager by remember { mutableStateOf(null) }
+ val coroutineScope = rememberCoroutineScope()
+
+ var invalidAudioDeviceReason by remember { mutableStateOf(null) }
+ invalidAudioDeviceReason?.let {
+ InvalidAudioDeviceDialog(invalidAudioDeviceReason = it) {
+ invalidAudioDeviceReason = null
+ }
}
- if (state.webViewError != null) {
- ErrorDialog(
- content = buildString {
- append(stringResource(CommonStrings.error_unknown))
- state.webViewError.takeIf { it.isNotEmpty() }?.let { append("\n\n").append(it) }
- },
- onSubmit = { state.eventSink(CallScreenEvent.Hangup) },
- )
- } else {
- var webViewAudioManager by remember { mutableStateOf(null) }
- val coroutineScope = rememberCoroutineScope()
- var invalidAudioDeviceReason by remember { mutableStateOf(null) }
- invalidAudioDeviceReason?.let {
- InvalidAudioDeviceDialog(invalidAudioDeviceReason = it) {
- invalidAudioDeviceReason = null
- }
+ CallWebView(
+ modifier = modifier.consumeWindowInsets(WindowInsets.systemBars).fillMaxSize(),
+ url = state.urlState,
+ userAgent = state.userAgent,
+ onPermissionsRequest = { request ->
+ val androidPermissions = mapWebkitPermissions(request.resources)
+ val callback: RequestPermissionCallback = { request.grant(it) }
+ requestPermissions(androidPermissions.toTypedArray(), callback)
+ },
+ onConsoleMessage = onConsoleMessage,
+ onCreateWebView = { webView ->
+ callWebView = webView
+ webView.addBackHandler(onBackPressed = ::handleBack)
+ val interceptor = WebViewWidgetMessageInterceptor(
+ webView = webView,
+ onUrlLoaded = { url ->
+ webView.evaluateJavascript("controls.onBackButtonPressed = () => { backHandler.onBackPressed() }", null)
+ if (webViewAudioManager?.isInCallMode?.get() == false) {
+ Timber.d("URL $url is loaded, starting in-call audio mode")
+ webViewAudioManager?.onCallStarted()
+ } else {
+ Timber.d("Can't start in-call audio mode since the app is already in it.")
+ }
+ },
+ onError = { state.eventSink(CallScreenEvent.OnWebViewError(it)) },
+ )
+ webViewAudioManager = WebViewAudioManager(
+ webView = webView,
+ coroutineScope = coroutineScope,
+ onInvalidAudioDeviceAdded = { invalidAudioDeviceReason = it },
+ )
+ state.eventSink(CallScreenEvent.SetupMessageChannels(interceptor))
+ val pipController = WebViewPipController(webView)
+ pipState.eventSink(PictureInPictureEvent.SetPipController(pipController))
+ },
+ onDestroyWebView = {
+ callWebView = null
+ // Reset audio mode
+ webViewAudioManager?.onCallStopped()
}
-
- CallWebView(
- modifier = Modifier
- .padding(padding)
- .consumeWindowInsets(padding)
- .fillMaxSize(),
- url = state.urlState,
- userAgent = state.userAgent,
- onPermissionsRequest = { request ->
- val androidPermissions = mapWebkitPermissions(request.resources)
- val callback: RequestPermissionCallback = { request.grant(it) }
- requestPermissions(androidPermissions.toTypedArray(), callback)
- },
- onConsoleMessage = onConsoleMessage,
- onCreateWebView = { webView ->
- webView.addBackHandler(onBackPressed = ::handleBack)
- val interceptor = WebViewWidgetMessageInterceptor(
- webView = webView,
- onUrlLoaded = { url ->
- webView.evaluateJavascript("controls.onBackButtonPressed = () => { backHandler.onBackPressed() }", null)
- if (webViewAudioManager?.isInCallMode?.get() == false) {
- Timber.d("URL $url is loaded, starting in-call audio mode")
- webViewAudioManager?.onCallStarted()
- } else {
- Timber.d("Can't start in-call audio mode since the app is already in it.")
- }
- },
- onError = { state.eventSink(CallScreenEvent.OnWebViewError(it)) },
- )
- webViewAudioManager = WebViewAudioManager(
- webView = webView,
- coroutineScope = coroutineScope,
- onInvalidAudioDeviceAdded = { invalidAudioDeviceReason = it },
- )
- state.eventSink(CallScreenEvent.SetupMessageChannels(interceptor))
- val pipController = WebViewPipController(webView)
- pipState.eventSink(PictureInPictureEvent.SetPipController(pipController))
- },
- onDestroyWebView = {
- // Reset audio mode
- webViewAudioManager?.onCallStopped()
- }
- )
- when (state.urlState) {
- AsyncData.Uninitialized,
- is AsyncData.Loading ->
- ProgressDialog(text = stringResource(id = CommonStrings.common_please_wait))
- is AsyncData.Failure -> {
- Timber.e(state.urlState.error, "WebView failed to load URL: ${state.urlState.error.message}")
- ErrorDialog(
- content = state.urlState.error.message.orEmpty(),
- onSubmit = { state.eventSink(CallScreenEvent.Hangup) },
- )
- }
- is AsyncData.Success -> Unit
+ )
+ when (state.urlState) {
+ AsyncData.Uninitialized,
+ is AsyncData.Loading ->
+ ProgressDialog(text = stringResource(id = CommonStrings.common_please_wait))
+ is AsyncData.Failure -> {
+ Timber.e(state.urlState.error, "WebView failed to load URL: ${state.urlState.error.message}")
+ ErrorDialog(
+ content = state.urlState.error.message.orEmpty(),
+ onSubmit = { state.eventSink(CallScreenEvent.Hangup) },
+ )
}
+ is AsyncData.Success -> Unit
}
}
}
@@ -248,15 +247,16 @@ private fun WebView.setup(
private fun WebView.addBackHandler(onBackPressed: () -> Unit) {
addJavascriptInterface(
- object {
- @Suppress("unused")
- @JavascriptInterface
- fun onBackPressed() = onBackPressed()
- },
+ JavascriptBackHandlerBridge(callback = onBackPressed),
"backHandler"
)
}
+private fun WebView.dispatchEscKeyEvent() {
+ dispatchKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_DOWN, android.view.KeyEvent.KEYCODE_ESCAPE))
+ dispatchKeyEvent(android.view.KeyEvent(android.view.KeyEvent.ACTION_UP, android.view.KeyEvent.KEYCODE_ESCAPE))
+}
+
@PreviewsDayNight
@Composable
internal fun CallScreenViewPreview(
@@ -275,3 +275,12 @@ internal fun CallScreenViewPreview(
internal fun InvalidAudioDeviceDialogPreview() = ElementPreview {
InvalidAudioDeviceDialog(invalidAudioDeviceReason = InvalidAudioDeviceReason.BT_AUDIO_DEVICE_DISABLED) {}
}
+
+internal class JavascriptBackHandlerBridge(
+ private val callback: () -> Unit,
+) {
+ @JavascriptInterface
+ fun onBackPressed() {
+ callback()
+ }
+}
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt
index 367328ed10..26df7c160c 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/ElementCallActivity.kt
@@ -32,6 +32,9 @@ import androidx.compose.runtime.rememberUpdatedState
import androidx.core.app.PictureInPictureModeChangedInfo
import androidx.core.content.IntentCompat
import androidx.core.util.Consumer
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.Lifecycle
import dev.zacsweers.metro.Inject
import io.element.android.compound.colors.SemanticColorsLightDark
@@ -52,6 +55,7 @@ import io.element.android.libraries.audio.api.AudioFocusRequester
import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.designsystem.theme.ElementThemeApp
+import io.element.android.libraries.designsystem.utils.hasCompactHeightWindowSize
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import timber.log.Timber
@@ -111,6 +115,27 @@ class ElementCallActivity :
val colors by remember(webViewTarget.value?.sessionId) {
enterpriseService.semanticColorsFlow(sessionId = webViewTarget.value?.sessionId)
}.collectAsState(SemanticColorsLightDark.default)
+
+ // When the height is compact, hide the system bars by default to maximize the space for the call, using immersive mode
+ val hasCompactHeight = hasCompactHeightWindowSize()
+ DisposableEffect(hasCompactHeight, pipState.isInPictureInPicture) {
+ if (hasCompactHeight && !pipState.isInPictureInPicture) {
+ val window = this@ElementCallActivity.window ?: return@DisposableEffect onDispose {}
+ val insetsController = WindowCompat.getInsetsController(window, window.decorView)
+ val systemBarInsets = WindowInsetsCompat.Type.systemBars()
+ insetsController.hide(systemBarInsets)
+
+ insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+
+ onDispose {
+ insetsController.show(systemBarInsets)
+ insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_DEFAULT
+ }
+ } else {
+ onDispose {}
+ }
+ }
+
ElementThemeApp(
appPreferencesStore = appPreferencesStore,
featureFlagService = featureFlagService,
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewAudioManager.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewAudioManager.kt
index 2d674d21af..febd919149 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewAudioManager.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/WebViewAudioManager.kt
@@ -201,12 +201,9 @@ class WebViewAudioManager(
return
}
- coroutineScope.launch {
- proximitySensorMutex.withLock {
- if (proximitySensorWakeLock?.isHeld == true) {
- proximitySensorWakeLock?.release()
- }
- }
+ // Since this should run when the call is no longer running, it should be OK to not use the mutex here
+ if (proximitySensorWakeLock?.isHeld == true) {
+ proximitySensorWakeLock?.release()
}
audioManager.mode = AudioManager.MODE_NORMAL
diff --git a/features/call/impl/src/main/res/values-et/translations.xml b/features/call/impl/src/main/res/values-et/translations.xml
index 16b72b8b97..fa0415a5f5 100644
--- a/features/call/impl/src/main/res/values-et/translations.xml
+++ b/features/call/impl/src/main/res/values-et/translations.xml
@@ -4,5 +4,5 @@
"Kõne juurde naasmiseks klõpsa"
"☎️ Kõne on pooleli"
"Element Call ei võimalda selles Androidi versioonis Bluetoothi heliseadmete kasutamist. Palun vali mõni muu heliseade."
- "Sissetulev Element Calli kõne"
+ "Saabuv Element Calli kõne"
diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenBackPressPolicyTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenBackPressPolicyTest.kt
new file mode 100644
index 0000000000..f07f7039d3
--- /dev/null
+++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenBackPressPolicyTest.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.call.ui
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.call.impl.ui.CallScreenBackPressAction
+import io.element.android.features.call.impl.ui.CallScreenBackPressPolicy
+import org.junit.Test
+
+class CallScreenBackPressPolicyTest {
+ @Test
+ fun `resolve returns dispatch escape when a web view is available and native button is pressed`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = false,
+ hasWebView = true,
+ fromNative = true,
+ )
+
+ assertThat(result).isEqualTo(CallScreenBackPressAction.DispatchEscapeToWebView)
+ }
+
+ @Test
+ fun `resolve dispatch escape when there is a web view and pip is supported on native button press`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = true,
+ hasWebView = true,
+ fromNative = true,
+ )
+
+ assertThat(result).isEqualTo(CallScreenBackPressAction.DispatchEscapeToWebView)
+ }
+
+ @Test
+ fun `resolve returns hangup when there is no web view and pip is not supported from native button`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = false,
+ hasWebView = false,
+ fromNative = true,
+ )
+
+ assertThat(result).isNull()
+ }
+
+ @Test
+ fun `resolve returns hangup when there is no web view even though pip is supported from native button`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = true,
+ hasWebView = false,
+ fromNative = true,
+ )
+
+ assertThat(result).isNull()
+ }
+
+ @Test
+ fun `resolve goes to pip if its not from native but from the webview`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = true,
+ hasWebView = true,
+ fromNative = false,
+ )
+
+ assertThat(result).isEqualTo(CallScreenBackPressAction.EnterPictureInPicture)
+ }
+ @Test
+ fun `resolve hangs up if its not from native but from the webview and pip is not supported`() {
+ val result = CallScreenBackPressPolicy.resolve(
+ supportPip = false,
+ hasWebView = true,
+ fromNative = false,
+ )
+
+ assertThat(result).isNull()
+ }
+
+ @Test
+ fun `invalid cases (event comes from webview but there is now webview) all result in hangup`() {
+ val withPipSupport = CallScreenBackPressPolicy.resolve(
+ supportPip = true,
+ hasWebView = false,
+ fromNative = false,
+ )
+ assertThat(withPipSupport).isNull()
+ val withOutPipSupport = CallScreenBackPressPolicy.resolve(
+ supportPip = false,
+ hasWebView = false,
+ fromNative = false,
+ )
+ assertThat(withOutPipSupport).isNull()
+ }
+}
diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenViewTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenViewTest.kt
new file mode 100644
index 0000000000..99aaee6f39
--- /dev/null
+++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenViewTest.kt
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.call.ui
+
+import android.view.KeyEvent
+import android.webkit.WebView
+import androidx.activity.ComponentActivity
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalInspectionMode
+import androidx.compose.ui.test.AndroidComposeUiTest
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.v2.runAndroidComposeUiTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import io.element.android.features.call.impl.pip.PictureInPictureEvent
+import io.element.android.features.call.impl.pip.PictureInPictureState
+import io.element.android.features.call.impl.pip.aPictureInPictureState
+import io.element.android.features.call.impl.ui.CallScreenEvent
+import io.element.android.features.call.impl.ui.CallScreenState
+import io.element.android.features.call.impl.ui.CallScreenView
+import io.element.android.features.call.impl.ui.JavascriptBackHandlerBridge
+import io.element.android.features.call.impl.ui.aCallScreenState
+import io.element.android.tests.testutils.EventsRecorder
+import io.element.android.tests.testutils.pressBackKey
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.Implementation
+import org.robolectric.annotation.Implements
+import org.robolectric.annotation.Resetter
+import org.robolectric.shadows.ShadowWebView
+
+@OptIn(ExperimentalTestApi::class)
+@RunWith(AndroidJUnit4::class)
+class CallScreenViewTest {
+ @Test
+ fun `pressing back key triggers hangup when no web view is available and pip is unsupported`() = runAndroidComposeUiTest {
+ val callEvents = EventsRecorder()
+
+ setCallScreenView(
+ state = aCallScreenState(eventSink = callEvents),
+ useInspectionMode = true,
+ )
+
+ pressBackKey()
+
+ callEvents.assertEmpty()
+ }
+
+ @Config(shadows = [RecordingShadowWebView::class])
+ @Test
+ fun `pressing back key dispatches escape key events to web view when pip is unsupported`() = runAndroidComposeUiTest {
+ setCallScreenView(
+ state = aCallScreenState(),
+ useInspectionMode = false,
+ pipState = aPictureInPictureState(supportPip = false),
+ )
+
+ pressBackKey()
+
+ val dispatchedEvents = RecordingShadowWebView.dispatchedEvents
+ assertEquals(2, dispatchedEvents.size)
+ assertEquals(KeyEvent.ACTION_DOWN, dispatchedEvents[0].action)
+ assertEquals(KeyEvent.KEYCODE_ESCAPE, dispatchedEvents[0].keyCode)
+ assertEquals(KeyEvent.ACTION_UP, dispatchedEvents[1].action)
+ assertEquals(KeyEvent.KEYCODE_ESCAPE, dispatchedEvents[1].keyCode)
+ }
+
+ @Config(shadows = [RecordingShadowWebView::class])
+ @Test
+ fun `web view javascript back handler emits pip event when pip is supported`() = runAndroidComposeUiTest {
+ val pipEvents = EventsRecorder()
+
+ setCallScreenView(
+ state = aCallScreenState(),
+ useInspectionMode = false,
+ pipState = aPictureInPictureState(
+ supportPip = true,
+ eventSink = pipEvents,
+ ),
+ )
+
+ runOnIdle {
+ RecordingShadowWebView.invokeJavascriptBackHandler()
+ }
+
+ pipEvents.assertSize(2)
+ pipEvents.assertTrue(0) { it is PictureInPictureEvent.SetPipController }
+ pipEvents.assertTrue(1) { it is PictureInPictureEvent.EnterPictureInPicture }
+ }
+}
+
+@OptIn(ExperimentalTestApi::class)
+private fun AndroidComposeUiTest.setCallScreenView(
+ state: CallScreenState,
+ useInspectionMode: Boolean,
+ pipState: PictureInPictureState = aPictureInPictureState(supportPip = false),
+) {
+ setContent {
+ // Inspection mode disables AndroidView creation; keep it configurable per test.
+ CompositionLocalProvider(LocalInspectionMode provides useInspectionMode) {
+ CallScreenView(
+ state = state,
+ pipState = pipState,
+ onConsoleMessage = {},
+ requestPermissions = { _, _ -> },
+ )
+ }
+ }
+}
+
+@Implements(WebView::class)
+internal class RecordingShadowWebView : ShadowWebView() {
+ companion object {
+ val dispatchedEvents = mutableListOf()
+ private var backHandlerJavascriptInterface: JavascriptBackHandlerBridge? = null
+
+ @Resetter
+ @JvmStatic
+ @Suppress("unused")
+ fun resetRecordedEvents() {
+ dispatchedEvents.clear()
+ backHandlerJavascriptInterface = null
+ }
+
+ fun invokeJavascriptBackHandler() {
+ val backHandler = checkNotNull(backHandlerJavascriptInterface) { "Expected backHandler JavaScript interface to be registered" }
+ backHandler.onBackPressed()
+ }
+ }
+
+ @Implementation
+ protected override fun addJavascriptInterface(`object`: Any, name: String) {
+ super.addJavascriptInterface(`object`, name)
+ if (name == "backHandler") {
+ backHandlerJavascriptInterface = `object` as? JavascriptBackHandlerBridge
+ }
+ }
+
+ @Implementation
+ @Suppress("unused")
+ fun dispatchKeyEvent(event: KeyEvent): Boolean {
+ dispatchedEvents += KeyEvent(event)
+ return false
+ }
+}
diff --git a/features/createroom/impl/src/main/res/values-ro/translations.xml b/features/createroom/impl/src/main/res/values-ro/translations.xml
index fd1854db40..33a5351877 100644
--- a/features/createroom/impl/src/main/res/values-ro/translations.xml
+++ b/features/createroom/impl/src/main/res/values-ro/translations.xml
@@ -3,14 +3,34 @@
"Cameră nouă"
"Invitați prieteni"
"A apărut o eroare la crearea camerei"
+ "Spațiul nu a putut fi creat din cauza unei erori necunoscute. Încercați din nou mai târziu."
+ "Adăugați un nume…"
+ "Cameră nouă"
+ "Spațiu nou"
"Doar persoanele invitate se pot alătura."
+ "Privat"
"Oricine poate găsi această cameră.
Puteți modifica acest lucru oricând în setări."
+ "Oricine se poate alătura."
+ "Public"
"Oricine poate cere să se alăture camerei, dar un administrator sau un moderator va trebui să accepte cererea"
"Permite solicitarea de alăturare"
+ "Oricine din %1$s se poate alătura, dar oricine altcineva trebuie să solicite acces."
+ "Solicitați să vă alăturați"
+ "Doar persoanele invitate se pot alătura."
+ "Privat"
"Oricine se poate alătura acestei camere"
+ "Public"
+ "Oricine din %1$s se poate alătura."
+ "Standard"
+ "Cine are acces"
"Pentru ca această cameră să fie vizibilă în directorul de camere publice, veți avea nevoie de o adresă de cameră."
"Adresă"
"Vizibilitatea camerei"
+ "(nicun spațiu)"
+ "Nu adăugați la un spațiu"
+ "Niciun spațiu selectat"
+ "Adăugați la spațiu"
"Subiect (opțional)"
+ "Adăugați o descriere…"
diff --git a/features/deactivation/impl/src/main/res/values-cs/translations.xml b/features/deactivation/impl/src/main/res/values-cs/translations.xml
index e0f4fd14c7..13659e1a75 100644
--- a/features/deactivation/impl/src/main/res/values-cs/translations.xml
+++ b/features/deactivation/impl/src/main/res/values-cs/translations.xml
@@ -1,14 +1,14 @@
- "Potvrďte prosím, že chcete svůj účet deaktivovat. Tuto akci nelze vrátit zpět."
+ "Potvrďte prosím, že chcete smazat svůj účet. Tuto akci nelze vrátit zpět."
"Smazat všechny mé zprávy"
"Upozornění: Budoucí uživatelé mohou vidět neúplné konverzace."
- "Deaktivace vašeho účtu je %1$s, což způsobí:"
+ "Smazání účtu je %1$s, dojde k:"
"nezvratná"
"%1$s váš účet (nemůžete se znovu přihlásit a vaše ID nelze znovu použít)."
"Trvale zakázat"
"Odebere vás ze všech chatovacích místností."
"Odstraní informace o vašem účtu z našeho serveru identit."
"Vaše zprávy budou stále viditelné registrovaným uživatelům, ale nebudou dostupné novým ani neregistrovaným uživatelům, pokud se rozhodnete je smazat."
- "Deaktivovat účet"
+ "Smazat účet"
diff --git a/features/deactivation/impl/src/main/res/values-et/translations.xml b/features/deactivation/impl/src/main/res/values-et/translations.xml
index 1776e2de17..bfb41d7665 100644
--- a/features/deactivation/impl/src/main/res/values-et/translations.xml
+++ b/features/deactivation/impl/src/main/res/values-et/translations.xml
@@ -3,7 +3,7 @@
"Palun kinnita uuesti, et soovid kustutada oma kasutajakonto. Seda tegevust ei saa tagasi pöörata."
"Kustuta kõik minu sõnumid"
"Hoiatus: tulevased kasutajad võivad näha poolikuid vestlusi."
- "Sinu konto kasutusest eemaldamine on %1$s ja sellega:"
+ "Sinu konto kustutamine on %1$s ja sellega:"
"pöördumatu"
"Sinu kasutajakonto %1$s (sa ei saa enam sellega võrku logida ning kasutajatunnust ei saa enam pruukida)."
"jäädavalt eemaldatakse kasutusest"
diff --git a/features/deactivation/impl/src/main/res/values-ro/translations.xml b/features/deactivation/impl/src/main/res/values-ro/translations.xml
index acd4c0747d..6176b4584e 100644
--- a/features/deactivation/impl/src/main/res/values-ro/translations.xml
+++ b/features/deactivation/impl/src/main/res/values-ro/translations.xml
@@ -1,14 +1,14 @@
- "Vă rugăm să confirmați că doriți să vă dezactivați contul. Această acțiune nu poate fi anulată."
+ "Vă rugăm să confirmați că doriți să vă ștergeți contul. Această acțiune nu poate fi anulată."
"Ștergeți toate mesajele mele"
"Avertisment: este posibil ca viitorii utilizatori să vadă conversații incomplete."
- "Dezactivarea contului dumneavoastră este %1$s, acesta va:"
+ "Ștergerea contului dumneavoastră este %1$s, acesta va:"
"ireversibilă"
"%1$s contul dumneavoastră (nu vă puteți conecta din nou, iar ID-ul dvs. nu poate fi reutilizat)."
"Dezactivați permanent"
"Îndepărta din toate camerele de chat."
"Șterge informațiile contului dumneavoastră de pe serverul nostru de identitate."
"Mesajele dumneavoastră vor fi în continuare vizibile pentru utilizatorii înregistrați, dar nu vor fi disponibile pentru utilizatorii noi sau neînregistrați dacă alegeți să le ștergeți."
- "Dezactivați contul"
+ "Ștergeți contul"
diff --git a/features/ftue/impl/src/main/res/values-et/translations.xml b/features/ftue/impl/src/main/res/values-et/translations.xml
index 3e961d6249..c013556568 100644
--- a/features/ftue/impl/src/main/res/values-et/translations.xml
+++ b/features/ftue/impl/src/main/res/values-et/translations.xml
@@ -2,7 +2,7 @@
"Kas kinnitamine pole võimalik?"
"Loo uus taastevõti"
- "Krüptitud sõnumivahetuse tagamiseks verifitseeri see seade."
+ "Turvalise sõnumside seadistamiseks vali verifitseerimise viis."
"Kinnita oma digitaalne identiteet"
"Kasuta teist seadet"
"Kasuta taastevõtit"
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
index 3ff4339bb2..56b2c1ade4 100644
--- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
@@ -83,8 +83,8 @@ class RoomListDataSource(
val loadingState = roomList.loadingState
- fun launchIn(coroutineScope: CoroutineScope) {
- roomList
+ fun launchIn(coroutineScope: CoroutineScope): Job {
+ return roomList
.summaries
.onEach { roomSummaries ->
replaceWith(roomSummaries)
@@ -212,6 +212,7 @@ class RoomListDataSource(
private suspend fun rebuildAllRoomSummaries() {
lock.withLock {
roomList.summaries.replayCache.firstOrNull()?.let { roomSummaries ->
+ diffCacheUpdater.updateWith(roomSummaries)
buildAndEmitAllRooms(roomSummaries, useCache = false)
}
}
diff --git a/features/home/impl/src/main/res/values-et/translations.xml b/features/home/impl/src/main/res/values-et/translations.xml
index 9d938ed941..4ba1695d7e 100644
--- a/features/home/impl/src/main/res/values-et/translations.xml
+++ b/features/home/impl/src/main/res/values-et/translations.xml
@@ -5,8 +5,8 @@
"Sa ei näe kõiki teavitusi?"
"Sinu nutiseadme teavituste heli on uuenenud - see on nüüd selgem, kiirem ja vähem häiriv."
"Oleme sinu helisid värskendanud"
- "Loo uus taastevõti, mida saad kasutada oma krüptitud sõnumite ajaloo taastamisel olukorras, kus kaotad ligipääsu oma seadmetele."
- "Seadista andmete taastamine"
+ "Sinu vestlused on automaatselt varundatud kasutades läbivat krüptimist. Kui peaksid kaotama ligipääsu kõikidele oma seadmetele, siis selle varukoopia taastamiseks ja oma digitaalse identiteedi säilitamiseks, on vaja taastevõtit."
+ "Seadista taastevõti"
"Varunda oma vestlused"
"Säilitamaks ligipääsu vestluste ja krüptovõtmete varukoopiale, palun sisesta kinnituseks oma taastevõti."
"Sisesta oma taastevõti"
diff --git a/features/home/impl/src/main/res/values-ro/translations.xml b/features/home/impl/src/main/res/values-ro/translations.xml
index be1933e160..14cf100c22 100644
--- a/features/home/impl/src/main/res/values-ro/translations.xml
+++ b/features/home/impl/src/main/res/values-ro/translations.xml
@@ -50,6 +50,7 @@ Nu aveți mesaje necitite!"
"Marcați ca citită"
"Marcați ca necitită"
"Această cameră a fost modernizată."
+ "Spațiile dumneavoastră"
"Se pare că folosiți un dispozitiv nou. Verificați-vă identitatea cu un alt dispozitiv pentru a accesa mesajele dumneavoastră criptate."
"Verificați că sunteți dumneavoastră"
diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
index 1ce5061356..6df5e05df5 100644
--- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
@@ -14,6 +14,9 @@ import io.element.android.features.home.impl.FakeDateTimeObserver
import io.element.android.libraries.androidutils.system.DateTimeObserver
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
import io.element.android.libraries.matrix.api.roomlist.RoomListService
+import io.element.android.libraries.matrix.test.A_ROOM_ID
+import io.element.android.libraries.matrix.test.A_ROOM_ID_2
+import io.element.android.libraries.matrix.test.A_ROOM_ID_3
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
import io.element.android.libraries.matrix.test.room.aRoomSummary
import io.element.android.libraries.matrix.test.roomlist.FakeDynamicRoomList
@@ -100,11 +103,169 @@ class RoomListDataSourceTest {
}
}
+ /**
+ * Tracking issue #4182: rooms duplicated in the room list around midnight.
+ *
+ * If the SDK ever leaks a list containing the same roomId twice (the suspected cause of #4182),
+ * the UI mapper's `distinctBy` safety net in [RoomListDataSource.buildAndEmitAllRooms] must
+ * remove the duplicate AND `analyticsService.trackError` must fire so the team can root-cause
+ * it via Sentry.
+ */
+ @Test
+ fun `when SDK summaries source contains duplicate roomIds, UI layer dedupes and reports trackError`() = runTest {
+ val analyticsService = FakeAnalyticsService()
+ val duplicatedSummaries = listOf(
+ aRoomSummary(roomId = A_ROOM_ID),
+ aRoomSummary(roomId = A_ROOM_ID),
+ aRoomSummary(roomId = A_ROOM_ID_2),
+ )
+ val roomList = FakeDynamicRoomList(summaries = MutableStateFlow(duplicatedSummaries))
+ val roomListService = FakeRoomListService(
+ createRoomListLambda = { roomList }
+ ).apply {
+ postState(RoomListService.State.Running)
+ }
+ val roomListDataSource = createRoomListDataSource(
+ roomListService = roomListService,
+ analyticsService = analyticsService,
+ )
+
+ roomListDataSource.roomSummariesFlow.test {
+ roomListDataSource.launchIn(backgroundScope)
+ val list = awaitItem()
+ assertThat(list.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+ assertThat(analyticsService.trackedErrors).hasSize(1)
+ }
+ }
+
+ /**
+ * Tracking issue #4182.
+ *
+ * Targeted scenario: a `DateChanged` tick fires after an initial SDK emit, then a follow-up
+ * SDK emit lands (mimicking "midnight, then a new message arrives"). Even though the diffCache
+ * is bypassed during the rebuild (`useCache = false`), the final state must contain each
+ * roomId exactly once and trackError must not fire on a happy path.
+ */
+ @Test
+ fun `interleaved date change and SDK update with overlapping content does not produce duplicates`() = runTest {
+ val analyticsService = FakeAnalyticsService()
+ val summariesFlow = MutableStateFlow(
+ listOf(
+ aRoomSummary(roomId = A_ROOM_ID),
+ aRoomSummary(roomId = A_ROOM_ID_2),
+ )
+ )
+ val roomList = FakeDynamicRoomList(summaries = summariesFlow)
+ val roomListService = FakeRoomListService(
+ createRoomListLambda = { roomList }
+ ).apply {
+ postState(RoomListService.State.Running)
+ }
+ val dateTimeObserver = FakeDateTimeObserver()
+ val roomListDataSource = createRoomListDataSource(
+ roomListService = roomListService,
+ dateTimeObserver = dateTimeObserver,
+ analyticsService = analyticsService,
+ )
+
+ roomListDataSource.roomSummariesFlow.test {
+ roomListDataSource.launchIn(backgroundScope)
+ val initial = awaitItem()
+ assertThat(initial.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+
+ // Midnight ticks while the cache holds [A_ROOM_ID, A_ROOM_ID_2]
+ dateTimeObserver.given(DateTimeObserver.Event.DateChanged(Instant.MIN, Instant.now()))
+ val afterMidnight = awaitItem()
+ assertThat(afterMidnight.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+
+ // A new message bumps A_ROOM_ID — different unread count makes the StateFlow see this
+ // as a new value
+ summariesFlow.value = listOf(
+ aRoomSummary(roomId = A_ROOM_ID, numUnreadMessages = 1),
+ aRoomSummary(roomId = A_ROOM_ID_2),
+ )
+ val afterMessage = awaitItem()
+ assertThat(afterMessage.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+ assertThat(afterMessage.map { it.roomId }.toSet()).hasSize(afterMessage.size)
+
+ // Second midnight rebuild after the new message
+ dateTimeObserver.given(DateTimeObserver.Event.DateChanged(Instant.MIN, Instant.now()))
+ val afterSecondMidnight = awaitItem()
+ assertThat(afterSecondMidnight.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+ assertThat(afterSecondMidnight.map { it.roomId }.toSet()).hasSize(afterSecondMidnight.size)
+
+ assertThat(analyticsService.trackedErrors).isEmpty()
+ }
+ }
+
+ @Test
+ fun `regression test for race with DateTimeObserver and new items`() = runTest {
+ val roomList = FakeDynamicRoomList(summaries = MutableStateFlow(listOf(aRoomSummary(), aRoomSummary(A_ROOM_ID_2))))
+ val roomListService = FakeRoomListService(
+ createRoomListLambda = { roomList }
+ ).apply {
+ postState(RoomListService.State.Running)
+ }
+ val dateTimeObserver = FakeDateTimeObserver()
+ var dateFormatterResult = "Today"
+ val dateFormatter = FakeDateFormatter({ _, _, _ -> dateFormatterResult })
+ val roomListDataSource = createRoomListDataSource(
+ roomListService = roomListService,
+ roomListRoomSummaryFactory = aRoomListRoomSummaryFactory(
+ dateFormatter = dateFormatter,
+ ),
+ dateTimeObserver = dateTimeObserver,
+ )
+ roomListDataSource.roomSummariesFlow.test {
+ // Observe room list items changes
+ val job = roomListDataSource.launchIn(backgroundScope)
+ // Get the initial room list
+ val initialRoomList = awaitItem()
+ assertThat(initialRoomList).hasSize(2)
+ assertThat(initialRoomList[0].roomId).isEqualTo(A_ROOM_ID)
+ assertThat(initialRoomList[0].timestamp).isEqualTo(dateFormatterResult)
+ assertThat(initialRoomList[1].roomId).isEqualTo(A_ROOM_ID_2)
+ assertThat(initialRoomList[1].timestamp).isEqualTo(dateFormatterResult)
+
+ // Stop processing room list updates so we can force a race condition with the date time observer updates
+ job.cancel()
+
+ // Trigger a date change and a new item at the same time
+ dateFormatterResult = "Yesterday"
+ roomList.summaries.tryEmit(listOf(aRoomSummary(roomId = A_ROOM_ID), aRoomSummary(roomId = A_ROOM_ID_3), aRoomSummary(roomId = A_ROOM_ID_2)))
+ dateTimeObserver.given(DateTimeObserver.Event.DateChanged(Instant.MIN, Instant.now()))
+
+ // The race condition would have caused the cache indices to be corrupted and only 2 items would be emitted
+ val rebuiltRoomList = awaitItem()
+ assertThat(rebuiltRoomList).hasSize(3)
+ assertThat(rebuiltRoomList[0].roomId).isEqualTo(A_ROOM_ID)
+ assertThat(rebuiltRoomList[0].timestamp).isEqualTo(dateFormatterResult)
+ assertThat(rebuiltRoomList[1].roomId).isEqualTo(A_ROOM_ID_3)
+ assertThat(rebuiltRoomList[1].timestamp).isEqualTo(dateFormatterResult)
+ assertThat(rebuiltRoomList[2].roomId).isEqualTo(A_ROOM_ID_2)
+ assertThat(rebuiltRoomList[2].timestamp).isEqualTo(dateFormatterResult)
+
+ // Restart processing room list updates
+ roomListDataSource.launchIn(backgroundScope)
+
+ // Check there is a new list and it's not the same as the previous one
+ val newRoomList = awaitItem()
+ assertThat(newRoomList).hasSize(3)
+ assertThat(newRoomList[0].roomId).isEqualTo(A_ROOM_ID)
+ assertThat(newRoomList[0].timestamp).isEqualTo(dateFormatterResult)
+ assertThat(newRoomList[1].roomId).isEqualTo(A_ROOM_ID_3)
+ assertThat(newRoomList[1].timestamp).isEqualTo(dateFormatterResult)
+ assertThat(newRoomList[2].roomId).isEqualTo(A_ROOM_ID_2)
+ assertThat(newRoomList[2].timestamp).isEqualTo(dateFormatterResult)
+ }
+ }
+
private fun TestScope.createRoomListDataSource(
roomListService: FakeRoomListService = FakeRoomListService(),
roomListRoomSummaryFactory: RoomListRoomSummaryFactory = aRoomListRoomSummaryFactory(),
notificationSettingsService: FakeNotificationSettingsService = FakeNotificationSettingsService(),
dateTimeObserver: FakeDateTimeObserver = FakeDateTimeObserver(),
+ analyticsService: FakeAnalyticsService = FakeAnalyticsService(),
) = RoomListDataSource(
roomListService = roomListService,
roomListRoomSummaryFactory = roomListRoomSummaryFactory,
@@ -112,6 +273,6 @@ class RoomListDataSourceTest {
notificationSettingsService = notificationSettingsService,
sessionCoroutineScope = backgroundScope,
dateTimeObserver = dateTimeObserver,
- analyticsService = FakeAnalyticsService(),
+ analyticsService = analyticsService,
)
}
diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt
index 264aafd570..0422fac4f1 100644
--- a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt
+++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleEvents.kt
@@ -11,4 +11,5 @@ package io.element.android.features.invitepeople.api
interface InvitePeopleEvents {
data object SendInvites : InvitePeopleEvents
data object CloseSearch : InvitePeopleEvents
+ data object ClearError : InvitePeopleEvents
}
diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt
index 9d342d191f..d14042cff7 100644
--- a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt
+++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleState.kt
@@ -9,10 +9,12 @@
package io.element.android.features.invitepeople.api
import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.core.RoomId
interface InvitePeopleState {
val canInvite: Boolean
val isSearchActive: Boolean
val sendInvitesAction: AsyncAction
+ val createRoomFromDmAction: AsyncAction
val eventSink: (InvitePeopleEvents) -> Unit
}
diff --git a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt
index ce30bcc1f6..b233ed07ef 100644
--- a/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt
+++ b/features/invitepeople/api/src/main/kotlin/io/element/android/features/invitepeople/api/InvitePeopleStateProvider.kt
@@ -10,6 +10,7 @@ package io.element.android.features.invitepeople.api
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.core.RoomId
class InvitePeopleStateProvider : PreviewParameterProvider {
override val values: Sequence
@@ -25,6 +26,7 @@ private data class PreviewInvitePeopleState(
override val canInvite: Boolean,
override val isSearchActive: Boolean,
override val sendInvitesAction: AsyncAction,
+ override val createRoomFromDmAction: AsyncAction,
override val eventSink: (InvitePeopleEvents) -> Unit,
) : InvitePeopleState
@@ -32,10 +34,12 @@ private fun aPreviewInvitePeopleState(
canInvite: Boolean = false,
isSearchActive: Boolean = false,
sendInvitesAction: AsyncAction = AsyncAction.Uninitialized,
+ createRoomFromDmAction: AsyncAction = AsyncAction.Uninitialized,
eventSink: (InvitePeopleEvents) -> Unit = {},
) = PreviewInvitePeopleState(
canInvite = canInvite,
isSearchActive = isSearchActive,
sendInvitesAction = sendInvitesAction,
+ createRoomFromDmAction = createRoomFromDmAction,
eventSink = eventSink
)
diff --git a/features/invitepeople/impl/build.gradle.kts b/features/invitepeople/impl/build.gradle.kts
index 185497c25b..2ab2fcb4a3 100644
--- a/features/invitepeople/impl/build.gradle.kts
+++ b/features/invitepeople/impl/build.gradle.kts
@@ -36,6 +36,7 @@ dependencies {
implementation(projects.libraries.uiUtils)
implementation(projects.libraries.androidutils)
implementation(projects.libraries.usersearch.api)
+ implementation(projects.libraries.testtags)
implementation(libs.coil.compose)
implementation(projects.services.apperror.api)
implementation(projects.libraries.featureflag.api)
diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt
index b223d30617..44627daca3 100644
--- a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt
+++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenter.kt
@@ -38,12 +38,17 @@ import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
+import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
+import io.element.android.libraries.matrix.api.createroom.RoomPreset
import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomMembershipState
import io.element.android.libraries.matrix.api.room.filterMembers
+import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
+import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.recent.getRecentDirectRooms
+import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.libraries.usersearch.api.UserRepository
@@ -88,6 +93,7 @@ class DefaultInvitePeoplePresenter(
var searchActive by rememberSaveable { mutableStateOf(false) }
val showSearchLoader = rememberSaveable { mutableStateOf(false) }
val sendInvitesAction = remember { mutableStateOf>(AsyncAction.Uninitialized) }
+ val createRoomFromDmAction = remember { mutableStateOf>(AsyncAction.Uninitialized) }
val recentDirectRooms by produceState(emptyList(), roomMembers.value) {
if (roomMembers.value.isSuccess()) {
@@ -208,7 +214,13 @@ class DefaultInvitePeoplePresenter(
)
} else {
room.dataOrNull()?.let {
- sessionCoroutineScope.sendInvites(it, selectedUsers.value, sendInvitesAction)
+ sessionCoroutineScope.launch {
+ if (it.isDm()) {
+ createRoomFromDm(it, selectedUsers.value, createRoomFromDmAction)
+ } else {
+ sendInvites(it, selectedUsers.value, sendInvitesAction)
+ }
+ }
}
}
}
@@ -216,6 +228,10 @@ class DefaultInvitePeoplePresenter(
searchActive = false
queryState.clearText()
}
+ is InvitePeopleEvents.ClearError -> {
+ sendInvitesAction.value = AsyncAction.Uninitialized
+ createRoomFromDmAction.value = AsyncAction.Uninitialized
+ }
}
}
@@ -228,6 +244,7 @@ class DefaultInvitePeoplePresenter(
searchResults = searchResults.value,
showSearchLoader = showSearchLoader.value,
sendInvitesAction = sendInvitesAction.value,
+ createRoomFromDmAction = createRoomFromDmAction.value,
suggestions = suggestions,
eventSink = ::handleEvent,
)
@@ -254,6 +271,35 @@ class DefaultInvitePeoplePresenter(
}
}
+ private fun CoroutineScope.createRoomFromDm(
+ currentRoom: JoinedRoom,
+ selectedUsers: List,
+ createRoomFromDmAction: MutableState>,
+ ) = launch {
+ createRoomFromDmAction.runUpdatingState {
+ val currentUsers = currentRoom.getMembers(limit = 100).getOrNull().orEmpty()
+ .filter { it.membership.isActive() }
+ val invitees = (currentUsers.map { it.userId } + selectedUsers.map { it.userId })
+ .filter { it != matrixClient.sessionId }
+ .distinct()
+ matrixClient.createRoom(
+ CreateRoomParameters(
+ name = null,
+ topic = null,
+ isEncrypted = true,
+ isDirect = false,
+ visibility = RoomVisibility.Private,
+ preset = RoomPreset.PRIVATE_CHAT,
+ invite = invitees,
+ avatar = null,
+ joinRuleOverride = JoinRule.Invite,
+ historyVisibilityOverride = RoomHistoryVisibility.Invited,
+ isSpace = false,
+ )
+ )
+ }
+ }
+
@JvmName("toggleUserInSelectedUsers")
private fun MutableState>.toggleUser(user: MatrixUser) {
value = if (value.contains(user)) {
diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt
index 842bcf1148..46e5d9f1a5 100644
--- a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt
+++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleState.kt
@@ -14,6 +14,7 @@ import io.element.android.features.invitepeople.api.InvitePeopleState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
+import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.ImmutableList
@@ -26,6 +27,7 @@ data class DefaultInvitePeopleState(
val selectedUsers: ImmutableList,
override val isSearchActive: Boolean,
override val sendInvitesAction: AsyncAction,
+ override val createRoomFromDmAction: AsyncAction,
val suggestions: ImmutableList,
override val eventSink: (InvitePeopleEvents) -> Unit
) : InvitePeopleState
diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt
index 45b47fbc6e..93a6e03bd3 100644
--- a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt
+++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeopleStateProvider.kt
@@ -18,6 +18,7 @@ import io.element.android.libraries.designsystem.preview.USER_NAME_CAROL
import io.element.android.libraries.designsystem.preview.USER_NAME_EVE
import io.element.android.libraries.designsystem.preview.USER_NAME_JUSTIN
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
+import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
@@ -119,6 +120,7 @@ private fun aDefaultInvitePeopleState(
isSearchActive: Boolean = false,
showSearchLoader: Boolean = false,
sendInvitesAction: AsyncAction = AsyncAction.Uninitialized,
+ createRoomFromDmAction: AsyncAction = AsyncAction.Uninitialized,
suggestions: List = aMatrixUserList()
.take(5)
.map { user -> anInvitableUser(matrixUser = user, isSelected = user in selectedUsers) },
@@ -132,6 +134,7 @@ private fun aDefaultInvitePeopleState(
isSearchActive = isSearchActive,
showSearchLoader = showSearchLoader,
sendInvitesAction = sendInvitesAction,
+ createRoomFromDmAction = createRoomFromDmAction,
suggestions = suggestions.toImmutableList(),
eventSink = {},
)
diff --git a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt
index b1f139f43c..2bbd64c977 100644
--- a/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt
+++ b/features/invitepeople/impl/src/main/kotlin/io/element/android/features/invitepeople/impl/InvitePeopleView.kt
@@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
@@ -23,6 +24,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -54,6 +56,8 @@ import io.element.android.libraries.matrix.ui.components.MatrixUserRow
import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName
+import io.element.android.libraries.testtags.TestTags
+import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.libraries.ui.utils.strings.simplePluralStringResource
import kotlinx.collections.immutable.ImmutableList
@@ -102,7 +106,7 @@ private fun InvitePeopleContentView(
}
InvitePeopleSearchBar(
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier.imePadding().fillMaxWidth(),
queryState = state.searchQuery,
showLoader = state.showSearchLoader,
selectedUsers = state.selectedUsers,
@@ -298,7 +302,7 @@ private fun InvitePeopleConfirmModal(
text = stringResource(CommonStrings.action_remove),
onClick = onRemove,
leadingIcon = IconSource.Vector(CompoundIcons.Close()),
- modifier = Modifier.weight(1f)
+ modifier = Modifier.weight(1f).testTag(TestTags.confirmInviteUnknown),
)
Button(
text = stringResource(CommonStrings.action_invite),
diff --git a/features/invitepeople/impl/src/main/res/values-et/translations.xml b/features/invitepeople/impl/src/main/res/values-et/translations.xml
index 44484d23c3..1bdf5f780c 100644
--- a/features/invitepeople/impl/src/main/res/values-et/translations.xml
+++ b/features/invitepeople/impl/src/main/res/values-et/translations.xml
@@ -2,4 +2,8 @@
"Sa juba oled jututoa liige"
"Sa juba oled kutse saanud"
+ "Sul pole hetkel nende kontaktidega ühtegi vestlust. Enne jätkamist kinnita neile siia jututuppa kutse saatmine."
+ "Sul pole hetkel selle kontaktiga ühtegi vestlust. Enne jätkamist kinnita talle siia jututuppa kutse saatmine."
+ "Kas kutsud uued kontaktid siia jututuppa?"
+ "Kas kutsud uue kontakti siia jututuppa?"
diff --git a/features/invitepeople/impl/src/main/res/values-ro/translations.xml b/features/invitepeople/impl/src/main/res/values-ro/translations.xml
index f03be4b263..40189e3186 100644
--- a/features/invitepeople/impl/src/main/res/values-ro/translations.xml
+++ b/features/invitepeople/impl/src/main/res/values-ro/translations.xml
@@ -2,4 +2,8 @@
"Deja membru"
"Deja invitat"
+ "În prezent, nu aveți nicio conversație cu aceste contacte. Confirmați invitarea lor în această cameră înainte de a continua."
+ "În prezent, nu aveți nicio conversație cu acest contact. Confirmați invitarea acestuia în cameră înainte de a continua."
+ "Invitați contactele noi în această cameră?"
+ "Invitați contactul nou în această cameră?"
diff --git a/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt b/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt
index 5d5a533bb6..4e141b2c4d 100644
--- a/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt
+++ b/features/invitepeople/impl/src/test/kotlin/io/element/android/features/invitepeople/impl/DefaultInvitePeoplePresenterTest.kt
@@ -831,6 +831,54 @@ internal class DefaultInvitePeoplePresenterTest {
}
}
+ @Test
+ fun `present - inviting someone to a DM creates a new room`() = runTest {
+ val alice = aMatrixUser("@alice:example.com")
+
+ val matrixClient = FakeMatrixClient(
+ encryptionService = FakeEncryptionService(
+ getUserIdentityResult = lambdaRecorder { userId: UserId ->
+ Result.success(IdentityState.Pinned)
+ }
+ )
+ )
+ val presenter = createDefaultInvitePeoplePresenter(
+ coroutineDispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true),
+ matrixClient = matrixClient,
+ joinedRoom = FakeJoinedRoom(
+ baseRoom = FakeBaseRoom(
+ initialRoomInfo = aRoomInfo(isDm = true),
+ getMembersResult = { Result.success(listOf(aRoomMember(userId = alice.userId, membership = RoomMembershipState.JOIN))) },
+ )
+ )
+ )
+ presenter.test {
+ val initialState = awaitItem()
+ skipItems(1)
+
+ // We want to add a new user to a DM
+ initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(alice))
+
+ // And we send the invites
+ initialState.eventSink(InvitePeopleEvents.SendInvites)
+
+ skipItems(1)
+
+ awaitItemAsDefault().run {
+ assertThat(canInvite).isTrue()
+ assertThat(sendInvitesAction.isUninitialized()).isTrue()
+ // Inviting to a DM should trigger the creation of a new room
+ assertThat(createRoomFromDmAction.isLoading()).isTrue()
+ }
+
+ awaitItemAsDefault().run {
+ assertThat(sendInvitesAction.isUninitialized()).isTrue()
+ // Once the room is created, the action should be successful
+ assertThat(createRoomFromDmAction.isSuccess()).isTrue()
+ }
+ }
+ }
+
private suspend fun FakeUserRepository.emitStateWithUsers(
users: List,
isSearching: Boolean = false
diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt
index 35cfbb1594..977308178d 100644
--- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt
+++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt
@@ -609,6 +609,7 @@ private fun JoinRoomTopBar(
val roundedCornerShape = RoundedCornerShape(8.dp)
val titleModifier = Modifier
.clip(roundedCornerShape)
+ .semantics { heading() }
if (contentState.name != null) {
Row(
modifier = titleModifier,
@@ -621,10 +622,7 @@ private fun JoinRoomTopBar(
)
Text(
modifier = Modifier
- .padding(horizontal = 8.dp)
- .semantics {
- heading()
- },
+ .padding(horizontal = 8.dp),
text = contentState.name,
style = ElementTheme.typography.fontBodyLgMedium,
maxLines = 1,
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewDeviceFlowNode.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewDeviceFlowNode.kt
index e90d318267..61645ead9d 100644
--- a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewDeviceFlowNode.kt
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewDeviceFlowNode.kt
@@ -144,8 +144,14 @@ class LinkNewDeviceFlowNode(
navigateToError(linkMobileStep.errorType)
}
is LinkMobileStep.QrReady -> {
- // The QrCode is ready, navigate to its display
- backstack.push(NavTarget.MobileShowQrCode(linkMobileStep.data))
+ // The QrCode is ready, navigate to its display, if not already there
+ val navTarget = backstack.elements.value.last().key.navTarget
+ if (navTarget !is NavTarget.MobileShowQrCode) {
+ backstack.push(NavTarget.MobileShowQrCode(linkMobileStep.data))
+ }
+ }
+ LinkMobileStep.QrRotating -> {
+ // This step is handled in ShowQrCodePresenter
}
is LinkMobileStep.QrScanned -> {
backstack.replace(NavTarget.MobileEnterNumber)
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewMobileHandler.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewMobileHandler.kt
index 157d946eaa..18d67f577a 100644
--- a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewMobileHandler.kt
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/LinkNewMobileHandler.kt
@@ -12,6 +12,7 @@ import dev.zacsweers.metro.SingleIn
import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient
+import io.element.android.libraries.matrix.api.linknewdevice.ErrorType
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler
import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep
import io.element.android.libraries.matrix.api.logs.LoggerTags
@@ -65,4 +66,15 @@ class LinkNewMobileHandler(
linkMobileStepFlow.emit(LinkMobileStep.Uninitialized)
}
}
+
+ fun rotateQrCode() {
+ createAndStartNewHandler()
+ }
+
+ fun onTooManyRotation() {
+ reset()
+ sessionScope.launch {
+ linkMobileStepFlow.emit(LinkMobileStep.Error(ErrorType.Expired("Too many QR code rotations")))
+ }
+ }
}
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeNode.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeNode.kt
index a884c3e97f..20bd50f488 100644
--- a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeNode.kt
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeNode.kt
@@ -25,6 +25,7 @@ import io.element.android.libraries.di.SessionScope
class ShowQrCodeNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List,
+ showQrCodePresenterFactory: ShowQrCodePresenter.Factory,
) : Node(buildContext, plugins = plugins) {
class Inputs(
val data: String,
@@ -36,11 +37,15 @@ class ShowQrCodeNode(
private val inputs: Inputs = inputs()
private val callback: Callback = callback()
+ private val showQrCodePresenter: ShowQrCodePresenter = showQrCodePresenterFactory.create(
+ initialData = inputs.data,
+ )
@Composable
override fun View(modifier: Modifier) {
+ val state = showQrCodePresenter.present()
ShowQrCodeView(
- data = inputs.data,
+ state = state,
modifier = modifier,
onBackClick = callback::navigateBack,
)
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenter.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenter.kt
new file mode 100644
index 0000000000..21071a6831
--- /dev/null
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenter.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.linknewdevice.impl.screens.qrcode
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.produceState
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import dev.zacsweers.metro.Assisted
+import dev.zacsweers.metro.AssistedFactory
+import dev.zacsweers.metro.AssistedInject
+import io.element.android.features.linknewdevice.impl.LinkNewMobileHandler
+import io.element.android.libraries.architecture.AsyncData
+import io.element.android.libraries.architecture.Presenter
+import io.element.android.libraries.core.log.logger.LoggerTag
+import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep
+import io.element.android.libraries.matrix.api.logs.LoggerTags
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import timber.log.Timber
+
+private val tag = LoggerTag("ShowQrCodePresenter", LoggerTags.linkNewDevice)
+
+@AssistedInject
+class ShowQrCodePresenter(
+ @Assisted private val initialData: String,
+ private val linkNewMobileHandler: LinkNewMobileHandler,
+) : Presenter {
+ @AssistedFactory
+ interface Factory {
+ fun create(initialData: String): ShowQrCodePresenter
+ }
+
+ private var loadingJob: Job? = null
+
+ @Composable
+ override fun present(): ShowQrCodeState {
+ var qrCodeRotationCounter by remember { mutableIntStateOf(MAX_QR_CODE_ROTATION) }
+ val state by produceState(
+ initialValue = ShowQrCodeState(
+ data = AsyncData.Success(initialData),
+ )
+ ) {
+ linkNewMobileHandler.stepFlow.collect { step ->
+ when (step) {
+ is LinkMobileStep.QrReady -> {
+ loadingJob?.cancel()
+ value = ShowQrCodeState(
+ data = AsyncData.Success(step.data),
+ )
+ }
+ is LinkMobileStep.QrRotating -> {
+ if (qrCodeRotationCounter-- > 0) {
+ Timber.tag(tag.value).d("Rotating QrCode")
+ linkNewMobileHandler.rotateQrCode()
+ // Ensure that outdated data is not rendered too long while rotating QR code
+ loadingJob = launch {
+ delay(1000)
+ value = ShowQrCodeState(
+ data = AsyncData.Loading(),
+ )
+ }
+ } else {
+ Timber.tag(tag.value).w("Max QR code rotation reached, not rotating anymore")
+ linkNewMobileHandler.onTooManyRotation()
+ }
+ }
+ else -> Unit
+ }
+ }
+ }
+
+ return state
+ }
+
+ companion object {
+ const val MAX_QR_CODE_ROTATION = 10
+ }
+}
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeState.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeState.kt
new file mode 100644
index 0000000000..e69dde8264
--- /dev/null
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeState.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.linknewdevice.impl.screens.qrcode
+
+import io.element.android.libraries.architecture.AsyncData
+
+data class ShowQrCodeState(
+ val data: AsyncData,
+)
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeStateProvider.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeStateProvider.kt
new file mode 100644
index 0000000000..e6d33c2544
--- /dev/null
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeStateProvider.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.linknewdevice.impl.screens.qrcode
+
+import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import io.element.android.libraries.architecture.AsyncData
+
+class ShowQrCodeStateProvider : PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(
+ aShowQrCodeState(),
+ aShowQrCodeState(
+ data = AsyncData.Loading(),
+ ),
+ )
+}
+
+internal fun aShowQrCodeState(
+ data: AsyncData = AsyncData.Success("DATA"),
+) = ShowQrCodeState(
+ data = data,
+)
diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeView.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeView.kt
index 501415f621..f2cd07f4a5 100644
--- a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeView.kt
+++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeView.kt
@@ -9,6 +9,12 @@
package io.element.android.features.linknewdevice.impl.screens.qrcode
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.togetherWith
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
@@ -21,6 +27,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.linknewdevice.impl.R
@@ -30,6 +37,7 @@ import io.element.android.libraries.designsystem.components.BigIcon
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.LocalBuildMeta
+import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.utils.annotatedTextWithBold
import io.element.android.libraries.qrcode.QrCodeImage
import kotlinx.collections.immutable.persistentListOf
@@ -38,9 +46,10 @@ import kotlinx.collections.immutable.persistentListOf
* QrCode display screen:
* https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=2027-23617
*/
+@OptIn(ExperimentalAnimationApi::class)
@Composable
fun ShowQrCodeView(
- data: String,
+ state: ShowQrCodeState,
onBackClick: () -> Unit,
modifier: Modifier = Modifier,
) {
@@ -55,11 +64,17 @@ fun ShowQrCodeView(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
- QrCodeImage(
- data = data,
- modifier = Modifier
- .size(220.dp)
- )
+ AnimatedContent(
+ modifier = Modifier.size(220.dp),
+ targetState = state.data.dataOrNull(),
+ transitionSpec = {
+ fadeIn().togetherWith(fadeOut())
+ }
+ ) { data ->
+ QrCodeOrLoading(
+ data = data,
+ )
+ }
Spacer(modifier = Modifier.height(32.dp))
NumberedListOrganism(
modifier = Modifier.fillMaxSize(),
@@ -79,11 +94,33 @@ fun ShowQrCodeView(
}
}
+@Composable
+private fun QrCodeOrLoading(
+ data: String?,
+ modifier: Modifier = Modifier,
+) {
+ if (data == null) {
+ Box(
+ modifier = modifier,
+ contentAlignment = Alignment.Center,
+ ) {
+ CircularProgressIndicator()
+ }
+ } else {
+ QrCodeImage(
+ modifier = modifier,
+ data = data,
+ )
+ }
+}
+
@PreviewsDayNight
@Composable
-internal fun ShowQrCodeViewPreview() = ElementPreview {
+internal fun ShowQrCodeViewPreview(
+ @PreviewParameter(ShowQrCodeStateProvider::class) state: ShowQrCodeState,
+) = ElementPreview {
ShowQrCodeView(
- data = "DATA",
+ state = state,
onBackClick = { },
)
}
diff --git a/features/linknewdevice/impl/src/main/res/values-ro/translations.xml b/features/linknewdevice/impl/src/main/res/values-ro/translations.xml
index c99b537084..57d439240d 100644
--- a/features/linknewdevice/impl/src/main/res/values-ro/translations.xml
+++ b/features/linknewdevice/impl/src/main/res/values-ro/translations.xml
@@ -26,6 +26,7 @@
"Se încarcă codul QR…"
"Dispozitiv mobil"
"Ce tip de dispozitiv doriți să conectați?"
+ "Încercați din nou și asigurați-vă că ați introdus corect codul de 2 cifre. Dacă numerele tot nu se potrivesc, contactați furnizorul contului."
"Numerele nu se potrivesc"
"Nu a putut fi făcută o conexiune sigură la noul dispozitiv. Dispozitivele existente sunt încă în siguranță și nu trebuie să vă faceți griji cu privire la ele."
"Și acum?"
@@ -39,6 +40,8 @@
"Cererea de autentificare a fost anulată"
"Autentificarea a fost refuzată pe celălalt dispozitiv."
"Autentificarea a fost refuzată"
+ "Nu trebuie să faceți nimic altceva."
+ "Celălalt dispozitiv este deja conectat"
"Autentificarea a expirat. Vă rugăm să încercați din nou."
"Autentificarea nu a fost finalizată la timp"
"Celălalt dispozitiv nu acceptă autentificarea la %s cu un cod QR.
diff --git a/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenterTest.kt b/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenterTest.kt
new file mode 100644
index 0000000000..f92cf66102
--- /dev/null
+++ b/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodePresenterTest.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package io.element.android.features.linknewdevice.impl.screens.qrcode
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.linknewdevice.impl.LinkNewMobileHandler
+import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileHandler
+import io.element.android.libraries.matrix.api.linknewdevice.LinkMobileStep
+import io.element.android.libraries.matrix.test.FakeMatrixClient
+import io.element.android.libraries.matrix.test.linknewdevice.FakeLinkMobileHandler
+import io.element.android.tests.testutils.WarmUpRule
+import io.element.android.tests.testutils.lambda.lambdaRecorder
+import io.element.android.tests.testutils.test
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Rule
+import org.junit.Test
+
+class ShowQrCodePresenterTest {
+ @get:Rule
+ val warmUpRule = WarmUpRule()
+
+ @Test
+ fun `present - initial state`() = runTest {
+ createPresenter().test {
+ val initialState = awaitItem()
+ assertThat(initialState.data.dataOrNull()).isEqualTo("DATA")
+ }
+ }
+
+ @Test
+ fun `present - when handler emits QrRotating, the presenter requests to rotate the QrCode`() = runTest {
+ val linkMobileHandler = FakeLinkMobileHandler(
+ startResult = {},
+ )
+ val createLinkMobileHandlerResult = lambdaRecorder> {
+ Result.success(linkMobileHandler)
+ }
+ val matrixClient = FakeMatrixClient(
+ sessionCoroutineScope = backgroundScope,
+ createLinkMobileHandlerResult = createLinkMobileHandlerResult,
+ )
+ val linkNewMobileHandler = LinkNewMobileHandler(matrixClient)
+ linkNewMobileHandler.createAndStartNewHandler()
+ createPresenter(
+ linkNewMobileHandler = linkNewMobileHandler,
+ ).test {
+ awaitItem()
+ linkMobileHandler.emitStep(
+ LinkMobileStep.QrRotating
+ )
+ runCurrent()
+ val finalState = awaitItem()
+ assertThat(finalState.data.isLoading()).isTrue()
+ createLinkMobileHandlerResult.assertions().isCalledExactly(2)
+ }
+ }
+
+ @Test
+ fun `present - when handler emits QrRotating, the presenter requests to rotate the QrCode and the code is rotated`() = runTest {
+ val linkMobileHandler = FakeLinkMobileHandler(
+ startResult = {},
+ )
+ val matrixClient = FakeMatrixClient(
+ sessionCoroutineScope = backgroundScope,
+ createLinkMobileHandlerResult = { Result.success(linkMobileHandler) },
+ )
+ val linkNewMobileHandler = LinkNewMobileHandler(matrixClient)
+ linkNewMobileHandler.createAndStartNewHandler()
+ createPresenter(
+ linkNewMobileHandler = linkNewMobileHandler,
+ ).test {
+ awaitItem()
+ linkMobileHandler.emitStep(
+ LinkMobileStep.QrRotating
+ )
+ runCurrent()
+ linkMobileHandler.emitStep(
+ LinkMobileStep.QrReady("DATA2")
+ )
+ val finalState = awaitItem()
+ assertThat(finalState.data.dataOrNull()).isEqualTo("DATA2")
+ }
+ }
+
+ private fun createPresenter(
+ linkNewMobileHandler: LinkNewMobileHandler = LinkNewMobileHandler(FakeMatrixClient()),
+ ) = ShowQrCodePresenter(
+ initialData = "DATA",
+ linkNewMobileHandler = linkNewMobileHandler,
+ )
+}
diff --git a/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeViewTest.kt b/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeViewTest.kt
index d552c2bff6..7927eeed77 100644
--- a/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeViewTest.kt
+++ b/features/linknewdevice/impl/src/test/kotlin/io/element/android/features/linknewdevice/impl/screens/qrcode/ShowQrCodeViewTest.kt
@@ -37,7 +37,7 @@ class ShowQrCodeViewTest {
) {
setContent {
ShowQrCodeView(
- data = "DATA",
+ state = aShowQrCodeState(),
onBackClick = onBackClick,
)
}
diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenter.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenter.kt
index 6c0d2120bc..a1e45cfea2 100644
--- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenter.kt
+++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenter.kt
@@ -40,8 +40,6 @@ import io.element.android.libraries.architecture.runUpdatingState
import io.element.android.libraries.core.extensions.flatMap
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.dateformatter.api.DurationFormatter
-import io.element.android.libraries.featureflag.api.FeatureFlagService
-import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.room.CreateTimelineParams
import io.element.android.libraries.matrix.api.room.JoinedRoom
@@ -66,7 +64,6 @@ class ShareLocationPresenter(
private val messageComposerContext: MessageComposerContext,
private val locationActions: LocationActions,
private val buildMeta: BuildMeta,
- private val featureFlagService: FeatureFlagService,
private val client: MatrixClient,
private val durationFormatter: DurationFormatter,
private val liveLocationShareManager: ActiveLiveLocationShareManager,
@@ -83,9 +80,6 @@ class ShareLocationPresenter(
override fun present(): ShareLocationState {
val permissionsState: PermissionsState = permissionsPresenter.present()
var trackUserPosition: Boolean by remember { mutableStateOf(permissionsState.isAnyGranted && locationActions.isLocationEnabled()) }
- val isLiveLocationSharingEnabled by remember {
- featureFlagService.isFeatureEnabledFlow(FeatureFlags.LiveLocationSharing)
- }.collectAsState(false)
val appName by remember { derivedStateOf { buildMeta.applicationName } }
var dialogState: ShareLocationState.Dialog by remember {
mutableStateOf(ShareLocationState.Dialog.None)
@@ -171,7 +165,7 @@ class ShareLocationPresenter(
dialogState = dialogState,
trackUserLocation = trackUserPosition,
hasLocationPermission = permissionsState.isAnyGranted,
- canShareLiveLocation = isLiveLocationSharingEnabled && timelineMode.canShareLiveLocation(),
+ canShareLiveLocation = timelineMode.canShareLiveLocation(),
appName = appName,
startLiveLocationAction = startLiveLocationAction.value,
eventSink = ::handleEvent,
diff --git a/features/location/impl/src/main/res/values-cs/translations.xml b/features/location/impl/src/main/res/values-cs/translations.xml
index 6bb5b1db8c..98af57abba 100644
--- a/features/location/impl/src/main/res/values-cs/translations.xml
+++ b/features/location/impl/src/main/res/values-cs/translations.xml
@@ -2,4 +2,5 @@
"Vaše historie aktuální polohy bude uložena v místnosti a bude viditelná pro členy i po skončení relace."
"Zvolte, jak dlouho chcete sdílet svou aktuální polohu."
+ "Nemáte oprávnění sdílet svou aktuální polohu v této místnosti."
diff --git a/features/location/impl/src/main/res/values-et/translations.xml b/features/location/impl/src/main/res/values-et/translations.xml
index 53aede1bb2..73847bcb43 100644
--- a/features/location/impl/src/main/res/values-et/translations.xml
+++ b/features/location/impl/src/main/res/values-et/translations.xml
@@ -1,4 +1,6 @@
+ "Sinu reaalajas jagatud asukoha ajalugu salvestub siin jututoas ja see on liikmetele nähtav ka pärast jagamissessiooni lõppu."
"Vali, kui kaua tahad oma reaalajas jagada."
+ "Sul pole õigust jagada selles jututoas oma asukohta reaalajas"
diff --git a/features/location/impl/src/main/res/values-ro/translations.xml b/features/location/impl/src/main/res/values-ro/translations.xml
new file mode 100644
index 0000000000..85e665647a
--- /dev/null
+++ b/features/location/impl/src/main/res/values-ro/translations.xml
@@ -0,0 +1,6 @@
+
+
+ "Istoricul locațiilor dumneavoastră va fi stocat în cameră și va fi vizibil pentru membri după încheierea sesiunii."
+ "Alegeți cât timp doriți să vă partajați locația în timp real."
+ "Nu aveți permisiunea de a vă partaja locația în această cameră."
+
diff --git a/features/location/impl/src/main/res/values-zh/translations.xml b/features/location/impl/src/main/res/values-zh/translations.xml
index 563bba593f..86f2f2a9da 100644
--- a/features/location/impl/src/main/res/values-zh/translations.xml
+++ b/features/location/impl/src/main/res/values-zh/translations.xml
@@ -1,6 +1,6 @@
- "你实时位置历史将存储在房间中,并于会话结束后对其他成员可见。"
+ "你的实时位置历史将存储在房间中,并于会话结束后对其他成员可见。"
"选择共享实时位置的时长。"
"你无权在此房内共享实时位置。"
diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/DefaultShareLocationEntryPointTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/DefaultShareLocationEntryPointTest.kt
index 9b1a14fb51..6f20e296d9 100644
--- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/DefaultShareLocationEntryPointTest.kt
+++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/DefaultShareLocationEntryPointTest.kt
@@ -17,7 +17,6 @@ import io.element.android.features.location.impl.live.LiveLocationStore
import io.element.android.features.location.test.FakeActiveLiveLocationShareManager
import io.element.android.features.messages.test.FakeMessageComposerContext
import io.element.android.libraries.dateformatter.test.FakeDurationFormatter
-import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.core.aBuildMeta
@@ -50,7 +49,6 @@ class DefaultShareLocationEntryPointTest {
messageComposerContext = FakeMessageComposerContext(),
locationActions = FakeLocationActions(),
buildMeta = aBuildMeta(),
- featureFlagService = FakeFeatureFlagService(),
client = FakeMatrixClient(),
durationFormatter = FakeDurationFormatter(),
liveLocationShareManager = FakeActiveLiveLocationShareManager(),
diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenterTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenterTest.kt
index dff5f05ee9..1bc4fce586 100644
--- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenterTest.kt
+++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/share/ShareLocationPresenterTest.kt
@@ -29,8 +29,6 @@ import io.element.android.features.location.impl.live.LiveLocationStore
import io.element.android.features.location.test.FakeActiveLiveLocationShareManager
import io.element.android.features.messages.test.FakeMessageComposerContext
import io.element.android.libraries.dateformatter.test.FakeDurationFormatter
-import io.element.android.libraries.featureflag.api.FeatureFlags
-import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
@@ -77,7 +75,6 @@ class ShareLocationPresenterTest {
private val fakeMessageComposerContext = FakeMessageComposerContext()
private val fakeLocationActions = FakeLocationActions()
private val fakeBuildMeta = aBuildMeta(applicationName = "app name")
- private val fakeFeatureFlagService = FakeFeatureFlagService()
private val fakeMatrixClient = FakeMatrixClient(sessionId = A_USER_ID)
private val durationFormatter = FakeDurationFormatter()
@@ -96,7 +93,6 @@ class ShareLocationPresenterTest {
messageComposerContext = fakeMessageComposerContext,
locationActions = locationActions,
buildMeta = fakeBuildMeta,
- featureFlagService = fakeFeatureFlagService,
client = fakeMatrixClient,
durationFormatter = durationFormatter,
liveLocationShareManager = liveLocationShareManager,
@@ -658,21 +654,7 @@ class ShareLocationPresenterTest {
}
@Test
- fun `canShareLiveLocation is false when the feature is disabled`() = runTest {
- fakeFeatureFlagService.setFeatureEnabled(FeatureFlags.LiveLocationSharing, false)
- val shareLocationPresenter = createShareLocationPresenter(
- timelineMode = Timeline.Mode.Live,
- )
- shareLocationPresenter.test {
- skipItems(1)
- val state = awaitItem()
- assertThat(state.canShareLiveLocation).isFalse()
- }
- }
-
- @Test
- fun `canShareLiveLocation is true when the feature is enabled`() = runTest {
- fakeFeatureFlagService.setFeatureEnabled(FeatureFlags.LiveLocationSharing, true)
+ fun `canShareLiveLocation is true in live timeline`() = runTest {
val shareLocationPresenter = createShareLocationPresenter(
timelineMode = Timeline.Mode.Live,
)
@@ -685,7 +667,6 @@ class ShareLocationPresenterTest {
@Test
fun `canShareLiveLocation is false in thread timeline`() = runTest {
- fakeFeatureFlagService.setFeatureEnabled(FeatureFlags.LiveLocationSharing, true)
val shareLocationPresenter = createShareLocationPresenter(
timelineMode = Timeline.Mode.Thread(A_THREAD_ID),
)
diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt
index 7ac42feda6..49d299b3f9 100644
--- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt
+++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt
@@ -43,7 +43,7 @@ class DefaultLockScreenService(
private val coroutineScope: CoroutineScope,
private val sessionObserver: SessionObserver,
private val appForegroundStateService: AppForegroundStateService,
- biometricAuthenticatorManager: BiometricAuthenticatorManager,
+ private val biometricAuthenticatorManager: BiometricAuthenticatorManager,
) : LockScreenService {
private val _lockState = MutableStateFlow(LockScreenLockState.Unlocked)
override val lockState: StateFlow = _lockState
@@ -81,6 +81,7 @@ class DefaultLockScreenService(
override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) {
if (wasLastSession) {
pinCodeManager.deletePinCode()
+ biometricAuthenticatorManager.disable()
}
}
})
diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticatorManager.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticatorManager.kt
index 9917845725..2ea0ed7d05 100644
--- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticatorManager.kt
+++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/BiometricAuthenticatorManager.kt
@@ -24,6 +24,11 @@ interface BiometricAuthenticatorManager {
fun addCallback(callback: BiometricAuthenticator.Callback)
fun removeCallback(callback: BiometricAuthenticator.Callback)
+ /**
+ * Disable using the biometric unlock feature and remove any data associated with it.
+ */
+ suspend fun disable()
+
/**
* Remember a biometric authenticator ready for unlocking the app.
*/
diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt
index 8bb044fd06..117323ec0a 100644
--- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt
+++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt
@@ -80,10 +80,7 @@ class DefaultBiometricAuthenticatorManager(
private val internalCallback = object : DefaultBiometricUnlockCallback() {
override fun onBiometricSetupError() {
- coroutineScope.launch {
- lockScreenStore.setIsBiometricUnlockAllowed(false)
- secretKeyRepository.deleteKey(SECRET_KEY_ALIAS)
- }
+ coroutineScope.launch { disable() }
}
}
@@ -120,6 +117,11 @@ class DefaultBiometricAuthenticatorManager(
)
}
+ override suspend fun disable() {
+ lockScreenStore.setIsBiometricUnlockAllowed(false)
+ secretKeyRepository.deleteKey(SECRET_KEY_ALIAS)
+ }
+
@Composable
private fun rememberBiometricAuthenticator(
isAvailable: Boolean,
diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManager.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManager.kt
index 2bda5759a8..d699357933 100644
--- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManager.kt
+++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/pin/DefaultPinCodeManager.kt
@@ -16,6 +16,10 @@ import io.element.android.libraries.cryptography.api.EncryptionDecryptionService
import io.element.android.libraries.cryptography.api.EncryptionResult
import io.element.android.libraries.cryptography.api.SecretKeyRepository
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.sync.Mutex
+import kotlinx.coroutines.sync.withLock
import java.util.concurrent.CopyOnWriteArrayList
internal const val SECRET_KEY_ALIAS = "elementx.SECRET_KEY_ALIAS_PIN_CODE"
@@ -29,6 +33,8 @@ class DefaultPinCodeManager(
) : PinCodeManager {
private val callbacks = CopyOnWriteArrayList()
+ private val migrationMutex = Mutex()
+
override fun addCallback(callback: PinCodeManager.Callback) {
callbacks.add(callback)
}
@@ -39,6 +45,15 @@ class DefaultPinCodeManager(
override fun hasPinCode(): Flow {
return secretKeyRepository.hasKey(SECRET_KEY_ALIAS)
+ .onStart {
+ migrationMutex.withLock {
+ val hasKey = secretKeyRepository.hasKey(SECRET_KEY_ALIAS).first()
+ if (hasKey && lockScreenStore.getEncryptedCode() == null) {
+ // Remove the key if there is no pin code
+ secretKeyRepository.deleteKey(SECRET_KEY_ALIAS)
+ }
+ }
+ }
}
override suspend fun getPinCodeSize(): Int? {
diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt
index 83a0253f39..17a0213f63 100644
--- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt
+++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt
@@ -59,6 +59,7 @@ class LockScreenSettingsPresenter(
if (showRemovePinConfirmation) {
showRemovePinConfirmation = false
pinCodeManager.deletePinCode()
+ biometricAuthenticatorManager.disable()
}
}
}
diff --git a/features/lockscreen/impl/src/main/res/values-et/translations.xml b/features/lockscreen/impl/src/main/res/values-et/translations.xml
index ac25914f8c..7137c09b60 100644
--- a/features/lockscreen/impl/src/main/res/values-et/translations.xml
+++ b/features/lockscreen/impl/src/main/res/values-et/translations.xml
@@ -34,5 +34,5 @@ Vali midagi, mis hästi meelde jääb. Kui unustad selle PIN-koodi, siis turvaka
"Kasuta biomeetriat"
"Kasuta PIN-koodi"
- "Logime välja…"
+ "Eemaldan seadet…"
diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticatorManager.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticatorManager.kt
index 9e9b892582..0ae8552334 100644
--- a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticatorManager.kt
+++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/biometric/FakeBiometricAuthenticatorManager.kt
@@ -15,6 +15,7 @@ class FakeBiometricAuthenticatorManager(
override var isDeviceSecured: Boolean = true,
override var hasAvailableAuthenticator: Boolean = false,
private val createBiometricAuthenticator: () -> BiometricAuthenticator = { FakeBiometricAuthenticator() },
+ private val disableLambda: suspend () -> Unit = { },
) : BiometricAuthenticatorManager {
override fun addCallback(callback: BiometricAuthenticator.Callback) {
// no-op
@@ -37,4 +38,8 @@ class FakeBiometricAuthenticatorManager(
createBiometricAuthenticator()
}
}
+
+ override suspend fun disable() {
+ disableLambda()
+ }
}
diff --git a/features/login/impl/build.gradle.kts b/features/login/impl/build.gradle.kts
index e739beb20a..86a8e0e7bc 100644
--- a/features/login/impl/build.gradle.kts
+++ b/features/login/impl/build.gradle.kts
@@ -60,7 +60,6 @@ dependencies {
implementation(projects.libraries.core)
implementation(projects.libraries.androidutils)
implementation(projects.libraries.architecture)
- implementation(projects.libraries.featureflag.api)
implementation(projects.libraries.matrix.api)
implementation(projects.libraries.matrix.api)
implementation(projects.libraries.designsystem)
@@ -81,7 +80,6 @@ dependencies {
testImplementation(projects.features.login.test)
testImplementation(projects.features.enterprise.test)
testImplementation(projects.features.preferences.test)
- testImplementation(projects.libraries.featureflag.test)
testImplementation(projects.libraries.matrix.test)
testImplementation(projects.libraries.oauth.test)
testImplementation(projects.libraries.permissions.test)
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/classic/ElementClassicConnection.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/classic/ElementClassicConnection.kt
index c928c05239..dfddd1d496 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/classic/ElementClassicConnection.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/classic/ElementClassicConnection.kt
@@ -28,8 +28,6 @@ import io.element.android.libraries.androidutils.service.ServiceBinder
import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.core.uri.ensureProtocol
import io.element.android.libraries.di.annotations.AppCoroutineScope
-import io.element.android.libraries.featureflag.api.FeatureFlagService
-import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.auth.ElementClassicSession
import io.element.android.libraries.matrix.api.auth.HomeServerLoginCompatibilityChecker
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
@@ -71,7 +69,6 @@ class DefaultElementClassicConnection(
private val coroutineScope: CoroutineScope,
private val matrixAuthenticationService: MatrixAuthenticationService,
private val homeServerLoginCompatibilityChecker: HomeServerLoginCompatibilityChecker,
- private val featureFlagService: FeatureFlagService,
) : ElementClassicConnection {
// Messenger for communicating with the service.
private var messenger: Messenger? = null
@@ -119,10 +116,6 @@ class DefaultElementClassicConnection(
override fun start() {
Timber.tag(loggerTag.value).d("start()")
coroutineScope.launch {
- if (!featureFlagService.isFeatureEnabled(FeatureFlags.SignInWithClassic)) {
- Timber.tag(loggerTag.value).d("Login with Element Classic is disabled, not starting connection")
- return@launch
- }
// Establish a connection with the service. We use an explicit
// class name because there is no reason to be able to let other
// applications replace our component.
@@ -158,11 +151,6 @@ class DefaultElementClassicConnection(
override fun requestSession() {
Timber.tag(loggerTag.value).d("requestSession()")
coroutineScope.launch {
- if (!featureFlagService.isFeatureEnabled(FeatureFlags.SignInWithClassic)) {
- Timber.tag(loggerTag.value).d("Login with Element Classic is disabled")
- emitState(ElementClassicConnectionState.Error("The feature is disabled"))
- return@launch
- }
val finalMessenger = messenger
if (finalMessenger == null) {
Timber.tag(loggerTag.value).d("The messenger is null, can't request data")
diff --git a/features/login/impl/src/main/res/values-cs/translations.xml b/features/login/impl/src/main/res/values-cs/translations.xml
index c5887de6c6..3181e823bb 100644
--- a/features/login/impl/src/main/res/values-cs/translations.xml
+++ b/features/login/impl/src/main/res/values-cs/translations.xml
@@ -28,7 +28,7 @@
"Jaká je adresa vašeho serveru?"
"Vyberte váš server"
"Vytvořit účet"
- "Tento účet byl deaktivován."
+ "Tento účet byl smazán."
"Nesprávné uživatelské jméno nebo heslo"
"Toto není platný identifikátor uživatele. Očekávaný formát: \'@user:homeserver.org\'"
"Tento server je nakonfigurován tak, aby používal obnovovací tokeny. Ty nejsou podporovány při použití přihlašovacích údajů založených na hesle."
diff --git a/features/login/impl/src/main/res/values-et/translations.xml b/features/login/impl/src/main/res/values-et/translations.xml
index b0b60009d4..dc37ed3e38 100644
--- a/features/login/impl/src/main/res/values-et/translations.xml
+++ b/features/login/impl/src/main/res/values-et/translations.xml
@@ -28,7 +28,7 @@
"Mis on sinu koduserveri aadress?"
"Vali oma server"
"Loo kasutajakonto"
- "Konto on kasutusest eemaldatud."
+ "See kasutajakonto on kustutatud."
"Vigane kasutajanimi ja/või salasõna"
"See ei ole korrektne kasutajanimi. Õige vorming on: „@kasutaja:koduserver.ee“"
"See server on seadistatud kasutama tunnusloa põhist sisselogimist. Salasõnaga sisselogimisel see võimalus aga ei ole toetatud."
@@ -39,7 +39,13 @@
"Logi sisse serverisse %1$s"
"Ava Element Classic"
"Ava Element Classic oma seadmes"
+ "Ava „Seadistused“ → „Turvalisus ja privaatsus“"
+ "Krüptovõtmete halduses vali „Krüptitud sõnumite taastamine“"
+ "Võtmehoidla kasutuselevõtmiseks palun järgi juhendit"
+ "Tule tagasi rakendusse %1$s"
+ "Enne jätkamist rakenduses %1$s võta oma võtmehoidla kasutusele"
"Versioon %1$s"
+ "Kontrollin kasutajakontot"
"Logi sisse käsitsi"
"Logi sisse serverisse %1$s"
"Logi sisse QR-koodi alusel"
diff --git a/features/login/impl/src/main/res/values-ro/translations.xml b/features/login/impl/src/main/res/values-ro/translations.xml
index ec9b260208..b44242abf8 100644
--- a/features/login/impl/src/main/res/values-ro/translations.xml
+++ b/features/login/impl/src/main/res/values-ro/translations.xml
@@ -28,7 +28,7 @@
"Care este adresa serverului dumneavoastră?"
"Selectați serverul dumneavoastra"
"Creați un cont"
- "Acest cont a fost dezactivat."
+ "Acest cont a fost șters."
"Utilizator și/sau parolă incorecte"
"Acesta nu este un identificator de utilizator valid. Format așteptat: „@user:homeserver.org”"
"Acest server este configurat pentru a utiliza token-uri de reîmprospătare. Acestea nu sunt acceptate atunci când utilizați autentificare bazată pe parolă."
@@ -37,11 +37,20 @@
"Matrix este o rețea deschisă pentru o comunicare sigură și descentralizată."
"Bine ați revenit!"
"Conectați-vă la %1$s"
+ "Deschideți Element Clasic"
+ "Deschideți Element Classic pe dispozitivul dumneavoastră"
+ "Accesați Setări > Securitate și confidențialitate"
+ "În Gestionarea cheilor criptografice, selectați Recuperarea mesajelor criptate"
+ "Urmați instrucțiunile pentru a activa stocarea cheilor"
+ "Reveniți la %1$s"
+ "Activați stocarea cheilor înainte de a continua către %1$s"
"Versiunea %1$s"
+ "Se verifică contul…"
"Conectați-vă manual"
"Conectați-vă la %1$s"
"Conectați-vă cu un cod QR"
"Creați un cont"
+ "Bine ați revenit"
"Bine ați venit la cel mai rapid %1$s din toate timpurile. Supraalimentat pentru viteză și simplitate."
"Bun venit în %1$s. Supraalimentat, pentru viteză și simplitate."
"Fii în Elementul tău"
@@ -60,6 +69,8 @@
"Cererea de autentificare a fost anulată"
"Autentificarea a fost refuzată pe celălalt dispozitiv."
"Autentificarea a fost refuzată"
+ "Nu trebuie să faceți nimic altceva."
+ "Celălalt dispozitiv este deja conectat"
"Autentificarea a expirat. Vă rugăm să încercați din nou."
"Autentificarea nu a fost finalizată la timp"
"Celălalt dispozitiv nu acceptă autentificarea la %s cu un cod QR.
diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/classic/DefaultElementClassicConnectionTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/classic/DefaultElementClassicConnectionTest.kt
index 5da3c97f3c..8ea1b2e3d3 100644
--- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/classic/DefaultElementClassicConnectionTest.kt
+++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/classic/DefaultElementClassicConnectionTest.kt
@@ -15,9 +15,6 @@ import androidx.core.graphics.createBitmap
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.androidutils.service.ServiceBinder
-import io.element.android.libraries.featureflag.api.FeatureFlagService
-import io.element.android.libraries.featureflag.api.FeatureFlags
-import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.auth.ElementClassicSession
import io.element.android.libraries.matrix.api.auth.HomeServerLoginCompatibilityChecker
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
@@ -112,21 +109,6 @@ class DefaultElementClassicConnectionTest {
}
}
- @Test
- fun `requestSession when the feature is disabled emits an error`() = runTest {
- val connection = createDefaultElementClassicConnection(
- matrixAuthenticationService = FakeMatrixAuthenticationService(
- setElementClassicSessionResult = {},
- ),
- isFeatureEnabled = false,
- )
- connection.stateFlow.test {
- assertThat(awaitItem()).isEqualTo(ElementClassicConnectionState.Idle)
- connection.requestSession()
- assertThat(awaitItem()).isInstanceOf(ElementClassicConnectionState.Error::class.java)
- }
- }
-
@Test
fun `when an error is received, an error is emitted`() = runTest {
val connection = createDefaultElementClassicConnection(
@@ -514,17 +496,10 @@ class DefaultElementClassicConnectionTest {
homeServerLoginCompatibilityChecker: HomeServerLoginCompatibilityChecker = FakeHomeServerLoginCompatibilityChecker(
checkResult = { Result.success(true) }
),
- isFeatureEnabled: Boolean = true,
- featureFlagService: FeatureFlagService = FakeFeatureFlagService(
- initialState = mapOf(
- FeatureFlags.SignInWithClassic.key to isFeatureEnabled,
- )
- ),
) = DefaultElementClassicConnection(
serviceBinder = serviceBinder,
coroutineScope = coroutineScope,
matrixAuthenticationService = matrixAuthenticationService,
homeServerLoginCompatibilityChecker = homeServerLoginCompatibilityChecker,
- featureFlagService = featureFlagService,
)
}
diff --git a/features/logout/impl/src/main/res/values-et/translations.xml b/features/logout/impl/src/main/res/values-et/translations.xml
index ee5a2ce9d0..cd29e13354 100644
--- a/features/logout/impl/src/main/res/values-et/translations.xml
+++ b/features/logout/impl/src/main/res/values-et/translations.xml
@@ -1,18 +1,18 @@
- "Kas sa oled kindel, et soovid välja logida?"
+ "Kas sa oled kindel, et soovid selle seadme eemaldada?"
"Eemalda see seade"
"Eemalda see seade"
- "Logime välja…"
- "Oled oma viimasest seansist välja logimas. Kui logid nüüd välja, kaotad ligipääsu oma krüptitud sõnumitele."
- "Sa oled varukoopiate tegemise välja lülitanud"
- "Kui su võrguühendus katkes, siis sinu krüptovõtmed oli parasjagu varundamisel. Loo võrguühendus uuesti, oota kuni krüptovõtmete varundamine lõppeb ja alles siis logi rakendusest välja."
+ "Eemaldan seadet…"
+ "See on sinu ainus seade. Kui sa selle eemaldad, vajad taastamisvõtit, et kinnitada oma digitaalset identiteeti ja taastada järgmisel sisselogimisel oma krüptitud vestlused."
+ "Sa kaotad peagi juurdepääsu oma krüptitud vestlustele"
+ "Kui su võrguühendus katkes, siis sinu krüptovõtmed oli parasjagu varundamisel. Loo võrguühendus uuesti, oota kuni krüptovõtmete varundamine lõppeb ja alles siis eemalda see seade."
"Sinu krüptovõtmed on veel varundamisel"
- "Enne väljalogimist palun oota, et pooleliolev toiming lõppeb."
+ "Enne selle seadme eemaldamist palun oota, et pooleliolev toiming lõppeb."
"Sinu krüptovõtmed on veel varundamisel"
"Eemalda see seade"
- "Sa oled logimas välja oma viimasest sessioonist. Kui teed seda nüüd, siis kaotad ligipääsu oma krüptitud sõnumitele."
+ "See on sinu ainus seade. Kui sa selle eemaldad, vajad taastamisvõtit, et kinnitada oma digitaalset identiteeti ja taastada järgmisel sisselogimisel oma krüptitud vestlused."
"Andmete taastamine on seadistamata"
"Sa oled logimas välja oma viimasest sessioonist. Kui teed seda nüüd, siis ilmselt kaotad ligipääsu oma krüptitud sõnumitele."
- "Kas sa oled oma taastevõtme salvestanud?"
+ "Enne selle seadme eemaldamist veendu, et sul on juurdepääs taastevõtmele"
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/Attachment.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/Attachment.kt
index d989b34ab3..73fa55228d 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/Attachment.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/Attachment.kt
@@ -16,5 +16,12 @@ import kotlinx.parcelize.Parcelize
@Immutable
sealed interface Attachment : Parcelable {
@Parcelize
- data class Media(val localMedia: LocalMedia) : Attachment
+ data class Media(
+ val localMedia: LocalMedia,
+ // When true, the media was picked through the "Files" picker and should be
+ // uploaded without image recompression; videos still use the highest available
+ // / best-fit preset rather than an additional size-reduction optimization pass.
+ // See https://github.com/element-hq/element-x-android/issues/6365
+ val sendAsFile: Boolean = false,
+ ) : Attachment
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt
index 8e92e53f6a..fc7f3034a6 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt
@@ -23,6 +23,8 @@ import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject
import io.element.android.features.messages.impl.attachments.Attachment
import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorPresenter
+import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState
+import io.element.android.features.messages.impl.attachments.video.VideoCompressionPresetSelector
import io.element.android.libraries.androidutils.file.TemporaryUriDeleter
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.androidutils.hash.hash
@@ -61,6 +63,7 @@ class AttachmentsPreviewPresenter(
private val permalinkBuilder: PermalinkBuilder,
private val temporaryUriDeleter: TemporaryUriDeleter,
private val mediaOptimizationSelectorPresenterFactory: MediaOptimizationSelectorPresenter.Factory,
+ private val videoCompressionPresetSelector: VideoCompressionPresetSelector,
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
private val dispatchers: CoroutineDispatchers,
private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider,
@@ -96,7 +99,10 @@ class AttachmentsPreviewPresenter(
val mediaAttachment = attachment as Attachment.Media
val mediaOptimizationSelectorPresenter = remember {
- mediaOptimizationSelectorPresenterFactory.create(mediaAttachment.localMedia)
+ mediaOptimizationSelectorPresenterFactory.create(
+ localMedia = mediaAttachment.localMedia,
+ sendAsFile = mediaAttachment.sendAsFile,
+ )
}
val mediaOptimizationSelectorState by rememberUpdatedState(mediaOptimizationSelectorPresenter.present())
@@ -104,14 +110,25 @@ class AttachmentsPreviewPresenter(
var displayFileTooLargeError by remember { mutableStateOf(false) }
- LaunchedEffect(mediaOptimizationSelectorState.displayMediaSelectorViews) {
+ LaunchedEffect(
+ mediaOptimizationSelectorState.displayMediaSelectorViews,
+ mediaOptimizationSelectorState.videoSizeEstimations,
+ ) {
// If the media optimization selector is not displayed, we can pre-process the media
// to prepare it for sending. This is done to avoid blocking the UI thread when the
// user clicks on the send button.
- if (mediaOptimizationSelectorState.displayMediaSelectorViews == false) {
- preprocessMediaJob = preProcessAttachment(
+ if (mediaOptimizationSelectorState.displayMediaSelectorViews == false && preprocessMediaJob == null) {
+ if (mediaAttachment.localMedia.info.mimeType.isMimeTypeVideo() && mediaOptimizationSelectorState.videoSizeEstimations.dataOrNull() == null) {
+ Timber.d("Waiting for video size estimations to be able to select the best video compression preset before pre-processing the media")
+ return@LaunchedEffect
+ }
+ val config = getAutoPreprocessMediaOptimizationConfig(
+ mediaAttachment = mediaAttachment,
+ mediaOptimizationSelectorState = mediaOptimizationSelectorState,
+ ) ?: return@LaunchedEffect
+ preprocessMediaJob = coroutineScope.preProcessAttachment(
attachment = attachment,
- mediaOptimizationConfig = mediaOptimizationConfigProvider.get(),
+ mediaOptimizationConfig = config,
displayProgress = false,
sendActionState = sendActionState,
)
@@ -233,6 +250,28 @@ class AttachmentsPreviewPresenter(
)
}
+ private suspend fun getAutoPreprocessMediaOptimizationConfig(
+ mediaAttachment: Attachment.Media,
+ mediaOptimizationSelectorState: MediaOptimizationSelectorState,
+ ): MediaOptimizationConfig? {
+ return if (mediaAttachment.sendAsFile) {
+ // If we're sending the media as a file, we can skip image compression and we should select the highest video compression preset that still fits
+ // the upload limit (if the estimations are available)
+ val videoCompressionPreset = videoCompressionPresetSelector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = mediaOptimizationSelectorState.videoSizeEstimations,
+ ).dataOrNull() ?: VideoCompressionPreset.HIGH
+
+ MediaOptimizationConfig(
+ compressImages = false,
+ videoCompressionPreset = videoCompressionPreset,
+ )
+ } else {
+ // Otherwise, we just rely on the user preferences for media optimization
+ mediaOptimizationConfigProvider.get()
+ }
+ }
+
private fun CoroutineScope.preProcessAttachment(
attachment: Attachment,
mediaOptimizationConfig: MediaOptimizationConfig,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt
index c81c306f90..abc0264b2f 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenter.kt
@@ -37,9 +37,11 @@ import kotlin.math.roundToLong
@AssistedInject
class DefaultMediaOptimizationSelectorPresenter(
@Assisted private val localMedia: LocalMedia,
+ @Assisted private val sendAsFile: Boolean,
private val maxUploadSizeProvider: MaxUploadSizeProvider,
private val featureFlagService: FeatureFlagService,
private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider,
+ private val videoCompressionPresetSelector: VideoCompressionPresetSelector,
mediaExtractorFactory: VideoMetadataExtractor.Factory,
) : MediaOptimizationSelectorPresenter {
@ContributesBinding(SessionScope::class)
@@ -47,6 +49,7 @@ class DefaultMediaOptimizationSelectorPresenter(
interface Factory : MediaOptimizationSelectorPresenter.Factory {
override fun create(
localMedia: LocalMedia,
+ sendAsFile: Boolean,
): DefaultMediaOptimizationSelectorPresenter
}
@@ -55,7 +58,9 @@ class DefaultMediaOptimizationSelectorPresenter(
@Composable
override fun present(): MediaOptimizationSelectorState {
val displayMediaSelectorViews by produceState(null) {
- value = featureFlagService.isFeatureEnabled(FeatureFlags.SelectableMediaQuality)
+ // When sending as a raw file, never show the optimization selector: images skip
+ // recompression, while videos use the highest available best-fit preset.
+ value = !sendAsFile && featureFlagService.isFeatureEnabled(FeatureFlags.SelectableMediaQuality)
}
var displayVideoPresetSelectorDialog by remember { mutableStateOf(false) }
@@ -123,12 +128,23 @@ class DefaultMediaOptimizationSelectorPresenter(
var selectedVideoOptimizationPreset by remember { mutableStateOf>(AsyncData.Loading()) }
LaunchedEffect(videoSizeEstimations.dataOrNull()) {
+ if (sendAsFile) {
+ // Send-as-file path: pin to no image compression, and pick the highest-quality
+ // video preset that still fits the upload limit (we have no true "do not re-encode
+ // video" path in the pre-processor right now).
+ selectedImageOptimization = AsyncData.Success(false)
+ selectedVideoOptimizationPreset = videoCompressionPresetSelector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = videoSizeEstimations,
+ )
+ return@LaunchedEffect
+ }
val mediaOptimizationConfig = mediaOptimizationConfigProvider.get()
selectedImageOptimization = AsyncData.Success(mediaOptimizationConfig.compressImages)
// Find the best video preset based on the default preset and the video size estimations
// Since the estimation for the current preset may be way too large to upload, we check the ones that provide lower file sizes
- selectedVideoOptimizationPreset = findBestVideoPreset(
- defaultVideoPreset = mediaOptimizationConfig.videoCompressionPreset,
+ selectedVideoOptimizationPreset = videoCompressionPresetSelector.selectBestVideoPreset(
+ expectedVideoPreset = mediaOptimizationConfig.videoCompressionPreset,
videoSizeEstimations = videoSizeEstimations,
)
}
@@ -176,20 +192,4 @@ class DefaultMediaOptimizationSelectorPresenter(
eventSink = ::handleEvent,
)
}
-
- private fun findBestVideoPreset(
- defaultVideoPreset: VideoCompressionPreset,
- videoSizeEstimations: AsyncData>,
- ): AsyncData {
- val estimations = videoSizeEstimations.dataOrNull() ?: return AsyncData.Loading()
- // This will find the best video preset that can be used to produce a video that can be uploaded
- val bestEstimation = estimations.find { it.preset.ordinal >= defaultVideoPreset.ordinal && it.canUpload }?.preset
- return if (bestEstimation != null) {
- AsyncData.Success(bestEstimation)
- } else {
- AsyncData.Failure(
- IllegalStateException("No suitable video preset found for default preset: $defaultVideoPreset")
- )
- }
- }
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt
index 80cdfd9467..f1e17ef0a6 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/MediaOptimizationSelectorPresenter.kt
@@ -15,6 +15,7 @@ fun interface MediaOptimizationSelectorPresenter : Presenter>,
+ ): AsyncData {
+ val estimations = videoSizeEstimations.dataOrNull() ?: return AsyncData.Loading()
+ val bestEstimation = estimations.find { it.preset.ordinal >= expectedVideoPreset.ordinal && it.canUpload }?.preset
+ return if (bestEstimation != null) {
+ AsyncData.Success(bestEstimation)
+ } else {
+ AsyncData.Failure(
+ IllegalStateException("No suitable video preset found for expected preset: $expectedVideoPreset")
+ )
+ }
+ }
+}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt
index a6945b5ebe..b0ff50dc72 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/video/VideoMetadataExtractor.kt
@@ -30,7 +30,6 @@ interface VideoMetadataExtractor : AutoCloseable {
}
}
-@ContributesBinding(AppScope::class)
@AssistedInject
class DefaultVideoMetadataExtractor(
@ApplicationContext private val context: Context,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
index d93fe0ee86..e226318345 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
@@ -179,7 +179,7 @@ class MessageComposerPresenter(
handlePickedMedia(uri, mimeType)
}
val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri, mimeType ->
- handlePickedMedia(uri, mimeType ?: MimeTypes.OctetStream)
+ handlePickedMedia(uri, mimeType ?: MimeTypes.OctetStream, sendAsFile = true)
}
val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker { uri ->
handlePickedMedia(uri, MimeTypes.Jpeg)
@@ -571,7 +571,7 @@ class MessageComposerPresenter(
notificationConversationService.onSendMessage(
sessionId = room.sessionId,
roomId = roomInfo.id,
- roomName = roomInfo.name ?: roomInfo.id.value,
+ roomName = roomInfo.name,
roomIsDirect = roomInfo.isDm,
roomAvatarUrl = roomInfo.avatarUrl ?: roomMembers.getDirectRoomMember(roomInfo = roomInfo, sessionId = room.sessionId)?.avatarUrl,
)
@@ -605,6 +605,7 @@ class MessageComposerPresenter(
private fun handlePickedMedia(
uri: Uri?,
mimeType: String? = null,
+ sendAsFile: Boolean = false,
) {
uri ?: return
val localMedia = localMediaFactory.createFromUri(
@@ -613,7 +614,7 @@ class MessageComposerPresenter(
name = null,
formattedFileSize = null
)
- val mediaAttachment = Attachment.Media(localMedia)
+ val mediaAttachment = Attachment.Media(localMedia, sendAsFile = sendAsFile)
val inReplyToEventId = (messageComposerContext.composerMode as? MessageComposerMode.Reply)?.eventId
navigator.navigateToPreviewAttachments(persistentListOf(mediaAttachment), inReplyToEventId)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt
index 63ce48e100..be573fa92f 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt
@@ -67,7 +67,6 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.alias.matches
import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo
-import io.element.android.libraries.mediaplayer.api.MediaPlayer
import io.element.android.libraries.ui.utils.a11y.hasExternalKeyboard
import io.element.android.libraries.ui.utils.a11y.isTalkbackActive
import io.element.android.services.analytics.api.AnalyticsService
@@ -88,7 +87,6 @@ class ThreadedMessagesNode(
private val presenterFactory: MessagesPresenter.Factory,
private val actionListPresenterFactory: ActionListPresenter.Factory,
private val timelineItemPresenterFactories: TimelineItemPresenterFactories,
- private val mediaPlayer: MediaPlayer,
private val permalinkParser: PermalinkParser,
private val appNavigationStateService: AppNavigationStateService,
private val roomMemberModerationRenderer: RoomMemberModerationRenderer,
@@ -157,9 +155,6 @@ class ThreadedMessagesNode(
onStop = {
appNavigationStateService.onLeavingThread(id)
},
- onDestroy = {
- mediaPlayer.close()
- }
)
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/list/ThreadsListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/list/ThreadsListView.kt
index 1beabcd3fa..5e26d849a5 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/list/ThreadsListView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/list/ThreadsListView.kt
@@ -31,6 +31,9 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.heading
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -79,7 +82,18 @@ fun ThreadsListView(
topBar = {
TopAppBar(
title = {
- Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) {
+ val description = stringResource(
+ CommonStrings.a11y_threads_in_room,
+ state.roomName,
+ )
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier.clearAndSetSemantics {
+ heading()
+ contentDescription = description
+ },
+ ) {
Avatar(
avatarData = AvatarData(
id = state.roomId.value,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt
index dfd1b2ed0e..61273ff07a 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemCallNotifyView.kt
@@ -8,6 +8,7 @@
package io.element.android.features.messages.impl.timeline.components
+import androidx.annotation.StringRes
import androidx.compose.foundation.border
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
@@ -22,17 +23,19 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
+import io.element.android.features.messages.impl.timeline.aTimelineRoomInfo
import io.element.android.features.messages.impl.timeline.model.TimelineItem
+import io.element.android.features.messages.impl.timeline.model.event.RtcNotificationState
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
-import io.element.android.libraries.designsystem.components.avatar.Avatar
-import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.modifiers.onKeyboardContextMenuAction
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -42,6 +45,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable
internal fun TimelineItemCallNotifyView(
+ timelineRoomInfo: TimelineRoomInfo,
event: TimelineItem.Event,
content: TimelineItemRtcNotificationContent,
onLongClick: (TimelineItem.Event) -> Unit,
@@ -62,37 +66,22 @@ internal fun TimelineItemCallNotifyView(
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
- Avatar(
- avatarData = event.senderAvatar,
- avatarType = AvatarType.User,
+ Icon(
+ modifier = Modifier.size(20.sp.toDp()),
+ imageVector = getIcon(timelineRoomInfo, content),
+ contentDescription = null,
+ tint = ElementTheme.colors.iconSecondary,
)
- Column(modifier = Modifier.weight(1f)) {
- Text(
- text = event.safeSenderName,
- style = ElementTheme.typography.fontBodyLgMedium,
- maxLines = 1,
- overflow = TextOverflow.Ellipsis,
- )
- Row(
- horizontalArrangement = Arrangement.spacedBy(4.dp),
- verticalAlignment = Alignment.CenterVertically
- ) {
- Icon(
- modifier = Modifier.size(20.sp.toDp()),
- imageVector =
- if (content.callIntent == CallIntent.AUDIO) CompoundIcons.VoiceCallSolid() else CompoundIcons.VideoCallSolid(),
- contentDescription = null,
- tint = ElementTheme.colors.iconSecondary,
- )
- Text(
- text = stringResource(CommonStrings.common_call_started),
- style = ElementTheme.typography.fontBodyMdRegular,
- color = ElementTheme.colors.textSecondary,
- maxLines = 1,
- overflow = TextOverflow.Ellipsis,
- )
- }
- }
+
+ Text(
+ modifier = Modifier.weight(1f),
+ text = stringResource(getTextRes(timelineRoomInfo, content)),
+ style = ElementTheme.typography.fontBodyMdRegular,
+ color = ElementTheme.colors.textSecondary,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis,
+ )
+
Text(
text = event.sentTime,
style = ElementTheme.typography.fontBodyMdRegular,
@@ -103,19 +92,56 @@ internal fun TimelineItemCallNotifyView(
}
}
+@StringRes
+private fun getTextRes(
+ timelineRoomInfo: TimelineRoomInfo,
+ content: TimelineItemRtcNotificationContent
+): Int = if (timelineRoomInfo.isDm) {
+ when (content.state) {
+ is RtcNotificationState.Declined -> {
+ if (content.state.byMe) CommonStrings.common_call_you_declined else CommonStrings.common_call_declined
+ }
+ RtcNotificationState.Started -> CommonStrings.common_call_started
+ }
+} else {
+ // In Rooms, do not show declined info.
+ CommonStrings.common_call_started
+}
+
+@Composable
+private fun getIcon(
+ timelineRoomInfo: TimelineRoomInfo,
+ content: TimelineItemRtcNotificationContent
+): ImageVector {
+ val showAsDeclined = timelineRoomInfo.isDm && content.state is RtcNotificationState.Declined
+ val icon = if (showAsDeclined) {
+ if (content.callIntent == CallIntent.AUDIO) CompoundIcons.VoiceCallDeclinedSolid() else CompoundIcons.VideoCallDeclinedSolid()
+ } else {
+ if (content.callIntent == CallIntent.AUDIO) CompoundIcons.VoiceCallSolid() else CompoundIcons.VideoCallSolid()
+ }
+ return icon
+}
+
@PreviewsDayNight
@Composable
internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
- Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) {
- listOf(
- TimelineItemRtcNotificationContent(CallIntent.AUDIO),
- TimelineItemRtcNotificationContent(CallIntent.VIDEO),
- ).forEach { content ->
- TimelineItemCallNotifyView(
- event = aTimelineItemEvent(content = content),
- content = content,
- onLongClick = {},
- )
+ Column(modifier = Modifier.padding(2.dp), verticalArrangement = Arrangement.spacedBy(2.dp)) {
+ listOf(false, true).forEach { isDm ->
+ listOf(CallIntent.AUDIO, CallIntent.VIDEO).forEach { callIntent ->
+ listOf(
+ RtcNotificationState.Started,
+ RtcNotificationState.Declined(byMe = false),
+ RtcNotificationState.Declined(byMe = true),
+ ).forEach { state ->
+ val content = TimelineItemRtcNotificationContent(callIntent, state)
+ TimelineItemCallNotifyView(
+ timelineRoomInfo = aTimelineRoomInfo(isDm = isDm),
+ event = aTimelineItemEvent(content = content),
+ content = content,
+ onLongClick = {},
+ )
+ }
+ }
}
}
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt
index 842b7a08f5..a02413d534 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemRow.kt
@@ -125,6 +125,7 @@ internal fun TimelineItemRow(
is TimelineItemRtcNotificationContent -> {
TimelineItemCallNotifyView(
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp),
+ timelineRoomInfo = timelineRoomInfo,
event = timelineItem,
content = timelineItem.content,
onLongClick = onLongClick,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt
index 11f6668dfb..3b3e5118d6 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentFactory.kt
@@ -10,6 +10,7 @@ package io.element.android.features.messages.impl.timeline.factories.event
import dev.zacsweers.metro.Inject
import io.element.android.features.location.api.Location
+import io.element.android.features.messages.impl.timeline.model.event.RtcNotificationState
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLegacyCallInviteContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent
@@ -104,7 +105,12 @@ class TimelineItemContentFactory(
is PollContent -> pollFactory.create(eventId, isEditable, isOutgoing, itemContent)
is UnableToDecryptContent -> utdFactory.create(itemContent)
is CallNotifyContent -> TimelineItemRtcNotificationContent(
- itemContent.callIntent
+ callIntent = itemContent.callIntent,
+ state = if (itemContent.declinedBy.isEmpty()) {
+ RtcNotificationState.Started
+ } else {
+ RtcNotificationState.Declined(itemContent.declinedBy.any { it == sessionId })
+ }
)
is UnknownContent -> TimelineItemUnknownContent
is LiveLocationContent -> {
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRtcNotificationContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRtcNotificationContent.kt
index 53facfc675..2359f196a9 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRtcNotificationContent.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemRtcNotificationContent.kt
@@ -9,7 +9,19 @@
package io.element.android.features.messages.impl.timeline.model.event
import io.element.android.libraries.matrix.api.notification.CallIntent
+import io.element.android.libraries.matrix.api.timeline.item.event.EventType
-class TimelineItemRtcNotificationContent(val callIntent: CallIntent) : TimelineItemEventContent {
- override val type: String = "org.matrix.msc4075.rtc.notification"
+// State of the call, for now only isDeclined but in the future could be missed, active.
+sealed interface RtcNotificationState {
+ /** Some users have declined, byMe indicates if the current user is one of them. */
+ data class Declined(val byMe: Boolean) : RtcNotificationState
+
+ object Started : RtcNotificationState
+}
+
+class TimelineItemRtcNotificationContent(
+ val callIntent: CallIntent,
+ val state: RtcNotificationState,
+) : TimelineItemEventContent {
+ override val type: String = EventType.RTC_NOTIFICATION
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt
index 639092fc6c..4f023ad2bd 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt
@@ -80,7 +80,8 @@ internal fun MessagesViewTopBar(
Row(
modifier = Modifier
.clip(roundedCornerShape)
- .clickable { onRoomDetailsClick() },
+ .clickable { onRoomDetailsClick() }
+ .semantics { heading() },
horizontalArrangement = Arrangement.spacedBy(4.dp),
verticalAlignment = Alignment.CenterVertically,
) {
@@ -158,10 +159,7 @@ private fun RoomAvatarAndNameRow(
)
Text(
modifier = Modifier
- .padding(start = 8.dp)
- .semantics {
- heading()
- },
+ .padding(start = 8.dp),
text = roomName ?: stringResource(CommonStrings.common_no_room_name),
style = ElementTheme.typography.fontBodyLgMedium,
fontStyle = FontStyle.Italic.takeIf { roomName == null },
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/ThreadTopBar.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/ThreadTopBar.kt
index e73b6b19b7..5ef4541f06 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/ThreadTopBar.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/ThreadTopBar.kt
@@ -17,8 +17,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.heading
-import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -58,7 +59,18 @@ internal fun ThreadTopBar(
BackButton(onClick = onBackClick)
},
title = {
- Row(verticalAlignment = Alignment.CenterVertically) {
+ val name = roomName ?: stringResource(CommonStrings.common_no_room_name)
+ val description = stringResource(
+ CommonStrings.a11y_thread_in_room,
+ name,
+ )
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier.clearAndSetSemantics {
+ heading()
+ contentDescription = description
+ },
+ ) {
Avatar(
avatarData = roomAvatarData,
avatarType = AvatarType.Room(
@@ -69,17 +81,14 @@ internal fun ThreadTopBar(
Column(
modifier = Modifier
.fillMaxWidth()
- .padding(horizontal = 8.dp)
- .semantics {
- heading()
- },
+ .padding(horizontal = 8.dp),
) {
Text(
text = stringResource(CommonStrings.common_thread),
style = ElementTheme.typography.fontBodyLgMedium,
)
Text(
- text = roomName ?: stringResource(CommonStrings.common_no_room_name),
+ text = name,
style = ElementTheme.typography.fontBodySmRegular,
fontStyle = FontStyle.Italic.takeIf { roomName == null },
color = ElementTheme.colors.textSecondary,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt
index c48f2dae40..210e123595 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt
@@ -10,6 +10,7 @@ package io.element.android.features.messages.impl.utils.messagesummary
import android.content.Context
import dev.zacsweers.metro.ContributesBinding
+import io.element.android.features.messages.impl.timeline.model.event.RtcNotificationState
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemAudioContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent
@@ -56,7 +57,16 @@ class DefaultMessageSummaryFormatter(
is TimelineItemFileContent -> context.getString(CommonStrings.common_file)
is TimelineItemAudioContent -> context.getString(CommonStrings.common_audio)
is TimelineItemLegacyCallInviteContent -> context.getString(CommonStrings.common_unsupported_call)
- is TimelineItemRtcNotificationContent -> context.getString(CommonStrings.common_call_started)
+ is TimelineItemRtcNotificationContent -> when (content.state) {
+ is RtcNotificationState.Declined -> {
+ if (content.state.byMe) {
+ context.getString(CommonStrings.common_call_you_declined)
+ } else {
+ context.getString(CommonStrings.common_call_declined)
+ }
+ }
+ RtcNotificationState.Started -> context.getString(CommonStrings.common_call_started)
+ }
}
// Truncate the message to a safe length to avoid crashes in Compose
.toSafeLength()
diff --git a/features/messages/impl/src/main/res/values-cs/translations.xml b/features/messages/impl/src/main/res/values-cs/translations.xml
index 93ea0d8178..9bf1c5c079 100644
--- a/features/messages/impl/src/main/res/values-cs/translations.xml
+++ b/features/messages/impl/src/main/res/values-cs/translations.xml
@@ -1,7 +1,7 @@
"Odesílatel události se neshoduje s vlastníkem zařízení, které ji odeslalo."
- "Autenticitu této zašifrované zprávy nelze na tomto zařízení zaručit."
+ "Pravost této šifrované zprávy nelze na tomto zařízení zaručit."
"Zašifrováno dříve ověřeným uživatelem."
"Není zašifrováno."
"Šifrováno neznámým nebo smazaným zařízením."
diff --git a/features/messages/impl/src/main/res/values-et/translations.xml b/features/messages/impl/src/main/res/values-et/translations.xml
index 8da4d23f79..506b5ce195 100644
--- a/features/messages/impl/src/main/res/values-et/translations.xml
+++ b/features/messages/impl/src/main/res/values-et/translations.xml
@@ -35,7 +35,7 @@
"Salvesta video"
"Manus"
"Fotode ja videote galerii"
- "Asukoht"
+ "Jaga asukohta"
"Küsitlus"
"Tekstivorming"
"Sõnumite ajalugu pole hetkel saadaval"
diff --git a/features/messages/impl/src/main/res/values-pl/translations.xml b/features/messages/impl/src/main/res/values-pl/translations.xml
index 0085e1d4ee..efb84cd153 100644
--- a/features/messages/impl/src/main/res/values-pl/translations.xml
+++ b/features/messages/impl/src/main/res/values-pl/translations.xml
@@ -32,7 +32,7 @@
"Powód zgłoszenia treści"
"Kamera"
"Zrób zdjęcie"
- "Nagraj film"
+ "Nagraj wideo"
"Załącznik"
"Zdjęcia i filmy"
"Udostępnij lokalizację"
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt
index 8c7f290441..20b636081a 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt
@@ -17,6 +17,7 @@ import io.element.android.features.messages.impl.crypto.sendfailure.VerifiedUser
import io.element.android.features.messages.impl.fixtures.aMessageEvent
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
import io.element.android.features.messages.impl.timeline.model.TimelineItemThreadInfo
+import io.element.android.features.messages.impl.timeline.model.event.RtcNotificationState
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent
@@ -1169,7 +1170,7 @@ class ActionListPresenterTest {
val initialState = awaitItem()
val messageEvent = aMessageEvent(
isMine = true,
- content = TimelineItemRtcNotificationContent(callIntent = CallIntent.VIDEO),
+ content = TimelineItemRtcNotificationContent(callIntent = CallIntent.VIDEO, state = RtcNotificationState.Started),
)
initialState.eventSink.invoke(
ActionListEvent.ComputeForMessage(
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt
index 384b78471d..9a9dc08834 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt
@@ -17,6 +17,7 @@ import io.element.android.features.messages.impl.attachments.preview.Attachments
import io.element.android.features.messages.impl.attachments.preview.OnDoneListener
import io.element.android.features.messages.impl.attachments.preview.SendActionState
import io.element.android.features.messages.impl.attachments.video.MediaOptimizationSelectorState
+import io.element.android.features.messages.impl.attachments.video.VideoCompressionPresetSelector
import io.element.android.features.messages.impl.attachments.video.VideoUploadEstimation
import io.element.android.features.messages.impl.fixtures.aMediaAttachment
import io.element.android.features.messages.test.attachments.video.FakeMediaOptimizationSelectorPresenterFactory
@@ -45,6 +46,7 @@ import io.element.android.libraries.mediaupload.test.FakeMediaOptimizationConfig
import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor
import io.element.android.libraries.mediaviewer.api.aVideoMediaInfo
import io.element.android.libraries.mediaviewer.api.anApkMediaInfo
+import io.element.android.libraries.mediaviewer.api.anImageMediaInfo
import io.element.android.libraries.mediaviewer.api.local.LocalMedia
import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia
import io.element.android.libraries.preferences.api.store.VideoCompressionPreset
@@ -548,10 +550,87 @@ class AttachmentsPreviewPresenterTest {
}
}
+ @Test
+ fun `present - sendAsFile attachment is pre-processed without image compression`() = runTest {
+ // Even though the user has enabled "Optimize media quality" globally, picking the file
+ // through the Files picker (sendAsFile = true) must skip compression. Regression test
+ // for https://github.com/element-hq/element-x-android/issues/6365
+ val mediaPreProcessor = FakeMediaPreProcessor()
+ val presenter = createAttachmentsPreviewPresenter(
+ localMedia = aLocalMedia(mockMediaUrl, anImageMediaInfo()),
+ sendAsFile = true,
+ mediaPreProcessor = mediaPreProcessor,
+ // Selector views are hidden in the sendAsFile flow, which triggers the auto pre-process path.
+ displayMediaQualitySelectorViews = false,
+ mediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(
+ config = MediaOptimizationConfig(
+ compressImages = true,
+ videoCompressionPreset = VideoCompressionPreset.STANDARD,
+ )
+ ),
+ )
+
+ presenter.test {
+ consumeItemsUntilPredicate { mediaPreProcessor.processCallCount > 0 }
+ assertThat(mediaPreProcessor.lastMediaOptimizationConfig).isEqualTo(
+ MediaOptimizationConfig(
+ compressImages = false,
+ videoCompressionPreset = VideoCompressionPreset.HIGH,
+ )
+ )
+ }
+ }
+
+ @Test
+ fun `present - sendAsFile video is pre-processed with best fitting preset`() = runTest {
+ val mediaPreProcessor = FakeMediaPreProcessor()
+ val presenter = createAttachmentsPreviewPresenter(
+ localMedia = aLocalMedia(mockMediaUrl, aVideoMediaInfo()),
+ sendAsFile = true,
+ mediaPreProcessor = mediaPreProcessor,
+ // Selector views are hidden in the sendAsFile flow, which triggers the auto pre-process path.
+ displayMediaQualitySelectorViews = false,
+ mediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory {
+ MediaOptimizationSelectorState(
+ maxUploadSize = AsyncData.Success(250_000_000L),
+ videoSizeEstimations = AsyncData.Success(
+ persistentListOf(
+ VideoUploadEstimation(VideoCompressionPreset.HIGH, sizeInBytes = 513_216_000L, canUpload = false),
+ VideoUploadEstimation(VideoCompressionPreset.STANDARD, sizeInBytes = 228_096_000L, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.LOW, sizeInBytes = 57_024_000L, canUpload = true),
+ )
+ ),
+ isImageOptimizationEnabled = false,
+ selectedVideoPreset = VideoCompressionPreset.STANDARD,
+ displayMediaSelectorViews = false,
+ displayVideoPresetSelectorDialog = false,
+ eventSink = {},
+ )
+ },
+ mediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(
+ config = MediaOptimizationConfig(
+ compressImages = true,
+ videoCompressionPreset = VideoCompressionPreset.LOW,
+ )
+ ),
+ )
+
+ presenter.test {
+ consumeItemsUntilPredicate { mediaPreProcessor.processCallCount > 0 }
+ assertThat(mediaPreProcessor.lastMediaOptimizationConfig).isEqualTo(
+ MediaOptimizationConfig(
+ compressImages = false,
+ videoCompressionPreset = VideoCompressionPreset.STANDARD,
+ )
+ )
+ }
+ }
+
private fun TestScope.createAttachmentsPreviewPresenter(
localMedia: LocalMedia = aLocalMedia(
uri = mockMediaUrl,
),
+ sendAsFile: Boolean = false,
room: JoinedRoom = FakeJoinedRoom(),
timelineMode: Timeline.Mode = Timeline.Mode.Live,
permalinkBuilder: PermalinkBuilder = FakePermalinkBuilder(),
@@ -573,9 +652,10 @@ class AttachmentsPreviewPresenterTest {
}
),
mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(),
+ videoCompressionPresetSelector: VideoCompressionPresetSelector = VideoCompressionPresetSelector(),
): AttachmentsPreviewPresenter {
return AttachmentsPreviewPresenter(
- attachment = aMediaAttachment(localMedia),
+ attachment = aMediaAttachment(localMedia, sendAsFile = sendAsFile),
onDoneListener = onDoneListener,
mediaSenderFactory = MediaSenderFactory { timelineMode ->
DefaultMediaSender(
@@ -592,6 +672,7 @@ class AttachmentsPreviewPresenterTest {
sessionCoroutineScope = this,
dispatchers = testCoroutineDispatchers(),
mediaOptimizationSelectorPresenterFactory = mediaOptimizationSelectorPresenterFactory,
+ videoCompressionPresetSelector = videoCompressionPresetSelector,
timelineMode = timelineMode,
inReplyToEventId = null,
mediaOptimizationConfigProvider = mediaOptimizationConfigProvider,
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt
index 106fff7375..e06f4ad4cd 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/DefaultMediaOptimizationSelectorPresenterTest.kt
@@ -210,19 +210,88 @@ class DefaultMediaOptimizationSelectorPresenterTest {
}
}
+ @Test
+ fun `present - sendAsFile hides selector views and disables image compression for images`() = runTest {
+ val presenter = createDefaultMediaOptimizationSelectorPresenter(
+ localMedia = aLocalMedia(mockMediaUrl, anImageMediaInfo()),
+ // Even with the feature flag on, sendAsFile must hide the selector.
+ featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SelectableMediaQuality.key to true)),
+ // And it must override the user's "optimize images" preference.
+ mediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(),
+ sendAsFile = true,
+ )
+ presenter.test {
+ // Initial loading state
+ skipItems(1)
+ awaitItem().run {
+ assertThat(displayMediaSelectorViews).isFalse()
+ assertThat(isImageOptimizationEnabled).isFalse()
+ }
+ }
+ }
+
+ @Test
+ fun `present - sendAsFile picks HIGH video preset when the video fits the upload limit`() = runTest {
+ val presenter = createDefaultMediaOptimizationSelectorPresenter(
+ // Plenty of room: even HIGH preset will fit.
+ maxUploadSizeProvider = MaxUploadSizeProvider { Result.success(Long.MAX_VALUE) },
+ mediaExtractorFactory = FakeVideoMetadataExtractorFactory(
+ FakeVideoMetadataExtractor(
+ sizeResult = Result.success(Size(1920, 1080)),
+ duration = Result.success(10.minutes)
+ )
+ ),
+ sendAsFile = true,
+ )
+ presenter.test {
+ // Initial loading state, then the one with size estimations loaded.
+ skipItems(1)
+ awaitItem().run {
+ assertThat(displayMediaSelectorViews).isFalse()
+ assertThat(selectedVideoPreset).isEqualTo(VideoCompressionPreset.HIGH)
+ }
+ }
+ }
+
+ @Test
+ fun `present - sendAsFile picks lower video preset when HIGH exceeds the upload limit`() = runTest {
+ val presenter = createDefaultMediaOptimizationSelectorPresenter(
+ maxUploadSizeProvider = MaxUploadSizeProvider { Result.success(250_000_000L) },
+ mediaExtractorFactory = FakeVideoMetadataExtractorFactory(
+ FakeVideoMetadataExtractor(
+ sizeResult = Result.success(Size(1920, 1080)),
+ duration = Result.success(10.minutes)
+ )
+ ),
+ sendAsFile = true,
+ )
+ presenter.test {
+ // Initial loading state, then the one with size estimations loaded.
+ skipItems(1)
+ awaitItem().run {
+ assertThat(displayMediaSelectorViews).isFalse()
+ assertThat(selectedVideoPreset).isEqualTo(VideoCompressionPreset.STANDARD)
+ }
+ }
+ }
+
private fun createDefaultMediaOptimizationSelectorPresenter(
localMedia: LocalMedia = aLocalMedia(mockMediaUrl, aVideoMediaInfo()),
maxUploadSizeProvider: MaxUploadSizeProvider = MaxUploadSizeProvider { Result.success(1_000L) },
featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SelectableMediaQuality.key to true)),
mediaExtractorFactory: FakeVideoMetadataExtractorFactory = FakeVideoMetadataExtractorFactory(),
mediaOptimizationConfigProvider: FakeMediaOptimizationConfigProvider = FakeMediaOptimizationConfigProvider(),
+ videoCompressionPresetSelector: VideoCompressionPresetSelector = VideoCompressionPresetSelector(),
+ sendAsFile: Boolean = false,
): DefaultMediaOptimizationSelectorPresenter {
return DefaultMediaOptimizationSelectorPresenter(
localMedia = localMedia,
+ sendAsFile = sendAsFile,
maxUploadSizeProvider = maxUploadSizeProvider,
featureFlagService = featureFlagService,
mediaExtractorFactory = mediaExtractorFactory,
mediaOptimizationConfigProvider = mediaOptimizationConfigProvider,
+ videoCompressionPresetSelector = videoCompressionPresetSelector,
)
}
}
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/VideoCompressionPresetSelectorTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/VideoCompressionPresetSelectorTest.kt
new file mode 100644
index 0000000000..d3864794c2
--- /dev/null
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/video/VideoCompressionPresetSelectorTest.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.messages.impl.attachments.video
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.architecture.AsyncData
+import io.element.android.libraries.preferences.api.store.VideoCompressionPreset
+import kotlinx.collections.immutable.persistentListOf
+import org.junit.Test
+
+class VideoCompressionPresetSelectorTest {
+ private val selector = VideoCompressionPresetSelector()
+
+ @Test
+ fun `selectBestVideoPreset - returns expected preset when it can upload`() {
+ val result = selector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = AsyncData.Success(
+ persistentListOf(
+ VideoUploadEstimation(VideoCompressionPreset.HIGH, sizeInBytes = 100, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.STANDARD, sizeInBytes = 50, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.LOW, sizeInBytes = 25, canUpload = true),
+ )
+ )
+ )
+
+ assertThat(result.dataOrNull()).isEqualTo(VideoCompressionPreset.HIGH)
+ }
+
+ @Test
+ fun `selectBestVideoPreset - falls back to the highest fitting preset`() {
+ val result = selector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = AsyncData.Success(
+ persistentListOf(
+ VideoUploadEstimation(VideoCompressionPreset.HIGH, sizeInBytes = 100, canUpload = false),
+ VideoUploadEstimation(VideoCompressionPreset.STANDARD, sizeInBytes = 50, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.LOW, sizeInBytes = 25, canUpload = true),
+ )
+ )
+ )
+
+ assertThat(result.dataOrNull()).isEqualTo(VideoCompressionPreset.STANDARD)
+ }
+
+ @Test
+ fun `selectBestVideoPreset - starts from the expected preset`() {
+ val result = selector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.STANDARD,
+ videoSizeEstimations = AsyncData.Success(
+ persistentListOf(
+ VideoUploadEstimation(VideoCompressionPreset.HIGH, sizeInBytes = 100, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.STANDARD, sizeInBytes = 50, canUpload = true),
+ VideoUploadEstimation(VideoCompressionPreset.LOW, sizeInBytes = 25, canUpload = true),
+ )
+ )
+ )
+
+ assertThat(result.dataOrNull()).isEqualTo(VideoCompressionPreset.STANDARD)
+ }
+
+ @Test
+ fun `selectBestVideoPreset - returns failure when no preset can upload`() {
+ val result = selector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = AsyncData.Success(
+ persistentListOf(
+ VideoUploadEstimation(VideoCompressionPreset.HIGH, sizeInBytes = 100, canUpload = false),
+ VideoUploadEstimation(VideoCompressionPreset.STANDARD, sizeInBytes = 50, canUpload = false),
+ VideoUploadEstimation(VideoCompressionPreset.LOW, sizeInBytes = 25, canUpload = false),
+ )
+ )
+ )
+
+ assertThat(result).isInstanceOf(AsyncData.Failure::class.java)
+ }
+
+ @Test
+ fun `selectBestVideoPreset - returns loading while estimations are missing`() {
+ val result = selector.selectBestVideoPreset(
+ expectedVideoPreset = VideoCompressionPreset.HIGH,
+ videoSizeEstimations = AsyncData.Loading(),
+ )
+
+ assertThat(result).isInstanceOf(AsyncData.Loading::class.java)
+ }
+}
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MediaAttachmentFixtures.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MediaAttachmentFixtures.kt
index 77207d6b52..1dde33714f 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MediaAttachmentFixtures.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MediaAttachmentFixtures.kt
@@ -11,6 +11,7 @@ package io.element.android.features.messages.impl.fixtures
import io.element.android.features.messages.impl.attachments.Attachment
import io.element.android.libraries.mediaviewer.api.local.LocalMedia
-fun aMediaAttachment(localMedia: LocalMedia) = Attachment.Media(
+fun aMediaAttachment(localMedia: LocalMedia, sendAsFile: Boolean = false) = Attachment.Media(
localMedia = localMedia,
+ sendAsFile = sendAsFile,
)
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultMessageSummaryFormatterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultMessageSummaryFormatterTest.kt
new file mode 100644
index 0000000000..664d21ed64
--- /dev/null
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultMessageSummaryFormatterTest.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.messages.impl.utils
+
+import android.content.Context
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.location.api.Location
+import io.element.android.features.messages.impl.timeline.model.event.RtcNotificationState
+import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent
+import io.element.android.features.messages.impl.timeline.model.event.TimelineItemLocationContent.Mode
+import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
+import io.element.android.features.messages.impl.utils.messagesummary.DefaultMessageSummaryFormatter
+import io.element.android.libraries.matrix.api.notification.CallIntent
+import io.element.android.libraries.matrix.test.A_USER_ID
+import io.element.android.libraries.matrix.test.timeline.aProfileDetails
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.RuntimeEnvironment
+import org.robolectric.annotation.Config
+
+@RunWith(RobolectricTestRunner::class)
+class DefaultMessageSummaryFormatterTest {
+ private val formatter = DefaultMessageSummaryFormatter(
+ RuntimeEnvironment.getApplication() as Context
+ )
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `format call notification started`() {
+ val expected = formatter.format(
+ TimelineItemRtcNotificationContent(
+ callIntent = CallIntent.VIDEO,
+ state = RtcNotificationState.Started
+ )
+ )
+ assertThat(expected).isEqualTo("Call started")
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `format call notification declined by me`() {
+ val expected = formatter.format(
+ TimelineItemRtcNotificationContent(
+ callIntent = CallIntent.VIDEO,
+ state = RtcNotificationState.Declined(byMe = true)
+ )
+ )
+ assertThat(expected).isEqualTo("You declined a call")
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `format call notification declined`() {
+ val expected = formatter.format(
+ TimelineItemRtcNotificationContent(
+ callIntent = CallIntent.VIDEO,
+ state = RtcNotificationState.Declined(byMe = false)
+ )
+ )
+ assertThat(expected).isEqualTo("Call declined")
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `format live location`() {
+ val expected = formatter.format(
+ aLocationContent(isLive = true)
+ )
+ assertThat(expected).isEqualTo("Shared live location")
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `format static location`() {
+ val expected = formatter.format(
+ aLocationContent(isLive = false)
+ )
+ assertThat(expected).isEqualTo("Shared location")
+ }
+}
+
+private fun aLocationContent(isLive: Boolean) = TimelineItemLocationContent(
+ senderId = A_USER_ID,
+ senderProfile = aProfileDetails(),
+ description = null,
+ assetType = null,
+ mode = if (isLive) {
+ Mode.Live(
+ lastKnownLocation = Location.fromGeoUri("geo:1,5"),
+ isActive = true,
+ endsAt = "",
+ endTimestamp = 0,
+ isOwnUser = true,
+ )
+ } else {
+ Mode.Static(
+ location = Location.fromGeoUri("geo:1,5")!!,
+ )
+ }
+)
diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt
index 02a6918ad8..fff3ede5d3 100644
--- a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt
+++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/attachments/video/FakeMediaOptimizationSelectorPresenterFactory.kt
@@ -26,7 +26,7 @@ class FakeMediaOptimizationSelectorPresenterFactory(
)
}
) : MediaOptimizationSelectorPresenter.Factory {
- override fun create(localMedia: LocalMedia): MediaOptimizationSelectorPresenter {
+ override fun create(localMedia: LocalMedia, sendAsFile: Boolean): MediaOptimizationSelectorPresenter {
return fakePresenter
}
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt
index 3d1fb3b0c7..45c136ab62 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt
@@ -25,11 +25,8 @@ import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.emptyFlow
-import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.launch
@Inject
@@ -56,17 +53,8 @@ class AdvancedSettingsPresenter(
appPreferencesStore.getThemeFlow().mapToTheme(isBlackThemeAllowed)
}.collectAsState(initial = Theme.System)
- @OptIn(ExperimentalCoroutinesApi::class)
val liveLocationMinimumDistanceUpdate by produceState(null) {
- featureFlagService.isFeatureEnabledFlow(FeatureFlags.LiveLocationSharing)
- .flatMapLatest { isEnabled ->
- if (isEnabled) {
- appPreferencesStore.getLiveLocationMinimumDistanceInMetersUpdateFlow()
- } else {
- emptyFlow()
- }
- }
- .collect { value = it }
+ appPreferencesStore.getLiveLocationMinimumDistanceInMetersUpdateFlow().collect { value = it }
}
val mediaPreviewConfigState = mediaPreviewConfigStateStore.state()
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt
index 1deb972abc..94019c1f01 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt
@@ -11,9 +11,9 @@ package io.element.android.features.preferences.impl.advanced
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.res.stringResource
+import io.element.android.features.preferences.impl.R
import io.element.android.libraries.designsystem.components.preferences.DropdownOption
import io.element.android.libraries.preferences.api.store.VideoCompressionPreset
-import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
data class AdvancedSettingsState(
@@ -44,24 +44,24 @@ enum class ThemeOption : DropdownOption {
System {
@Composable
@ReadOnlyComposable
- override fun getText(): String = stringResource(CommonStrings.common_system)
+ override fun getText(): String = stringResource(R.string.theme_system)
},
Light {
@Composable
@ReadOnlyComposable
- override fun getText(): String = stringResource(CommonStrings.common_light)
+ override fun getText(): String = stringResource(R.string.theme_light)
},
Dark {
@Composable
@ReadOnlyComposable
- override fun getText(): String = stringResource(CommonStrings.common_dark)
+ override fun getText(): String = stringResource(R.string.theme_dark)
},
Black {
@Composable
@ReadOnlyComposable
- override fun getText(): String = stringResource(CommonStrings.common_black)
+ override fun getText(): String = stringResource(R.string.theme_black)
}
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt
index de6ccf5da7..f3faf96ba2 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt
@@ -11,7 +11,6 @@ package io.element.android.features.preferences.impl.tasks
import android.content.Context
import coil3.SingletonImageLoader
import dev.zacsweers.metro.ContributesBinding
-import dev.zacsweers.metro.Provider
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.preferences.impl.DefaultCacheService
import io.element.android.libraries.cachestore.api.CacheStore
@@ -34,7 +33,7 @@ class DefaultClearCacheUseCase(
private val matrixClient: MatrixClient,
private val coroutineDispatchers: CoroutineDispatchers,
private val defaultCacheService: DefaultCacheService,
- private val okHttpClient: Provider,
+ private val okHttpClient: () -> OkHttpClient,
private val pushService: PushService,
private val seenInvitesStore: SeenInvitesStore,
private val activeRoomsHolder: ActiveRoomsHolder,
diff --git a/features/preferences/impl/src/main/res/values-be/translations.xml b/features/preferences/impl/src/main/res/values-be/translations.xml
index b27a22bb8d..7f487afa24 100644
--- a/features/preferences/impl/src/main/res/values-be/translations.xml
+++ b/features/preferences/impl/src/main/res/values-be/translations.xml
@@ -53,6 +53,9 @@
"налады сістэмы"
"Сістэмныя апавяшчэнні выключаны"
"Апавяшчэнні"
+ "Цёмная"
+ "Светлая"
+ "Сістэмная"
"Выпраўленне непаладак"
"Выпраўленне непаладак з апавяшчэннямі"
diff --git a/features/preferences/impl/src/main/res/values-bg/translations.xml b/features/preferences/impl/src/main/res/values-bg/translations.xml
index 692f0ac8f3..d5ad7facb2 100644
--- a/features/preferences/impl/src/main/res/values-bg/translations.xml
+++ b/features/preferences/impl/src/main/res/values-bg/translations.xml
@@ -58,6 +58,9 @@
"системни настройки"
"Системните известия са изключени"
"Известия"
+ "Тъмен"
+ "Светъл"
+ "Система"
"Отстраняване на неизправности"
"Отстраняване на неизправности с известията"
diff --git a/features/preferences/impl/src/main/res/values-cs/translations.xml b/features/preferences/impl/src/main/res/values-cs/translations.xml
index 12014e7104..5c690dd824 100644
--- a/features/preferences/impl/src/main/res/values-cs/translations.xml
+++ b/features/preferences/impl/src/main/res/values-cs/translations.xml
@@ -87,6 +87,10 @@ Pokud budete pokračovat, některá nastavení se mohou změnit."
"systémová nastavení"
"Systémová oznámení byla vypnuta"
"Oznámení"
+ "Černý"
+ "Tmavé"
+ "Světlý"
+ "Systém"
"Historie push oznámení"
"Odstraňování problémů"
"Odstraňování problémů s upozorněními"
diff --git a/features/preferences/impl/src/main/res/values-cy/translations.xml b/features/preferences/impl/src/main/res/values-cy/translations.xml
index 9711eda179..e857f6aebe 100644
--- a/features/preferences/impl/src/main/res/values-cy/translations.xml
+++ b/features/preferences/impl/src/main/res/values-cy/translations.xml
@@ -70,6 +70,9 @@ Os ewch ymlaen, efallai y bydd rhai o\'ch gosodiadau\'n newid."
"gosodiadau system"
"Hysbysiadau system wedi\'u diffodd"
"Hysbysiadau"
+ "Tywyll"
+ "Golau"
+ "System"
"Hanes gwthio"
"Datrys Problemau"
"Hysbysiadau datrys problemau"
diff --git a/features/preferences/impl/src/main/res/values-da/translations.xml b/features/preferences/impl/src/main/res/values-da/translations.xml
index 2f828a4063..459ea33632 100644
--- a/features/preferences/impl/src/main/res/values-da/translations.xml
+++ b/features/preferences/impl/src/main/res/values-da/translations.xml
@@ -84,6 +84,9 @@ Hvis du fortsætter, kan nogle af dine indstillinger blive ændret."
"systemindstillinger"
"Systemmeddelelser slået fra"
"Notifikationer"
+ "Mørkt tema"
+ "Lyst tema"
+ "System"
"Push-historik"
"Fejlfind"
"Fejlfinding af meddelelser"
diff --git a/features/preferences/impl/src/main/res/values-de/translations.xml b/features/preferences/impl/src/main/res/values-de/translations.xml
index c3722ec88c..e35cf871a1 100644
--- a/features/preferences/impl/src/main/res/values-de/translations.xml
+++ b/features/preferences/impl/src/main/res/values-de/translations.xml
@@ -76,6 +76,9 @@ Wenn du fortfährst, können sich einige deiner Einstellungen ändern."
"Systemeinstellungen"
"Systembenachrichtigungen deaktiviert"
"Benachrichtigungen"
+ "Dunkel"
+ "Hell"
+ "System"
"Verlauf pushen"
"Fehlerbehebung"
"Fehlerbehebung für Benachrichtigungen"
diff --git a/features/preferences/impl/src/main/res/values-el/translations.xml b/features/preferences/impl/src/main/res/values-el/translations.xml
index 64b651114d..6db52343d3 100644
--- a/features/preferences/impl/src/main/res/values-el/translations.xml
+++ b/features/preferences/impl/src/main/res/values-el/translations.xml
@@ -76,6 +76,9 @@
"ρυθμίσεις συστήματος"
"Ειδοποιήσεις συστήματος ανενεργές"
"Ειδοποιήσεις"
+ "Σκοτεινό"
+ "Φωτεινό"
+ "Σύστημα"
"Ιστορικό push"
"Αντιμετώπιση προβλημάτων"
"Αντιμετώπιση προβλημάτων ειδοποιήσεων"
diff --git a/features/preferences/impl/src/main/res/values-es/translations.xml b/features/preferences/impl/src/main/res/values-es/translations.xml
index afdc23d90b..dd496a1273 100644
--- a/features/preferences/impl/src/main/res/values-es/translations.xml
+++ b/features/preferences/impl/src/main/res/values-es/translations.xml
@@ -63,6 +63,9 @@ Si continúas, es posible que algunos de tus ajustes cambien."
"ajustes del sistema"
"Notificaciones del sistema desactivadas"
"Notificaciones"
+ "Oscuro"
+ "Claro"
+ "Sistema"
"Historial de notificaciones push"
"Solucionar problemas"
"Solucionar problemas con las notificaciones"
diff --git a/features/preferences/impl/src/main/res/values-et/translations.xml b/features/preferences/impl/src/main/res/values-et/translations.xml
index c9094f1d31..d1e2b91d58 100644
--- a/features/preferences/impl/src/main/res/values-et/translations.xml
+++ b/features/preferences/impl/src/main/res/values-et/translations.xml
@@ -11,7 +11,10 @@
"Peida jututubade kutsetest tunnuspildid"
"Peida meedia eelvaated ajajoonel"
"Katsed"
+ "Vahemaa, mille pead andmete uuenduse käivitamiseks läbima."
+ "Veendu, et sellel rakendusel on õigus kasutada funktsionaalsust „Täpne asukoht“. Õiguste muutmiseks ava %1$s."
"Rakenduse seadistused"
+ "Andmete uuendused reaalajas asukoha jagamisel"
- "Iga %1$d meeter"
- "Iga %1$d meetrit"
@@ -81,6 +84,10 @@ Kui sa jätkad muutmist, siis võivad muutuda ka need peidetud eelistused.""süsteemi seadistusi"
"Süsteemi teavitused on välja lülitatud"
"Teavitused"
+ "Süsimust kujundus"
+ "Tume"
+ "Hele"
+ "Süsteem"
"Tõuketeadete ajalugu"
"Veaotsing"
"Teavituste veaotsing"
diff --git a/features/preferences/impl/src/main/res/values-eu/translations.xml b/features/preferences/impl/src/main/res/values-eu/translations.xml
index 42a90e0328..42416c682b 100644
--- a/features/preferences/impl/src/main/res/values-eu/translations.xml
+++ b/features/preferences/impl/src/main/res/values-eu/translations.xml
@@ -55,4 +55,7 @@
"sistemaren ezarpenak"
"Sistemaren jakinarazpenak desaktibatuta daude"
"Jakinarazpenak"
+ "Iluna"
+ "Argia"
+ "Sistema"
diff --git a/features/preferences/impl/src/main/res/values-fa/translations.xml b/features/preferences/impl/src/main/res/values-fa/translations.xml
index 1a832ca54c..df42ca953c 100644
--- a/features/preferences/impl/src/main/res/values-fa/translations.xml
+++ b/features/preferences/impl/src/main/res/values-fa/translations.xml
@@ -67,6 +67,9 @@
"تنظیمات سامانه"
"آگاهیهای سامانهای خاموش شدند"
"آگاهیها"
+ "تیره"
+ "روشن"
+ "سامانه"
"تاریخچهٔ آگاهیهای ارسالی"
"رفعاشکال"
"رفعاشکال آگاهیها"
diff --git a/features/preferences/impl/src/main/res/values-fi/translations.xml b/features/preferences/impl/src/main/res/values-fi/translations.xml
index f1462f3bb7..97da4e138a 100644
--- a/features/preferences/impl/src/main/res/values-fi/translations.xml
+++ b/features/preferences/impl/src/main/res/values-fi/translations.xml
@@ -76,6 +76,9 @@ Jos jatkat, jotkin asetukset saattavat muuttua."
"järjestelmäsi asetuksia"
"Järjestelmän ilmoitukset on poissa päältä"
"Ilmoitukset"
+ "Tumma"
+ "Vaalea"
+ "Järjestelmän oletus"
"Push-historia"
"Vianmääritys"
"Ilmoitusten vianmääritys"
diff --git a/features/preferences/impl/src/main/res/values-fr/translations.xml b/features/preferences/impl/src/main/res/values-fr/translations.xml
index 292b5bf9a5..3f97b67eb8 100644
--- a/features/preferences/impl/src/main/res/values-fr/translations.xml
+++ b/features/preferences/impl/src/main/res/values-fr/translations.xml
@@ -84,6 +84,9 @@ Si vous continuez, il est possible que certains de vos paramètres soient modifi
"paramètres du système"
"Les notifications du système sont désactivées"
"Notifications"
+ "Sombre"
+ "Clair"
+ "Système"
"Historique des Push"
"Dépannage"
"Dépanner les notifications"
diff --git a/features/preferences/impl/src/main/res/values-hr/translations.xml b/features/preferences/impl/src/main/res/values-hr/translations.xml
index a40a6feccd..d101146f8c 100644
--- a/features/preferences/impl/src/main/res/values-hr/translations.xml
+++ b/features/preferences/impl/src/main/res/values-hr/translations.xml
@@ -85,6 +85,9 @@ Ako nastavite, neke od vaših postavki mogu se promijeniti."
"postavke sustava"
"Obavijesti sustava su isključene"
"Obavijesti"
+ "Tamno"
+ "Svijetlo"
+ "Sustav"
"Povijest push obavijesti"
"Rješavanje problema"
"Rješavanje problema s obavijestima"
diff --git a/features/preferences/impl/src/main/res/values-hu/translations.xml b/features/preferences/impl/src/main/res/values-hu/translations.xml
index d75166df5e..4c1b988696 100644
--- a/features/preferences/impl/src/main/res/values-hu/translations.xml
+++ b/features/preferences/impl/src/main/res/values-hu/translations.xml
@@ -84,6 +84,10 @@ Ha folytatja, egyes beállítások megváltozhatnak."
"rendszerbeállításokat"
"A rendszerértesítések ki vannak kapcsolva"
"Értesítések"
+ "Fekete"
+ "Sötét"
+ "Világos"
+ "Rendszer"
"Leküldéses értesítések előzmények"
"Hibaelhárítás"
"Értesítések hibaelhárítása"
diff --git a/features/preferences/impl/src/main/res/values-in/translations.xml b/features/preferences/impl/src/main/res/values-in/translations.xml
index 5ce794c8ac..9c853aed45 100644
--- a/features/preferences/impl/src/main/res/values-in/translations.xml
+++ b/features/preferences/impl/src/main/res/values-in/translations.xml
@@ -72,6 +72,9 @@ Jika Anda melanjutkan, beberapa pengaturan Anda dapat berubah."
"pengaturan sistem"
"Pemberitahuan sistem dimatikan"
"Notifikasi"
+ "Gelap"
+ "Terang"
+ "Sistem"
"Riwayat dorongan"
"Pemecahan masalah"
"Pecahkan masalah notifikasi"
diff --git a/features/preferences/impl/src/main/res/values-it/translations.xml b/features/preferences/impl/src/main/res/values-it/translations.xml
index 7872a2d47d..73555754fc 100644
--- a/features/preferences/impl/src/main/res/values-it/translations.xml
+++ b/features/preferences/impl/src/main/res/values-it/translations.xml
@@ -84,6 +84,9 @@ Se procedi, alcune delle tue impostazioni potrebbero cambiare."
"impostazioni di sistema"
"Notifiche di sistema disattivate"
"Notifiche"
+ "Scuro"
+ "Chiaro"
+ "Sistema"
"Cronologia push"
"Risoluzione dei problemi"
"Risoluzione di problemi delle notifiche"
diff --git a/features/preferences/impl/src/main/res/values-ja/translations.xml b/features/preferences/impl/src/main/res/values-ja/translations.xml
index 22334c4120..95380cf148 100644
--- a/features/preferences/impl/src/main/res/values-ja/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ja/translations.xml
@@ -83,6 +83,9 @@
"システム設定"
"システムで通知がオフです"
"通知"
+ "ダーク"
+ "ライト"
+ "システム"
"プッシュ履歴"
"トラブルシューティング"
"通知のトラブルシューティング"
diff --git a/features/preferences/impl/src/main/res/values-ka/translations.xml b/features/preferences/impl/src/main/res/values-ka/translations.xml
index 1efe197267..5a20e718a0 100644
--- a/features/preferences/impl/src/main/res/values-ka/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ka/translations.xml
@@ -50,6 +50,9 @@
"სისტემის პარამეტრები"
"სისტემის შეტყობინებები გამორთულია"
"შეტყობინებები"
+ "მუქი"
+ "ღია"
+ "სისტემა"
"პრობლემების გადაჭრა"
"პრობლემების გადაჭრის შეტყობინებები"
diff --git a/features/preferences/impl/src/main/res/values-ko/translations.xml b/features/preferences/impl/src/main/res/values-ko/translations.xml
index 5e17d57a87..e2c5e8e83b 100644
--- a/features/preferences/impl/src/main/res/values-ko/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ko/translations.xml
@@ -77,6 +77,9 @@
"시스템 설정"
"시스템 알림이 꺼져 있습니다."
"알림"
+ "다크"
+ "라이트"
+ "시스템"
"푸시 기록"
"문제 해결"
"문제 해결 알림"
diff --git a/features/preferences/impl/src/main/res/values-nb/translations.xml b/features/preferences/impl/src/main/res/values-nb/translations.xml
index 90ec12a1a1..ac67e04259 100644
--- a/features/preferences/impl/src/main/res/values-nb/translations.xml
+++ b/features/preferences/impl/src/main/res/values-nb/translations.xml
@@ -76,6 +76,9 @@ Hvis du fortsetter, kan noen av innstillingene dine endres."
"systeminnstillinger"
"Systemvarsler er slått av"
"Varslinger"
+ "Mørk"
+ "Lys"
+ "System"
"Push-historikk"
"Feilsøk"
"Feilsøk varsler"
diff --git a/features/preferences/impl/src/main/res/values-nl/translations.xml b/features/preferences/impl/src/main/res/values-nl/translations.xml
index 28614965c5..c5c439a0c3 100644
--- a/features/preferences/impl/src/main/res/values-nl/translations.xml
+++ b/features/preferences/impl/src/main/res/values-nl/translations.xml
@@ -54,6 +54,9 @@ Als je doorgaat, kunnen sommige van je instellingen veranderen."
"systeeminstellingen"
"Systeemmeldingen uitgeschakeld"
"Meldingen"
+ "Donker"
+ "Licht"
+ "Systeem"
"Problemen oplossen"
"Problemen met meldingen oplossen"
diff --git a/features/preferences/impl/src/main/res/values-pl/translations.xml b/features/preferences/impl/src/main/res/values-pl/translations.xml
index 606a79df0d..83b02c6fe2 100644
--- a/features/preferences/impl/src/main/res/values-pl/translations.xml
+++ b/features/preferences/impl/src/main/res/values-pl/translations.xml
@@ -85,6 +85,10 @@ Niektóre ustawienia mogą ulec zmianie, jeśli kontynuujesz."
"ustawienia systemowe"
"Powiadomienia systemowe wyłączone"
"Powiadomienia"
+ "Czarny"
+ "Ciemny"
+ "Jasny"
+ "System"
"Historia powiadomień Push"
"Rozwiązywanie problemów"
"Rozwiązywanie problemów powiadomień"
diff --git a/features/preferences/impl/src/main/res/values-pt-rBR/translations.xml b/features/preferences/impl/src/main/res/values-pt-rBR/translations.xml
index f6e1bc90ba..be354681f5 100644
--- a/features/preferences/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/preferences/impl/src/main/res/values-pt-rBR/translations.xml
@@ -76,6 +76,9 @@ Se você continuar, algumas de suas configurações poderão mudar."
"configurações do seu sistema"
"Notificações do sistema desativadas"
"Notificações"
+ "Escuro"
+ "Claro"
+ "Sistema"
"Histórico de push"
"Solução de problemas"
"Solucionar problemas de notificações"
diff --git a/features/preferences/impl/src/main/res/values-pt/translations.xml b/features/preferences/impl/src/main/res/values-pt/translations.xml
index ffd38b961f..0e27d58de5 100644
--- a/features/preferences/impl/src/main/res/values-pt/translations.xml
+++ b/features/preferences/impl/src/main/res/values-pt/translations.xml
@@ -76,6 +76,9 @@ Se prosseguires, algumas delas podem ser alteradas."
"configurações do sistema"
"Notificações do sistema desativadas"
"Notificações"
+ "Escuro"
+ "Claro"
+ "Sistema"
"Histórico de push"
"Resolução de problemas"
"Corrigir notificações"
diff --git a/features/preferences/impl/src/main/res/values-ro/translations.xml b/features/preferences/impl/src/main/res/values-ro/translations.xml
index 6f8e41c5b9..69eddf05f5 100644
--- a/features/preferences/impl/src/main/res/values-ro/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ro/translations.xml
@@ -11,6 +11,15 @@
"Ascundeți avatarele din invitațiile pentru camere"
"Ascundeți previzualizările media în lista de mesaje"
"Laboratoare"
+ "Distanța pe care trebuie să o parcurgeți pentru a declanșa o actualizare."
+ "Asigurați-vă că este activată opțiunea „Locație precisă” pentru această aplicație. Pentru a schimba permisiunea, accesați %1$s."
+ "Setările aplicației"
+ "Actualizări in timp real ale locației"
+
+ - "La fiecare %1$d metru"
+ - "La fiecare %1$d metri"
+ - "La fiecare %1$d metri"
+
"Încărcați fotografii și videoclipuri mai rapid și reduceți consumul de date"
"Optimizați calitatea media"
"Moderare și siguranță"
@@ -78,6 +87,10 @@ Dacă continuați, unele dintre setările dumneavoastră pot fi modificate.""Setări de sistem"
"Notificările de sistem sunt dezactivate"
"Notificări"
+ "Negru"
+ "Întunecat"
+ "Deschis"
+ "Sistem"
"Istoricul notificărilor"
"Depanare"
"Depanați notificările"
diff --git a/features/preferences/impl/src/main/res/values-ru/translations.xml b/features/preferences/impl/src/main/res/values-ru/translations.xml
index 77be6fd8db..edb98feee8 100644
--- a/features/preferences/impl/src/main/res/values-ru/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ru/translations.xml
@@ -76,6 +76,9 @@
"системные настройки"
"Системные уведомления выключены"
"Уведомления"
+ "Темная"
+ "Светлое"
+ "Системное"
"История уведомлений"
"Устранение неполадок"
"Уведомления об устранении неполадок"
diff --git a/features/preferences/impl/src/main/res/values-sk/translations.xml b/features/preferences/impl/src/main/res/values-sk/translations.xml
index 9968c6d4cb..530fccd90b 100644
--- a/features/preferences/impl/src/main/res/values-sk/translations.xml
+++ b/features/preferences/impl/src/main/res/values-sk/translations.xml
@@ -78,6 +78,9 @@ Ak budete pokračovať, niektoré z vašich nastavení sa môžu zmeniť.""nastavenia systému"
"Systémové oznámenia sú vypnuté"
"Oznámenia"
+ "Tmavý"
+ "Svetlý"
+ "Systém"
"História push oznámení"
"Riešenie problémov"
"Oznámenia riešení problémov"
diff --git a/features/preferences/impl/src/main/res/values-sv/translations.xml b/features/preferences/impl/src/main/res/values-sv/translations.xml
index e25e36a44f..109000440f 100644
--- a/features/preferences/impl/src/main/res/values-sv/translations.xml
+++ b/features/preferences/impl/src/main/res/values-sv/translations.xml
@@ -70,6 +70,9 @@ Om du fortsätter kan vissa av dina inställningar ändras."
"systeminställningar"
"Systemaviseringar avstängda"
"Aviseringar"
+ "Mörkt"
+ "Ljust"
+ "System"
"Push-historik"
"Felsök"
"Felsök aviseringar"
diff --git a/features/preferences/impl/src/main/res/values-tr/translations.xml b/features/preferences/impl/src/main/res/values-tr/translations.xml
index 0df8500fda..78e9018554 100644
--- a/features/preferences/impl/src/main/res/values-tr/translations.xml
+++ b/features/preferences/impl/src/main/res/values-tr/translations.xml
@@ -74,6 +74,9 @@ Devam ederseniz, bazı ayarlarınız değişebilir."
"si̇stem ayarları"
"Sistem bildirimleri kapalı"
"Bildirimler"
+ "Koyu"
+ "Aydınlık"
+ "Sistem"
"Sorun gider"
"Sorun Giderme Bildirimleri"
diff --git a/features/preferences/impl/src/main/res/values-uk/translations.xml b/features/preferences/impl/src/main/res/values-uk/translations.xml
index eeffc97328..4d8d738122 100644
--- a/features/preferences/impl/src/main/res/values-uk/translations.xml
+++ b/features/preferences/impl/src/main/res/values-uk/translations.xml
@@ -85,6 +85,9 @@
"системні налаштування"
"Системні сповіщення вимкнені"
"Сповіщення"
+ "Темна"
+ "Світла"
+ "Системна"
"Історія push-сповіщень"
"Усунення несправностей"
"Усунення неполадок сповіщень"
diff --git a/features/preferences/impl/src/main/res/values-ur/translations.xml b/features/preferences/impl/src/main/res/values-ur/translations.xml
index 470763e877..35b8f4aa4e 100644
--- a/features/preferences/impl/src/main/res/values-ur/translations.xml
+++ b/features/preferences/impl/src/main/res/values-ur/translations.xml
@@ -53,6 +53,9 @@
"نظام کی ترتیبات"
"نظام کی اطلاعات بند کر دی گئیں"
"اطلاعات"
+ "اندھیرا"
+ "روشنی"
+ "نظام"
"ازالہ کریں"
"اطلاعات کا ازالہ کریں"
diff --git a/features/preferences/impl/src/main/res/values-uz/translations.xml b/features/preferences/impl/src/main/res/values-uz/translations.xml
index 9c81fc3daa..884027f9b8 100644
--- a/features/preferences/impl/src/main/res/values-uz/translations.xml
+++ b/features/preferences/impl/src/main/res/values-uz/translations.xml
@@ -76,6 +76,9 @@ Davom ettirsangiz, baʼzi sozlamalaringiz oʻzgarishi mumkin."
"tizim sozlamalari"
"Tizim bildirishnomalari o\'chirilgan"
"Bildirishnomalar"
+ "Tungi"
+ "Nur"
+ "Tizim"
"Bildirishnoma tarixi"
"Muammolarni bartaraf etish"
"Bildirishnomalar bilan bog‘liq muammolarni bartaraf etish"
diff --git a/features/preferences/impl/src/main/res/values-vi/translations.xml b/features/preferences/impl/src/main/res/values-vi/translations.xml
index 9f24244b7e..9889b1697a 100644
--- a/features/preferences/impl/src/main/res/values-vi/translations.xml
+++ b/features/preferences/impl/src/main/res/values-vi/translations.xml
@@ -61,6 +61,9 @@ Nếu bạn tiếp tục, một số cài đặt của bạn có thể thay đ
"cài đặt hệ thống"
"Thông báo hệ thống đã tắt"
"Thông báo"
+ "Tối"
+ "Sáng"
+ "Hệ thống"
"Khắc phục sự cố"
"Khắc phục sự cố thông báo"
diff --git a/features/preferences/impl/src/main/res/values-zh-rTW/translations.xml b/features/preferences/impl/src/main/res/values-zh-rTW/translations.xml
index 634911100a..03892ce980 100644
--- a/features/preferences/impl/src/main/res/values-zh-rTW/translations.xml
+++ b/features/preferences/impl/src/main/res/values-zh-rTW/translations.xml
@@ -76,6 +76,9 @@
"系統設定"
"已關閉系統通知"
"通知"
+ "深色"
+ "淺色"
+ "系統"
"推播通知歷史紀錄"
"疑難排解"
"疑難排解通知"
diff --git a/features/preferences/impl/src/main/res/values-zh/translations.xml b/features/preferences/impl/src/main/res/values-zh/translations.xml
index 41eb147141..8f6de8209e 100644
--- a/features/preferences/impl/src/main/res/values-zh/translations.xml
+++ b/features/preferences/impl/src/main/res/values-zh/translations.xml
@@ -78,11 +78,15 @@
"全部"
"提及"
"通知我以下类型"
- "我在房间中被提及时通知我"
+ "提及所有成员(@room)时通知我"
"要接收通知,请更改 %1$s。"
"系统设置"
"系统通知已关闭"
"通知"
+ "纯黑"
+ "深色"
+ "浅色"
+ "系统"
"推送历史"
"排查问题"
"排查通知问题"
diff --git a/features/preferences/impl/src/main/res/values/localazy.xml b/features/preferences/impl/src/main/res/values/localazy.xml
index d5abe1df6a..a431139fd6 100644
--- a/features/preferences/impl/src/main/res/values/localazy.xml
+++ b/features/preferences/impl/src/main/res/values/localazy.xml
@@ -84,6 +84,10 @@ If you proceed, some of your settings may change."
"system settings"
"System notifications turned off"
"Notifications"
+ "Black"
+ "Dark"
+ "Light"
+ "System"
"Push history"
"Troubleshoot"
"Troubleshoot notifications"
diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt
index 27d91bd8de..25d7c01778 100644
--- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt
+++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenterTest.kt
@@ -210,35 +210,12 @@ class AdvancedSettingsPresenterTest {
}
}
- @Test
- fun `present - live location minimum distance is null when feature is disabled`() = runTest {
- val appPreferencesStore = InMemoryAppPreferencesStore(
- liveLocationMinimumDistanceUpdate = 50,
- )
- val featureFlagService = FakeFeatureFlagService().apply {
- setFeatureEnabled(FeatureFlags.LiveLocationSharing, false)
- }
- val presenter = createAdvancedSettingsPresenter(appPreferencesStore = appPreferencesStore, featureFlagService = featureFlagService)
-
- moleculeFlow(RecompositionMode.Immediate) {
- presenter.present()
- }.test {
- skipItems(1)
- with(awaitItem()) {
- assertThat(liveLocationMinimumDistanceUpdate).isNull()
- }
- }
- }
-
@Test
fun `present - exposes live location minimum distance from app preferences`() = runTest {
val appPreferencesStore = InMemoryAppPreferencesStore(
liveLocationMinimumDistanceUpdate = 50,
)
- val featureFlagService = FakeFeatureFlagService().apply {
- setFeatureEnabled(FeatureFlags.LiveLocationSharing, true)
- }
- val presenter = createAdvancedSettingsPresenter(appPreferencesStore = appPreferencesStore, featureFlagService = featureFlagService)
+ val presenter = createAdvancedSettingsPresenter(appPreferencesStore = appPreferencesStore)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
@@ -256,10 +233,7 @@ class AdvancedSettingsPresenterTest {
val appPreferencesStore = InMemoryAppPreferencesStore(
liveLocationMinimumDistanceUpdate = 10,
)
- val featureFlagService = FakeFeatureFlagService().apply {
- setFeatureEnabled(FeatureFlags.LiveLocationSharing, true)
- }
- val presenter = createAdvancedSettingsPresenter(appPreferencesStore = appPreferencesStore, featureFlagService = featureFlagService)
+ val presenter = createAdvancedSettingsPresenter(appPreferencesStore = appPreferencesStore)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt
index 4823a7c26e..302a209578 100644
--- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt
+++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsViewTest.kt
@@ -62,7 +62,7 @@ class AdvancedSettingsViewTest {
),
)
clickOn(CommonStrings.common_appearance)
- clickOn(CommonStrings.common_dark)
+ clickOn(R.string.theme_dark)
eventsRecorder.assertSingle(AdvancedSettingsEvents.SetTheme(ThemeOption.Dark))
}
@@ -75,7 +75,7 @@ class AdvancedSettingsViewTest {
)
clickOn(CommonStrings.common_appearance)
run {
- val text = activity!!.getString(CommonStrings.common_black)
+ val text = activity!!.getString(R.string.theme_black)
onNodeWithText(text).assertExists()
}
}
@@ -88,7 +88,7 @@ class AdvancedSettingsViewTest {
),
)
clickOn(CommonStrings.common_appearance)
- assertNoNodeWithText(CommonStrings.common_black)
+ assertNoNodeWithText(R.string.theme_black)
}
@Test
diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt
index b4e7faa01e..2568a6fba9 100755
--- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt
+++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt
@@ -14,7 +14,6 @@ import androidx.core.net.toFile
import androidx.core.net.toUri
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
-import dev.zacsweers.metro.Provider
import dev.zacsweers.metro.SingleIn
import io.element.android.appconfig.RageshakeConfig
import io.element.android.features.rageshake.api.logs.createWriteToFilesConfiguration
@@ -77,7 +76,7 @@ class DefaultBugReporter(
private val screenshotHolder: ScreenshotHolder,
private val crashDataStore: CrashDataStore,
private val coroutineDispatchers: CoroutineDispatchers,
- private val okHttpClient: Provider,
+ private val okHttpClient: () -> OkHttpClient,
private val userAgentProvider: UserAgentProvider,
private val sessionStore: SessionStore,
private val buildMeta: BuildMeta,
diff --git a/features/reportroom/impl/src/main/res/values-zh/translations.xml b/features/reportroom/impl/src/main/res/values-zh/translations.xml
index e79148a45d..4366e33455 100644
--- a/features/reportroom/impl/src/main/res/values-zh/translations.xml
+++ b/features/reportroom/impl/src/main/res/values-zh/translations.xml
@@ -2,7 +2,7 @@
"你的举报已成功提交,但在尝试退出房间时遇到问题。请重试。"
"无法离开房间"
- "向管理员举报此房间。如果信息已加密,管理员将无法读取。"
+ "向管理员举报此房间。如果消息已加密,管理员将无法读取。"
"描述举报的理由…"
"举报房间"
diff --git a/features/rolesandpermissions/impl/src/main/res/values-cs/translations.xml b/features/rolesandpermissions/impl/src/main/res/values-cs/translations.xml
index 87936de3a7..662096dd20 100644
--- a/features/rolesandpermissions/impl/src/main/res/values-cs/translations.xml
+++ b/features/rolesandpermissions/impl/src/main/res/values-cs/translations.xml
@@ -6,6 +6,7 @@
"Odstranit zprávy"
"Člen"
"Pozvat přátele"
+ "Sdílet aktuální polohu"
"Správa prostoru"
"Spravovat místnosti"
"Spravovat členy"
diff --git a/features/rolesandpermissions/impl/src/main/res/values-et/translations.xml b/features/rolesandpermissions/impl/src/main/res/values-et/translations.xml
index 1c1f490580..02ec4ad07d 100644
--- a/features/rolesandpermissions/impl/src/main/res/values-et/translations.xml
+++ b/features/rolesandpermissions/impl/src/main/res/values-et/translations.xml
@@ -6,6 +6,7 @@
"Eemalda sõnumid"
"Liikmed"
"Osalejate kutsumine"
+ "Jaga asukohta reaalajas"
"Halda kogukonda"
"Halda jututuba"
"Liikmete haldus"
diff --git a/features/rolesandpermissions/impl/src/main/res/values-ro/translations.xml b/features/rolesandpermissions/impl/src/main/res/values-ro/translations.xml
index ac9ec710a2..962f8b2d4d 100644
--- a/features/rolesandpermissions/impl/src/main/res/values-ro/translations.xml
+++ b/features/rolesandpermissions/impl/src/main/res/values-ro/translations.xml
@@ -6,6 +6,7 @@
"Ștergeți mesajele"
"Membru"
"Invitați persoane"
+ "Partajați locația în timp real"
"Gestionați spațiul"
"Gestionați camerele"
"Gestionați membrii"
diff --git a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt
index 07e10c65ef..3474711b55 100644
--- a/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt
+++ b/features/roomdetails/api/src/main/kotlin/io/element/android/features/roomdetails/api/RoomDetailsEntryPoint.kt
@@ -38,9 +38,10 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint {
data class Params(val initialElement: InitialTarget) : NodeInputs
interface Callback : Plugin {
+ fun onDone()
fun navigateToGlobalNotificationSettings()
fun navigateToDeveloperSettings()
- fun navigateToRoom(roomId: RoomId, serverNames: List)
+ fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean = false)
fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean)
}
diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts
index 2765a95a1e..77e2d0c229 100644
--- a/features/roomdetails/impl/build.gradle.kts
+++ b/features/roomdetails/impl/build.gradle.kts
@@ -40,6 +40,7 @@ dependencies {
implementation(projects.libraries.featureflag.api)
implementation(projects.libraries.permissions.api)
implementation(projects.libraries.preferences.api)
+ implementation(projects.libraries.push.api)
implementation(projects.libraries.testtags)
api(projects.features.roomdetails.api)
api(projects.libraries.usersearch.api)
@@ -69,6 +70,7 @@ dependencies {
testImplementation(projects.libraries.mediaviewer.test)
testImplementation(projects.libraries.permissions.test)
testImplementation(projects.libraries.preferences.test)
+ testImplementation(projects.libraries.push.test)
testImplementation(projects.libraries.usersearch.test)
testImplementation(projects.libraries.featureflag.test)
testImplementation(projects.features.call.test)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt
index de801e8aae..a82766175d 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt
@@ -14,4 +14,6 @@ sealed interface RoomDetailsEvent {
data object UnmuteNotification : RoomDetailsEvent
data class CopyToClipboard(val text: String) : RoomDetailsEvent
data class SetFavorite(val isFavorite: Boolean) : RoomDetailsEvent
+ data object MarkAsRead : RoomDetailsEvent
+ data object MarkAsUnread : RoomDetailsEvent
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt
index 818287ab68..d4108a77e3 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt
@@ -176,6 +176,10 @@ class RoomDetailsFlowNode(
return when (navTarget) {
NavTarget.RoomDetails -> {
val roomDetailsCallback = object : RoomDetailsNode.Callback {
+ override fun navigateBack() {
+ callback.onDone()
+ }
+
override fun navigateToRoomMemberList() {
backstack.push(NavTarget.RoomMemberList)
}
@@ -263,7 +267,20 @@ class RoomDetailsFlowNode(
}
NavTarget.InviteMembers -> {
- createNode(buildContext)
+ val callback = object : RoomInviteMembersNode.Callback {
+ override fun openCreatedRoom(roomId: RoomId) {
+ navigateUp()
+ room.roomCoroutineScope.launch {
+ callback.navigateToRoom(
+ roomId = roomId,
+ serverNames = emptyList(),
+ // Remove the invite screen from the backstack to avoid navigating back to it after the new room has been created
+ clearBackStack = true,
+ )
+ }
+ }
+ }
+ createNode(buildContext, plugins = listOf(callback))
}
is NavTarget.RoomNotificationSettings -> {
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNavigator.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNavigator.kt
new file mode 100644
index 0000000000..9e2b77a260
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNavigator.kt
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.roomdetails.impl
+
+interface RoomDetailsNavigator {
+ fun onDone()
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt
index e9aad5b1d2..7f22c7e111 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt
@@ -42,12 +42,13 @@ import io.element.android.libraries.androidutils.R as AndroidUtilsR
class RoomDetailsNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List,
- private val presenter: RoomDetailsPresenter,
+ presenterFactory: RoomDetailsPresenter.Factory,
private val room: BaseRoom,
private val analyticsService: AnalyticsService,
private val leaveRoomRenderer: LeaveRoomRenderer,
-) : Node(buildContext, plugins = plugins) {
+) : Node(buildContext, plugins = plugins), RoomDetailsNavigator {
interface Callback : Plugin {
+ fun navigateBack()
fun navigateToRoomMemberList()
fun navigateToInviteMembers()
fun navigateToRoomDetailsEdit()
@@ -65,6 +66,7 @@ class RoomDetailsNode(
fun navigateToSelectNewOwnersWhenLeaving()
}
+ private val presenter = presenterFactory.create(this)
private val callback: Callback = callback()
init {
@@ -144,4 +146,8 @@ class RoomDetailsNode(
}
)
}
+
+ override fun onDone() {
+ callback.navigateBack()
+ }
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt
index 167cc2ced5..e6617d1dd5 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt
@@ -17,7 +17,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
-import dev.zacsweers.metro.Inject
+import dev.zacsweers.metro.Assisted
+import dev.zacsweers.metro.AssistedFactory
+import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.Interaction
import io.element.android.features.knockrequests.api.KnockRequestPermissions
import io.element.android.features.knockrequests.api.knockRequestPermissions
@@ -44,19 +46,24 @@ import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.canEditRolesAndPermissions
import io.element.android.libraries.matrix.api.room.powerlevels.permissionsAsState
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
+import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.ui.room.getDirectRoomMember
import io.element.android.libraries.matrix.ui.room.roomMemberIdentityStateChange
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
+import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
+import io.element.android.libraries.push.api.notifications.NotificationCleaner
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
-@Inject
+@AssistedInject
class RoomDetailsPresenter(
+ @Assisted private val navigator: RoomDetailsNavigator,
private val client: MatrixClient,
private val room: JoinedRoom,
private val notificationSettingsService: NotificationSettingsService,
@@ -67,7 +74,16 @@ class RoomDetailsPresenter(
private val analyticsService: AnalyticsService,
private val clipboardHelper: ClipboardHelper,
private val appPreferencesStore: AppPreferencesStore,
+ private val sessionPreferencesStore: SessionPreferencesStore,
+ private val notificationCleaner: NotificationCleaner,
) : Presenter {
+ @AssistedFactory
+ interface Factory {
+ fun create(
+ navigator: RoomDetailsNavigator,
+ ): RoomDetailsPresenter
+ }
+
@Composable
override fun present(): RoomDetailsState {
val scope = rememberCoroutineScope()
@@ -79,6 +95,14 @@ class RoomDetailsPresenter(
val roomTopic by remember { derivedStateOf { roomInfo.topic } }
val isFavorite by remember { derivedStateOf { roomInfo.isFavorite } }
val joinRule by remember { derivedStateOf { roomInfo.joinRule } }
+ val hasNewContent by remember {
+ derivedStateOf {
+ roomInfo.numUnreadMessages > 0 ||
+ roomInfo.numUnreadMentions > 0 ||
+ roomInfo.numUnreadNotifications > 0 ||
+ roomInfo.isMarkedUnread
+ }
+ }
val pinnedMessagesCount by remember { derivedStateOf { roomInfo.pinnedEventIds.size } }
@@ -145,6 +169,8 @@ class RoomDetailsPresenter(
clipboardHelper.copyPlainText(event.text)
snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_copied_to_clipboard))
}
+ is RoomDetailsEvent.MarkAsRead -> scope.markAsRead()
+ is RoomDetailsEvent.MarkAsUnread -> scope.markAsUnread()
}
}
@@ -188,6 +214,7 @@ class RoomDetailsPresenter(
showDebugInfo = isDeveloperModeEnabled,
roomVersion = roomInfo.roomVersion,
roomHistoryVisibility = roomInfo.historyVisibility,
+ hasNewContent = hasNewContent,
eventSink = ::handleEvent,
)
}
@@ -241,4 +268,26 @@ class RoomDetailsPresenter(
analyticsService.captureInteraction(Interaction.Name.MobileRoomFavouriteToggle)
}
}
+
+ private fun CoroutineScope.markAsRead() = launch {
+ notificationCleaner.clearMessagesForRoom(client.sessionId, room.roomId)
+ room.setUnreadFlag(isUnread = false)
+ val receiptType = if (sessionPreferencesStore.isSendPublicReadReceiptsEnabled().first()) {
+ ReceiptType.READ
+ } else {
+ ReceiptType.READ_PRIVATE
+ }
+ room.markAsRead(receiptType)
+ .onSuccess {
+ analyticsService.captureInteraction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle)
+ }
+ }
+
+ private fun CoroutineScope.markAsUnread() = launch {
+ room.setUnreadFlag(isUnread = true)
+ .onSuccess {
+ analyticsService.captureInteraction(name = Interaction.Name.MobileRoomListRoomContextMenuUnreadToggle)
+ navigator.onDone()
+ }
+ }
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt
index 90a912e86f..bd3b90d416 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt
@@ -52,6 +52,7 @@ data class RoomDetailsState(
val showDebugInfo: Boolean,
val roomVersion: String?,
val roomHistoryVisibility: RoomHistoryVisibility,
+ val hasNewContent: Boolean,
val eventSink: (RoomDetailsEvent) -> Unit
) {
val roomBadges = buildList {
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt
index ad627d8677..7182d2ec04 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt
@@ -34,7 +34,7 @@ open class RoomDetailsStateProvider : PreviewParameterProvider
override val values: Sequence
get() = sequenceOf(
aRoomDetailsState(displayAdminSettings = true),
- aRoomDetailsState(roomTopic = RoomTopicState.Hidden, showDebugInfo = true),
+ aRoomDetailsState(roomTopic = RoomTopicState.Hidden, showDebugInfo = true, hasNewContent = true),
aRoomDetailsState(roomTopic = RoomTopicState.CanAddTopic),
aRoomDetailsState(isEncrypted = false),
aRoomDetailsState(roomAlias = null),
@@ -123,6 +123,7 @@ fun aRoomDetailsState(
isTombstoned: Boolean = false,
showDebugInfo: Boolean = false,
roomHistoryVisibility: RoomHistoryVisibility = RoomHistoryVisibility.Shared,
+ hasNewContent: Boolean = false,
eventSink: (RoomDetailsEvent) -> Unit = {},
) = RoomDetailsState(
roomId = roomId,
@@ -154,6 +155,7 @@ fun aRoomDetailsState(
showDebugInfo = showDebugInfo,
roomVersion = "12",
roomHistoryVisibility = roomHistoryVisibility,
+ hasNewContent = hasNewContent,
eventSink = eventSink,
)
@@ -180,6 +182,7 @@ fun aDmRoomDetailsState(
roomName = roomName,
isPublic = false,
isEncrypted = isEncrypted,
+ canInvite = true,
roomType = RoomDetailsType.Dm(otherMember = aDmRoomMember(isIgnored = isDmMemberIgnored)),
roomMemberDetailsState = aUserProfileState(
isBlocked = AsyncData.Success(isDmMemberIgnored),
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt
index e877c24554..b30c73b9c8 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt
@@ -8,6 +8,7 @@
package io.element.android.features.roomdetails.impl
+import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
@@ -188,6 +189,46 @@ fun RoomDetailsView(
)
}
+ PreferenceCategory {
+ if (state.hasNewContent) {
+ ListItem(
+ headlineContent = {
+ Text(
+ text = stringResource(id = R.string.screen_roomlist_mark_as_read),
+ style = MaterialTheme.typography.bodyLarge,
+ )
+ },
+ onClick = {
+ state.eventSink(RoomDetailsEvent.MarkAsRead)
+ },
+ leadingContent = ListItemContent.Icon(
+ iconSource = IconSource.Vector(CompoundIcons.MarkAsRead())
+ ),
+ trailingContent = ListItemContent.Custom {
+ Box(
+ modifier = modifier
+ .size(8.dp)
+ .clip(CircleShape)
+ .background(ElementTheme.colors.iconAccentPrimary)
+ )
+ },
+ )
+ } else {
+ ListItem(
+ headlineContent = {
+ Text(
+ text = stringResource(id = R.string.screen_roomlist_mark_as_unread),
+ )
+ },
+ onClick = {
+ state.eventSink(RoomDetailsEvent.MarkAsUnread)
+ },
+ leadingContent = ListItemContent.Icon(
+ iconSource = IconSource.Vector(CompoundIcons.MarkAsUnread())
+ ),
+ )
+ }
+ }
PreferenceCategory {
if (state.roomNotificationSettings != null) {
NotificationItem(
@@ -208,8 +249,15 @@ fun RoomDetailsView(
onClick = onSecurityAndPrivacyClick
)
}
+ }
- state.roomMemberDetailsState?.let { dmMemberDetails ->
+ state.roomMemberDetailsState?.let { dmMemberDetails ->
+ if (state.canInvite) {
+ PreferenceCategory {
+ InviteItem(onClick = invitePeople)
+ }
+ }
+ PreferenceCategory {
ProfileItem(
verificationState = dmMemberDetails.verificationState,
onClick = { onProfileClick(dmMemberDetails.userId) }
@@ -374,14 +422,14 @@ private fun MainActionsSection(
onClick = { onCall(CallIntent.VIDEO) },
)
}
+ if (state.canInvite && state.roomType !is RoomDetailsType.Dm) {
+ MainActionButton(
+ title = stringResource(CommonStrings.action_invite),
+ imageVector = CompoundIcons.UserAdd(),
+ onClick = onInvitePeople,
+ )
+ }
if (state.roomType is RoomDetailsType.Room) {
- if (state.canInvite) {
- MainActionButton(
- title = stringResource(CommonStrings.action_invite),
- imageVector = CompoundIcons.UserAdd(),
- onClick = onInvitePeople,
- )
- }
// Share CTA should be hidden for DMs
MainActionButton(
title = stringResource(CommonStrings.action_share),
@@ -693,6 +741,17 @@ private fun MembersItem(
)
}
+@Composable
+private fun InviteItem(
+ onClick: () -> Unit,
+) {
+ ListItem(
+ headlineContent = { Text(stringResource(R.string.screen_room_details_invite_title)) },
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.UserAdd())),
+ onClick = onClick,
+ )
+}
+
@Composable
private fun PinnedMessagesItem(
pinnedMessagesCount: Int?,
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt
index ea0ed1bb72..3919817313 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt
@@ -11,6 +11,7 @@ package io.element.android.features.roomdetails.impl.invite
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import com.bumble.appyx.core.lifecycle.subscribe
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
@@ -19,10 +20,16 @@ import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.annotations.ContributesNode
+import io.element.android.features.invitepeople.api.InvitePeopleEvents
import io.element.android.features.invitepeople.api.InvitePeoplePresenter
import io.element.android.features.invitepeople.api.InvitePeopleRenderer
+import io.element.android.libraries.architecture.callback
+import io.element.android.libraries.designsystem.components.ProgressDialog
+import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.di.RoomScope
+import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.JoinedRoom
+import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
@ContributesNode(RoomScope::class)
@@ -35,6 +42,10 @@ class RoomInviteMembersNode(
room: JoinedRoom,
invitePeoplePresenterFactory: InvitePeoplePresenter.Factory,
) : Node(buildContext, plugins = plugins) {
+ interface Callback : Plugin {
+ fun openCreatedRoom(roomId: RoomId)
+ }
+
init {
lifecycle.subscribe(
onResume = {
@@ -48,6 +59,8 @@ class RoomInviteMembersNode(
roomId = room.roomId,
)
+ private val callback = plugins.callback()
+
@Composable
override fun View(modifier: Modifier) {
val state = invitePeoplePresenter.present()
@@ -59,6 +72,19 @@ class RoomInviteMembersNode(
}
}
+ AsyncActionView(
+ async = state.createRoomFromDmAction,
+ onSuccess = { roomId ->
+ callback.openCreatedRoom(roomId)
+ },
+ progressDialog = {
+ ProgressDialog(text = stringResource(CommonStrings.common_creating_room))
+ },
+ onErrorDismiss = {
+ state.eventSink(InvitePeopleEvents.ClearError)
+ }
+ )
+
RoomInviteMembersView(
state = state,
modifier = modifier,
diff --git a/features/roomdetails/impl/src/main/res/values-pl/translations.xml b/features/roomdetails/impl/src/main/res/values-pl/translations.xml
index 7af5d8e557..ccc359ed25 100644
--- a/features/roomdetails/impl/src/main/res/values-pl/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-pl/translations.xml
@@ -108,8 +108,8 @@
"Zezwalaj na ustawienia niestandardowe"
"Włączenie tej opcji nadpisze ustawienie domyślne"
"Powiadamiaj mnie o tym czacie przez"
- "Możesz to zmienić w swoim %1$s."
- "ustawienia globalne"
+ "Możesz to zmienić w %1$s."
+ "ustawieniach globalnych"
"Ustawienie domyślne"
"Usuń ustawienia własne"
"Wystąpił błąd podczas ładowania ustawień powiadomień."
diff --git a/features/roomdetails/impl/src/main/res/values-ro/translations.xml b/features/roomdetails/impl/src/main/res/values-ro/translations.xml
index 0374c64314..425e35a23c 100644
--- a/features/roomdetails/impl/src/main/res/values-ro/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-ro/translations.xml
@@ -1,5 +1,8 @@
+ "Membrii noi nu pot vedea istoricul"
+ "Membrii noi pot vedea istoricul"
+ "Oricine poate vedea istoricul"
"Veți avea nevoie de o adresă pentru a o face vizibilă în directorul public."
"Editați adresa"
"A apărut o eroare în timpul actualizării setărilor pentru notificari."
@@ -135,6 +138,7 @@
"Adăugați o adresă"
"Oricine se află în spațiile autorizate se poate alătura, dar toți ceilalți trebuie să solicite accesul."
"Toată lumea trebuie să solicite acces."
+ "Solicitați să vă alăturați"
"Oricine în %1$s se poate alătura, dar toți ceilalți trebuie să solicite acces."
"Da, activați criptarea"
"Odată activată, criptarea pentru o cameră nu poate fi dezactivată. Mesajele anterioare vor fi vizibile numai pentru membrii camerei de la momentul la care au fost invitați sau de la momentul la care s-au alăturat camerei.
@@ -145,22 +149,26 @@ Nu recomandăm activarea criptării pentru camerele pe care oricine le poate gă
"Criptare"
"Activați criptarea end-to-end"
"Oricine se poate alătura."
- "Alegeți membrii căror spații se pot alătura acestei camere fără invitație. %1$s"
+ "Oricine"
+ "Alegeți membrii căror spații se pot alătura acestei cameră fără invitație. %1$s"
"Gestionați spațiile"
"Doar persoanele invitate se pot alătura."
"Doar pe bază de invitație"
"Acces"
"Oricine se află într-un spațiu autorizat poate participa."
"Oricine din %1$s se poate alătura."
+ "Membrii spațiului"
"Spațiile nu sunt momentan suportate."
"Veți avea nevoie de o adresă pentru a o face vizibilă în directorul public."
"Adresă"
"Permiteți găsirea acestei camere prin căutarea în directorul de camere publice al %1$s"
"Permiteți găsirea prin căutarea în directorul public."
"Vizibilă în directorul de camere publice"
+ "Oricine (istoricul este public)"
+ "Modificările nu vor afecta mesajele anterioare, ci doar pe cele noi. %1$s"
"Cine poate citi mesajele anterioare"
- "Doar pentru membri, de la momentul în care au fost invitați"
- "Doar pentru membri, după selectarea acestei opțiuni"
+ "Membri de la momentul invitației"
+ "Membri (istoric complet)"
"Adresele camerelor sunt modalități de a găsi și accesa camere. Acest lucru vă asigură, de asemenea, că puteți partaja cu ușurință camera dumneavoastră cu alte persoane.
Puteți alege să publicați camera în directorul public al camerelor serverului dumneavoastră."
"Publicare cameră"
diff --git a/features/roomdetails/impl/src/main/res/values/localazy.xml b/features/roomdetails/impl/src/main/res/values/localazy.xml
index d7092af70e..0287b5657b 100644
--- a/features/roomdetails/impl/src/main/res/values/localazy.xml
+++ b/features/roomdetails/impl/src/main/res/values/localazy.xml
@@ -132,6 +132,8 @@
"Roles"
"Room details"
"Roles & permissions"
+ "Mark as read"
+ "Mark as unread"
"Add address"
"Anyone in authorised spaces can join, but everyone else must request access."
"Everyone must request access."
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt
index bcf25b2aac..9a97380d21 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt
@@ -68,9 +68,10 @@ class DefaultRoomDetailsEntryPointTest {
)
}
val callback = object : RoomDetailsEntryPoint.Callback {
+ override fun onDone() = lambdaError()
override fun navigateToGlobalNotificationSettings() = lambdaError()
override fun navigateToDeveloperSettings() = lambdaError()
- override fun navigateToRoom(roomId: RoomId, serverNames: List) = lambdaError()
+ override fun navigateToRoom(roomId: RoomId, serverNames: List, clearBackStack: Boolean) = lambdaError()
override fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean) = lambdaError()
override fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean) = lambdaError()
}
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/FakeRoomDetailsNavigator.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/FakeRoomDetailsNavigator.kt
new file mode 100644
index 0000000000..b416902dab
--- /dev/null
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/FakeRoomDetailsNavigator.kt
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.features.roomdetails.impl
+
+import io.element.android.tests.testutils.lambda.lambdaError
+
+class FakeRoomDetailsNavigator(
+ private val onDoneResult: () -> Unit = { lambdaError() }
+) : RoomDetailsNavigator {
+ override fun onDone() = onDoneResult()
+}
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/MatrixRoomFixture.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/MatrixRoomFixture.kt
index 2d85744345..edb9115a7e 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/MatrixRoomFixture.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/MatrixRoomFixture.kt
@@ -15,6 +15,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPermissions
+import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.A_ROOM_ALIAS
import io.element.android.libraries.matrix.test.A_ROOM_ID
@@ -28,7 +29,7 @@ import io.element.android.libraries.matrix.test.room.aRoomInfo
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
import io.element.android.tests.testutils.lambda.lambdaError
-fun aRoom(
+fun aFakeBaseRoom(
sessionId: SessionId = A_SESSION_ID,
roomId: RoomId = A_ROOM_ID,
displayName: String = A_ROOM_NAME,
@@ -49,6 +50,7 @@ fun aRoom(
getUpdatedMemberResult: (UserId) -> Result = { lambdaError() },
userRoleResult: () -> Result = { lambdaError() },
setIsFavoriteResult: (Boolean) -> Result = { lambdaError() },
+ markAsReadResult: (ReceiptType) -> Result = { lambdaError() },
) = FakeBaseRoom(
sessionId = sessionId,
roomId = roomId,
@@ -57,6 +59,7 @@ fun aRoom(
getUpdatedMemberResult = getUpdatedMemberResult,
userRoleResult = userRoleResult,
setIsFavoriteResult = setIsFavoriteResult,
+ markAsReadResult = markAsReadResult,
roomPermissions = roomPermissions,
initialRoomInfo = aRoomInfo(
name = displayName,
@@ -106,6 +109,7 @@ fun aJoinedRoom(
publishRoomAliasInRoomDirectoryResult: (RoomAlias) -> Result = { lambdaError() },
removeRoomAliasFromRoomDirectoryResult: (RoomAlias) -> Result = { lambdaError() },
setIsFavoriteResult: (Boolean) -> Result = { lambdaError() },
+ markAsReadResult: (ReceiptType) -> Result = { lambdaError() },
) = FakeJoinedRoom(
roomNotificationSettingsService = notificationSettingsService,
setNameResult = setNameResult,
@@ -118,7 +122,7 @@ fun aJoinedRoom(
updateCanonicalAliasResult = updateCanonicalAliasResult,
publishRoomAliasInRoomDirectoryResult = publishRoomAliasInRoomDirectoryResult,
removeRoomAliasFromRoomDirectoryResult = removeRoomAliasFromRoomDirectoryResult,
- baseRoom = aRoom(
+ baseRoom = aFakeBaseRoom(
sessionId = sessionId,
roomId = roomId,
roomPermissions = roomPermissions,
@@ -139,5 +143,6 @@ fun aJoinedRoom(
joinedMemberCount = joinedMemberCount,
activeMemberCount = activeMemberCount,
invitedMemberCount = invitedMemberCount,
+ markAsReadResult = markAsReadResult,
)
)
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt
index 9c116f5a9d..51a6f97ab0 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt
@@ -21,6 +21,8 @@ import io.element.android.libraries.androidutils.clipboard.ClipboardHelper
import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
+import io.element.android.libraries.matrix.api.core.RoomId
+import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMembersState
@@ -28,6 +30,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPermissions
+import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
import io.element.android.libraries.matrix.test.AN_EVENT_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
@@ -41,7 +44,11 @@ import io.element.android.libraries.matrix.test.notificationsettings.FakeNotific
import io.element.android.libraries.matrix.test.room.aRoomInfo
import io.element.android.libraries.matrix.test.room.powerlevels.FakeRoomPermissions
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
+import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
+import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
+import io.element.android.libraries.push.api.notifications.NotificationCleaner
+import io.element.android.libraries.push.test.notifications.FakeNotificationCleaner
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.EventsRecorder
@@ -79,7 +86,10 @@ class RoomDetailsPresenterTest {
analyticsService: AnalyticsService = FakeAnalyticsService(),
encryptionService: FakeEncryptionService = FakeEncryptionService(),
clipboardHelper: ClipboardHelper = FakeClipboardHelper(),
- appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore()
+ appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(),
+ navigator: RoomDetailsNavigator = FakeRoomDetailsNavigator(),
+ notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
+ sessionPreferencesStore: SessionPreferencesStore = InMemorySessionPreferencesStore(),
): RoomDetailsPresenter {
val matrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService)
val roomMemberDetailsPresenterFactory = object : RoomMemberDetailsPresenter.Factory {
@@ -96,6 +106,7 @@ class RoomDetailsPresenterTest {
}
}
return RoomDetailsPresenter(
+ navigator = navigator,
client = matrixClient,
room = room,
notificationSettingsService = matrixClient.notificationSettingsService,
@@ -106,6 +117,8 @@ class RoomDetailsPresenterTest {
analyticsService = analyticsService,
clipboardHelper = clipboardHelper,
appPreferencesStore = appPreferencesStore,
+ notificationCleaner = notificationCleaner,
+ sessionPreferencesStore = sessionPreferencesStore,
)
}
@@ -598,6 +611,87 @@ class RoomDetailsPresenterTest {
}
}
+ @Test
+ fun `present - mark as read`() = runTest {
+ val markAsReadResult = lambdaRecorder> { _ -> Result.success(Unit) }
+ val room = aJoinedRoom(
+ markAsReadResult = markAsReadResult,
+ )
+ val clearMessagesForRoomResult = lambdaRecorder { _, _ -> Result.success(Unit) }
+ val notificationCleaner = FakeNotificationCleaner(
+ clearMessagesForRoomLambda = clearMessagesForRoomResult,
+ )
+ val presenter = createRoomDetailsPresenter(
+ room = room,
+ notificationCleaner = notificationCleaner,
+ )
+ presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
+ skipItems(1)
+ with(awaitItem()) {
+ eventSink(RoomDetailsEvent.MarkAsRead)
+ }
+ assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(false)
+ markAsReadResult.assertions().isCalledOnce().with(value(ReceiptType.READ))
+ clearMessagesForRoomResult.assertions().isCalledOnce().with(
+ value(room.sessionId),
+ value(room.roomId),
+ )
+ }
+ }
+
+ @Test
+ fun `present - mark as read - private`() = runTest {
+ val markAsReadResult = lambdaRecorder> { _ -> Result.success(Unit) }
+ val room = aJoinedRoom(
+ markAsReadResult = markAsReadResult,
+ )
+ val sessionPreferencesStore = InMemorySessionPreferencesStore(
+ isSendPublicReadReceiptsEnabled = false,
+ )
+ val clearMessagesForRoomResult = lambdaRecorder { _, _ -> Result.success(Unit) }
+ val notificationCleaner = FakeNotificationCleaner(
+ clearMessagesForRoomLambda = clearMessagesForRoomResult,
+ )
+ val presenter = createRoomDetailsPresenter(
+ room = room,
+ notificationCleaner = notificationCleaner,
+ sessionPreferencesStore = sessionPreferencesStore,
+ )
+ presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
+ skipItems(1)
+ with(awaitItem()) {
+ eventSink(RoomDetailsEvent.MarkAsRead)
+ }
+ assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(false)
+ markAsReadResult.assertions().isCalledOnce().with(value(ReceiptType.READ_PRIVATE))
+ clearMessagesForRoomResult.assertions().isCalledOnce().with(
+ value(room.sessionId),
+ value(room.roomId),
+ )
+ }
+ }
+
+ @Test
+ fun `present - mark as unread`() = runTest {
+ val room = aJoinedRoom()
+ val onDoneResult = lambdaRecorder { }
+ val navigator = FakeRoomDetailsNavigator(
+ onDoneResult = onDoneResult
+ )
+ val presenter = createRoomDetailsPresenter(
+ room = room,
+ navigator = navigator,
+ )
+ presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
+ skipItems(1)
+ with(awaitItem()) {
+ eventSink(RoomDetailsEvent.MarkAsUnread)
+ }
+ onDoneResult.assertions().isCalledOnce()
+ assertThat(room.baseRoom.setUnreadFlagCalls).containsExactly(true)
+ }
+ }
+
private fun roomPermissions(
canInvite: Boolean = true,
canKick: Boolean = true,
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsViewTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsViewTest.kt
index 5fe0130c73..9494df5d44 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsViewTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsViewTest.kt
@@ -13,6 +13,8 @@ package io.element.android.features.roomdetails.impl
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.onAllNodesWithText
+import androidx.compose.ui.test.onLast
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
@@ -339,6 +341,25 @@ class RoomDetailsViewTest {
clickOn(R.string.screen_room_details_profile_row_title)
}
}
+
+ @Config(qualifiers = "h1024dp")
+ @Test
+ fun `click on invite invokes the expected callback`() = runAndroidComposeUiTest {
+ ensureCalledOnce { callback ->
+ setRoomDetailView(
+ state = aRoomDetailsState(
+ eventSink = EventsRecorder(expectEvents = false),
+ roomType = RoomDetailsType.Dm(
+ aDmRoomMember(userId = UserId("@other:local.org")),
+ ),
+ roomMemberDetailsState = aUserProfileState(userId = A_USER_ID),
+ canInvite = true,
+ ),
+ invitePeople = callback,
+ )
+ onAllNodesWithText(activity!!.getString(R.string.screen_room_details_invite_title)).onLast().performClick()
+ }
+ }
}
private fun AndroidComposeUiTest.setRoomDetailView(
diff --git a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationView.kt b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationView.kt
index 884e421e1f..53bf667c6e 100644
--- a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationView.kt
+++ b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationView.kt
@@ -8,6 +8,7 @@
package io.element.android.features.roommembermoderation.impl
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -239,6 +240,12 @@ private fun RoomMemberActionsBottomSheet(
modifier = Modifier
.padding(bottom = 24.dp)
.align(Alignment.CenterHorizontally)
+ .clickable {
+ coroutineScope.launch {
+ onSelectAction(ModerationAction.DisplayProfile, user)
+ bottomSheetState.hide()
+ }
+ }
)
val bestName = user.getBestName()
Text(
diff --git a/features/securebackup/impl/src/main/res/values-et/translations.xml b/features/securebackup/impl/src/main/res/values-et/translations.xml
index c3d849f37b..860d017781 100644
--- a/features/securebackup/impl/src/main/res/values-et/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-et/translations.xml
@@ -2,16 +2,17 @@
"Lülita võtmete varundamine välja"
"Lülita võtmete varundamine sisse"
- "Salvesta oma krüptoidentiteet ja sõnumite krüptovõtmed turvaliselt serveris. See tagab, et sinu sõnumite ajalugu on alati loetav, ka kõikides uutes seadmetes. %1$s."
+ "Salvesta oma digitaalne identiteet ja sõnumite krüptovõtmed turvaliselt serveris. See tagab, et sinu sõnumite ajalugu on alati loetav, ka kõikides uutes seadmetes. %1$s."
"Krüptovõtmete varundus"
- "Taastamise seadistamiseks peab võtmehoidla olema sisselülitatud."
+ "Sinu vestluste varundamiseks peab võtmehoidla olema sisselülitatud."
"Laadi siin seadmes leiduvad võtmed üles"
"Luba krüptovõtmete salvestamine"
"Muuda taastevõtit"
- "Kui sa oled kaotanud ligipääsu kõikidele oma olemasolevatele seadmetele, siis sa saad taastevõtme abil taastada ligipääsu oma krüptoidentiteedile ja sõnumite ajaloole."
+ "Kui sa oled kaotanud ligipääsu kõikidele oma olemasolevatele seadmetele, siis sa saad taastevõtme abil taastada ligipääsu oma digitaalsele identiteedile ja sõnumite ajaloole."
"Sisesta taastevõti"
"Sinu krüptovõtmete varundus pole hetkel enam sünkroonis."
- "Seadista andmete taastamine"
+ "Seadista taastevõti"
+ "Sinu vestlused on automaatselt varundatud kasutades läbivat krüptimist. Kui peaksid kaotama ligipääsu kõikidele oma seadmetele, siis selle varukoopia taastamiseks ja oma digitaalse identiteedi säilitamiseks, on vaja taastevõtit."
"Ava %1$s töölauaga seadmes"
"Logi uuesti sisse oma kasutajakontole"
"Kui sul palutakse seadet verifitseerida, vali %1$s"
@@ -23,12 +24,12 @@
"Sinu kasutajakonto andmed, kontaktid, eelistused ja vestluste loend säiluvad"
"Sa kaotad seniste sõnumite ajaloo"
"Sa pead kõik oma olemasolevad seadmed ja kontaktid uuesti verifitseerima"
- "Lähtesta oma identiteet vaid siis, kui sul pole ligipääsu mitte ühelegi oma seadmele ja sa oled kaotanud oma taastevõtme."
- "Kui sa ühtegi muud võimalust ei leia, siis lähtesta oma identiteet."
- "Lülita välja"
- "Kui sa logid välja kõikidest oma seadmetest, siis sa kaotad ligipääsu oma krüptitud sõnumitele."
- "Kas sa oled kindel, et soovid varukoopiate tegemise välja lülitada?"
- "Varunduse väljalülitamisel kustutatakse hetkel olemasolev sinu krüptovõtmete varukoopia ning lülituvad välja veel mõned turvafunktsionaalsused. Sellisel juhul sul:"
+ "Lähtesta oma digitaalne identiteet vaid siis, kui sul pole ligipääsu mitte ühelegi oma seadmele ja sa oled kaotanud oma taastevõtme."
+ "Kui sa ühtegi muud võimalust ei leia, siis lähtesta oma digitaalne identiteet."
+ "Kustuta"
+ "Kui sa eemaldad kõik oma seadmed, siis sa kaotad ligipääsu oma krüptitud sõnumitele ja pead oma digitaalse identiteedi lähtestama."
+ "Kas oled kindel, et soovid võtmehoidla kustutada?"
+ "Võtmehoidla kustutamine eemaldab sinu digitaalse identiteedi ja sõnumivõtmed serverist ning lülitab välja järgmised turvafunktsionaalsused:"
"sul ei ole krüptitud sõnumite ajalugu uutes seadmetes"
"sa kaotad ligipääsu oma krüptitud sõnumitele, kui sa logid kõikjal välja rakendusest %1$s"
"Kas sa oled kindel, et soovid varunduse välja lülitada?"
@@ -58,12 +59,12 @@
"Loo oma taastevõti"
"Ära jaga seda kellegagi"
"Andmete taastamise seadistamine õnnestus"
- "Seadista andmete taastamine"
+ "Seadista taastevõti"
"Jah, lähtesta nüüd"
"See tegevus on tagasipöördumatu."
- "Kas sa oled kindel, et soovid oma võrguidentiteeti lähtestada?"
+ "Kas sa oled kindel, et soovid oma digitaalse identiteedi lähtestada?"
"Tekkis teadmata viga. Palun kontrolli, kas sinu kasutajakonto salasõna on õige ja proovi uuesti."
"Sisesta…"
- "Palun kinnita, et soovid oma võrguidentiteedi lähtestada."
+ "Palun kinnita, et soovid oma digitaalse identiteedi lähtestada."
"Jätkamaks sisesta oma kasutajakonto salasõna"
diff --git a/features/securebackup/impl/src/main/res/values-pl/translations.xml b/features/securebackup/impl/src/main/res/values-pl/translations.xml
index f2f44e10f3..99bbcc8159 100644
--- a/features/securebackup/impl/src/main/res/values-pl/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-pl/translations.xml
@@ -30,7 +30,7 @@
"Jeśli usuniesz wszystkie swoje urządzenia, stracisz zaszyfrowaną historię wiadomości i będziesz musiał zresetować swoją tożsamość cyfrową."
"Czy na pewno chcesz usunąć magazyn kluczy?"
"Usunięcie magazynu kluczy usunie Twoją tożsamość cyfrową i klucze wiadomości z serwera, wyłączając następujące funkcje bezpieczeństwa:"
- "Posiadał historii wiadomości szyfrowanych na nowych urządzeniach"
+ "Stracisz dostęp do zaszyfrowanej historii wiadomości na nowych urządzeniach"
"Utracisz dostęp do wiadomości szyfrowanych, jeśli zostaniesz wszędzie wylogowany z %1$s"
"Czy na pewno chcesz wyłączyć backup?"
"Uzyskaj nowy klucz przywracania, jeśli straciłeś dostęp do obecnego. Po zmianie klucza przywracania stary nie będzie już działał."
diff --git a/features/securebackup/impl/src/main/res/values-ro/translations.xml b/features/securebackup/impl/src/main/res/values-ro/translations.xml
index 452a0543c8..2351a54923 100644
--- a/features/securebackup/impl/src/main/res/values-ro/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-ro/translations.xml
@@ -12,6 +12,7 @@
"Introduceți cheia de recuperare"
"Backup-ul pentru chat nu este sincronizat în prezent."
"Obțineți cheia de recuperare"
+ "Chaturile dumneavoastră sunt salvate automat cu criptare end-to-end. Pentru a restaura această copie de rezervă și a vă păstra identitatea digitală atunci când pierdeți accesul la toate dispozitivele dumneavoastră, veți avea nevoie de cheia de recuperare."
"Deschideți %1$s pe un dispozitiv desktop"
"Conectați-vă din nou la contul dumneavoastră"
"Când vi se cere să vă verificați dispozitivul, selectați%1$s"
diff --git a/features/securityandprivacy/impl/src/main/res/values-ro/translations.xml b/features/securityandprivacy/impl/src/main/res/values-ro/translations.xml
index 83292637ce..2f3eaab319 100644
--- a/features/securityandprivacy/impl/src/main/res/values-ro/translations.xml
+++ b/features/securityandprivacy/impl/src/main/res/values-ro/translations.xml
@@ -10,6 +10,7 @@
"Adăugați o adresă"
"Oricine se află în spațiile autorizate se poate alătura, dar toți ceilalți trebuie să solicite accesul."
"Toată lumea trebuie să solicite acces."
+ "Solicitați să vă alăturați"
"Oricine în %1$s se poate alătura, dar toți ceilalți trebuie să solicite acces."
"Da, activați criptarea"
"Odată activată, criptarea pentru o cameră nu poate fi dezactivată. Mesajele anterioare vor fi vizibile numai pentru membrii camerei de la momentul la care au fost invitați sau de la momentul la care s-au alăturat camerei.
@@ -20,22 +21,26 @@ Nu recomandăm activarea criptării pentru camerele pe care oricine le poate gă
"Criptare"
"Activați criptarea end-to-end"
"Oricine se poate alătura."
- "Alegeți membrii căror spații se pot alătura acestei camere fără invitație. %1$s"
+ "Oricine"
+ "Alegeți membrii căror spații se pot alătura acestei cameră fără invitație. %1$s"
"Gestionați spațiile"
"Doar persoanele invitate se pot alătura."
"Doar pe bază de invitație"
"Acces"
"Oricine se află într-un spațiu autorizat poate participa."
"Oricine din %1$s se poate alătura."
+ "Membrii spațiului"
"Spațiile nu sunt momentan suportate."
"Veți avea nevoie de o adresă pentru a o face vizibilă în directorul public."
"Adresă"
"Permiteți găsirea acestei camere prin căutarea în directorul de camere publice al %1$s"
"Permiteți găsirea prin căutarea în directorul public."
"Vizibilă în directorul de camere publice"
+ "Oricine (istoricul este public)"
+ "Modificările nu vor afecta mesajele anterioare, ci doar pe cele noi. %1$s"
"Cine poate citi mesajele anterioare"
- "Doar pentru membri, de la momentul în care au fost invitați"
- "Doar pentru membri, după selectarea acestei opțiuni"
+ "Membri de la momentul invitației"
+ "Membri (istoric complet)"
"Adresele camerelor sunt modalități de a găsi și accesa camere. Acest lucru vă asigură, de asemenea, că puteți partaja cu ușurință camera dumneavoastră cu alte persoane.
Puteți alege să publicați camera în directorul public al camerelor serverului dumneavoastră."
"Publicare cameră"
diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt
index 6b8d714cb7..6824cc6c10 100644
--- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt
+++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt
@@ -131,7 +131,6 @@ private fun aSpaceInfo(
numUnreadMessages = 0,
numUnreadNotifications = 0,
numUnreadMentions = 0,
- fullyReadEventId = null,
heroes = persistentListOf(),
pinnedEventIds = persistentListOf(),
creators = persistentListOf(),
@@ -141,6 +140,7 @@ private fun aSpaceInfo(
privilegedCreatorRole = false,
isLowPriority = false,
activeCallIntentConsensus = CallIntentConsensus.None,
+ fullyReadEventId = null,
)
}
diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt
index 05fb75ee5e..29898a1f63 100644
--- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt
+++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt
@@ -354,7 +354,8 @@ private fun EmptySpaceView(
title = stringResource(R.string.screen_space_empty_state_title),
subTitle = null,
iconStyle = BigIcon.Style.Default(vectorIcon = CompoundIcons.Room(), usePrimaryTint = true),
- modifier = Modifier.fillMaxWidth()
+ modifier = Modifier
+ .fillMaxWidth()
.padding(top = 40.dp, start = 24.dp, end = 24.dp, bottom = 24.dp),
)
ButtonColumnMolecule(
@@ -425,6 +426,7 @@ private fun SpaceViewTopBar(
modifier = Modifier
.clip(roundedCornerShape)
.clickable(enabled = canAccessSpaceSettings, onClick = onSettingsClick)
+ .semantics { heading() }
)
},
actions = {
@@ -532,6 +534,7 @@ private fun ManageModeTopBar(
Text(
text = pluralStringResource(CommonPlurals.common_selected_count, selectedCount, selectedCount),
style = ElementTheme.typography.fontBodyLgMedium,
+ modifier = Modifier.semantics { heading() },
)
},
actions = {
@@ -585,10 +588,7 @@ private fun SpaceAvatarAndNameRow(
)
Text(
modifier = Modifier
- .padding(horizontal = 8.dp)
- .semantics {
- heading()
- },
+ .padding(horizontal = 8.dp),
text = name ?: stringResource(CommonStrings.common_no_space_name),
style = ElementTheme.typography.fontBodyLgMedium,
fontStyle = FontStyle.Italic.takeIf { name == null },
diff --git a/features/space/impl/src/main/res/values-ro/translations.xml b/features/space/impl/src/main/res/values-ro/translations.xml
index 2bf5d0e251..7748f44ee2 100644
--- a/features/space/impl/src/main/res/values-ro/translations.xml
+++ b/features/space/impl/src/main/res/values-ro/translations.xml
@@ -9,10 +9,21 @@
"Selectați camerele pe care doriți să le părăsiți și în care nu sunteți singurul administrator:"
"Trebuie să desemnați un alt administrator pentru acest spațiu înainte de a-l părăsi."
+ "Sunteți singurul proprietar al %1$s. Trebuie să transferați dreptul de proprietate către altcineva înainte de a parăsi camera."
"Nu veți părăsi următoarele camere deoarece sunteți singurul administrator:"
"Părăsiți %1$s?"
"Sunteți singurul administrator pentru %1$s"
+ "Transferați proprietatea"
+ "Cameră"
+ "Adăugarea unei camere nu va afecta accesul la cameră. Pentru a modifica accesul, accesați Setări cameră > Securitate și confidențialitate."
+ "Adăugați prima dumneavoastră cameră"
"Vizualizați membrii"
+ "Eliminarea unei camere nu va afecta accesul la aceasta. Pentru a modifica accesul, accesați Informații despre cameră > Confidențialitate și securitate."
+
+ - "Eliminați camera %1$d din %2$s"
+ - "Eliminați camerele %1$d din %2$s"
+ - "Eliminați camerele %1$d din %2$s"
+
"Părăsiți spațiul"
"Roluri și permisiuni"
"Securitate & confidențialitate"
diff --git a/features/verifysession/impl/src/main/res/values-et/translations.xml b/features/verifysession/impl/src/main/res/values-et/translations.xml
index f09202c9c2..25cf6272fe 100644
--- a/features/verifysession/impl/src/main/res/values-et/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-et/translations.xml
@@ -2,7 +2,7 @@
"Kas kinnitamine pole võimalik?"
"Loo uus taastevõti"
- "Krüptitud sõnumivahetuse tagamiseks verifitseeri see seade."
+ "Turvalise sõnumside seadistamiseks vali verifitseerimise viis."
"Kinnita oma digitaalne identiteet"
"Kasuta teist seadet"
"Kasuta taastevõtit"
@@ -17,7 +17,7 @@
"Kinnita, et kõik järgnevalt kuvatud numbrid on täpselt samad, mida sa näed oma teises sessioonis."
"Võrdle numbreid"
"Võid nüüd sõnumeid oma teises seadmes turvaliselt saata ja vastu võtta."
- "Nüüd sa võid sõnumite vastuvõtmisel ja saatmisel selle kasutaja identiteeti usaldada."
+ "Nüüd sa võid sõnumite vastuvõtmisel ja saatmisel selle kasutaja digitaalset identiteeti usaldada."
"Seade on verifitseeritud"
"Sisesta taastevõti"
"Kas verifitseerimine aegus, teine osapool keeldus vastamast või tekkis vastuste mittevastavus."
@@ -42,7 +42,7 @@
"Ava rakendus teises verifitseeritud seadmes"
"Lisaturvalisuse nimel verifitseeri seee kasutaja, võrreldes oma seadmetes olevaid emojisid. Tee seda, kasutades usaldusväärset suhtlusviisi."
"Kas verifitseerime selle kasutaja?"
- "Lisaturvalisuse nimel soovib teine kasutaja sinu identiteeti verifitseerida. Järgmiseks näed sa emojisid, mida peate omavahel võrdlema."
+ "Lisaturvalisuse nimel soovib teine kasutaja sinu digitaalse identiteeti verifitseerida. Järgmiseks näed sa emojisid, mida peate omavahel võrdlema."
"Sa peaksid teises seadmes nägema hüpikakent. Palun alusta sealt verifitseerimist."
"Alusta verifitseerimist teises seadmes"
"Alusta verifitseerimist teises seadmes"
@@ -50,5 +50,5 @@
"Kui oled nõustunud, siis saad sa verifitseerimist jätkata."
"Jätkamaks nõustu verifitseerimisprotsessi alustamisega oma teises sessioonis."
"Ootame nõustumist verifitseerimispäringuga"
- "Logime välja…"
+ "Eemaldan seadet…"
diff --git a/features/verifysession/impl/src/main/res/values-ro/translations.xml b/features/verifysession/impl/src/main/res/values-ro/translations.xml
index cb22fd02d9..25f897d954 100644
--- a/features/verifysession/impl/src/main/res/values-ro/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-ro/translations.xml
@@ -17,7 +17,7 @@
"Confirmați că numerele de mai jos se potrivesc cu cele afișate în cealaltă sesiune."
"Comparați numerele"
"Noua dumneavoastră sesiune este acum verificată. Are acces la mesajele dumneavoastră criptate, iar ceilalti utilizatori vă vor vedea ca fiind de încredere."
- "Acum puteți avea încredere în identitatea acestui utilizator atunci când trimiteți sau primiți mesaje."
+ "Acum puteți avea încredere în identitatea digitală a acestui utilizator atunci când trimiteți sau primiți mesaje."
"Dispozitiv verificat"
"Introduceți cheia de recuperare"
"Fie cererea a expirat, cererea a fost respinsă, fie a existat o nepotrivire de verificare."
@@ -42,7 +42,7 @@
"Deschideți aplicația pe un alt dispozitiv verificat"
"Pentru securitate suplimentară, verificați acest utilizator comparând un set de emoji-uri pe dispozitivele dvs. Faceți acest lucru utilizând o metodă de comunicare de încredere."
"Verificați acest utilizator?"
- "Pentru o securitate suplimentară, un alt utilizator dorește să vă verifice identitatea. Vi se va afișa un set de emoji-uri pentru comparație."
+ "Pentru o securitate sporită, un alt utilizator dorește să vă verifice identitatea digitală. Vi se va afișa un set de emoji-uri pentru comparație."
"Ar trebui să vedeți o fereastră pop-up pe celălalt dispozitiv. Începeți verificarea de acolo acum."
"Începeți verificarea pe celălalt dispozitiv"
"Începeți verificarea pe celălalt dispozitiv"
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index cf95945d05..3d49f2cda1 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -7,7 +7,7 @@ android_gradle_plugin = "8.13.2"
# When updating this, please also update the version in the file ./idea/kotlinc.xml
kotlin = "2.3.21"
kotlinpoet = "2.3.0"
-ksp = "2.3.7"
+ksp = "2.3.8"
firebaseAppDistribution = "5.2.1"
# AndroidX
@@ -17,15 +17,15 @@ constraintlayout = "2.2.1"
constraintlayout_compose = "1.1.1"
lifecycle = "2.10.0"
activity = "1.13.0"
-media3 = "1.10.0"
-camera = "1.6.0"
+media3 = "1.10.1"
+camera = "1.6.1"
work = "2.11.2"
# Compose
-compose_bom = "2026.04.01"
+compose_bom = "2026.05.00"
# Coroutines
-coroutines = "1.10.2"
+coroutines = "1.11.0"
# Accompanist
accompanist = "0.37.3"
@@ -35,7 +35,7 @@ test_core = "1.7.0"
roborazzi = "1.60.0"
# Jetbrain
-datetime = "0.7.1"
+datetime = "0.8.0"
serialization_json = "1.11.0"
#other
@@ -51,10 +51,10 @@ telephoto = "0.19.0"
haze = "1.7.2"
# Dependency analysis
-dependencyAnalysis = "3.10.0"
+dependencyAnalysis = "3.11.0"
# DI
-metro = "0.13.2"
+metro = "1.1.1"
# Auto service
autoservice = "1.1.1"
@@ -80,7 +80,7 @@ kotlinpoet-ksp = { module = "com.squareup:kotlinpoet-ksp", version.ref = "kotlin
kover_gradle_plugin = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", version.ref = "kover" }
ksp_gradle_plugin = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }
# https://firebase.google.com/docs/android/setup#available-libraries
-google_firebase_bom = "com.google.firebase:firebase-bom:34.12.0"
+google_firebase_bom = "com.google.firebase:firebase-bom:34.13.0"
firebase_appdistribution_gradle = { module = "com.google.firebase:firebase-appdistribution-gradle", version.ref = "firebaseAppDistribution" }
autonomousapps_dependencyanalysis_plugin = { module = "com.autonomousapps:dependency-analysis-gradle-plugin", version.ref = "dependencyAnalysis" }
ksp_plugin = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "ksp" }
@@ -111,13 +111,14 @@ androidx_media3_ui = { module = "androidx.media3:media3-ui", version.ref = "medi
androidx_media3_transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" }
androidx_media3_effect = { module = "androidx.media3:media3-effect", version.ref = "media3" }
androidx_media3_common = { module = "androidx.media3:media3-common", version.ref = "media3" }
+androidx_media3_exoplayer_midi = { module = "androidx.media3:media3-exoplayer-midi", version.ref = "media3" }
androidx_biometric = "androidx.biometric:biometric-ktx:1.4.0-alpha02"
androidx_activity_activity = { module = "androidx.activity:activity", version.ref = "activity" }
androidx_activity_compose = { module = "androidx.activity:activity-compose", version.ref = "activity" }
androidx_startup = "androidx.startup:startup-runtime:1.2.0"
androidx_preference = "androidx.preference:preference:1.2.1"
-androidx_webkit = "androidx.webkit:webkit:1.15.0"
+androidx_webkit = "androidx.webkit:webkit:1.16.0"
androidx_compose_bom = { module = "androidx.compose:compose-bom", version.ref = "compose_bom" }
androidx_compose_material3 = { module = "androidx.compose.material3:material3", version = '1.5.0-alpha15' }
@@ -200,7 +201,7 @@ matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose",
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" }
sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
-sqlcipher = "net.zetetic:sqlcipher-android:4.15.0"
+sqlcipher = "net.zetetic:sqlcipher-android:4.16.0"
sqlite = "androidx.sqlite:sqlite-ktx:2.6.2"
unifiedpush = "org.unifiedpush.android:connector:3.3.2"
vanniktech_blurhash = "com.vanniktech:blurhash:0.3.0"
@@ -214,7 +215,7 @@ maplibre_annotation = "org.maplibre.gl:android-plugin-annotation-v9:3.0.2"
opusencoder = "io.element.android:opusencoder:1.2.0"
zxing_cpp = "io.github.zxing-cpp:android:3.0.2"
google_zxing = "com.google.zxing:core:3.5.4"
-google_guava = "com.google.guava:guava:33.5.0-android"
+google_guava = "com.google.guava:guava:33.6.0-android"
haze = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" }
haze_materials = { module = "dev.chrisbanes.haze:haze-materials", version.ref = "haze" }
@@ -222,7 +223,7 @@ color_picker = "io.mhssn:colorpicker:1.0.0"
# Analytics
posthog = "com.posthog:posthog-android:3.43.0"
-sentry = "io.sentry:sentry-android:8.40.0"
+sentry = "io.sentry:sentry-android:8.41.0"
# main branch can be tested replacing the version with main-SNAPSHOT
matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.33.2"
@@ -234,7 +235,7 @@ sigpwned_emoji4j = "com.sigpwned:emoji4j-core:16.0.0"
metro_runtime = { module = "dev.zacsweers.metro:runtime", version.ref = "metro" }
# Element Call
-element_call_embedded = "io.element.android:element-call-embedded:0.19.2"
+element_call_embedded = "io.element.android:element-call-embedded:0.19.4"
# Auto services
google_autoservice = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" }
@@ -262,13 +263,13 @@ metro = { id = "dev.zacsweers.metro", version.ref = "metro" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
ktlint = "org.jlleitschuh.gradle.ktlint:14.2.0"
dependencygraph = "com.savvasdalkitsis.module-dependency-graph:0.12"
-dependencycheck = "org.owasp.dependencycheck:12.2.1"
+dependencycheck = "org.owasp.dependencycheck:12.2.2"
dependencyanalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyAnalysis" }
paparazzi = "app.cash.paparazzi:2.0.0-alpha04"
roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" }
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" }
firebaseAppDistribution = { id = "com.google.firebase.appdistribution", version.ref = "firebaseAppDistribution" }
-sonarqube = "org.sonarqube:7.2.3.7755"
+sonarqube = "org.sonarqube:7.3.0.8198"
licensee = "app.cash.licensee:1.14.1"
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
gms_google_services = { id = "com.google.gms.google-services", version = "4.4.4" }
diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatter.kt
index b9b6467c92..d234e7b239 100644
--- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatter.kt
+++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatter.kt
@@ -54,6 +54,7 @@ class DefaultRoomLatestEventFormatter(
private val roomMembershipContentFormatter: RoomMembershipContentFormatter,
private val profileChangeContentFormatter: ProfileChangeContentFormatter,
private val stateContentFormatter: StateContentFormatter,
+ private val rtcNotificationContentFormatter: RtcNotificationContentFormatter,
private val permalinkParser: PermalinkParser,
) : RoomLatestEventFormatter {
override fun format(
@@ -121,7 +122,7 @@ class DefaultRoomLatestEventFormatter(
message.prefixIfNeeded(senderDisambiguatedDisplayName, isDmRoom, isOutgoing)
}
is LegacyCallInviteContent -> sp.getString(CommonStrings.common_unsupported_call)
- is CallNotifyContent -> sp.getString(CommonStrings.common_call_started)
+ is CallNotifyContent -> rtcNotificationContentFormatter.format(content, isDmRoom)
}?.take(DEFAULT_SAFE_LENGTH)
}
diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatter.kt
new file mode 100644
index 0000000000..ab3fb9433d
--- /dev/null
+++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatter.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.libraries.eventformatter.impl
+
+import dev.zacsweers.metro.Inject
+import io.element.android.libraries.matrix.api.MatrixClient
+import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent
+import io.element.android.libraries.ui.strings.CommonStrings
+import io.element.android.services.toolbox.api.strings.StringProvider
+
+@Inject
+class RtcNotificationContentFormatter(
+ private val matrixClient: MatrixClient,
+ private val sp: StringProvider,
+) {
+ fun format(
+ content: CallNotifyContent,
+ isDm: Boolean,
+ ): CharSequence {
+ return if (isDm) {
+ val isDeclined = content.declinedBy.isNotEmpty()
+ val isDeclinedByMe = content.declinedBy.any { matrixClient.isMe(it) }
+ if (isDeclinedByMe) {
+ sp.getString(CommonStrings.common_call_you_declined)
+ } else if (isDeclined) {
+ sp.getString(CommonStrings.common_call_declined)
+ } else {
+ sp.getString(CommonStrings.common_call_started)
+ }
+ } else {
+ sp.getString(CommonStrings.common_call_started)
+ }
+ }
+}
diff --git a/libraries/eventformatter/impl/src/main/res/values-pl/translations.xml b/libraries/eventformatter/impl/src/main/res/values-pl/translations.xml
index e45227ad62..94e1015375 100644
--- a/libraries/eventformatter/impl/src/main/res/values-pl/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-pl/translations.xml
@@ -29,7 +29,7 @@
"Zaprosiłeś %1$s"
"%1$s zaprosił Cię"
"%1$s dołączył do pokoju"
- "Dołączyłeś(aś) do pokoju"
+ "Dołączyłeś do pokoju"
"%1$s prosi o możliwość dołączenia"
"%1$s zezwolił %2$s na dołączenie"
"Zezwoliłeś %1$s na dołączenie"
diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatterTest.kt
index e1e8717c4c..e0613ed008 100644
--- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatterTest.kt
+++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLatestEventFormatterTest.kt
@@ -74,7 +74,8 @@ class DefaultRoomLatestEventFormatterTest {
roomMembershipContentFormatter = RoomMembershipContentFormatter(fakeMatrixClient, stringProvider),
profileChangeContentFormatter = ProfileChangeContentFormatter(stringProvider),
stateContentFormatter = StateContentFormatter(stringProvider),
- permalinkParser = FakePermalinkParser(),
+ rtcNotificationContentFormatter = RtcNotificationContentFormatter(fakeMatrixClient, stringProvider),
+ permalinkParser = FakePermalinkParser()
)
}
diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatterTest.kt
new file mode 100644
index 0000000000..dca34db3cc
--- /dev/null
+++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/RtcNotificationContentFormatterTest.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2026 Element Creations Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+package io.element.android.libraries.eventformatter.impl
+
+import android.content.Context
+import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.matrix.api.notification.CallIntent
+import io.element.android.libraries.matrix.api.timeline.item.event.CallNotifyContent
+import io.element.android.libraries.matrix.test.A_USER_ID_2
+import io.element.android.libraries.matrix.test.A_USER_ID_3
+import io.element.android.libraries.matrix.test.FakeMatrixClient
+import io.element.android.services.toolbox.impl.strings.AndroidStringProvider
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.RuntimeEnvironment
+import org.robolectric.annotation.Config
+import kotlin.toString
+
+@Suppress("LargeClass")
+@RunWith(RobolectricTestRunner::class)
+class RtcNotificationContentFormatterTest {
+ private lateinit var context: Context
+ private lateinit var fakeMatrixClient: FakeMatrixClient
+ private lateinit var formatter: RtcNotificationContentFormatter
+
+ @Before
+ fun setup() {
+ context = RuntimeEnvironment.getApplication() as Context
+ fakeMatrixClient = FakeMatrixClient()
+ val stringProvider = AndroidStringProvider(context.resources)
+ formatter = RtcNotificationContentFormatter(
+ fakeMatrixClient,
+ stringProvider
+ )
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `Should not display declined info in rooms`() {
+ val result = formatter.format(
+ CallNotifyContent(
+ CallIntent.VIDEO,
+ declinedBy = listOf(A_USER_ID_2, A_USER_ID_3)
+ ),
+ false
+ )
+ val expected = "Call started"
+ assertThat(result.toString()).isEqualTo(expected)
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `Declined by me variant`() {
+ val result = formatter.format(
+ CallNotifyContent(
+ CallIntent.VIDEO,
+ declinedBy = listOf(fakeMatrixClient.sessionId)
+ ),
+ true
+ )
+ val expected = "You declined a call"
+ assertThat(result.toString()).isEqualTo(expected)
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `Declined by other variant`() {
+ val result = formatter.format(
+ CallNotifyContent(
+ CallIntent.VIDEO,
+ declinedBy = listOf(A_USER_ID_2)
+ ),
+ true
+ )
+ val expected = "Call declined"
+ assertThat(result.toString()).isEqualTo(expected)
+ }
+
+ @Test
+ @Config(qualifiers = "en")
+ fun `Call started in DM`() {
+ val result = formatter.format(
+ CallNotifyContent(
+ CallIntent.AUDIO,
+ declinedBy = listOf()
+ ),
+ true
+ )
+ val expected = "Call started"
+ assertThat(result.toString()).isEqualTo(expected)
+ }
+}
diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt
index 72b681ad49..55d43e20c0 100644
--- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt
+++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt
@@ -93,27 +93,13 @@ enum class FeatureFlags(
defaultValue = { false },
isFinished = false,
),
- SignInWithClassic(
- key = "feature.signin_with_classic",
- title = "Sign in with Element Classic",
- description = "Allow the application to sign in to the current Element Classic account.",
- defaultValue = { false },
- isFinished = false,
- ),
AllowBlackTheme(
key = "feature.allow_black_theme",
- title = "Allow black theme",
+ title = "Black theme",
description = "Allow selecting the black appearance theme for battery saving on OLED.",
defaultValue = { false },
isFinished = false,
),
- LiveLocationSharing(
- key = "feature.liveLocationSharing",
- title = "Live location sharing",
- description = "Allow sharing live location in rooms.",
- defaultValue = { false },
- isFinished = false,
- ),
ValidateNetworkWhenSchedulingNotificationFetching(
key = "feature.validate_network_when_scheduling_notification_fetching",
title = "Validate internet connectivity when scheduling notification fetching",
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/linknewdevice/LinkMobileHandler.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/linknewdevice/LinkMobileHandler.kt
index 0c261cdd1a..1947729c7f 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/linknewdevice/LinkMobileHandler.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/linknewdevice/LinkMobileHandler.kt
@@ -18,6 +18,7 @@ sealed interface LinkMobileStep {
data object Uninitialized : LinkMobileStep
data object Starting : LinkMobileStep
data class QrReady(val data: String) : LinkMobileStep
+ data object QrRotating : LinkMobileStep
data class WaitingForAuth(val verificationUri: String) : LinkMobileStep
data class QrScanned(val checkCodeSender: CheckCodeSender) : LinkMobileStep
data class Error(val errorType: ErrorType) : LinkMobileStep
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt
index 715c7348a1..e590976cab 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomInfo.kt
@@ -70,11 +70,6 @@ data class RoomInfo(
* notification settings.
*/
val numUnreadMentions: Long,
- /**
- * Event ID of the user's `m.fully_read` marker for this room, if any.
- * Can be set even when the event is older than the loaded timeline window.
- */
- val fullyReadEventId: EventId?,
val heroes: ImmutableList,
val pinnedEventIds: ImmutableList,
val creators: ImmutableList,
@@ -84,6 +79,7 @@ data class RoomInfo(
val privilegedCreatorRole: Boolean,
val isLowPriority: Boolean,
val activeCallIntentConsensus: CallIntentConsensus,
+ val fullyReadEventId: EventId?,
) {
val aliases: List
get() = listOfNotNull(canonicalAlias) + alternativeAliases
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt
index d91d404a0b..f323b316f7 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt
@@ -119,7 +119,8 @@ data class LiveLocationContent(
data object LegacyCallInviteContent : EventContent
data class CallNotifyContent(
- val callIntent: CallIntent
+ val callIntent: CallIntent,
+ val declinedBy: List
) : EventContent
data object UnknownContent : EventContent
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt
index 6cd30d4f70..692edf79ae 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt
@@ -434,13 +434,30 @@ class RustMatrixAuthenticationService(
qrCodeData: QrCodeData,
): Client {
Timber.d("Creating client for QR Code login with simplified sliding sync")
+ // The 2025 version of MSC4108 provides baseUrl; the 2024 version has null baseUrl and uses
+ // serverName instead, which can be null or malformed. We only enforce presence/non-blankness
+ // here and rely on serverNameOrHomeserverUrl()/the Rust builder layer to validate structure.
+ val baseUrlOrServerName = qrCodeData.baseUrl() ?: qrCodeData.serverName()
+
+ if (baseUrlOrServerName == null) {
+ // With the 2024 version of MSC4108 we treat the absence of serverName as meaning that
+ // the other device is not signed in.
+ Timber.e("The QR code is from a device that is not yet signed in")
+ throw HumanQrLoginException.OtherDeviceNotSignedIn()
+ }
+
+ if (baseUrlOrServerName.isBlank()) {
+ Timber.e("The QR code contains an empty base URL or server name, which is invalid")
+ throw HumanQrLoginException.Unknown()
+ }
+
return rustMatrixClientFactory
.getBaseClientBuilder(
sessionPaths = sessionPaths,
passphrase = pendingPassphrase,
slidingSyncType = ClientBuilderSlidingSync.Discovered,
)
- .serverNameOrHomeserverUrl(qrCodeData.serverName()!!)
+ .serverNameOrHomeserverUrl(baseUrlOrServerName)
.build()
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandler.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandler.kt
index 6d212d4784..cb387a9d21 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandler.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandler.kt
@@ -51,6 +51,15 @@ class RustLinkMobileHandler(
)
// We emit Done in case the progress listener was deallocated before generate() sent the Done
_linkMobileStep.emit(LinkMobileStep.Done)
+ } catch (e: HumanQrGrantLoginException.NotFound) {
+ Timber.tag(tag.value).w(e, "Error during QR login grant")
+ // Catch timeout here?
+ if (_linkMobileStep.value is LinkMobileStep.QrReady) {
+ Timber.tag(tag.value).d("Emit QrRotating due to HumanQrGrantLoginException.NotFound")
+ _linkMobileStep.emit(LinkMobileStep.QrRotating)
+ } else {
+ _linkMobileStep.emit(LinkMobileStep.Error(e.map()))
+ }
} catch (e: HumanQrGrantLoginException) {
Timber.tag(tag.value).w(e, "Error during QR login grant")
_linkMobileStep.emit(LinkMobileStep.Error(e.map()))
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt
index a1d0dd5cd3..a972b3c130 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapper.kt
@@ -71,13 +71,13 @@ class RoomInfoMapper {
numUnreadMessages = it.numUnreadMessages.toLong(),
numUnreadMentions = it.numUnreadMentions.toLong(),
numUnreadNotifications = it.numUnreadNotifications.toLong(),
- fullyReadEventId = it.fullyReadEventId?.let(::EventId),
historyVisibility = it.historyVisibility.map(),
successorRoom = it.successorRoom?.map(),
roomVersion = it.roomVersion,
privilegedCreatorRole = it.privilegedCreatorsRole,
isLowPriority = it.isLowPriority,
activeCallIntentConsensus = it.activeRoomCallConsensusIntent.map(),
+ fullyReadEventId = it.fullyReadEventId?.let(::EventId)
)
}
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListEntriesUpdateExt.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListEntriesUpdateExt.kt
index 27b19ebf19..5d8367bb99 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListEntriesUpdateExt.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListEntriesUpdateExt.kt
@@ -16,25 +16,25 @@ import org.matrix.rustcomponents.sdk.RoomListEntriesUpdate
internal fun RoomListEntriesUpdate.describe(): String {
return when (this) {
is RoomListEntriesUpdate.Set -> {
- "Set #$index to '${value.displayName()}'"
+ "Set #$index to '${value.id()}'"
}
is RoomListEntriesUpdate.Append -> {
- "Append ${values.map { "'" + it.displayName() + "'" }}"
+ "Append ${values.map { "'" + it.id() + "'" }}"
}
is RoomListEntriesUpdate.PushBack -> {
- "PushBack '${value.displayName()}'"
+ "PushBack '${value.id()}'"
}
is RoomListEntriesUpdate.PushFront -> {
- "PushFront '${value.displayName()}'"
+ "PushFront '${value.id()}'"
}
is RoomListEntriesUpdate.Insert -> {
- "Insert at #$index: '${value.displayName()}'"
+ "Insert at #$index: '${value.id()}'"
}
is RoomListEntriesUpdate.Remove -> {
"Remove #$index"
}
is RoomListEntriesUpdate.Reset -> {
- "Reset all to ${values.map { "'" + it.displayName() + "'" }}"
+ "Reset all to ${values.map { "'" + it.id() + "'" }}"
}
RoomListEntriesUpdate.PopBack -> {
"PopBack"
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessor.kt
index 968a768fa2..afdac3db12 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessor.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessor.kt
@@ -112,6 +112,11 @@ class RoomSummaryListProcessor(
private suspend fun updateRoomSummaries(updates: List, block: suspend MutableList.() -> Unit) = withContext(
coroutineContext
) {
+ // Capture the description before applying updates: applyUpdate consumes each Room via
+ // `entry.use { ... }` which destroys it, and the duplicate-detection branch below reads
+ // id() through `describe()`. Without this capture the trackError call crashes before it
+ // can be reported.
+ val updatesDescription = updates.description()
mutex.withLock {
val current = roomSummaries.replayCache.lastOrNull()
val mutableRoomSummaries = current.orEmpty().toMutableList()
@@ -126,7 +131,7 @@ class RoomSummaryListProcessor(
analyticsService.trackError(
IllegalStateException(
"Found duplicates in room summaries after a list update from the SDK: $duplicates. " +
- "Updates: ${updates.description()}"
+ "Updates: $updatesDescription"
)
)
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
index edfe9a3543..fa671bc546 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
@@ -153,7 +153,8 @@ class TimelineEventContentMapper(
CallIntent.AUDIO
} else {
CallIntent.VIDEO
- }
+ },
+ declinedBy = it.declinedBy.map(::UserId)
)
}
}
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt
index a809f16803..cb5e221dc9 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomInfo.kt
@@ -52,7 +52,6 @@ internal fun aRustRoomInfo(
numUnreadMessages: ULong = 0uL,
numUnreadNotifications: ULong = 0uL,
numUnreadMentions: ULong = 0uL,
- fullyReadEventId: String? = null,
pinnedEventIds: List = listOf(),
roomCreators: List? = emptyList(),
joinRule: JoinRule? = null,
@@ -65,6 +64,7 @@ internal fun aRustRoomInfo(
activeRoomCallConsensusIntent: RtcCallIntentConsensus = RtcCallIntentConsensus.None,
activeServiceMembersCount: Int = 0,
isDm: Boolean = false,
+ fullyReadEventId: String? = null,
) = RoomInfo(
id = id,
displayName = displayName,
@@ -94,7 +94,6 @@ internal fun aRustRoomInfo(
numUnreadMessages = numUnreadMessages,
numUnreadNotifications = numUnreadNotifications,
numUnreadMentions = numUnreadMentions,
- fullyReadEventId = fullyReadEventId,
pinnedEventIds = pinnedEventIds,
creators = roomCreators,
joinRule = joinRule,
@@ -107,4 +106,5 @@ internal fun aRustRoomInfo(
activeRoomCallConsensusIntent = activeRoomCallConsensusIntent,
activeServiceMembersCount = activeServiceMembersCount.toULong(),
isDm = isDm,
+ fullyReadEventId = fullyReadEventId,
)
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceRoomList.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceRoomList.kt
index c85fb287b7..56cc5b9a1f 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceRoomList.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiSpaceRoomList.kt
@@ -40,8 +40,8 @@ class FakeFfiSpaceRoomList(
return paginationStateResult()
}
- override suspend fun rooms(): List = simulateLongTask {
- roomsResult()
+ override suspend fun rooms(): List {
+ return roomsResult()
}
override fun subscribeToPaginationStateUpdates(listener: SpaceRoomListPaginationStateListener): TaskHandle {
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandlerTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandlerTest.kt
index 9f71cb7169..ad751cc86b 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandlerTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/linknewdevice/RustLinkMobileHandlerTest.kt
@@ -118,6 +118,35 @@ class RustLinkMobileHandlerTest {
}
}
+ @Test
+ fun `when start throws HumanQrGrantLoginException_NotFound when in state QrReady, the handler emits QrRotating step`() = runTest {
+ val completable = CompletableDeferred()
+ val handler = FakeFfiGrantLoginWithQrCodeHandler(
+ generateResult = {
+ completable.await()
+ throw HumanQrGrantLoginException.NotFound("Timeout")
+ }
+ )
+ val sut = createRustLinkMobileHandler(
+ handler,
+ )
+ sut.linkMobileStep.test {
+ val initialItem = awaitItem()
+ assertThat(initialItem).isEqualTo(LinkMobileStep.Uninitialized)
+ backgroundScope.launch {
+ sut.start()
+ }
+ runCurrent()
+ handler.emitGenerateProgress(GrantGeneratedQrLoginProgress.QrReady(FakeFfiQrCodeData(toBytesResult = { QR_CODE_DATA_RECIPROCATE })))
+ val readyState = awaitItem()
+ assertThat(readyState).isInstanceOf(LinkMobileStep.QrReady::class.java)
+ // generate returns, error is emitted
+ completable.complete(Unit)
+ val qrRotatingState = awaitItem()
+ assertThat(qrRotatingState).isEqualTo(LinkMobileStep.QrRotating)
+ }
+ }
+
private fun TestScope.createRustLinkMobileHandler(
handler: FakeFfiGrantLoginWithQrCodeHandler = FakeFfiGrantLoginWithQrCodeHandler(),
) = RustLinkMobileHandler(
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt
index 75386964ca..dc3b16ca3c 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/RoomInfoMapperTest.kt
@@ -79,7 +79,6 @@ class RoomInfoMapperTest {
numUnreadMessages = 12uL,
numUnreadNotifications = 13uL,
numUnreadMentions = 14uL,
- fullyReadEventId = AN_EVENT_ID.value,
pinnedEventIds = listOf(AN_EVENT_ID.value),
roomCreators = listOf(A_USER_ID.value),
historyVisibility = RustRoomHistoryVisibility.Joined,
@@ -88,6 +87,7 @@ class RoomInfoMapperTest {
isLowPriority = true,
activeRoomCallConsensusIntent = RtcCallIntentConsensus.Full(RtcCallIntent.AUDIO),
isDm = true,
+ fullyReadEventId = AN_EVENT_ID.value,
)
)
).isEqualTo(
@@ -132,7 +132,6 @@ class RoomInfoMapperTest {
numUnreadMessages = 12L,
numUnreadNotifications = 13L,
numUnreadMentions = 14L,
- fullyReadEventId = AN_EVENT_ID,
historyVisibility = RoomHistoryVisibility.Joined,
successorRoom = null,
roomVersion = "12",
@@ -140,6 +139,7 @@ class RoomInfoMapperTest {
isLowPriority = true,
activeCallIntentConsensus = CallIntentConsensus.Full(CallIntent.AUDIO),
isDm = true,
+ fullyReadEventId = AN_EVENT_ID,
)
)
}
@@ -186,6 +186,7 @@ class RoomInfoMapperTest {
isLowPriority = true,
activeRoomCallConsensusIntent = RtcCallIntentConsensus.None,
isDm = false,
+ fullyReadEventId = AN_EVENT_ID.value,
)
)
).isEqualTo(
@@ -225,13 +226,13 @@ class RoomInfoMapperTest {
numUnreadMessages = 12L,
numUnreadNotifications = 13L,
numUnreadMentions = 14L,
- fullyReadEventId = null,
historyVisibility = RoomHistoryVisibility.Joined,
roomVersion = "12",
privilegedCreatorRole = true,
isLowPriority = true,
activeCallIntentConsensus = CallIntentConsensus.None,
isDm = false,
+ fullyReadEventId = AN_EVENT_ID,
)
)
}
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt
index 6fac54b904..d951b3d339 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTest.kt
@@ -173,16 +173,68 @@ class RoomSummaryListProcessorTest {
assertThat(summaries.value[index].roomId).isEqualTo(A_ROOM_ID_3)
}
+ /**
+ * Tracking issue #4182 / #5031: rooms duplicated in the room list.
+ *
+ * If duplicates are present in the upstream summaries flow, the dedupe safety net in
+ * [RoomSummaryListProcessor.updateRoomSummaries] must remove them and report the incident via
+ * [analyticsService.trackError]. Uses an empty update to drive the dedupe path without
+ * passing a Rust Room through the destroy-on-use path.
+ */
+ @Test
+ fun `pre-existing duplicates in summaries are deduped on next update and trackError fires`() = runTest {
+ summaries.value = listOf(
+ aRoomSummary(roomId = A_ROOM_ID),
+ aRoomSummary(roomId = A_ROOM_ID), // simulated SDK-side leak
+ aRoomSummary(roomId = A_ROOM_ID_2),
+ )
+ val analyticsService = FakeAnalyticsService()
+ val processor = createProcessor(analyticsService = analyticsService)
+
+ processor.postUpdate(emptyList())
+
+ assertThat(summaries.value.map { it.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_2).inOrder()
+ assertThat(analyticsService.trackedErrors).hasSize(1)
+ }
+
+ /**
+ * Tracking issue #4182 / #5031.
+ *
+ * Insert is the most likely Rust-SDK trigger for a duplicate-room report: it blindly inserts
+ * a new entry at an index without checking whether the roomId already exists. Before the
+ * describe-capture fix, the dedupe branch in [updateRoomSummaries] would call `Room.id()`
+ * on an already-destroyed Room (because [applyUpdate] consumes each value via
+ * `entry.use { ... }`) and crash before [trackError] could be invoked. This test guards the
+ * fix: the Insert is processed, the list is emitted deduplicated, and the tracked error
+ * message carries the human-readable description of the offending update.
+ */
+ @Test
+ fun `Insert that triggers dedupe is reported via trackError without crashing`() = runTest {
+ summaries.value = listOf(aRoomSummary(roomId = A_ROOM_ID))
+ val analyticsService = FakeAnalyticsService()
+ val processor = createProcessor(analyticsService = analyticsService)
+
+ processor.postUpdate(listOf(RoomListEntriesUpdate.Insert(0u, aRustRoom(A_ROOM_ID))))
+
+ assertThat(summaries.value.map { it.roomId }).containsExactly(A_ROOM_ID)
+ assertThat(analyticsService.trackedErrors).hasSize(1)
+ val message = analyticsService.trackedErrors.single().message.orEmpty()
+ assertThat(message).contains("Found duplicates")
+ assertThat(message).contains("Insert at #0")
+ }
+
private fun aRustRoom(roomId: RoomId = A_ROOM_ID) = FakeFfiRoom(
roomId = roomId,
latestEventLambda = { LatestEventValue.None }
)
- private fun TestScope.createProcessor() = RoomSummaryListProcessor(
+ private fun TestScope.createProcessor(
+ analyticsService: FakeAnalyticsService = FakeAnalyticsService(),
+ ) = RoomSummaryListProcessor(
summaries,
FakeFfiRoomListService(),
coroutineContext = StandardTestDispatcher(testScheduler),
roomSummaryFactory = RoomSummaryFactory(),
- analyticsService = FakeAnalyticsService(),
+ analyticsService = analyticsService,
)
}
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt
index 7fba39c909..3293570eec 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomInfoFixture.kt
@@ -66,13 +66,13 @@ fun aRoomInfo(
numUnreadMessages: Long = 0,
numUnreadNotifications: Long = 0,
numUnreadMentions: Long = 0,
- fullyReadEventId: EventId? = null,
historyVisibility: RoomHistoryVisibility = RoomHistoryVisibility.Joined,
roomVersion: String? = "11",
privilegedCreatorRole: Boolean = false,
isLowPriority: Boolean = false,
activeCallIntentConsensus: CallIntentConsensus = CallIntentConsensus.None,
isDm: Boolean = false,
+ fullyReadEventId: EventId? = null,
) = RoomInfo(
id = id,
name = name,
@@ -106,11 +106,11 @@ fun aRoomInfo(
numUnreadMessages = numUnreadMessages,
numUnreadNotifications = numUnreadNotifications,
numUnreadMentions = numUnreadMentions,
- fullyReadEventId = fullyReadEventId,
historyVisibility = historyVisibility,
roomVersion = roomVersion,
privilegedCreatorRole = privilegedCreatorRole,
isLowPriority = isLowPriority,
activeCallIntentConsensus = activeCallIntentConsensus,
isDm = isDm,
+ fullyReadEventId = fullyReadEventId,
)
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt
index 57f89101b7..392aa880c9 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomSummaryFixture.kt
@@ -81,6 +81,7 @@ fun aRoomSummary(
privilegedCreatorRole: Boolean = false,
isLowPriority: Boolean = false,
activeCallIntentConsensus: CallIntentConsensus = CallIntentConsensus.None,
+ fullyReadEventId: EventId? = null,
) = RoomSummary(
info = RoomInfo(
id = roomId,
@@ -115,13 +116,13 @@ fun aRoomSummary(
numUnreadMessages = numUnreadMessages,
numUnreadNotifications = numUnreadNotifications,
numUnreadMentions = numUnreadMentions,
- fullyReadEventId = null,
historyVisibility = historyVisibility,
roomVersion = roomVersion,
privilegedCreatorRole = privilegedCreatorRole,
isLowPriority = isLowPriority,
activeCallIntentConsensus = activeCallIntentConsensus,
isDm = false,
+ fullyReadEventId = fullyReadEventId,
),
latestEvent = latestEvent,
)
diff --git a/libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt b/libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt
index e67e630e97..ef654a4cf7 100644
--- a/libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt
+++ b/libraries/matrixmedia/impl/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderFactories.kt
@@ -16,7 +16,6 @@ import coil3.gif.GifDecoder
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
-import dev.zacsweers.metro.Provider
import io.element.android.libraries.di.annotations.ApplicationContext
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import okhttp3.OkHttpClient
@@ -29,7 +28,7 @@ interface ImageLoaderFactory {
@ContributesBinding(AppScope::class)
class DefaultImageLoaderFactory(
@ApplicationContext private val context: Context,
- private val okHttpClient: Provider,
+ private val okHttpClient: () -> OkHttpClient,
) : ImageLoaderFactory {
private val okHttpNetworkFetcherFactory = OkHttpNetworkFetcherFactory(
callFactory = {
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AvatarPickerView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AvatarPickerView.kt
index e743a2447c..4d3ba4dc6b 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AvatarPickerView.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/AvatarPickerView.kt
@@ -42,6 +42,7 @@ import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.hideFromAccessibility
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
@@ -196,7 +197,10 @@ private fun BoxScope.OverlayEditButton(
.clip(CircleShape)
.clickable(interactionSource = interactionSource, onClick = onClick, indication = null)
.background(ElementTheme.colors.bgCanvasDefault)
- .border(BorderStroke(1.dp, ElementTheme.colors.borderInteractiveSecondary), shape = CircleShape),
+ .border(BorderStroke(1.dp, ElementTheme.colors.borderInteractiveSecondary), shape = CircleShape)
+ .clearAndSetSemantics {
+ hideFromAccessibility()
+ },
contentAlignment = Alignment.Center,
) {
Icon(
diff --git a/libraries/matrixui/src/main/res/values-et/translations.xml b/libraries/matrixui/src/main/res/values-et/translations.xml
index abd3830768..a84990af10 100644
--- a/libraries/matrixui/src/main/res/values-et/translations.xml
+++ b/libraries/matrixui/src/main/res/values-et/translations.xml
@@ -3,6 +3,7 @@
"Saada kutse"
"Kas sa soovid alustada vestlust kasutajaga %1$s?"
"Kas saadame kutse?"
+ "Sul pole hetkel selle inimesega ühtegi vestlust. Enne jätkamist kinnita talle kutse saatmine."
"Kas alustad vestlust selle uue kontaktiga?"
"%1$s (%2$s) saatis sulle kutse"
diff --git a/libraries/matrixui/src/main/res/values-ro/translations.xml b/libraries/matrixui/src/main/res/values-ro/translations.xml
index 5156d6bd16..4d3eaa2364 100644
--- a/libraries/matrixui/src/main/res/values-ro/translations.xml
+++ b/libraries/matrixui/src/main/res/values-ro/translations.xml
@@ -3,5 +3,7 @@
"Trimiteți invitația"
"Doriți să începeți o discuție cu %1$s?"
"Trimiteți invitația?"
+ "În prezent, nu aveți nicio chat cu această persoană. Confirmați invitația înainte de a continua."
+ "Începeți o conversație cu acest nou contact?"
"%1$s (%2$s) v-a invitat."
diff --git a/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt
index c07ebb6ec9..3750060eef 100644
--- a/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt
+++ b/libraries/mediaupload/test/src/main/kotlin/io/element/android/libraries/mediaupload/test/FakeMediaPreProcessor.kt
@@ -31,6 +31,10 @@ class FakeMediaPreProcessor(
var cleanUpCallCount = 0
private set
+ /** The [MediaOptimizationConfig] passed to the most recent [process] call, or `null` if it was never called. */
+ var lastMediaOptimizationConfig: MediaOptimizationConfig? = null
+ private set
+
private var result: Result = Result.success(
MediaUploadInfo.AnyFile(
File("test"),
@@ -51,6 +55,7 @@ class FakeMediaPreProcessor(
): Result = simulateLongTask {
processLatch?.await()
processCallCount++
+ lastMediaOptimizationConfig = mediaOptimizationConfig
result
}
diff --git a/libraries/mediaviewer/impl/build.gradle.kts b/libraries/mediaviewer/impl/build.gradle.kts
index cd1579d50d..b723578829 100644
--- a/libraries/mediaviewer/impl/build.gradle.kts
+++ b/libraries/mediaviewer/impl/build.gradle.kts
@@ -31,6 +31,7 @@ dependencies {
implementation(libs.coroutines.core)
implementation(libs.coil.compose)
implementation(libs.androidx.media3.exoplayer)
+ implementation(libs.androidx.media3.exoplayer.midi)
implementation(libs.androidx.media3.ui)
implementation(libs.telephoto.zoomableimage)
implementation(libs.vanniktech.blurhash)
@@ -49,6 +50,7 @@ dependencies {
implementation(projects.libraries.matrix.api)
implementation(projects.libraries.matrixmedia.api)
implementation(projects.libraries.uiStrings)
+ implementation(projects.libraries.uiUtils)
implementation(projects.libraries.voiceplayer.api)
implementation(projects.services.toolbox.api)
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt
index f5418c76c9..7bdd4872a3 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt
@@ -32,6 +32,7 @@ import timber.log.Timber
import java.util.concurrent.atomic.AtomicBoolean
interface MediaGalleryDataSource {
+ val isReady: Boolean
fun start(coroutineScope: CoroutineScope)
fun groupedMediaItemsFlow(): Flow>
fun getLastData(): AsyncData
@@ -49,7 +50,7 @@ class TimelineMediaGalleryDataSource(
) : MediaGalleryDataSource {
private var timeline: Timeline? = null
- private val groupedMediaItemsFlow = MutableSharedFlow>(replay = 1)
+ private val groupedMediaItemsFlow = MutableSharedFlow>(replay = 1, extraBufferCapacity = 10)
override fun groupedMediaItemsFlow(): Flow> = groupedMediaItemsFlow
@@ -59,9 +60,12 @@ class TimelineMediaGalleryDataSource(
private val isStarted = AtomicBoolean(false)
+ override val isReady: Boolean get() = isStarted.get() && timeline != null
+
@OptIn(ExperimentalCoroutinesApi::class)
override fun start(coroutineScope: CoroutineScope) {
if (!isStarted.compareAndSet(false, true)) {
+ Timber.w("MediaGalleryDataSource for room ${room.roomId} is already started, ignoring subsequent start call")
return
}
flow {
@@ -73,10 +77,12 @@ class TimelineMediaGalleryDataSource(
}
mediaTimeline.getTimeline().fold(
{
+ Timber.d("Timeline media data source flow started for room ${room.roomId}")
timeline = it
emit(it)
},
{
+ Timber.e(it, "Failed to get media timeline for room ${room.roomId}")
groupedMediaItemsFlow.emit(AsyncData.Failure(it))
},
)
@@ -107,13 +113,13 @@ class TimelineMediaGalleryDataSource(
}
override suspend fun loadMore(direction: Timeline.PaginationDirection) {
- timeline?.paginate(direction)
+ timeline?.paginate(direction) ?: Timber.w("Timeline is not ready yet, cannot load more media items for room ${room.roomId}")
}
override suspend fun deleteItem(eventId: EventId) {
timeline?.redactEvent(
eventOrTransactionId = eventId.toEventOrTransactionId(),
reason = null,
- )
+ ) ?: Timber.w("Timeline is not ready yet, cannot delete media item with eventId $eventId for room ${room.roomId}")
}
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt
index e7caa12f2e..2c2fb31020 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenter.kt
@@ -94,7 +94,9 @@ class MediaGalleryPresenter(
mode = event.mode
}
is MediaGalleryEvent.LoadMore -> coroutineScope.launch {
- mediaGalleryDataSource.loadMore(event.direction)
+ if (mediaGalleryDataSource.isReady) {
+ mediaGalleryDataSource.loadMore(event.direction)
+ }
}
is MediaGalleryEvent.Delete -> coroutineScope.launch {
mediaGalleryDataSource.deleteItem(event.eventId)
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt
index cb9d6ae9c8..3ac578196d 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt
@@ -88,7 +88,7 @@ fun MediaAudioView(
modifier: Modifier = Modifier,
isDisplayed: Boolean = true,
) {
- val exoPlayer = rememberExoPlayer()
+ val exoPlayer = rememberExoPlayer(forAudioOnly = true)
ExoPlayerMediaAudioView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerFactory.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerFactory.kt
index d0043c657a..ccd628dbc5 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerFactory.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerFactory.kt
@@ -8,14 +8,18 @@
package io.element.android.libraries.mediaviewer.impl.local.player
+import androidx.annotation.OptIn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode
+import androidx.media3.common.util.UnstableApi
+import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.ExoPlayer
+@OptIn(UnstableApi::class)
@Composable
-fun rememberExoPlayer(): ExoPlayer {
+fun rememberExoPlayer(forAudioOnly: Boolean): ExoPlayer {
return if (LocalInspectionMode.current) {
remember {
ExoPlayerForPreview()
@@ -23,7 +27,14 @@ fun rememberExoPlayer(): ExoPlayer {
} else {
val context = LocalContext.current
remember {
- ExoPlayer.Builder(context).build()
+ if (forAudioOnly) {
+ // Required for media3-exoplayer-midi to decode MIDI samples produced by DefaultExtractorsFactory.
+ val renderersFactory = DefaultRenderersFactory(context)
+ .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
+ ExoPlayer.Builder(context, renderersFactory).build()
+ } else {
+ ExoPlayer.Builder(context).build()
+ }
}
}
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerView.kt
index b06b97f491..1f2b0b93d2 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerView.kt
@@ -28,6 +28,9 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.stateDescription
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -100,36 +103,54 @@ fun MediaPlayerControllerView(
contentColor = ElementTheme.colors.iconOnSolidPrimary,
)
}
+ val a11yPause = stringResource(CommonStrings.a11y_pause)
+ val a11yPlay = stringResource(CommonStrings.a11y_play)
IconButton(
modifier = Modifier
- .size(36.dp),
+ .size(36.dp)
+ .semantics {
+ stateDescription = if (state.isPlaying) a11yPause else a11yPlay
+ },
onClick = onTogglePlay,
colors = colors,
) {
if (state.isPlaying) {
Icon(
imageVector = CompoundIcons.PauseSolid(),
- contentDescription = stringResource(CommonStrings.a11y_pause)
+ contentDescription = null,
)
} else {
Icon(
imageVector = CompoundIcons.PlaySolid(),
- contentDescription = stringResource(CommonStrings.a11y_play)
+ contentDescription = null,
)
}
}
+ val position = state.displayProgressInMillis.toHumanReadableDuration()
+ val a11yPosition = stringResource(CommonStrings.a11y_position, position)
Text(
modifier = Modifier
.widthIn(min = 48.dp)
- .padding(horizontal = 8.dp),
- text = state.displayProgressInMillis.toHumanReadableDuration(),
+ .padding(horizontal = 8.dp)
+ .semantics {
+ contentDescription = a11yPosition
+ },
+ text = position,
textAlign = TextAlign.Center,
color = ElementTheme.colors.textPrimary,
style = ElementTheme.typography.fontBodyXsMedium,
)
var lastSelectedValue by remember { mutableFloatStateOf(-1f) }
Slider(
- modifier = Modifier.weight(1f),
+ modifier = Modifier
+ .weight(1f)
+ .semantics {
+ // Speak out a progress percent instead of milliseconds
+ stateDescription = buildString {
+ append((state.progressAsFloat * 100).toInt())
+ append("%")
+ }
+ },
valueRange = 0f..state.durationInMillis.toFloat(),
value = lastSelectedValue.takeIf { it >= 0 }
?: state.seekingToMillis?.toFloat()
@@ -146,30 +167,40 @@ fun MediaPlayerControllerView(
val formattedDuration = remember(state.durationInMillis) {
state.durationInMillis.toHumanReadableDuration()
}
+ val a11yDuration = stringResource(CommonStrings.a11y_duration, formattedDuration)
Text(
modifier = Modifier
.widthIn(min = 48.dp)
- .padding(horizontal = 8.dp),
+ .padding(horizontal = 8.dp)
+ .semantics {
+ contentDescription = a11yDuration
+ },
text = formattedDuration,
textAlign = TextAlign.Center,
color = ElementTheme.colors.textPrimary,
style = ElementTheme.typography.fontBodyXsMedium,
)
if (state.canMute) {
+ val a11yUnmute = stringResource(CommonStrings.common_unmute)
+ val a11yMute = stringResource(CommonStrings.common_mute)
IconButton(
onClick = onToggleMute,
+ modifier = Modifier
+ .semantics {
+ stateDescription = if (state.isMuted) a11yUnmute else a11yMute
+ },
) {
if (state.isMuted) {
Icon(
imageVector = CompoundIcons.VolumeOffSolid(),
tint = ElementTheme.colors.iconPrimary,
- contentDescription = stringResource(CommonStrings.common_unmute)
+ contentDescription = null,
)
} else {
Icon(
imageVector = CompoundIcons.VolumeOnSolid(),
tint = ElementTheme.colors.iconPrimary,
- contentDescription = stringResource(CommonStrings.common_mute)
+ contentDescription = null,
)
}
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt
index 082dc0571c..d89762b72e 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/video/MediaVideoView.kt
@@ -57,6 +57,7 @@ import io.element.android.libraries.mediaviewer.impl.local.player.rememberExoPla
import io.element.android.libraries.mediaviewer.impl.local.player.seekToEnsurePlaying
import io.element.android.libraries.mediaviewer.impl.local.player.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
+import io.element.android.libraries.ui.utils.a11y.isTalkbackActive
import kotlinx.coroutines.delay
import me.saket.telephoto.zoomable.zoomable
import timber.log.Timber
@@ -73,7 +74,7 @@ fun MediaVideoView(
audioFocus: AudioFocus?,
modifier: Modifier = Modifier,
) {
- val exoPlayer = rememberExoPlayer()
+ val exoPlayer = rememberExoPlayer(forAudioOnly = false)
ExoPlayerMediaVideoView(
isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState,
@@ -162,12 +163,20 @@ private fun ExoPlayerMediaVideoView(
var autoHideController by remember { mutableIntStateOf(0) }
- LaunchedEffect(autoHideController) {
- delay(5.seconds)
- if (exoPlayer.isPlaying) {
+ val isTalkbackActive = isTalkbackActive()
+ LaunchedEffect(autoHideController, isTalkbackActive) {
+ if (isTalkbackActive) {
+ // Ensure that the controller is always visible when talkback is active
mediaPlayerControllerState = mediaPlayerControllerState.copy(
- isVisible = false,
+ isVisible = true,
)
+ } else {
+ delay(5.seconds)
+ if (exoPlayer.isPlaying) {
+ mediaPlayerControllerState = mediaPlayerControllerState.copy(
+ isVisible = false,
+ )
+ }
}
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt
index eadbd544fc..b0b81bbde0 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSource.kt
@@ -11,14 +11,16 @@ package io.element.android.libraries.mediaviewer.impl.viewer
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.ProduceStateScope
import androidx.compose.runtime.State
-import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
+import androidx.compose.runtime.produceState
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.core.extensions.mapCatchingExceptions
+import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
import io.element.android.libraries.matrix.api.media.MediaFile
+import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint.MediaViewerMode
import io.element.android.libraries.mediaviewer.api.local.LocalMedia
@@ -36,13 +38,17 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.withContext
import timber.log.Timber
+import java.util.concurrent.ConcurrentHashMap
class MediaViewerDataSource(
mode: MediaViewerMode,
+ coroutineScope: CoroutineScope,
private val dispatcher: CoroutineDispatcher,
private val galleryDataSource: MediaGalleryDataSource,
private val mediaLoader: MatrixMediaLoader,
@@ -51,7 +57,7 @@ class MediaViewerDataSource(
private val pagerKeysHandler: PagerKeysHandler,
) {
// List of media files that are currently being loaded
- private val mediaFiles: MutableList = mutableListOf()
+ private val mediaFiles: ConcurrentHashMap = ConcurrentHashMap()
private val galleryMode = when (mode) {
MediaViewerMode.SingleMedia,
@@ -69,45 +75,63 @@ class MediaViewerDataSource(
fun dispose() {
Timber.d("Disposing MediaViewerDataSource, closing ${mediaFiles.size} media files")
- mediaFiles.forEach { it.close() }
+ mediaFiles.values.forEach { it.close() }
mediaFiles.clear()
localMediaStates.clear()
}
+ /**
+ * Helper function to translate the [dataFlow] result to a Compose [State] that can be observed in the UI.
+ */
@Composable
- fun collectAsState(): State> {
- return remember { dataFlow() }.collectAsState(initialData())
+ fun produceState(
+ producer: suspend ProduceStateScope>.(StateFlow>) -> Unit
+ ): State> {
+ return produceState(initialValue = initialData()) {
+ producer(dataFlow)
+ }
+ }
+
+ /**
+ * Find the index of the page corresponding to the given eventId, or null if not found.
+ */
+ fun findEventIndex(eventId: EventId?): Int? {
+ if (eventId == null) return null
+ return dataFlow.value.indexOfFirst { (it as? MediaViewerPageData.MediaViewerData)?.eventId == eventId }.takeIf { it >= 0 }
}
@VisibleForTesting
- internal fun dataFlow(): Flow> {
- return galleryDataSource.groupedMediaItemsFlow()
- .map { groupedItems ->
- when (groupedItems) {
- AsyncData.Uninitialized,
- is AsyncData.Loading -> {
- persistentListOf(
- MediaViewerPageData.Loading(
- direction = Timeline.PaginationDirection.BACKWARDS,
- timestamp = systemClock.epochMillis(),
- pagerKey = Long.MIN_VALUE,
- )
+ internal val dataFlow: StateFlow> = galleryDataSource.groupedMediaItemsFlow()
+ .map { groupedItems ->
+ when (groupedItems) {
+ AsyncData.Uninitialized,
+ is AsyncData.Loading -> {
+ persistentListOf(
+ MediaViewerPageData.Loading(
+ direction = Timeline.PaginationDirection.BACKWARDS,
+ timestamp = systemClock.epochMillis(),
+ pagerKey = Long.MIN_VALUE,
)
- }
- is AsyncData.Failure -> {
- persistentListOf(
- MediaViewerPageData.Failure(groupedItems.error),
- )
- }
- is AsyncData.Success -> {
- withContext(dispatcher) {
- val mediaItems = groupedItems.data.getItems(galleryMode)
- buildMediaViewerPageList(mediaItems)
- }
+ )
+ }
+ is AsyncData.Failure -> {
+ persistentListOf(
+ MediaViewerPageData.Failure(groupedItems.error),
+ )
+ }
+ is AsyncData.Success -> {
+ withContext(dispatcher) {
+ val mediaItems = groupedItems.data.getItems(galleryMode)
+ buildMediaViewerPageList(mediaItems)
}
}
}
- }
+ }
+ .stateIn(
+ scope = CoroutineScope(coroutineScope.coroutineContext + dispatcher),
+ started = SharingStarted.Lazily,
+ initialValue = initialData(),
+ )
private fun initialData(): ImmutableList {
val initialMediaItems =
@@ -146,7 +170,7 @@ class MediaViewerDataSource(
is MediaItem.LoadingIndicator -> add(
MediaViewerPageData.Loading(
direction = mediaItem.direction,
- timestamp = systemClock.epochMillis(),
+ timestamp = mediaItem.timestamp,
pagerKey = pagerKeysHandler.getKey(mediaItem),
)
)
@@ -159,10 +183,18 @@ class MediaViewerDataSource(
}
suspend fun loadMore(direction: Timeline.PaginationDirection) {
- galleryDataSource.loadMore(direction)
+ if (galleryDataSource.isReady) {
+ galleryDataSource.loadMore(direction)
+ }
}
suspend fun loadMedia(data: MediaViewerPageData.MediaViewerData) {
+ val currentState = localMediaStates[data.mediaSource.safeUrl]?.value
+ // If the media is already loading or has been loaded successfully, do nothing
+ if (currentState?.isLoading() == true || currentState?.isSuccess() == true) {
+ return
+ }
+
Timber.d("loadMedia for ${data.eventId}")
val localMediaState = localMediaStates.getOrPut(data.mediaSource.safeUrl) {
mutableStateOf(AsyncData.Uninitialized)
@@ -175,7 +207,7 @@ class MediaViewerDataSource(
filename = data.mediaInfo.filename
)
.onSuccess { mediaFile ->
- mediaFiles.add(mediaFile)
+ mediaFiles[data.mediaSource] = mediaFile
}
.mapCatchingExceptions { mediaFile ->
localMediaFactory.createFromMediaFile(
@@ -190,4 +222,12 @@ class MediaViewerDataSource(
localMediaState.value = AsyncData.Failure(it)
}
}
+
+ fun cancelLoadingMedia(data: MediaViewerPageData.MediaViewerData) {
+ if (localMediaStates[data.mediaSource.safeUrl]?.value?.isLoading() == true) {
+ Timber.d("cancelLoadingMedia for ${data.eventId}")
+ mediaFiles.remove(data.mediaSource)?.close()
+ localMediaStates[data.mediaSource.safeUrl]?.value = AsyncData.Uninitialized
+ }
+ }
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt
index 1960b69e4c..53d287075d 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerEvent.kt
@@ -29,4 +29,5 @@ sealed interface MediaViewerEvent {
data class Delete(val eventId: EventId) : MediaViewerEvent
data class OnNavigateTo(val index: Int) : MediaViewerEvent
data class LoadMore(val direction: Timeline.PaginationDirection) : MediaViewerEvent
+ data class CancelLoadingMedia(val data: MediaViewerPageData.MediaViewerData) : MediaViewerEvent
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt
index d834534e3e..e594daeb41 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerNode.kt
@@ -13,6 +13,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.lifecycle.lifecycleScope
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
@@ -118,6 +119,7 @@ class MediaViewerNode(
navigator = this,
dataSource = MediaViewerDataSource(
mode = inputs.mode,
+ coroutineScope = lifecycleScope,
dispatcher = coroutineDispatchers.computation,
galleryDataSource = mediaGallerySource,
mediaLoader = mediaLoader,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt
index 138c73c383..296f20ef4c 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt
@@ -14,14 +14,12 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.IntState
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State
-import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.snapshotFlow
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject
@@ -45,10 +43,7 @@ import io.element.android.libraries.mediaviewer.impl.model.mediaPermissions
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import io.element.android.libraries.androidutils.R as UtilsR
@@ -75,12 +70,27 @@ class MediaViewerPresenter(
@Composable
override fun present(): MediaViewerState {
val coroutineScope = rememberCoroutineScope()
- val data = dataSource.collectAsState()
- val currentIndex = remember { mutableIntStateOf(searchIndex(data.value, inputs.eventId)) }
+ val currentIndex = remember { mutableIntStateOf(dataSource.findEventIndex(inputs.eventId) ?: 0) }
+ val data = dataSource.produceState { flow ->
+ flow.collectLatest { new ->
+ val existingItem = value.getOrNull(currentIndex.intValue)
+ val newItem = new.getOrNull(currentIndex.intValue)
+ if (existingItem is MediaViewerPageData.MediaViewerData && existingItem.eventId == inputs.eventId && newItem != existingItem) {
+ currentIndex.intValue = dataSource.findEventIndex(inputs.eventId) ?: 0
+ } else if (currentIndex.intValue > 0 && value.firstOrNull() is MediaViewerPageData.Loading &&
+ new.firstOrNull() !is MediaViewerPageData.Loading) {
+ // Restore index based on the eventId after the initial items have been loaded
+ currentIndex.intValue = dataSource.findEventIndex(inputs.eventId) ?: 0
+ }
+ value = new
+ }
+ }
+
val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
- NoMoreItemsBackwardSnackBarDisplayer(currentIndex, data)
- NoMoreItemsForwardSnackBarDisplayer(currentIndex, data)
+ // Add both forward and backward pagination state checks to display a snackbar when there is no more items to load in either direction
+ NoMoreItemsSnackBarDisplayer(currentIndex, data, Timeline.PaginationDirection.FORWARDS)
+ NoMoreItemsSnackBarDisplayer(currentIndex, data, Timeline.PaginationDirection.BACKWARDS)
val permissions by room.permissionsAsState(MediaPermissions.DEFAULT) { perms ->
perms.mediaPermissions()
@@ -100,6 +110,9 @@ class MediaViewerPresenter(
is MediaViewerEvent.LoadMedia -> {
coroutineScope.downloadMedia(data = event.data)
}
+ is MediaViewerEvent.CancelLoadingMedia -> {
+ dataSource.cancelLoadingMedia(event.data)
+ }
is MediaViewerEvent.ClearLoadingError -> {
dataSource.clearLoadingError(event.data)
}
@@ -173,52 +186,39 @@ class MediaViewerPresenter(
}
@Composable
- private fun NoMoreItemsBackwardSnackBarDisplayer(
+ private fun NoMoreItemsSnackBarDisplayer(
currentIndex: IntState,
data: State>,
+ direction: Timeline.PaginationDirection,
) {
- // With newest-first ordering, backward loading indicator is at the last index
- val isRenderingLoadingBackward by remember {
- derivedStateOf {
- currentIndex.intValue == data.value.lastIndex &&
- data.value.size > 1 &&
- data.value.lastOrNull() is MediaViewerPageData.Loading
+ var previousIndex by remember { mutableIntStateOf(currentIndex.intValue) }
+ var previousDataSize by remember { mutableIntStateOf(data.value.size) }
+ var wasLoading: Boolean? by remember { mutableStateOf(null) }
+ LaunchedEffect(currentIndex.intValue, data.value) {
+ fun isLoading(index: Int, data: List, direction: Timeline.PaginationDirection): Boolean {
+ return when (direction) {
+ Timeline.PaginationDirection.BACKWARDS -> index == data.lastIndex && data.lastOrNull() is MediaViewerPageData.Loading
+ Timeline.PaginationDirection.FORWARDS -> index == 0 && data.firstOrNull() is MediaViewerPageData.Loading
+ }
}
- }
- if (isRenderingLoadingBackward) {
- LaunchedEffect(Unit) {
- // Observe the loading data vanishing
- snapshotFlow { data.value.lastOrNull() is MediaViewerPageData.Loading }
- .distinctUntilChanged()
- .filter { !it }
- .onEach { showNoMoreItemsSnackbar() }
- .launchIn(this)
+ // Reset the effect when the user navigate to another item so we only take into account index changes caused by data changes
+ if (previousIndex != currentIndex.intValue) {
+ wasLoading = null
+ previousIndex = currentIndex.intValue
+ }
+ // If we were navigating backwards and the data size grew, we can discard the previous value: it means we received new items
+ if (direction == Timeline.PaginationDirection.BACKWARDS && previousDataSize < data.value.size) {
+ wasLoading = null
}
- }
- }
- @Composable
- private fun NoMoreItemsForwardSnackBarDisplayer(
- currentIndex: IntState,
- data: State>,
- ) {
- // With newest-first ordering, forward loading indicator is at the first index
- val isRenderingLoadingForward by remember {
- derivedStateOf {
- currentIndex.intValue == 0 &&
- data.value.size > 1 &&
- data.value.firstOrNull() is MediaViewerPageData.Loading
- }
- }
- if (isRenderingLoadingForward) {
- LaunchedEffect(Unit) {
- // Observe the loading data vanishing
- snapshotFlow { data.value.firstOrNull() is MediaViewerPageData.Loading }
- .distinctUntilChanged()
- .filter { !it }
- .onEach { showNoMoreItemsSnackbar() }
- .launchIn(this)
+ val isLoading = isLoading(currentIndex.intValue, data.value, direction)
+
+ if (wasLoading == true && !isLoading) {
+ showNoMoreItemsSnackbar()
}
+
+ previousDataSize = data.value.size
+ wasLoading = isLoading
}
}
@@ -290,13 +290,4 @@ class MediaViewerPresenter(
CommonStrings.error_unknown
}
}
-
- private fun searchIndex(data: List, eventId: EventId?): Int {
- if (eventId == null) {
- return 0
- }
- return data.indexOfFirst {
- (it as? MediaViewerPageData.MediaViewerData)?.eventId == eventId
- }.coerceAtLeast(0)
- }
}
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt
index 8a4da2aac3..a51d3c44e9 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt
@@ -8,6 +8,7 @@
package io.element.android.libraries.mediaviewer.impl.viewer
+import androidx.compose.runtime.Immutable
import androidx.compose.runtime.State
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
@@ -29,6 +30,7 @@ data class MediaViewerState(
val eventSink: (MediaViewerEvent) -> Unit,
)
+@Immutable
sealed interface MediaViewerPageData {
val pagerKey: Long
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt
index 8bc5088187..3a7c006593 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt
@@ -44,7 +44,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
@@ -52,9 +51,12 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged
+import androidx.compose.ui.layout.onVisibilityChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
@@ -178,9 +180,11 @@ fun MediaViewerView(
val pagerState = rememberPagerState(state.currentIndex, 0f) {
state.listData.size
}
- LaunchedEffect(pagerState) {
- snapshotFlow { pagerState.currentPage }.collect { page ->
- state.eventSink(MediaViewerEvent.OnNavigateTo(page))
+
+ LaunchedEffect(pagerState.targetPage, state.currentIndex) {
+ // Only emit an index navigation change when it's triggered by the user scrolling
+ if (pagerState.targetPage != state.currentIndex && pagerState.isScrollInProgress) {
+ state.eventSink(MediaViewerEvent.OnNavigateTo(pagerState.targetPage))
}
}
HorizontalPager(
@@ -208,11 +212,16 @@ fun MediaViewerView(
}
is MediaViewerPageData.MediaViewerData -> {
var bottomPaddingInPixels by remember { mutableIntStateOf(defaultBottomPaddingInPixels) }
- LaunchedEffect(Unit) {
- state.eventSink(MediaViewerEvent.LoadMedia(dataForPage))
- }
Box(
- modifier = Modifier.fillMaxSize()
+ modifier = Modifier
+ .onVisibilityChanged(minDurationMs = 200L) { isVisible ->
+ if (isVisible) {
+ state.eventSink(MediaViewerEvent.LoadMedia(dataForPage))
+ } else {
+ state.eventSink(MediaViewerEvent.CancelLoadingMedia(dataForPage))
+ }
+ }
+ .fillMaxSize()
) {
val isDisplayed = remember(pagerState.settledPage) {
// This 'item provider' lambda will be called when the data source changes with an outdated `settlePage` value
@@ -488,14 +497,20 @@ private fun MediaViewerTopBar(
TopAppBar(
title = {
if (senderName != null && dateSent != null) {
+ val description = stringResource(
+ CommonStrings.a11y_sent_by_sender_at_date,
+ senderName,
+ dateSent,
+ )
Column(
modifier = Modifier
.fillMaxWidth()
+ .clearAndSetSemantics {
+ heading()
+ contentDescription = description
+ },
) {
Text(
- modifier = Modifier.semantics {
- heading()
- },
text = senderName,
style = ElementTheme.typography.fontBodyMdMedium,
color = ElementTheme.colors.textPrimary,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt
index 7bbf397171..146ace8620 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/SingleMediaGalleryDataSource.kt
@@ -30,6 +30,8 @@ class SingleMediaGalleryDataSource(
override fun groupedMediaItemsFlow() = flowOf(AsyncData.Success(data))
override fun getLastData(): AsyncData = AsyncData.Success(data)
+ override val isReady: Boolean = true
+
override suspend fun loadMore(direction: Timeline.PaginationDirection) = Unit
override suspend fun deleteItem(eventId: EventId) = Unit
diff --git a/libraries/mediaviewer/impl/src/main/res/values-cs/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-cs/translations.xml
index bcb7b64237..654aa869a6 100644
--- a/libraries/mediaviewer/impl/src/main/res/values-cs/translations.xml
+++ b/libraries/mediaviewer/impl/src/main/res/values-cs/translations.xml
@@ -16,6 +16,7 @@
"Název souboru"
"Žádné další soubory k zobrazení"
"Žádná další média k zobrazení"
+ "Informace o souboru"
"Nahrál(a)"
"Nahráno"
diff --git a/libraries/mediaviewer/impl/src/main/res/values-et/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-et/translations.xml
index 63329a797d..f982b32433 100644
--- a/libraries/mediaviewer/impl/src/main/res/values-et/translations.xml
+++ b/libraries/mediaviewer/impl/src/main/res/values-et/translations.xml
@@ -16,6 +16,7 @@
"Failinimi"
"Pole enam kuvatavaid faile"
"Pole enam kuvatavat meediat"
+ "Faili teave"
"Üleslaadija"
"Üleslaaditud"
diff --git a/libraries/mediaviewer/impl/src/main/res/values-ro/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-ro/translations.xml
index bfd1d49c2b..aa713361d0 100644
--- a/libraries/mediaviewer/impl/src/main/res/values-ro/translations.xml
+++ b/libraries/mediaviewer/impl/src/main/res/values-ro/translations.xml
@@ -16,6 +16,7 @@
"Nume fișier"
"Nu mai există fișiere de afișat"
"Nu mai există conținut media de afișat"
+ "Informații despre fișier"
"Încărcat de"
"Încărcat la"
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt
index b848ea2a7b..e7d45f433a 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/DefaultMediaViewerEntryPointTest.kt
@@ -33,16 +33,21 @@ import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.node.TestParentNode
import io.element.android.tests.testutils.testCoroutineDispatchers
import io.mockk.mockk
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
+import kotlinx.coroutines.test.setMain
import org.junit.Rule
import org.junit.Test
+@OptIn(ExperimentalCoroutinesApi::class)
class DefaultMediaViewerEntryPointTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
fun `test node builder`() = runTest {
+ Dispatchers.setMain(testCoroutineDispatchers().main)
val entryPoint = DefaultMediaViewerEntryPoint()
val mockMediaUri: Uri = mockk("localMediaUri")
val localMediaFactory = FakeLocalMediaFactory(mockMediaUri)
@@ -89,6 +94,7 @@ class DefaultMediaViewerEntryPointTest {
@Test
fun `test node builder avatar`() = runTest {
+ Dispatchers.setMain(testCoroutineDispatchers().main)
val entryPoint = DefaultMediaViewerEntryPoint()
val mockMediaUri: Uri = mockk("localMediaUri")
val localMediaFactory = FakeLocalMediaFactory(mockMediaUri)
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt
index 6602f475eb..ab3ffa98c7 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/DefaultEventItemFactoryTest.kt
@@ -62,7 +62,7 @@ class DefaultEventItemFactoryTest {
fun `create check all null cases`() {
val factory = createEventItemFactory()
val contents = listOf(
- CallNotifyContent(callIntent = CallIntent.VIDEO),
+ CallNotifyContent(callIntent = CallIntent.VIDEO, emptyList()),
FailedToParseMessageLikeContent("", ""),
FailedToParseStateContent("", "", ""),
LegacyCallInviteContent,
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt
index 4a64f02a33..5839f33ce6 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FakeMediaGalleryDataSource.kt
@@ -15,18 +15,20 @@ import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems
import io.element.android.tests.testutils.lambda.lambdaError
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.MutableStateFlow
class FakeMediaGalleryDataSource(
+ initialData: AsyncData = AsyncData.Uninitialized,
+ private val isReadyResult: () -> Boolean = { true },
private val startLambda: () -> Unit = { lambdaError() },
private val loadMoreLambda: (Timeline.PaginationDirection) -> Unit = { lambdaError() },
private val deleteItemLambda: (EventId) -> Unit = { lambdaError() },
- ) : MediaGalleryDataSource {
+) : MediaGalleryDataSource {
override fun start(coroutineScope: CoroutineScope) = startLambda()
- private val groupedMediaItemsFlow = MutableSharedFlow>(
- replay = 1
- )
+ private val groupedMediaItemsFlow = MutableStateFlow(initialData)
+
+ override val isReady: Boolean get() = isReadyResult()
override fun groupedMediaItemsFlow(): Flow> {
return groupedMediaItemsFlow
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt
index c3f1ab9a0d..d7ba547ee4 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerDataSourceTest.kt
@@ -62,15 +62,20 @@ class MediaViewerDataSourceTest {
@Test
fun `test dataFlow uninitialized, loading and error`() = runTest {
- val galleryDataSource = FakeMediaGalleryDataSource()
+ val galleryDataSource = FakeMediaGalleryDataSource(
+ initialData = AsyncData.Uninitialized,
+ )
val sut = createMediaViewerDataSource(
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ // The flow starts with an empty result
+ assertThat(awaitItem()).isEmpty()
galleryDataSource.emitGroupedMediaItems(AsyncData.Uninitialized)
assertThat(awaitItem().first()).isInstanceOf(MediaViewerPageData.Loading::class.java)
galleryDataSource.emitGroupedMediaItems(AsyncData.Loading())
- assertThat(awaitItem().first()).isInstanceOf(MediaViewerPageData.Loading::class.java)
+ // No items emitted, we were already loading data
+ ensureAllEventsConsumed()
galleryDataSource.emitGroupedMediaItems(AsyncData.Failure(AN_EXCEPTION))
assertThat(awaitItem().first()).isEqualTo(MediaViewerPageData.Failure(AN_EXCEPTION))
}
@@ -82,7 +87,7 @@ class MediaViewerDataSourceTest {
val sut = createMediaViewerDataSource(
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -102,7 +107,8 @@ class MediaViewerDataSourceTest {
val sut = createMediaViewerDataSource(
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -141,7 +147,8 @@ class MediaViewerDataSourceTest {
mode = MediaViewerMode.TimelineImagesAndVideos(timelineMode = Timeline.Mode.Media),
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -163,7 +170,8 @@ class MediaViewerDataSourceTest {
mode = MediaViewerMode.TimelineFilesAndAudios(timelineMode = Timeline.Mode.Media),
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -184,7 +192,8 @@ class MediaViewerDataSourceTest {
val sut = createMediaViewerDataSource(
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -217,7 +226,8 @@ class MediaViewerDataSourceTest {
val sut = createMediaViewerDataSource(
galleryDataSource = galleryDataSource,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -241,7 +251,8 @@ class MediaViewerDataSourceTest {
galleryDataSource = galleryDataSource,
mediaLoader = mediaLoader,
)
- sut.dataFlow().test {
+ sut.dataFlow.test {
+ skipItems(1)
galleryDataSource.emitGroupedMediaItems(
AsyncData.Success(
aGroupedMediaItems(
@@ -271,6 +282,7 @@ class MediaViewerDataSourceTest {
mediaLoader: MatrixMediaLoader = FakeMatrixMediaLoader(),
localMediaFactory: LocalMediaFactory = FakeLocalMediaFactory(mockMediaUrl),
) = MediaViewerDataSource(
+ coroutineScope = backgroundScope,
mode = mode,
dispatcher = testCoroutineDispatchers().computation,
galleryDataSource = galleryDataSource,
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt
index 86689859ad..459d30b8d5 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenterTest.kt
@@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId
import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId
import io.element.android.libraries.matrix.test.AN_EVENT_ID
+import io.element.android.libraries.matrix.test.AN_EVENT_ID_2
import io.element.android.libraries.matrix.test.A_SESSION_ID_2
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.media.FakeMatrixMediaLoader
@@ -51,6 +52,8 @@ import io.mockk.mockk
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.advanceUntilIdle
+import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
@@ -97,6 +100,8 @@ class MediaViewerPresenterTest {
assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue()
assertThat(initialState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
+
+ cancelAndIgnoreRemainingEvents()
}
}
@@ -120,6 +125,8 @@ class MediaViewerPresenterTest {
assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isFalse()
assertThat(initialState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
+
+ cancelAndIgnoreRemainingEvents()
}
}
@@ -143,6 +150,8 @@ class MediaViewerPresenterTest {
assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue()
assertThat(initialState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
+
+ cancelAndIgnoreRemainingEvents()
}
}
@@ -167,6 +176,8 @@ class MediaViewerPresenterTest {
assertThat(initialState.snackbarMessage).isNull()
assertThat(initialState.canShowInfo).isTrue()
assertThat(initialState.mediaBottomSheetState).isEqualTo(MediaBottomSheetState.Hidden)
+
+ cancelAndIgnoreRemainingEvents()
}
}
@@ -555,6 +566,8 @@ class MediaViewerPresenterTest {
)
val finalState = awaitItem()
assertThat(finalState.currentIndex).isEqualTo(1)
+
+ cancelAndIgnoreRemainingEvents()
}
}
@@ -578,32 +591,34 @@ class MediaViewerPresenterTest {
mode: MediaViewerEntryPoint.MediaViewerMode,
expectedSnackbarResId: Int,
) = runTest {
+ val image = anImage.copy(eventId = AN_EVENT_ID)
val mediaGalleryDataSource = FakeMediaGalleryDataSource(
+ initialData = AsyncData.Success(
+ if (mode is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios) {
+ GroupedMediaItems(
+ imageAndVideoItems = persistentListOf(),
+ fileItems = persistentListOf(aForwardLoadingIndicator, image, aBackwardLoadingIndicator),
+ )
+ } else {
+ GroupedMediaItems(
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, image, aBackwardLoadingIndicator),
+ fileItems = persistentListOf(),
+ )
+ }
+ ),
startLambda = { },
)
val presenter = createMediaViewerPresenter(
+ eventId = AN_EVENT_ID,
localMediaFactory = localMediaFactory,
mode = mode,
mediaGalleryDataSource = mediaGalleryDataSource,
)
presenter.test {
- awaitFirstItem()
- mediaGalleryDataSource.emitGroupedMediaItems(
- AsyncData.Success(
- if (mode is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios) {
- GroupedMediaItems(
- imageAndVideoItems = persistentListOf(),
- fileItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
- )
- } else {
- GroupedMediaItems(
- imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
- fileItems = persistentListOf(),
- )
- }
- )
- )
- val updatedState = awaitItem()
+ val updatedState = awaitFirstItem()
+
+ advanceUntilIdle()
+ runCurrent()
// User navigate to the first item (forward loading indicator)
updatedState.eventSink(
MediaViewerEvent.OnNavigateTo(0)
@@ -614,17 +629,17 @@ class MediaViewerPresenterTest {
if (mode is MediaViewerEntryPoint.MediaViewerMode.TimelineFilesAndAudios) {
GroupedMediaItems(
imageAndVideoItems = persistentListOf(),
- fileItems = persistentListOf(anImage, aBackwardLoadingIndicator),
+ fileItems = persistentListOf(image, aBackwardLoadingIndicator),
)
} else {
GroupedMediaItems(
- imageAndVideoItems = persistentListOf(anImage, aBackwardLoadingIndicator),
+ imageAndVideoItems = persistentListOf(image, aBackwardLoadingIndicator),
fileItems = persistentListOf(),
)
}
)
)
- skipItems(1)
+ skipItems(2)
val stateWithSnackbar = awaitItem()
assertThat(stateWithSnackbar.snackbarMessage!!.messageResId).isEqualTo(expectedSnackbarResId)
}
@@ -707,21 +722,19 @@ class MediaViewerPresenterTest {
fun `present - no snackbar displayed when there is no more items but not displaying a loading item`() = runTest {
val mediaGalleryDataSource = FakeMediaGalleryDataSource(
startLambda = { },
+ initialData = AsyncData.Success(
+ GroupedMediaItems(
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, anImage.copy(eventId = AN_EVENT_ID_2), aBackwardLoadingIndicator),
+ fileItems = persistentListOf(),
+ )
+ )
)
val presenter = createMediaViewerPresenter(
+ eventId = AN_EVENT_ID,
localMediaFactory = localMediaFactory,
mediaGalleryDataSource = mediaGalleryDataSource,
)
presenter.test {
- awaitFirstItem()
- mediaGalleryDataSource.emitGroupedMediaItems(
- AsyncData.Success(
- GroupedMediaItems(
- imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
- fileItems = persistentListOf(),
- )
- )
- )
val updatedState = awaitItem()
// User navigate to the media
updatedState.eventSink(
@@ -774,6 +787,51 @@ class MediaViewerPresenterTest {
}
}
+ @Test
+ fun `present - receiving loading items with different timestamps emits different items too`() = runTest {
+ val loadMoreLambda = lambdaRecorder { }
+ val mediaGalleryDataSource = FakeMediaGalleryDataSource(
+ startLambda = { },
+ loadMoreLambda = loadMoreLambda,
+ )
+ val presenter = createMediaViewerPresenter(
+ localMediaFactory = localMediaFactory,
+ mediaGalleryDataSource = mediaGalleryDataSource,
+ )
+ val anImage = aMediaItemImage(
+ mediaSourceUrl = aUrl,
+ )
+ presenter.test {
+ awaitFirstItem()
+ mediaGalleryDataSource.emitGroupedMediaItems(
+ AsyncData.Success(
+ GroupedMediaItems(
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
+ fileItems = persistentListOf(),
+ )
+ )
+ )
+ val updatedState = awaitItem()
+
+ // Get the exact same items, but with new timestamps for the loading indicators
+ mediaGalleryDataSource.emitGroupedMediaItems(
+ AsyncData.Success(
+ GroupedMediaItems(
+ imageAndVideoItems = persistentListOf(
+ aForwardLoadingIndicator.copy(timestamp = 1234L),
+ anImage,
+ aBackwardLoadingIndicator.copy(timestamp = 1234L),
+ ),
+ fileItems = persistentListOf(),
+ )
+ )
+ )
+
+ // We should get a new list of items, which should not be equal to the previous one
+ assertThat(updatedState.listData).isNotEqualTo(awaitItem().listData)
+ }
+ }
+
@Test
fun `present - view in timeline hides the bottom sheet and invokes the navigator`() = runTest {
val onViewInTimelineClickLambda = lambdaRecorder { }
@@ -794,6 +852,7 @@ class MediaViewerPresenterTest {
presenter.test {
val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
+ skipItems(1)
val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
initialState.eventSink(MediaViewerEvent.ViewInTimeline(AN_EVENT_ID))
@@ -823,6 +882,7 @@ class MediaViewerPresenterTest {
presenter.test {
val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
+ skipItems(1)
val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
initialState.eventSink(MediaViewerEvent.Forward(AN_EVENT_ID))
@@ -854,6 +914,7 @@ class MediaViewerPresenterTest {
presenter.test {
val initialState = awaitItem()
initialState.eventSink(MediaViewerEvent.OpenInfo(aMediaViewerPageData()))
+ skipItems(1)
val withBottomSheetState = awaitItem()
assertThat(withBottomSheetState.mediaBottomSheetState).isInstanceOf(MediaBottomSheetState.Details::class.java)
initialState.eventSink(MediaViewerEvent.Forward(AN_EVENT_ID))
@@ -892,6 +953,7 @@ internal fun TestScope.createMediaViewerPresenter(
),
navigator = mediaViewerNavigator,
dataSource = MediaViewerDataSource(
+ coroutineScope = backgroundScope,
mode = mode,
dispatcher = testCoroutineDispatchers().computation,
galleryDataSource = mediaGalleryDataSource,
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt
index fdd447c4a6..6521f450f5 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerViewTest.kt
@@ -13,6 +13,11 @@ package io.element.android.libraries.mediaviewer.impl.viewer
import android.net.Uri
import androidx.activity.ComponentActivity
import androidx.annotation.StringRes
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.test.AndroidComposeUiTest
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertHasClickAction
@@ -23,6 +28,7 @@ import androidx.compose.ui.test.swipeDown
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.architecture.AsyncData
+import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.libraries.mediaviewer.impl.details.aMediaBottomSheetStateDetails
import io.element.android.libraries.mediaviewer.test.viewer.aLocalMedia
import io.element.android.libraries.ui.strings.CommonStrings
@@ -33,9 +39,11 @@ import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.pressBack
import io.element.android.tests.testutils.setSafeContent
import io.mockk.mockk
+import kotlinx.coroutines.delay
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
+import kotlin.time.Duration.Companion.milliseconds
@RunWith(AndroidJUnit4::class)
class MediaViewerViewTest {
@@ -52,11 +60,14 @@ class MediaViewerViewTest {
state = state,
onBackClick = callback,
)
+
+ // Wait for enough time for the onVisibilityChanged modifier to trigger
+ mainClock.advanceTimeBy(200)
+
pressBack()
}
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
)
)
@@ -110,11 +121,14 @@ class MediaViewerViewTest {
eventSink = eventsRecorder
),
)
+
+ // Wait for enough time for the onVisibilityChanged modifier to trigger
+ mainClock.advanceTimeBy(200)
+
val contentDescription = activity!!.getString(contentDescriptionRes)
onNodeWithContentDescription(contentDescription).performClick()
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(data),
expectedEvent,
)
@@ -170,7 +184,6 @@ class MediaViewerViewTest {
clickOn(textRes)
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(data),
expectedEvent,
)
@@ -200,7 +213,6 @@ class MediaViewerViewTest {
.assertDoesNotExist()
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
)
)
@@ -223,7 +235,6 @@ class MediaViewerViewTest {
}
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(state.listData.first() as MediaViewerPageData.MediaViewerData),
)
)
@@ -241,10 +252,13 @@ class MediaViewerViewTest {
eventSink = eventsRecorder
),
)
+
+ // Wait for enough time for the onVisibilityChanged modifier to trigger
+ mainClock.advanceTimeBy(200)
+
clickOn(CommonStrings.action_retry)
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(data),
MediaViewerEvent.LoadMedia(data),
)
@@ -263,15 +277,72 @@ class MediaViewerViewTest {
eventSink = eventsRecorder
),
)
+
+ // Wait for enough time for the onVisibilityChanged modifier to trigger
+ mainClock.advanceTimeBy(200)
+
clickOn(CommonStrings.action_cancel)
eventsRecorder.assertList(
listOf(
- MediaViewerEvent.OnNavigateTo(0),
MediaViewerEvent.LoadMedia(data),
MediaViewerEvent.ClearLoadingError(data)
)
)
}
+
+ @Test
+ fun `loading event after an error triggers load more Event`() = runAndroidComposeUiTest {
+ val eventsRecorder = EventsRecorder()
+ val states = listOf(
+ aMediaViewerState(
+ listData = listOf(aMediaViewerPageDataLoading(timestamp = 0L)),
+ eventSink = eventsRecorder,
+ ),
+ aMediaViewerState(
+ listData = listOf(MediaViewerPageData.Failure(IllegalStateException("error"))),
+ eventSink = eventsRecorder,
+ ),
+ aMediaViewerState(
+ listData = listOf(aMediaViewerPageDataLoading(timestamp = 0L)),
+ eventSink = eventsRecorder,
+ ),
+ // This one should be ignored since it has the same timestamp as the last one, it should not trigger a recomposition
+ aMediaViewerState(
+ listData = listOf(aMediaViewerPageDataLoading(timestamp = 0L)),
+ eventSink = eventsRecorder,
+ ),
+ )
+ setSafeContent {
+ // Iterate over the states with a delay to give the view some time to trigger the `LoadMore` Event
+ var state by remember { mutableStateOf(states.first()) }
+ LaunchedEffect(Unit) {
+ val iterator = states.iterator()
+ while (iterator.hasNext()) {
+ delay(200.milliseconds)
+ state = iterator.next()
+ }
+ }
+ MediaViewerView(
+ state = state,
+ textFileViewer = { _, _ -> },
+ onBackClick = EnsureNeverCalled(),
+ audioFocus = null,
+ )
+ }
+
+ // Advance time to let the states update
+ mainClock.advanceTimeBy(3_000)
+
+ // `LoadMore` should be called twice, once for the first loading state, and once for the second one even though they have the same timestamp because
+ // of the intermediate error state.
+ // The third one will be ignored since it has the same timestamp as the second one and it'll be discarded by the Compose's equality diffing.
+ eventsRecorder.assertList(
+ listOf(
+ MediaViewerEvent.LoadMore(direction = Timeline.PaginationDirection.BACKWARDS),
+ MediaViewerEvent.LoadMore(direction = Timeline.PaginationDirection.BACKWARDS),
+ )
+ )
+ }
}
private fun AndroidComposeUiTest.setMediaViewerView(
diff --git a/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt b/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt
index 88240c3d65..39a54dca61 100644
--- a/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt
+++ b/libraries/network/src/main/kotlin/io/element/android/libraries/network/RetrofitFactory.kt
@@ -9,7 +9,6 @@
package io.element.android.libraries.network
import dev.zacsweers.metro.Inject
-import dev.zacsweers.metro.Provider
import io.element.android.libraries.androidutils.json.JsonProvider
import io.element.android.libraries.core.uri.ensureTrailingSlash
import okhttp3.MediaType.Companion.toMediaType
@@ -19,8 +18,8 @@ import retrofit2.converter.kotlinx.serialization.asConverterFactory
@Inject
class RetrofitFactory(
- private val okHttpClient: Provider,
- private val json: Provider,
+ private val okHttpClient: () -> OkHttpClient,
+ private val json: () -> JsonProvider,
) {
fun create(baseUrl: String): Retrofit = Retrofit.Builder()
.baseUrl(baseUrl.ensureTrailingSlash())
diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt
index 504adacdb6..4ea80e4ce8 100644
--- a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt
+++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/notifications/conversations/NotificationConversationService.kt
@@ -22,7 +22,7 @@ interface NotificationConversationService {
suspend fun onSendMessage(
sessionId: SessionId,
roomId: RoomId,
- roomName: String,
+ roomName: String?,
roomIsDirect: Boolean,
roomAvatarUrl: String?,
)
diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt
index ce20234385..f898e4a9ed 100644
--- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt
+++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt
@@ -76,7 +76,7 @@ class DefaultNotificationConversationService(
override suspend fun onSendMessage(
sessionId: SessionId,
roomId: RoomId,
- roomName: String,
+ roomName: String?,
roomIsDirect: Boolean,
roomAvatarUrl: String?,
) {
@@ -93,10 +93,11 @@ class DefaultNotificationConversationService(
val imageLoader = imageLoaderHolder.get(client)
val defaultShortcutIconSize = ShortcutManagerCompat.getIconMaxWidth(context)
+ val name = roomName?.takeIf { it.isNotBlank() } ?: roomId.value
val icon = bitmapLoader.getRoomBitmap(
avatarData = AvatarData(
id = roomId.value,
- name = roomName,
+ name = name,
url = roomAvatarUrl,
size = AvatarSize.RoomDetailsHeader,
),
@@ -105,7 +106,7 @@ class DefaultNotificationConversationService(
)?.let(IconCompat::createWithBitmap)
val shortcutInfo = ShortcutInfoCompat.Builder(context, createShortcutId(sessionId, roomId))
- .setShortLabel(roomName)
+ .setShortLabel(name)
.setIcon(icon)
.setIntent(intentProvider.getViewRoomIntent(sessionId, roomId, threadId = null, eventId = null))
.setCategories(categories)
diff --git a/libraries/push/impl/src/main/res/values-et/translations.xml b/libraries/push/impl/src/main/res/values-et/translations.xml
index 4b00b7b5e7..49010359cd 100644
--- a/libraries/push/impl/src/main/res/values-et/translations.xml
+++ b/libraries/push/impl/src/main/res/values-et/translations.xml
@@ -19,7 +19,8 @@
- "Sul on %d uus sõnum."
- "Sul on %d uut sõnumit."
- "📹 Sissetulev kõne"
+ "📞 Saabuv kõne"
+ "📹 Saabuv kõne"
"** Saatmine ei õnnestunud - palun ava jututoa täisvaade"
"Liitu"
"Keeldu"
diff --git a/libraries/push/impl/src/main/res/values-ro/translations.xml b/libraries/push/impl/src/main/res/values-ro/translations.xml
index 0a83e6afad..2f677568ea 100644
--- a/libraries/push/impl/src/main/res/values-ro/translations.xml
+++ b/libraries/push/impl/src/main/res/values-ro/translations.xml
@@ -15,10 +15,16 @@
"Distribuitorul de notificări UnifiedPush nu a putut fi înregistrat, așadar nu veți mai primi notificări. Verificați setările de notificări ale aplicației și starea distribuitorului push."
"Aveți mesaje noi"
+
+ - "Aveți %d mesaj nou."
+ - "Aveți %d mesaje noi."
+ - "Aveți %d mesaje noi."
+
+ "📞 Apel primit"
"Apel primit"
"** Trimiterea eșuată - vă rugăm să deschideți camera"
"Alăturați-vă"
- "Respinge"
+ "Respingeți"
- "%d invitație"
- "%d invitații"
diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt
index 0c8d870448..a2022ea22d 100644
--- a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt
+++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/conversations/FakeNotificationConversationService.kt
@@ -16,7 +16,7 @@ class FakeNotificationConversationService : NotificationConversationService {
override suspend fun onSendMessage(
sessionId: SessionId,
roomId: RoomId,
- roomName: String,
+ roomName: String?,
roomIsDirect: Boolean,
roomAvatarUrl: String?,
) = Unit
diff --git a/libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QrCodeImage.kt b/libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QrCodeImage.kt
index e045e42f17..b50b202e2c 100644
--- a/libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QrCodeImage.kt
+++ b/libraries/qrcode/src/main/kotlin/io/element/android/libraries/qrcode/QrCodeImage.kt
@@ -57,8 +57,8 @@ private fun BitMatrix.toBitmap(
@Composable
fun QrCodeImage(
data: String,
- forceMaxBrightness: Boolean = true,
modifier: Modifier = Modifier,
+ forceMaxBrightness: Boolean = true,
) {
if (forceMaxBrightness) {
ForceMaxBrightness()
diff --git a/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt b/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt
index 87ca215099..d8f897fe9f 100644
--- a/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt
+++ b/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt
@@ -130,4 +130,6 @@ object TestTags {
*
*/
val roomAddressField = TestTag("room_address_field")
+
+ val confirmInviteUnknown = TestTag("confirm_invite_unknown")
}
diff --git a/libraries/ui-strings/src/main/res/values-be/translations.xml b/libraries/ui-strings/src/main/res/values-be/translations.xml
index f106b46e6c..f550ce1075 100644
--- a/libraries/ui-strings/src/main/res/values-be/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-be/translations.xml
@@ -170,7 +170,6 @@
"Аўтарскае права"
"Стварэнне пакоя…"
"Выйшаў з пакоя"
- "Цёмная"
"Памылка расшыфроўкі"
"Параметры распрацоўшчыка"
"Прамы чат"
@@ -197,7 +196,6 @@
"Усталяваць APK"
"Гэты Matrix ID не знойдзены, таму запрашэнне можа быць не атрымана."
"Пакінуць пакой"
- "Светлая"
"Спасылка скапіравана ў буфер абмену"
"Загрузка…"
@@ -272,7 +270,6 @@
"Поспех"
"Прапановы"
"Сінхранізацыя"
- "Сістэмная"
"Тэкст"
"Паведамленні трэціх асоб"
"Гутарка"
diff --git a/libraries/ui-strings/src/main/res/values-bg/translations.xml b/libraries/ui-strings/src/main/res/values-bg/translations.xml
index 596b7b3e34..3f38b1991f 100644
--- a/libraries/ui-strings/src/main/res/values-bg/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-bg/translations.xml
@@ -145,7 +145,6 @@
"Създаване на стая…"
"Стаята е напусната"
"Пространството е напуснато"
- "Тъмен"
"Грешка при разшифроване"
"Описание"
"Опции за разработчици"
@@ -176,7 +175,6 @@
"Този Matrix ID не може да бъде намерен, така че поканата може да не бъде получена."
"Стаята се напуска"
"Пространството се напуска"
- "Светъл"
"Връзката е копирана в клипборда"
"Зарежда се…"
"Зарежда се още…"
@@ -269,7 +267,6 @@
"Успешно"
"Предложения"
"Синхронизиране"
- "Система"
"Текст"
"Уведомления от трети страни"
"Нишка"
diff --git a/libraries/ui-strings/src/main/res/values-cs/translations.xml b/libraries/ui-strings/src/main/res/values-cs/translations.xml
index 4a8623f5dc..1bf3802b12 100644
--- a/libraries/ui-strings/src/main/res/values-cs/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml
@@ -15,6 +15,7 @@
"Podrobnosti o šifrování"
"Rozbalit textové pole zprávy"
"Skrýt heslo"
+ "Informace"
"Připojit se k hovoru"
"Přejít dolů"
"Přesunout mapu na mou polohu"
@@ -50,6 +51,7 @@
"Odeslat soubory"
"Poloha odesílatele"
"Vyžaduje se časově omezená akce, na ověření máte jednu minutu"
+ "Nastavení, vyžaduje akci"
"Zobrazit heslo"
"Zahájit hovor"
"Zahájit videohovor"
@@ -71,6 +73,7 @@
"Hovor"
"Zrušit"
"Prozatím zrušit"
+ "Vyberte soubor"
"Vybrat fotku"
"Vymazat"
"Zavřít"
@@ -205,7 +208,9 @@
"Beta"
"Blokovaní uživatelé"
"Bubliny"
+ "Hovor odmítnut"
"Hovor zahájen"
+ "Odmítli jste hovor"
"Záloha chatu"
"Zkopírováno do schránky"
"Autorská práva"
@@ -215,7 +220,6 @@
"Místnost opuštěna"
"Opustit prostor"
"Pozvánka odmítnuta"
- "Tmavé"
"Chyba dešifrování"
"Popis"
"Možnosti pro vývojáře"
@@ -255,7 +259,6 @@ Důvod: %1$s."
"Tento Matrix identifikátor nelze najít, takže pozvánka nemusí být přijata."
"Opuštění místnosti"
"Opuštění prostoru"
- "Světlý"
"Řádek zkopírován do schránky"
"Odkaz zkopírován do schránky"
"Připojit nové zařízení"
@@ -380,7 +383,6 @@ Důvod: %1$s."
"Doporučeno"
"Návrhy"
"Synchronizace"
- "Systém"
"Text"
"Oznámení třetích stran"
"Vlákno"
@@ -469,6 +471,9 @@ Opravdu chcete pokračovat?"
"Omlouváme se, došlo k chybě"
"🔐️ Připojte se ke mně na %1$s"
"Ahoj, ozvi se mi na %1$s: %2$s"
+ "Sdílení polohy v reálném čase"
+ "Probíhá sdílení polohy"
+ "%1$s Aktuální poloha"
"%1$s Android"
"Zatřeste zařízením pro nahlášení chyby"
"Snímek obrazovky"
diff --git a/libraries/ui-strings/src/main/res/values-cy/translations.xml b/libraries/ui-strings/src/main/res/values-cy/translations.xml
index 98538f517d..00e2a39297 100644
--- a/libraries/ui-strings/src/main/res/values-cy/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml
@@ -198,7 +198,6 @@
"Wedi gadael yr ystafell"
"Gofod chwith"
"Wedi gwrthod y gwahoddiad"
- "Tywyll"
"Gwall dadgryptio"
"Disgrifiad"
"Dewisiadau datblygwr"
@@ -235,7 +234,6 @@ Rheswm: %1$s."
"Gosod APK"
"Nid oes modd dod o hyd i\'r ID Matrics hwn, felly mae\'n bosibl na fydd y gwahoddiad yn cael ei dderbyn."
"Gadael ystafell"
- "Golau"
"Llinell wedi\'i chopïo i\'r clipfwrdd"
"Dolen wedi\'i chopïo i\'r clipfwrdd"
"Yn Llwytho…"
@@ -359,7 +357,6 @@ Rheswm: %1$s."
"Llwyddiant"
"Awgrymiadau"
"Cydweddu"
- "System"
"Testun"
"Hysbysiadau trydydd parti"
"Edefyn"
diff --git a/libraries/ui-strings/src/main/res/values-da/translations.xml b/libraries/ui-strings/src/main/res/values-da/translations.xml
index 0837d0bb33..ce79b8972b 100644
--- a/libraries/ui-strings/src/main/res/values-da/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-da/translations.xml
@@ -217,7 +217,6 @@
"Forlod rummet"
"Forlod klynge"
"Invitationen blev afvist"
- "Mørkt tema"
"Fejl under dekryptering"
"Beskrivelse"
"Indstillinger for udviklere"
@@ -257,7 +256,6 @@
"Dette Matrix-ID kan ikke findes, så invitationen modtages muligvis ikke."
"Forlader rummet"
"Forlader klynge"
- "Lyst tema"
"Linje kopieret til udklipsholder"
"Linket er kopieret til udklipsholderen"
"Forbind ny enhed"
@@ -376,7 +374,6 @@
"Forslag"
"Forslag"
"Synkroniserer"
- "System"
"Tekst"
"Tredjepartsmeddelelser"
"Tråd"
diff --git a/libraries/ui-strings/src/main/res/values-de/translations.xml b/libraries/ui-strings/src/main/res/values-de/translations.xml
index 1a9190568c..5b7f52cf4e 100644
--- a/libraries/ui-strings/src/main/res/values-de/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-de/translations.xml
@@ -209,7 +209,6 @@
"Hat den Chat verlassen"
"Space verlassen"
"Einladung abgelehnt"
- "Dunkel"
"Dekodierungsfehler"
"Beschreibung"
"Entwickleroptionen"
@@ -249,7 +248,6 @@ Grund: %1$s."
"Diese Matrix Kennung wurde nicht gefunden, daher wird die Einladung möglicherweise nicht empfangen."
"Chat verlassen"
"Space wird verlassen"
- "Hell"
"Zeile in die Zwischenablage kopiert"
"Link in die Zwischenablage kopiert"
"Neues Gerät verknüpfen"
@@ -369,7 +367,6 @@ Grund: %1$s."
"Empfohlen"
"Vorschläge"
"Synchronisieren"
- "System"
"Text"
"Hinweise von Drittanbietern"
"Thread"
diff --git a/libraries/ui-strings/src/main/res/values-el/translations.xml b/libraries/ui-strings/src/main/res/values-el/translations.xml
index e5d6d0d1f5..ec14b73e04 100644
--- a/libraries/ui-strings/src/main/res/values-el/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-el/translations.xml
@@ -209,7 +209,6 @@
"Αποχώρησε από την αίθουσα"
"Αποχωρήσατε από τον χώρο"
"Η πρόσκληση απορρίφθηκε"
- "Σκοτεινό"
"Σφάλμα αποκρυπτογράφησης"
"Περιγραφή"
"Επιλογές προγραμματιστή"
@@ -249,7 +248,6 @@
"Αυτό το Matrix ID δεν μπορεί να βρεθεί, επομένως η πρόσκληση ενδέχεται να μην ληφθεί."
"Αποχώρηση από την αίθουσα"
"Αποχωρείτε από τον χώρο"
- "Φωτεινό"
"Η γραμμή αντιγράφηκε στο πρόχειρο"
"Ο σύνδεσμος αντιγράφηκε στο πρόχειρο"
"Σύνδεση νέας συσκευής"
@@ -369,7 +367,6 @@
"Προτεινόμενο"
"Προτάσεις"
"Συγχρονισμός"
- "Σύστημα"
"Κείμενο"
"Ειδοποιήσεις τρίτων"
"Νήμα"
diff --git a/libraries/ui-strings/src/main/res/values-es/translations.xml b/libraries/ui-strings/src/main/res/values-es/translations.xml
index 1dc69b127c..b03223a70e 100644
--- a/libraries/ui-strings/src/main/res/values-es/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-es/translations.xml
@@ -165,7 +165,6 @@
"Solicitud cancelada"
"Saliste de la sala"
"Invitación rechazada"
- "Oscuro"
"Error de descifrado"
"Opciones de desarrollador"
"ID de dispositivo"
@@ -201,7 +200,6 @@ Motivo: %1$s."
"Instalar APK"
"No se encontró este ID de Matrix, por lo que es posible que no se reciba la invitación."
"Saliendo de la sala"
- "Claro"
"Línea copiada al portapapeles"
"Enlace copiado al portapapeles"
"Cargando…"
@@ -280,7 +278,6 @@ Motivo: %1$s."
"Terminado"
"Sugerencias"
"Sincronizando"
- "Sistema"
"Texto"
"Avisos de terceros"
"Hilo"
diff --git a/libraries/ui-strings/src/main/res/values-et/translations.xml b/libraries/ui-strings/src/main/res/values-et/translations.xml
index 6004792f51..eef46172bd 100644
--- a/libraries/ui-strings/src/main/res/values-et/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-et/translations.xml
@@ -14,6 +14,7 @@
"Krüptimise üksikasjad"
"Laienda tekstivälja"
"Peida salasõna"
+ "Teave"
"Liitu kõnega"
"Mine lõppu"
"Nihuta kaart minu asukohta"
@@ -48,6 +49,7 @@
"Saada faile"
"Saatja asukoht"
"Palun tee see ajapiiranguga toiming, sul on aega üks minut"
+ "Seaded, vajalik on tegevus"
"Näita salasõna"
"Helista"
"Alusta videokõnet"
@@ -216,7 +218,6 @@
"Lahkus jututoast"
"Lahkus kogukonnast"
"Keeldusid kutsest"
- "Tume"
"Dekrüptimisviga"
"Kirjeldus"
"Arendaja valikud"
@@ -232,6 +233,7 @@
"Tühi fail"
"Krüptimine"
"Krüptimine on kasutusel"
+ "Lõpeb kell %1$s"
"Sisesta oma PIN-kood"
"Viga"
"Tekkis viga ja sa ei pruugi enam saada uute sõnumite kohta teavitusi. Palun kontrolli teavituste seadistusi ja proovi viga tuvastada.
@@ -255,7 +257,6 @@ Põhjus: %1$s."
"Sellist Matrix\'i kasutajatunnust ei õnnestu leida, seega sõnumit ilmselt keegi kätte ei saa."
"Oled lahkumas jututoast"
"Oled lahkumas kogukonnast"
- "Hele"
"Rida on kopeeritud lõikelauale"
"Link on kopeeritud lõikelauale"
"Seo uus seade"
@@ -356,9 +357,10 @@ Põhjus: %1$s."
"Seadistused"
"Jaga kogukonda"
"Uued liikmed näevad ajalugu"
+ "Reaalajas jagatud asukoht"
"Jagatud asukoht"
"Jagatud kogukond"
- "Logime välja"
+ "Seade on eemaldamisel"
"Midagi läks valesti"
"Tekkis viga. Palun proovi uuesti."
"Kogukond"
@@ -374,7 +376,6 @@ Põhjus: %1$s."
"Soovitatud"
"Soovitused"
"Sünkroniseerime"
- "Süsteem"
"Tekst"
"Kolmandate osapoolte teatised"
"Jutulõng"
@@ -384,7 +385,7 @@ Põhjus: %1$s."
"Dekrüptimine ei olnud võimalik"
"Saadetud ebaturvalisest seadmest"
"Sul pole ligipääsu antud sõnumile"
- "Saatja verifitseeritud identiteet on lähtestatud"
+ "Saatja digitaalse identiteet on lähtestatud"
"Kutset polnud võimalik saata ühele või enamale kasutajale."
"Kutse(te) saatmine ei õnnestunud"
"Eemalda lukustus"
@@ -415,12 +416,13 @@ Põhjus: %1$s."
"Kuna sind polnud saatmise ajal jututoas, siis %1$s (%2$s) jagas seda sõnumit sinuga."
"%1$s jagas seda sõnumit, kuna sind ei olnud selle algse saatmise ajal jututoas."
"See jututuba on seadistatud sedaviisi, et ka uued liikmed saavad lugeda varasemat ajalugu. %1$s"
- "Kasutaja %1$s võrguidentiteet on lähtestatud. %2$s"
- "Kasutaja %1$s %2$s võrguidentiteet on lähtestatud. %3$s"
+ "Kasutaja %1$s digitaalse identiteet on lähtestatud. %2$s"
+ "Kasutaja %1$s %2$s digitaalse identiteet on lähtestatud. %3$s"
"(%1$s)"
- "%1$s kasutaja verifitseeritud identiteet on lähtestatud."
- "%1$s kasutaja (%2$s kasutajanimi) verifitseeritud identiteet on lähtestatud. %3$s"
+ "%1$s kasutaja digitaalse identiteet on lähtestatud."
+ "%1$s kasutaja (ksutajanimega %2$s) digitaalse identiteet on lähtestatud. %3$s"
"Võta verifitseerimine tagasi"
+ "Luba juurdepääs"
"%1$s link viib sind teise veebisaiti %2$s
Kas sa oled kindel, et soovid jätkata?"
@@ -450,6 +452,7 @@ Kas sa oled kindel, et soovid jätkata?"
"Rakendus %1$s ei suutnud tuvastada sinu asukohta. Palun proovi hiljem uuesti."
"Sinu häälsõnumi üleslaadimine ei õnnestunud."
"Seda jututuba pole enam olemas või pole see kutse enam kehtiv."
+ "Asukohapõhise funktsionaalsuse kasutamiseks palun lülita nutiseadmes GPS sisse."
"Sõnumit ei leidu"
"Rakendusel %1$s puudub õigus sinu asukohta tuvastada. Sa saad seda lubada süsteemi seadistustest."
"Rakendusel %1$s puudub õigus sinu asukohta tuvastada. Järgnevalt anna vastavad õigused."
@@ -461,6 +464,9 @@ Kas sa oled kindel, et soovid jätkata?"
"Vabandust, ilmnes viga"
"🔐️ Liitu minuga rakenduses %1$s"
"Hei, suhtle minuga %1$s võrgus: %2$s"
+ "Asukoha jagamine reaalajas"
+ "Asukoha jagamine käimas"
+ "Asukoht reaalajas: %1$s"
"%1$s Android"
"Veast teatamiseks raputa nutiseadet ägedalt"
"Ekraanitõmmis"
@@ -483,11 +489,11 @@ Kas sa oled kindel, et soovid jätkata?"
- "%1$d esiletõstetud sõnumit"
"Esiletõstetud sõnumid"
- "Oma võrguidentiteedi lähtestamiseks suuname sind %1$s kasutajakonto halduse lehele. Hiljem suunatakse sind tagasi sama rakenduse juurde."
- "Sa ei saa seda kinnitada? Ava oma kasutajakonto haldus ja lähtesta oma võrguidentiteet."
+ "Oma digitaalse identiteedi lähtestamiseks suuname sind %1$s kasutajakonto halduse lehele. Hiljem suunatakse sind tagasi sama rakenduse juurde."
+ "Sa ei saa seda kinnitada? Ava oma kasutajakonto haldus ja lähtesta oma digitaalne identiteet."
"Unusta verifitseerimine ja saada ikkagi"
"Sa võid jätta verifitseerimisvea tähelepanuta ja sõnumi ikkagi saata või katkestad saatmise ja peale kasutaja %1$s verifitseerimist proovid seda uuesti."
- "Sinu sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud."
+ "Sinu sõnum on saatmata, kuna kasutaja %1$s digitaalse identiteet on lähtestatud."
"Saada sõnum ikkagi"
"%1$s kasutab ühte või enamat verifitseerimata seadet. Sa võid sõnumi ikkagi saata või katkestad selle ning ootad kuni %2$s on kõik oma seadmed verifitseerinud ning proovid seejärel uuesti."
"Sinu sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid"
@@ -511,14 +517,16 @@ Kas sa oled kindel, et soovid jätkata?"
"Ava Apple Mapsis"
"Ava Google Mapsis"
"Ava OpenStreetMapis"
- "Jaga seda asukohta"
+ "Jaga valitud asukohta"
"Jagamise valikud"
"Sinu loodud kogukonnad ning need, millega oled liitunud."
"%1$s • %2$s"
"Jututubade haldamiseks võid luua kogukondi"
"Kogukond: %1$s"
"Kogukonnad"
- "Sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud."
+ "Jagatud %1$s"
+ "Kaardil"
+ "Sõnum on saatmata, kuna kasutaja %1$s digitaalse identiteet on lähtestatud."
"Sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid."
"Kuna sa pole üks või enamgi oma seadet verifitseerinud, siis sinu sõnum on saatmata."
"Asukoht"
@@ -528,5 +536,5 @@ Kas sa oled kindel, et soovid jätkata?"
"Ligipääsuks vanadele sõnumitele pead selle seadme verifitseerima"
"Sul pole ligipääsu antud sõnumile"
"Sõnumi dekrüptimine ei õnnestu"
- "Kuna seade on verifitseerimata või saatja pole sind verifitseerinud, siis sõnumi näitamine on blokeeritud."
+ "Kuna seade on verifitseerimata või saatja pole sinu digitaalset identiteeti verifitseerinud, siis sõnumi näitamine on blokeeritud."
diff --git a/libraries/ui-strings/src/main/res/values-eu/translations.xml b/libraries/ui-strings/src/main/res/values-eu/translations.xml
index 7e9d3a05fe..0c046b8bb4 100644
--- a/libraries/ui-strings/src/main/res/values-eu/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml
@@ -169,7 +169,6 @@
"Eskaera bertan behera utzi da"
"Gelatik atera da"
"Gonbidapenari uko egin zaio"
- "Iluna"
"Deszifratze-errorea"
"Garapen aukerak"
"Gailuaren IDa"
@@ -204,7 +203,6 @@ Arrazoia: %1$s."
"Instalatu APK"
"Matrix IDa ezin da topatu eta, beraz, litekeena da gonbidapena ez jasotzea."
"Gelatik ateratzen"
- "Argia"
"Lerroa arbelean kopiatu da"
"Esteka arbelean kopiatu da"
"Kargatzen…"
@@ -287,7 +285,6 @@ Arrazoia: %1$s."
"Arrakasta"
"Iradokizunak"
"Sinkronizatzen"
- "Sistema"
"Testua"
"Hirugarrenei buruzko oharrak"
"Haria"
diff --git a/libraries/ui-strings/src/main/res/values-fa/translations.xml b/libraries/ui-strings/src/main/res/values-fa/translations.xml
index 418ca96419..c14f281f0d 100644
--- a/libraries/ui-strings/src/main/res/values-fa/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml
@@ -185,7 +185,6 @@
"اتاق را ترک کرد"
"فضا را ترک کرد"
"دعوت لغو شد"
- "تیره"
"خطای رمزگشایی"
"توضیح"
"گزینههای توسعه دهنده"
@@ -220,7 +219,6 @@
"شناسهٔ ماتریکس نتوانست پیدا شود. ممکن است دعوت نرسیده باشد."
"ترک کردن اتاق"
"ترک کردن فضا"
- "روشن"
"خط در تختهگیره رونوشت شد"
"پیوند در تختهگیره رونوشت شد"
"بار کردن…"
@@ -308,7 +306,6 @@
"موفّقیت"
"پیشنهادها"
"همگام ساختن"
- "سامانه"
"متن"
"تذکّرهای سومشخص"
"رشته"
diff --git a/libraries/ui-strings/src/main/res/values-fi/translations.xml b/libraries/ui-strings/src/main/res/values-fi/translations.xml
index 1a7f6c50c9..b3f0f32639 100644
--- a/libraries/ui-strings/src/main/res/values-fi/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fi/translations.xml
@@ -210,7 +210,6 @@
"Poistuit huoneesta"
"Poistuit tilasta"
"Kutsu hylätty"
- "Tumma"
"Salauksen purkuvirhe"
"Kuvaus"
"Kehittäjän asetukset"
@@ -236,7 +235,7 @@ Syy: %1$s."
"Epäonnistui"
"Lisää suosikkeihin"
"Lisätty suosikkeihin"
- "Synkronoidaan ilmoituksia…"
+ "Synkronoidaan ilmoituksia…"
"Tiedosto"
"Tiedosto poistettu"
"Tiedosto tallennettu"
@@ -250,7 +249,6 @@ Syy: %1$s."
"Tätä Matrix-tunnusta ei löytynyt, joten kutsu ei välttämättä mene perille."
"Poistutaan huoneesta"
"Poistutaan tilasta"
- "Vaalea"
"Rivi kopioitu leikepöydälle"
"Linkki kopioitu leikepöydälle"
"Yhdistä uusi laite"
@@ -370,7 +368,6 @@ Syy: %1$s."
"Ehdotettu"
"Ehdotukset"
"Synkronoidaan"
- "Järjestelmän oletus"
"Teksti"
"Kolmannen osapuolen ilmoitukset"
"Viestiketju"
diff --git a/libraries/ui-strings/src/main/res/values-fr/translations.xml b/libraries/ui-strings/src/main/res/values-fr/translations.xml
index 5cb21b772f..545cf66c73 100644
--- a/libraries/ui-strings/src/main/res/values-fr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml
@@ -217,7 +217,6 @@
"Vous avez quitté le salon"
"Vous avez quitté l’espace"
"Invitation refusée"
- "Sombre"
"Erreur de déchiffrement"
"Description"
"Options pour les développeurs"
@@ -257,7 +256,6 @@ Raison : %1$s."
"Cet identifiant Matrix est introuvable, il est donc possible que l’invitation ne soit pas reçue."
"Quitter le salon…"
"En train de quitter l’espace"
- "Clair"
"Ligne copiée dans le presse-papiers"
"Lien copié dans le presse-papiers"
"Associer un nouvel appareil"
@@ -377,7 +375,6 @@ Raison : %1$s."
"Recommandé"
"Suggestions"
"Synchronisation"
- "Système"
"Texte"
"Avis de tiers"
"Fil de discussion"
diff --git a/libraries/ui-strings/src/main/res/values-hr/translations.xml b/libraries/ui-strings/src/main/res/values-hr/translations.xml
index bb6cf79187..369d8ccce4 100644
--- a/libraries/ui-strings/src/main/res/values-hr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-hr/translations.xml
@@ -219,7 +219,6 @@
"Napustio/la je sobu"
"Napušteni prostor"
"Poziv je odbijen"
- "Tamno"
"Pogreška kod dešifriranja"
"Opis"
"Mogućnosti za razvojne inženjere"
@@ -259,7 +258,6 @@ Razlog: %1$s ."
"Ovaj Matrix ID nije moguće pronaći, pa se pozivnica možda neće primiti."
"Izlazak iz sobe"
"Napuštanje prostora"
- "Svijetlo"
"Redak je kopiran u međuspremnik"
"Poveznica je kopirana u međuspremnik."
"Poveži novi uređaj"
@@ -385,7 +383,6 @@ Razlog: %1$s ."
"Preporučeno"
"Prijedlozi"
"Sinkronizacija"
- "Sustav"
"Tekst"
"Obavijesti trećih strana"
"Nit"
diff --git a/libraries/ui-strings/src/main/res/values-hu/translations.xml b/libraries/ui-strings/src/main/res/values-hu/translations.xml
index c477a6b6ba..7acfb90ef7 100644
--- a/libraries/ui-strings/src/main/res/values-hu/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml
@@ -218,7 +218,6 @@
"Elhagyta a szobát"
"Tér elhagyva"
"Meghívás elutasítva"
- "Sötét"
"Visszafejtési hiba"
"Leírás"
"Fejlesztői beállítások"
@@ -258,7 +257,6 @@ Ok: %1$s."
"Ez a Matrix-azonosító nem található, ezért előfordulhat, hogy a meghívó nem érkezik meg."
"Szoba elhagyása"
"Tér elhagyása"
- "Világos"
"A sor a vágólapra másolva"
"Hivatkozás a vágólapra másolva"
"Új eszköz összekapcsolása"
@@ -377,7 +375,6 @@ Ok: %1$s."
"Javaslat"
"Javaslatok"
"Szinkronizálás"
- "Rendszer"
"Szöveg"
"Harmadik felek nyilatkozatai"
"Üzenetszál"
diff --git a/libraries/ui-strings/src/main/res/values-in/translations.xml b/libraries/ui-strings/src/main/res/values-in/translations.xml
index ec5a582838..51d78530a8 100644
--- a/libraries/ui-strings/src/main/res/values-in/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-in/translations.xml
@@ -185,7 +185,6 @@
"Permintaan dibatalkan"
"Keluar dari ruangan"
"Undangan ditolak"
- "Gelap"
"Kesalahan dekripsi"
"Deskripsi"
"Opsi pengembang"
@@ -222,7 +221,6 @@ Alasan: %1$s."
"Pasang APK"
"ID Matrix ini tidak dapat ditemukan, sehingga undangan mungkin tidak diterima."
"Meninggalkan ruangan"
- "Terang"
"Baris disalin ke papan klip"
"Tautan disalin ke papan klip"
"Memuat…"
@@ -308,7 +306,6 @@ Alasan: %1$s."
"Berhasil"
"Saran"
"Menyinkronkan"
- "Sistem"
"Teks"
"Pemberitahuan pihak ketiga"
"Utas"
diff --git a/libraries/ui-strings/src/main/res/values-it/translations.xml b/libraries/ui-strings/src/main/res/values-it/translations.xml
index cdc523a5ab..d1ec78d920 100644
--- a/libraries/ui-strings/src/main/res/values-it/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-it/translations.xml
@@ -218,7 +218,6 @@
"Hai lasciato la stanza"
"Hai lasciato lo spazio"
"Invito rifiutato"
- "Scuro"
"Errore di decrittazione"
"Descrizione"
"Opzioni sviluppatore"
@@ -258,7 +257,6 @@ Motivo:. %1$s"
"Questo ID Matrix non può essere trovato, quindi l\'invito potrebbe non essere ricevuto."
"Lascio la stanza"
"Uscendo dallo spazio"
- "Chiaro"
"Riga copiata negli appunti"
"Collegamento copiato negli appunti"
"Collega un nuovo dispositivo"
@@ -378,7 +376,6 @@ Motivo:. %1$s"
"Suggeriti"
"Suggerimenti"
"Sincronizzazione"
- "Sistema"
"Testo"
"Comunicazioni di terze parti"
"Discussione"
diff --git a/libraries/ui-strings/src/main/res/values-ja/translations.xml b/libraries/ui-strings/src/main/res/values-ja/translations.xml
index e25ca0cf4e..c62c579f32 100644
--- a/libraries/ui-strings/src/main/res/values-ja/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ja/translations.xml
@@ -216,7 +216,6 @@
"ルームを退出しました"
"スペースから退出しました"
"招待は却下されました"
- "ダーク"
"復号化エラー"
"詳細"
"開発者向けオプション"
@@ -256,7 +255,6 @@
"このMatrix IDは見つからないため、招待が届かない可能性があります。"
"ルームを退出しています"
"スペースを退出しています"
- "ライト"
"行をクリップボードにコピーしました"
"リンクをクリップボードにコピーしました"
"新しい端末から接続"
@@ -369,7 +367,6 @@
"推奨される"
"提案"
"同期中"
- "システム"
"テキスト"
"第三者に関する通知"
"スレッド"
diff --git a/libraries/ui-strings/src/main/res/values-ka/translations.xml b/libraries/ui-strings/src/main/res/values-ka/translations.xml
index aa7659dde2..2be4e43d61 100644
--- a/libraries/ui-strings/src/main/res/values-ka/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ka/translations.xml
@@ -122,7 +122,6 @@
"საავტორო უფლება"
"ოთახის შექმნა…"
"დატოვა ოთახი"
- "მუქი"
"გაშიფვრის შეცდომა"
"დეველოპერის პარამეტრები"
"პირდაპირი ჩატი"
@@ -145,7 +144,6 @@
"დააინსტალირეთ APK"
"ეს Matrix ID ვერ მოიძებნა, ამიტომ მოწვევა შეიძლება არ იყოს მიღებული."
"ოთახის დატოვება"
- "ღია"
"ბმული კოპირებულია გაცვლის ბუფერში"
"იტვირთება…"
@@ -212,7 +210,6 @@
"წარმატება"
"შეთავაზებები"
"სინქრონიზაცია"
- "სისტემა"
"ტექსტი"
"მესამე პირის შენიშვნები"
"თემა"
diff --git a/libraries/ui-strings/src/main/res/values-ko/translations.xml b/libraries/ui-strings/src/main/res/values-ko/translations.xml
index 3a029e20fc..303e8ba929 100644
--- a/libraries/ui-strings/src/main/res/values-ko/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ko/translations.xml
@@ -207,7 +207,6 @@
"방 떠남"
"스페이스 떠남"
"초대 거부됨"
- "다크"
"복호화 오류"
"설명"
"개발자 설정"
@@ -247,7 +246,6 @@
"Matrix ID를 찾을 수 없기 때문에 초대가 수신되지 않을 수도 있습니다."
"방을 떠나는 중"
"스페이스 떠나는 중"
- "라이트"
"줄이 클립보드에 복사되었습니다."
"링크가 클립보드에 복사됨"
"새 기기 연결"
@@ -360,7 +358,6 @@
"공유된 스페이스"
"제안"
"동기화 중"
- "시스템"
"글자"
"제3자 고지"
"스레드"
diff --git a/libraries/ui-strings/src/main/res/values-nb/translations.xml b/libraries/ui-strings/src/main/res/values-nb/translations.xml
index a0bb1b1a16..aa594f8027 100644
--- a/libraries/ui-strings/src/main/res/values-nb/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml
@@ -207,7 +207,6 @@
"Forlot rommet"
"Forlot område"
"Invitasjon avslått"
- "Mørk"
"Dekrypteringsfeil"
"Beskrivelse"
"Alternativer for utviklere"
@@ -245,7 +244,6 @@
"Finner ikke denne Matrix-IDen, så invitasjonen blir kanskje ikke mottatt."
"Forlater rommet"
"Forlater området"
- "Lys"
"Linje kopiert til utklippstavlen"
"Lenke kopiert til utklippstavlen"
"Koble til ny enhet"
@@ -360,7 +358,6 @@
"Foreslått"
"Forslag"
"Synkroniserer"
- "System"
"Tekst"
"Varsler fra tredjeparter"
"Tråd"
diff --git a/libraries/ui-strings/src/main/res/values-nl/translations.xml b/libraries/ui-strings/src/main/res/values-nl/translations.xml
index ab39365f8e..3edeeb00a0 100644
--- a/libraries/ui-strings/src/main/res/values-nl/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-nl/translations.xml
@@ -172,7 +172,6 @@
"Kamer maken…"
"Heeft de kamer verlaten"
"Uitnodiging geweigerd"
- "Donker"
"Decryptie fout"
"Ontwikkelaarsopties"
"Apparaat-ID"
@@ -200,7 +199,6 @@ Reden: %1$s."
"APK installeren"
"Deze Matrix-ID kan niet worden gevonden, dus de uitnodiging is mogelijk niet ontvangen."
"De kamer verlaten"
- "Licht"
"Link gekopieerd naar klembord"
"Laden…"
@@ -278,7 +276,6 @@ Reden: %1$s."
"Geslaagd"
"Suggesties"
"Synchroniseren"
- "Systeem"
"Tekst"
"Kennisgevingen van derden"
"Gesprek"
diff --git a/libraries/ui-strings/src/main/res/values-pl/translations.xml b/libraries/ui-strings/src/main/res/values-pl/translations.xml
index 1a9a45cd94..c654a66541 100644
--- a/libraries/ui-strings/src/main/res/values-pl/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml
@@ -220,7 +220,6 @@
"Opuszczono pokój"
"Opuścił przestrzeń"
"Odrzucono zaproszenie"
- "Ciemny"
"Błąd deszyfrowania"
"Opis"
"Opcje programisty"
@@ -260,7 +259,6 @@ Powód: %1$s."
"Nie można znaleźć identyfikatora Matrix ID, zaproszenie mogło nie dotrzeć."
"Opuszczanie pokoju"
"Opuszczam przestrzeń"
- "Jasny"
"Wiersz skopiowany do schowka"
"Link został skopiowany do schowka"
"Powiąż nowe urządzenie"
@@ -387,7 +385,6 @@ Powód: %1$s."
"Polecane"
"Sugestie"
"Synchronizuję"
- "System"
"Tekst"
"Informacje stron trzecich"
"Wątek"
@@ -412,7 +409,7 @@ Powód: %1$s."
"Zweryfikuj urządzenie"
"Zweryfikuj tożsamość"
"Zweryfikuj użytkownika"
- "Film"
+ "Wideo"
"Wysoka jakość"
"Najlepsza jakość, większy rozmiar pliku"
"Niska jakość"
diff --git a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml
index 68035e0cc2..f35aca5a58 100644
--- a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml
@@ -200,7 +200,6 @@
"Saiu da sala"
"Saiu do espaço"
"Convite recusado"
- "Escuro"
"Erro de descriptografia"
"Descrição"
"Opções de desenvolvedor"
@@ -238,7 +237,6 @@ Motivo: %1$s."
"Este ID Matrix não foi encontrado, então o convite pode não ser recebido"
"Saindo da sala"
"Saindo do espaço"
- "Claro"
"Linha copiada para a área de transferência"
"Link copiado para área de transferência"
"Vincular novo dispositivo"
@@ -350,7 +348,6 @@ Motivo: %1$s."
"Sugerido"
"Sugestões"
"Sincronizando"
- "Sistema"
"Texto"
"Comunicados de terceiros"
"Tópico"
diff --git a/libraries/ui-strings/src/main/res/values-pt/translations.xml b/libraries/ui-strings/src/main/res/values-pt/translations.xml
index d82855223d..0acc939565 100644
--- a/libraries/ui-strings/src/main/res/values-pt/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml
@@ -195,7 +195,6 @@
"Saíste da sala"
"Saíste do espaço"
"Convite rejeitado"
- "Escuro"
"Erro de decifragem"
"Descrição"
"Opções de programador"
@@ -233,7 +232,6 @@ Razão: %1$s."
"Não foi possível encontrar este ID Matrix, portanto o convite pode não ser recebido."
"A sair da sala"
"A sair do espaço"
- "Claro"
"Linha copiada para a área de transferência"
"Ligação copiada para a área de transferência"
"A carregar…"
@@ -334,7 +332,6 @@ Razão: %1$s."
"Sucesso"
"Sugestões"
"A sincronizar…"
- "Sistema"
"Texto"
"Avisos de terceiros"
"Tópico"
diff --git a/libraries/ui-strings/src/main/res/values-ro/translations.xml b/libraries/ui-strings/src/main/res/values-ro/translations.xml
index 33a39278a4..dfd68686ce 100644
--- a/libraries/ui-strings/src/main/res/values-ro/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml
@@ -15,6 +15,7 @@
"Detalii privind criptarea"
"Extindeți câmpul mesajului"
"Ascundeți parola"
+ "Informații"
"Alăturați-vă apelului"
"Mergeți în jos"
"Mutați harta la locația mea"
@@ -28,9 +29,12 @@
"Pauză"
"Mesaj vocal, durată:%1$s, poziție curentă: %2$s"
"Câmp PIN"
+ "Locație fixată"
"Redați"
+ "Viteză de redare"
"Sondaj"
"Sondaj încheiat"
+ "Cod QR"
"Reacționați cu %1$s"
"Reacționați cu alte emoji-uri"
"Citit de %1$s și %2$s"
@@ -45,9 +49,13 @@
"Îndepărtați reacția %1$s"
"Avatarul camerei"
"Trimiteți fișiere"
+ "Locația expeditorului"
"Acțiune limitată în timp necesară, aveți un minut pentru a verifica"
+ "Setări, acțiune necesară"
"Afișați parola"
"Începeți un apel"
+ "Inițiați un apel video"
+ "Inițiați un apel vocal"
"Cameră terminată"
"Avatar utilizator"
"Meniu utilizator"
@@ -59,15 +67,17 @@
"Avatarul dumneavoastră"
"Acceptați"
"Adăugați o descriere"
+ "Adăugați camere existente"
"Adăugați listei de mesaje"
"Înapoi"
- "Apel"
+ "Apelați"
"Anulați"
"Anulați pentru moment"
+ "Alegeți fișierul"
"Alegeți o fotografie"
"Ștergeți"
"Închideți"
- "Verificare completă"
+ "Finalizați verificarea"
"Confirmați"
"Confirmați parola"
"Continuați"
@@ -78,22 +88,27 @@
"Copiați textul"
"Creați"
"Creați o cameră"
+ "Creeați spațiu"
"Dezactivați"
"Dezactivați contul"
"Refuzați"
"Refuzați și blocați"
+ "Ștergere"
+ "Ștergeți contul"
"Ștergeți sondajul"
"Deselectați tot"
"Dezactivați"
"Renunţare"
"Renunțați"
- "Efectuat"
+ "Terminat"
+ "Descărcare"
"Editați"
"Editați descrierea"
"Editați sondajul"
"Activați"
"Închideți sondajul"
"Introduceți PIN-ul"
+ "Explorați spațiile publice"
"Finalizați"
"Ați uitat parola?"
"Redirecționați"
@@ -113,10 +128,11 @@
"Părăsiți camera"
"Părăsiți spațiul"
"Încărcați mai mult"
- "Administrare cont"
- "Gestionare dispozitive"
+ "Gestionați contul"
+ "Gestionați contul și dispozitivele"
+ "Gestionați dispozitivele"
"Gestionați camerele"
- "Mesaj"
+ "Contactați"
"Minimizați"
"Următorul"
"Nu"
@@ -125,11 +141,11 @@
"Deschideți meniul contextual"
"Setări"
"Deschideți cu"
- "Fixează"
+ "Fixați"
"Raspuns rapid"
- "Citat"
+ "Citați"
"Reacționați"
- "Respinge"
+ "Respingeți"
"Indepărtați"
"Ștergeți descrierea"
"Ștergeți mesajul"
@@ -140,7 +156,7 @@
"Raportați conținutul"
"Raportați conversația"
"Raportați camera"
- "Resetare"
+ "Resetați"
"Resetați identitatea"
"Reîncercați"
"Reîncercați decriptarea"
@@ -153,7 +169,8 @@
"Trimiteți un mesaj vocal"
"Partajați"
"Partajați linkul"
- "Afișare"
+ "Partajați locația în timp real"
+ "Afișați"
"Autentificați-vă din nou"
"Deconectați-vă"
"Deconectați-vă oricum"
@@ -163,10 +180,12 @@
"Începeți din nou"
"Începeți verificarea"
"Atingeți pentru a încărca harta"
+ "Opriți"
"Faceți o fotografie"
"Atingeți pentru opțiuni"
+ "Traduceți"
"Încercați din nou"
- "Defixeaza"
+ "Defixați"
"Vizualizați"
"Vedeți în lista de mesaje"
"Vedeți sursă"
@@ -176,8 +195,8 @@
"Upgrade disponibil"
"Despre"
"Politică de utilizare rezonabilă"
- "Adăugați un cont"
- "Adăugați un alt cont"
+ "Adăugare cont"
+ "Adăugare cont"
"Adăugare descriere"
"Setări avansate"
"o imagine"
@@ -189,16 +208,18 @@
"Beta"
"Utilizatori blocați"
"Baloane"
- "A început un apel"
+ "Apel respins"
+ "Apel inițiat"
+ "Ați respins un apel"
"Backup conversații"
"Copiat în clipboard"
"Drepturi de autor"
"Se creează camera…"
+ "Se crează spațiul"
"Cerere anulată"
- "Ați parăsit camera"
- "S-a părăsit spațiul"
+ "Cameră părăsită"
+ "Spațiu părăsit"
"Invitația a fost refuzată"
- "Întunecat"
"Eroare de decriptare"
"Descriere"
"Opțiuni programator"
@@ -214,6 +235,7 @@
"Fișier gol"
"Criptare"
"Criptare activată"
+ "Se termină la %1$s"
"Introduceți codul PIN"
"Eroare"
"A apărut o eroare, este posibil să nu primiți notificări pentru mesaje noi. Vă rugăm să depanați notificările din setări.
@@ -223,6 +245,7 @@ Motiv:%1$s."
"Eșuat"
"Favorite"
"Favorită"
+ "Se sincronizează notificările…"
"Fişier"
"Fișier șters"
"Fișier salvat"
@@ -236,10 +259,11 @@ Motiv:%1$s."
"Nu am putut valida ID-ul Matrix al acestui utilizator. Este posibil ca invitația să nu fi fost trimisă."
"Se părăsește conversația"
"Se părăsește spațiul"
- "Deschis"
"Linie copiată în clipboard"
"Linkul a fost copiat în clipboard"
"Conectați un dispozitiv nou"
+ "Locație în timp real"
+ "Locația în timp real s-a încheiat"
"Se încarcă…"
"Se încarcă…"
@@ -258,7 +282,7 @@ Motiv:%1$s."
"Aspectul mesajelor"
"Mesaj șters"
"Modern"
- "Dezactivați sunetul"
+ "Dezactivare sunet"
"Nume"
"%1$s (%2$s)"
"Niciun rezultat"
@@ -268,6 +292,7 @@ Motiv:%1$s."
"Deconectat"
"Licențe open source"
"sau"
+ "Alte opțiuni"
"Parola"
"Persoane"
"Permalink"
@@ -286,8 +311,10 @@ Motiv:%1$s."
"Se pregăteşte…"
"Politica de confidențialitate"
+ "Privat"
"Cameră privată"
"Spațiu privat"
+ "Public"
"Cameră publică"
"Spațiu public"
"Reacţie"
@@ -295,6 +322,7 @@ Motiv:%1$s."
"Motiv"
"Cheie de recuperare"
"Se actualizează"
+ "Se elimină…"
- "%1$d răspuns"
- "%1$d răspunsuri"
@@ -304,6 +332,7 @@ Motiv:%1$s."
"Raportați o problemă"
"Raport trimis"
"Editor text avansat"
+ "Rol"
"Cameră"
"Numele camerei"
"de exemplu, numele proiectului dumneavoastră"
@@ -320,6 +349,11 @@ Motiv:%1$s."
"Securitate"
"Văzut de"
"Selectați un cont"
+
+ - "%1$d selectat"
+ - "%1$d selectate"
+ - "%1$d selectate"
+
"Trimiteți către"
"Se trimite…"
"Trimiterea a eșuat"
@@ -329,13 +363,16 @@ Motiv:%1$s."
"Serverul nu poate fi accesat"
"Adresa URL a serverului"
"Setări"
- "Partajați spațiul"
+ "Partajare spațiu"
+ "Membrii noi pot vedea istoricul"
+ "Locație în timp real partajată"
"Locație partajată"
"Spațiu comun"
"Eliminare în curs"
"Ceva nu a mers bine"
"Am întâmpinat o problemă. Vă rugăm să încercați din nou."
"Spațiu"
+ "Membrii spațiului"
"Despre ce este vorba în acest spațiu?"
- "%1$d Spațiu"
@@ -345,12 +382,13 @@ Motiv:%1$s."
"Se începe conversația…"
"Autocolant"
"Succes"
+ "Sugerat"
"Sugestii"
"Se sincronizează…"
- "Sistem"
"Text"
"Notificări despre software de la terți"
"Fir"
+ "Fire"
"Subiect"
"Despre ce este vorba în această cameră?"
"Nu s-a putut decripta"
@@ -360,8 +398,8 @@ Motiv:%1$s."
"Nu am putut trimite invitații unuia sau mai multor utilizatori."
"Nu s-a putut trimite invitația (invitațiile)"
"Deblocare"
- "Activați sunetul"
- "Apel nesuportat"
+ "Activare sunet"
+ "Apel incompatibil"
"Eveniment neacceptat"
"Utilizator"
"Verificare anulată"
@@ -381,14 +419,19 @@ Motiv:%1$s."
"Mesaj vocal"
"Se aşteaptă…"
"Mesaj în așteptare"
+ "Se așteptă localizarea în timp real…"
+ "Oricine poate vedea istoricul"
"Dumneavoastră"
+ "%1$s (%2$s) a distribuit acest mesaj deoarece nu erați în cameră când a fost trimis."
+ "%1$s a distribuit acest mesaj deoarece nu erați în cameră când a fost trimis."
"Această cameră a fost configurată astfel încât noii membri să poată citi istoricul. %1$s"
"Identitatea digitala lui %1$s a fost resetată. %2$s"
"Identitatea digitala %2$s a lui %1$s a fost resetată. %3$s"
"(%1$s)"
"Identitatea lui %1$s a fost resetată."
- "Identitatea %2$s a lui %1$s a fost resetată. %3$s"
+ "Identitatea digitală %2$s a lui %1$s a fost resetată. %3$s"
"Retrageți verificarea"
+ "Permiteți accesul"
"Linkul %1$s vă redirecționează către un alt site %2$s
Sunteți sigur că doriți să continuați?"
@@ -418,6 +461,7 @@ Sunteți sigur că doriți să continuați?"
"%1$s nu a putut accesa locația dumneavoastră. Vă rugăm să încercați din nou mai târziu."
"Trimiterea mesajului vocal nu a reușit."
"Camera nu mai există sau invitația nu mai este valabilă."
+ "Vă rugăm să activați GPS-ul pentru a accesa funcțiile bazate pe locație."
"Mesajul nu a fost găsit"
"%1$s nu are permisiuni pentru a accesa locația dumneavoastră. Puteți permite accesul în Setări."
"%1$s nu are permisiuni pentru a accesa locația dumneavoastră. Permiteți accesul mai jos."
@@ -429,6 +473,9 @@ Sunteți sigur că doriți să continuați?"
"Ne pare rău, a apărut o eroare"
"🔐️ Alăturați-vă mie în %1$s"
"Hei, vorbește cu mine pe %1$s: %2$s"
+ "Partajarea locației în timp real"
+ "Partajarea locației este în curs de desfășurare"
+ "%1$s Locație în timp real"
"%1$s Android"
"Rageshake pentru a raporta erori"
"Captură de ecran"
@@ -436,6 +483,14 @@ Sunteți sigur că doriți să continuați?"
"Opțiuni"
"Ștergeți %1$s"
"Setări"
+ "Nimeni nu își partajează locația"
+ "Se partajează locația în timp real"
+
+ - "%1$d persoană"
+ - "%1$d persoane"
+ - "%1$d persoane"
+
+ "Pe hartă"
"Selectarea fișierelor media a eșuat, încercați din nou."
"Apăsați pe un mesaj și alegeți \"%1$s\" pentru a-l include aici."
"Fixați mesajele importante, astfel încât să poată fi descoperite cu ușurință"
@@ -461,6 +516,7 @@ Sunteți sigur că doriți să continuați?"
"Mesaj în %1$s"
"Extindeți"
"Reduceți"
+ "Se partajează locația în timp real"
"Deja vizualizați această cameră!"
"%1$s din %2$s"
"%1$s Mesaje fixate"
@@ -473,10 +529,14 @@ Sunteți sigur că doriți să continuați?"
"Deschideți în Google Maps"
"Deschideți în OpenStreetMap"
"Partajați locația selectată"
+ "Opțiuni de partajare"
"Spații pe care le-ați creat sau la care v-ați alăturat."
"%1$s • %2$s"
+ "Creați spații pentru a organiza camerele"
"Spațiu %1$s"
"Spații"
+ "Partajat %1$s"
+ "Pe hartă"
"Mesajul nu a fost trimis deoarece identitatea digitala verificată a lui %1$s s-a schimbat."
"Mesajul nu a fost trimis deoarece %1$s nu a verificat toate dispozitivele."
"Mesajul nu a fost trimis deoarece nu ați verificat unul sau mai multe dispozitive."
@@ -487,5 +547,5 @@ Sunteți sigur că doriți să continuați?"
"Trebuie să verificați acest dispozitiv pentru a avea acces la mesajele anterioare."
"Nu aveți acces la acest mesaj"
"Nu s-a putut decripta mesajul"
- "Acest mesaj a fost blocat fie pentru că nu ați verificat dispozitivul, fie pentru că expeditorul trebuie să vă verifice identitatea."
+ "Acest mesaj a fost blocat fie pentru că nu ați verificat dispozitivul, fie pentru că expeditorul trebuie să vă verifice identitatea digitală."
diff --git a/libraries/ui-strings/src/main/res/values-ru/translations.xml b/libraries/ui-strings/src/main/res/values-ru/translations.xml
index fe852dcfd0..26e1dcfe8d 100644
--- a/libraries/ui-strings/src/main/res/values-ru/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml
@@ -212,7 +212,6 @@
"Покинул комнату"
"Покинуть пространство"
"Приглашение отклонено"
- "Темная"
"Ошибка расшифровки"
"Описание"
"Для разработчиков"
@@ -252,7 +251,6 @@
"Идентификатор Matrix ID не найден, приглашение может быть не получено."
"Покидаем комнату"
"Покидаем пространство"
- "Светлое"
"Строка скопирована в буфер обмена"
"Ссылка скопирована в буфер обмена"
"Привязать новое устройство"
@@ -379,7 +377,6 @@
"Рекомендуемые"
"Предложения"
"Синхронизация"
- "Системное"
"Текст"
"Уведомления о третьих лицах"
"Обсуждение"
diff --git a/libraries/ui-strings/src/main/res/values-sk/translations.xml b/libraries/ui-strings/src/main/res/values-sk/translations.xml
index 208016e363..11f4b22005 100644
--- a/libraries/ui-strings/src/main/res/values-sk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml
@@ -206,7 +206,6 @@
"Opustil/a miestnosť"
"Opustil priestor"
"Pozvánka bola odmietnutá"
- "Tmavý"
"Chyba dešifrovania"
"Popis"
"Možnosti pre vývojárov"
@@ -244,7 +243,6 @@ Dôvod: %1$s."
"Toto Matrix ID sa nedá nájsť, takže pozvánka nemusí byť prijatá."
"Opustenie miestnosti"
"Opúšťanie priestoru"
- "Svetlý"
"Riadok skopírovaný do schránky"
"Odkaz bol skopírovaný do schránky"
"Prepojiť nové zariadenie"
@@ -363,7 +361,6 @@ Dôvod: %1$s."
"Navrhované"
"Návrhy"
"Synchronizuje sa"
- "Systém"
"Text"
"Oznámenia tretích strán"
"Vlákno"
diff --git a/libraries/ui-strings/src/main/res/values-sv/translations.xml b/libraries/ui-strings/src/main/res/values-sv/translations.xml
index afc58de8a5..28dd63d425 100644
--- a/libraries/ui-strings/src/main/res/values-sv/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml
@@ -187,7 +187,6 @@
"Begäran avbruten"
"Lämnade rummet"
"Inbjudan avvisad"
- "Mörkt"
"Avkrypteringsfel"
"Beskrivning"
"Utvecklaralternativ"
@@ -224,7 +223,6 @@ Anledning:%1$s."
"Installera APK"
"Det här Matrix-ID:t kan inte hittas, så inbjudan kanske inte tas emot."
"Lämnar rummet"
- "Ljust"
"Rad kopierad till klippbordet"
"Länk kopierad till klippbordet"
"Laddar …"
@@ -322,7 +320,6 @@ Anledning:%1$s."
"Lyckades"
"Förslag"
"Synkar"
- "System"
"Text"
"Meddelanden från tredje part"
"Tråd"
diff --git a/libraries/ui-strings/src/main/res/values-tr/translations.xml b/libraries/ui-strings/src/main/res/values-tr/translations.xml
index a6d0b3e198..d500b57507 100644
--- a/libraries/ui-strings/src/main/res/values-tr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-tr/translations.xml
@@ -175,7 +175,6 @@
"İstek iptal edildi"
"Sol oda"
"Davet reddedildi"
- "Koyu"
"Şifre çözme hatası"
"Geliştirici seçenekleri"
"Cihaz Kimliği"
@@ -211,7 +210,6 @@ Neden: %1$s."
"APK\'yı yükleyin"
"Bu Matrix Kimliği bulunamıyor, bu nedenle davet alınmayabilir."
"Odadan ayrılma"
- "Aydınlık"
"Metin panoya kopyalandı"
"Bağlantı panoya kopyalandı"
"Yükleniyor…"
@@ -295,7 +293,6 @@ Neden: %1$s."
"Başarılı"
"Öneriler"
"Senkronizasyon"
- "Sistem"
"Metin"
"Üçüncü taraf bildirimleri"
"Konu"
diff --git a/libraries/ui-strings/src/main/res/values-uk/translations.xml b/libraries/ui-strings/src/main/res/values-uk/translations.xml
index a9e1d14b40..d7b18bf1ae 100644
--- a/libraries/ui-strings/src/main/res/values-uk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml
@@ -220,7 +220,6 @@
"Виходить з кімнати"
"Вийшов із простору"
"Запрошення відхилено"
- "Темна"
"Помилка розшифрування"
"Опис"
"Налаштування розробника"
@@ -260,7 +259,6 @@
"Цей Matrix-ID не знайдено, тому запрошення може не бути отримано."
"Вихід з кімнати"
"Вихід з простору"
- "Світла"
"Рядок скопійовано до буфера обміну"
"Посилання скопійовано в буфер обміну"
"Під\'єднати новий пристрій"
@@ -387,7 +385,6 @@
"Запропоновано"
"Пропозиції"
"Синхронізація"
- "Системна"
"Текст"
"Повідомлення третіх сторін"
"Гілка"
diff --git a/libraries/ui-strings/src/main/res/values-ur/translations.xml b/libraries/ui-strings/src/main/res/values-ur/translations.xml
index 7bf138deb5..accba4556c 100644
--- a/libraries/ui-strings/src/main/res/values-ur/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ur/translations.xml
@@ -141,7 +141,6 @@
"حقوقِ طبع و نشر"
"کمرہ تخلیق کررہاہے…"
"کمرہ چھوڑ لیا"
- "اندھیرا"
"رمزکشائی کی خرابی"
"مطور اختیارات"
"براہ راست گفتگو"
@@ -168,7 +167,6 @@
"APK تنصیب کریں"
"یہ میٹرکس شناخت نہیں مل سکتی، تو ہو سکتا ہے کہ دعوت نامہ موصول نہ ہو۔"
"کمرہ چھوڑنا"
- "روشنی"
"ربط تختہ تراشہ پر نقل کردا گیا"
"لاد رہا ہے…"
@@ -240,7 +238,6 @@
"کامیابی"
"تجاویز"
"ہمسات سازی"
- "نظام"
"متن"
"فریق ثالث کے اشعارات"
"دھاگہ"
diff --git a/libraries/ui-strings/src/main/res/values-uz/translations.xml b/libraries/ui-strings/src/main/res/values-uz/translations.xml
index 50d14ef4d4..63e1756a23 100644
--- a/libraries/ui-strings/src/main/res/values-uz/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-uz/translations.xml
@@ -210,7 +210,6 @@
"Xonani tark etdi"
"Tar etilgan maydon"
"Taklif rad etildi"
- "Tungi"
"Shifrni ochish xatosi"
"Tavsif"
"Dasturchi variantlari"
@@ -250,7 +249,6 @@ Sababi:%1$s."
"Ushbu Matrix identifikatori topilmadi, shuning uchun taklif qabul qilinmasligi mumkin."
"Xonadan chiqish"
"Maydonni tark etish"
- "Nur"
"Satr vaqtinchalik xotiraga nusxalandi"
"Havola vaqtinchalik xotiraga nusxalandi"
"Yangi qurilmani ulang"
@@ -370,7 +368,6 @@ Sababi:%1$s."
"Tavsiya etilgan"
"Tavsiyalar"
"Sinxronlash"
- "Tizim"
"Matn"
"Uchinchi tomon bildirishnomalari"
"Ip"
diff --git a/libraries/ui-strings/src/main/res/values-vi/translations.xml b/libraries/ui-strings/src/main/res/values-vi/translations.xml
index 825ff12bea..5cfbe26fba 100644
--- a/libraries/ui-strings/src/main/res/values-vi/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-vi/translations.xml
@@ -208,7 +208,6 @@
"Đã rời khỏi phòng"
"Rời khỏi không gian"
"Lời mời bị từ chối"
- "Tối"
"Lỗi khi giải mã"
"Mô tả"
"Tùy chọn nhà phát triển"
@@ -248,7 +247,6 @@ Lý do: %1$s ."
"Không tìm thấy Matrix ID này, nên lời mời có thể chưa được nhận."
"Rời khỏi phòng"
"Rời khỏi không gian"
- "Sáng"
"Đã sao chép dòng"
"Đã chép liên kết vào bộ nhớ tạm"
"Liên kết thiết bị mới"
@@ -359,7 +357,6 @@ Lý do: %1$s ."
"Gợi ý"
"Gợi ý"
"Đang đồng bộ"
- "Hệ thống"
"Văn bản"
"Thông báo từ bên thứ ba"
"Chủ đề"
diff --git a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
index b4c993e852..71159b78e4 100644
--- a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
@@ -208,7 +208,6 @@
"已離開聊天室"
"離開空間"
"邀請被拒絕"
- "深色"
"解密錯誤"
"描述"
"開發者選項"
@@ -248,7 +247,6 @@
"找不到此 Matrix ID,因此可能沒有人會收到邀請。"
"正在離開聊天室"
"離開空間"
- "淺色"
"行已複製到剪貼簿"
"連結已複製到剪貼簿"
"連結新裝置"
@@ -361,7 +359,6 @@
"已建議"
"建議"
"同步中"
- "系統"
"文字"
"第三方通知"
"討論串"
diff --git a/libraries/ui-strings/src/main/res/values-zh/translations.xml b/libraries/ui-strings/src/main/res/values-zh/translations.xml
index 7366a4fd95..9cea16d2f0 100644
--- a/libraries/ui-strings/src/main/res/values-zh/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml
@@ -215,7 +215,6 @@
"离开房间"
"离开空间"
"邀请已拒绝"
- "深色"
"解密错误"
"描述"
"开发者选项"
@@ -255,7 +254,6 @@
"找不到此 Matrix ID,因此可能无法收到邀请。"
"正在离开房间"
"正在离开空间"
- "浅色"
"链接已复制到剪贴板"
"链接已复制到剪贴板"
"关联新设备"
@@ -368,7 +366,6 @@
"建议"
"建议"
"正在同步"
- "系统"
"文本"
"第三方通知"
"消息列"
diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml
index 173a525919..e89d45b228 100644
--- a/libraries/ui-strings/src/main/res/values/localazy.xml
+++ b/libraries/ui-strings/src/main/res/values/localazy.xml
@@ -9,6 +9,7 @@
- "%1$d digit entered"
- "%1$d digits entered"
+ "Duration: %1$s"
"Edit avatar"
"The full address will be %1$s"
"Encryption details"
@@ -33,6 +34,7 @@
"Playback speed"
"Poll"
"Ended poll"
+ "Position: %1$s"
"QR Code"
"React with %1$s"
"React with other emojis"
@@ -48,12 +50,15 @@
"Room avatar"
"Send files"
"Sender location"
+ "Sent by %1$s at %2$s"
"Time limited action required, you have one minute to verify"
"Settings, action required"
"Show password"
"Start a call"
"Start a video call"
"Start a voice call"
+ "Thread in %1$s"
+ "Threads in %1$s"
"Tombstoned room"
"User avatar"
"User menu"
@@ -218,7 +223,6 @@
"Left room"
"Left space"
"Invite declined"
- "Dark"
"Decryption error"
"Description"
"Developer options"
@@ -258,7 +262,6 @@ Reason: %1$s."
"This Matrix ID can\'t be found, so the invite might not be received."
"Leaving room"
"Leaving space"
- "Light"
"Line copied to clipboard"
"Link copied to clipboard"
"Link new device"
@@ -378,7 +381,6 @@ Reason: %1$s."
"Suggested"
"Suggestions"
"Syncing"
- "System"
"Text"
"Third-party notices"
"Thread"
diff --git a/libraries/ui-strings/src/main/res/values/temporary.xml b/libraries/ui-strings/src/main/res/values/temporary.xml
index e930968f8f..29dadb0418 100644
--- a/libraries/ui-strings/src/main/res/values/temporary.xml
+++ b/libraries/ui-strings/src/main/res/values/temporary.xml
@@ -6,11 +6,6 @@
-->
- "Black"
"Mark as read"
"Jump to unread messages"
-
- - "Jump to %1$d unread message"
- - "Jump to %1$d unread messages"
-
diff --git a/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DefaultEncoder.kt b/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DefaultEncoder.kt
index 9d471f7a6d..9d41b0da92 100644
--- a/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DefaultEncoder.kt
+++ b/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/DefaultEncoder.kt
@@ -9,7 +9,6 @@
package io.element.android.libraries.voicerecorder.impl.audio
import dev.zacsweers.metro.ContributesBinding
-import dev.zacsweers.metro.Provider
import io.element.android.libraries.di.RoomScope
import io.element.android.opusencoder.OggOpusEncoder
import timber.log.Timber
@@ -20,7 +19,7 @@ import java.io.File
*/
@ContributesBinding(RoomScope::class)
class DefaultEncoder(
- private val encoderProvider: Provider,
+ private val encoderProvider: () -> OggOpusEncoder,
config: AudioConfig,
) : Encoder {
private val bitRate = config.bitRate
diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt
index fa197e4a08..5e9a8694be 100644
--- a/plugins/src/main/kotlin/Versions.kt
+++ b/plugins/src/main/kotlin/Versions.kt
@@ -45,7 +45,7 @@ private const val versionMonth = 5
* Release number in the month. Value must be in [0,99].
* Do not update this value. it is updated by the release script.
*/
-private const val versionReleaseNumber = 0
+private const val versionReleaseNumber = 2
object Versions {
/**
diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png
index bfa7251296..0996d18bf0 100644
--- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png
+++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b5988ca59d9fcfaccbf4bc2929d7c135f67be0852e739caeb566b0518fac7f75
-size 19021
+oid sha256:bc9627a6288987e446206dc54abb8e1319ba6996674f0b588decd5418eeafc1b
+size 18688
diff --git a/screenshots/de/features.location.api_LiveLocationSharingBanner_Day_0_de.png b/screenshots/de/features.location.api_LiveLocationSharingBanner_Day_0_de.png
new file mode 100644
index 0000000000..f889a65156
--- /dev/null
+++ b/screenshots/de/features.location.api_LiveLocationSharingBanner_Day_0_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efd6cb8498b29f79769b3287a062ee1ddad3c34195aa5d653b8e28e4e6f973bc
+size 10767
diff --git a/screenshots/de/features.location.impl.share_ShareLocationView_Day_6_de.png b/screenshots/de/features.location.impl.share_ShareLocationView_Day_6_de.png
index bf8a621fe1..bb93cfc575 100644
--- a/screenshots/de/features.location.impl.share_ShareLocationView_Day_6_de.png
+++ b/screenshots/de/features.location.impl.share_ShareLocationView_Day_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6a5606179cc7dacc1d0bc86ff0f38a7654cebeb7c428575e2da51d4af0ba12b9
-size 43384
+oid sha256:1342bc5c63e6fa38797d1867b5006ebc91cfa926d189e4ff9060f84efd8146ca
+size 26114
diff --git a/screenshots/de/features.location.impl.share_ShareLocationView_Day_7_de.png b/screenshots/de/features.location.impl.share_ShareLocationView_Day_7_de.png
new file mode 100644
index 0000000000..0663eceb1d
--- /dev/null
+++ b/screenshots/de/features.location.impl.share_ShareLocationView_Day_7_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b08870ebcd6da6372363b0af0334524a4288db7242cdb5a377512ef9aa728a66
+size 38883
diff --git a/screenshots/de/features.location.impl.share_ShareLocationView_Day_8_de.png b/screenshots/de/features.location.impl.share_ShareLocationView_Day_8_de.png
new file mode 100644
index 0000000000..bf8a621fe1
--- /dev/null
+++ b/screenshots/de/features.location.impl.share_ShareLocationView_Day_8_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a5606179cc7dacc1d0bc86ff0f38a7654cebeb7c428575e2da51d4af0ba12b9
+size 43384
diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_de.png
index 642cb48d0f..a854d161d7 100644
--- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ebee62aecbbc7e65168799cdeb940d112095d7e38059bf91e4192dea242eb884
-size 113883
+oid sha256:ad01125850f8dc08f39832fe3ffcaae1950edd736a80f39811b4c1d9a6eafd93
+size 122264
diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_de.png
index 0b33acb4dc..a8d7c0385c 100644
--- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f7bc6e29e43c98d47257304e38b5d6f3c0aeb55fc671adc02ea0234ba6ff31be
-size 120123
+oid sha256:5dd0fa202f0d1ec868537a2726df10013072fe9cec7bce4c947ab13f39e683dc
+size 122366
diff --git a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_de.png
index 400c371f56..2ed9893cb4 100644
--- a/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aec9126323f766fa0caf0bf1aba5ebd2110bfe6076c91197f4613088eb3b8a62
-size 120233
+oid sha256:dbe9d2831b54807db3c329ac4ca9e853198195df21f8db348050b40fe98cab5f
+size 121228
diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png
index 610bc5d0a0..d005896ab7 100644
--- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e2b86e1326023be378c0c03b12305810f36e4fed11886ffd3bfa46ef9e5802ab
-size 18767
+oid sha256:08984e24e297742f065201c4cea3d07eda34e4c80fbcb4689e539ac64f32f1db
+size 53795
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png
index 98dd645229..63497b4081 100644
--- a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9b13eb680dca1d551d843b92dff0062a58781c6c9c1fe713e35c26412b6addf6
-size 68596
+oid sha256:a7cf06d5921dae7bbdd3b774e38ac6fcbad724261c1adef9ad93ff992fcc7669
+size 51515
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png
new file mode 100644
index 0000000000..98dd645229
--- /dev/null
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b13eb680dca1d551d843b92dff0062a58781c6c9c1fe713e35c26412b6addf6
+size 68596
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png
index b713fac540..194a69f62b 100644
--- a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e08f56a74a85de1d5e792dbc17a409f95c0a72df49b3c2538814442fdd63d4a9
-size 65018
+oid sha256:cd28a4f1e30c5ef7db0cd167a3d0328af7b969ccd7c35f616472dc2ab02b5c4a
+size 57867
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png
index 63497b4081..b713fac540 100644
--- a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a7cf06d5921dae7bbdd3b774e38ac6fcbad724261c1adef9ad93ff992fcc7669
-size 51515
+oid sha256:e08f56a74a85de1d5e792dbc17a409f95c0a72df49b3c2538814442fdd63d4a9
+size 65018
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_de.png
index 20df66736f..0793b01c92 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b2c1dc2c23f6b8dafab3eec3bd703c9ffeacf8e3de6f0da8b182ded7dea27244
-size 53656
+oid sha256:cea139c9bc1d71d342a99ce43b6bff414e1f9cb53ac69b8994b1b7ea2c750f41
+size 60894
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_de.png
index e9d7ece4cc..c50a3e35cf 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d2215fecf0a0cd2e708d7b2aba1879528d3a1ea07cc2dfa255d74986fec933ca
-size 53531
+oid sha256:e19998bcd7bb878ee3fa1429ce7edd03293e8f9dfc2dc9cd439ad3a71ccd6276
+size 60764
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_de.png
index 5ed68bb027..eb4c703d89 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ca1bff9d9c6f5b68823a43eebc8196ae9705f743e7b59897a69cc4016ee155ea
-size 53523
+oid sha256:139462dbd69c23df0aff5b8a2b310c2a9a40a9f691ebff57a03d0bf7cf638269
+size 60757
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_de.png
index 7e71476836..4e5adc17e1 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c208bdd8a985ab7108020659f0c6dec3413fdd54a529f86d7f2bcb44448fe0d9
-size 53520
+oid sha256:3013b0a0e261f87364a5e72cce9d25cf59c2d1360dc778fec533268e1340a0ca
+size 60755
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_de.png
index 46d1ca20e2..33a8e007e4 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:abe747567a372eb4b674a1e7976b24d498ad2a4d7e20d425c9291ddb05922a14
-size 53339
+oid sha256:a8f056723e3999c53a1e582237290b74e178e652fd49d5b636d1256bcb846de3
+size 60597
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_de.png
index 567949e6e5..61e1649e93 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:90068ee2e83b713cd11d9879bbcc3c389dd0f79778d8999df6bfc9f2b1b1bb55
-size 53662
+oid sha256:db5aa655ec48b8b8c3019e886a742a2e7922f329c7d7e7c88ca5d70cbf2f6f3e
+size 60901
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_de.png
index 04837d0ca6..f48a864d6d 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3387219f505ee6168eb44879b4f943b75459f4c5b6c311cce874eba5e49ba628
-size 53108
+oid sha256:0fdcef2b4374ba9a1dded6c7fe3315ccc3c585e489d59572879a1e5efe2dff1c
+size 60422
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_de.png
index 304befe3c3..3c66dd1128 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d7333bd76d2de37bd13fe507d89c000984d73141a3dec81f71eaa13d6658871e
-size 52600
+oid sha256:ee1b3b15e7f08f2f63c556a584db2fa3ebcf004b980f7fe837c32ea2d166159c
+size 60000
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_de.png
index 025b3d596f..1eca9c9326 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:97f271f0ba965c1b40edaad388e111bf624c01e5caceb73dfae1e09c28b3856a
-size 61504
+oid sha256:1dca13f4ac7e2d0f80d302d2d819a32f536d5765b2d7533be4f019b6bc28dd92
+size 63485
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png
index 0bf95ba4b1..246e46b33d 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:030671a61e231a9c87a221e20e63bac8add5f0a3fe4aa967313af45196151c64
-size 51196
+oid sha256:a060a4ef3ae0e7117863606fac9196536fce38d5483e3d882e86931d5f6098e1
+size 57951
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png
index 8ece7cdeaa..248175a402 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c813fcb2b9cf76749d9233d5cb66e643e185ac3248eab4c4fdd71f4c7fab7ba4
-size 51057
+oid sha256:9e4faac64c7b38a8b9613eddc62805a5816ed340984e62dc5d6625a79782d3e6
+size 57811
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png
index 89c8b5a536..c8bc853a8e 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:66feb2ac420379ece0b85ffe53d5a25a8d11cbe27133313dd9e679d582c384fc
-size 51052
+oid sha256:7e4713a87444130061d605edcf65d67d5aa1d6730e8afee1ba41c751c2dac77f
+size 57804
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png
index cff6d2b2f4..19d124ead1 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3fd601997ff6e5af28e70c25c7c8c2a61c37e47e736b955b1510ac67e3a05034
-size 51064
+oid sha256:d8907dbe4553c7aac67cd5007dffc12a06e3c3f218fa95a75c390ee8982cf117
+size 57815
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png
index fba8ff45f9..26bdb4b258 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6b089d766841cc1ce24ea03d3d91b59d0f2ea1789aee3a9d06ece551c862d1ce
-size 50901
+oid sha256:961a4dd2ef4c74770f9c140f4b337146225d7a626ca2082f35cc107c91263e12
+size 57670
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png
index fb27f001cd..dca7c97656 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2b38f2502dd31806ffab41547b66b9987de66c4e899b0df59c068d08ed4350b6
-size 51198
+oid sha256:0ea1eb184dcfcf13c8673f3df717a540c74eb500b759cd752e8fd270da9b8f4e
+size 57951
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png
index 0429803048..53eb657d5f 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2ce5af26d03b80ad7bb0190b6b1dcdbdba4f7a666c442109da58f05c07505aad
-size 50867
+oid sha256:ad17f959304774a8956cc38cb008024e79ae70dd1d2f147b2de20a95ca29ca96
+size 57638
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png
index 27f6862b8c..1d51b69a1a 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:536cbfdce1cfdecdbf076f0747c50f2db7e3a88dda54c0708d4b7388c9efbf30
-size 50402
+oid sha256:85693d212e3726d4e7bc5cd3c4c2e9d73276cac7a6cba7b9549d5b45bf55b686
+size 57160
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png
index 0d41a18697..5736128377 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:20285a2d5b10f74f927f8459a2d92180b7f86bc266c95889b5d017679b622462
-size 58368
+oid sha256:aca6e0c7f9d7c48ca80c5a8e56a86e8d0a1cced6020d5b4ef0aae443575071ae
+size 60239
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png
index ab828c858a..36df3fb547 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5ff37f653ce34795f7d054e1d552c161c83fe85b6c80c6925953440a75fd4ea4
-size 53181
+oid sha256:7713d5bb6252597bfc465fc85b3283e08d95684f9d0a17fc89e08f5cf8e870e4
+size 60327
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png
index 6583fc352d..833794c51e 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4d69ff7dc1c3efb334b8a03dbd796cde640aecac07a10adb910519810bddefed
-size 53065
+oid sha256:59b93100a819cc8a0b8b8156da39f47034745bfc6d06957907009ff3eef3c2b0
+size 60210
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png
index 1080a3e297..25914b7cbe 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:827f3291c252fa8a5b938ca7a38a76d0d58e1969607f2c5514d06264e10a1ddd
-size 53078
+oid sha256:eaaf5ae88296f64e80ebbe60a126a1fd40944e31311329cade209631f36424cd
+size 60223
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png
index 1b77b7d963..2af3d0fc1b 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bb8636f0a7dbad6b32346cad952b5447a79b96d3db0e5da876fca7a78ced91c2
-size 53072
+oid sha256:77c71a0c84d3fa9e39ba3c9b9b81e8a3b6e406af87e4158bfb8bb4736a8b27c7
+size 60217
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png
index 3048b141f6..9f0b5c037c 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24dfd7e781f8b035045ca075b607676a2a4cbc0ef882c1f527252d85339a738e
-size 52922
+oid sha256:c9228e4ace7d30444a45deb04f211782ca53c5a366e0e812145b5b772fa51d3b
+size 60085
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png
index 8ebc7b90cd..a880ff90f4 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:640ecec1abd4992b962a9ab8ce68d4c5a3accfde9116b93af4d55d8365c35307
-size 53187
+oid sha256:c00205667f22842c1c5d63c20c0990b6e0fb7f7cd134f625957df733627378df
+size 60330
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png
index c1dda2d9d5..4265684997 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dc3da8b4380809f5f9724d98ba4eceb86ea9d6a7df54c4a2117d187550b46597
-size 52800
+oid sha256:cbed351c3ce6dfcb334d28316501baa5f97ade4614bd9b7dbbd91b0ce7689994
+size 59987
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png
index 419eec6b72..dd801a4745 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c03b9b002d3d5a42c6a5662301e8feda20f734a299dbd753b4fa797023ad697f
-size 52372
+oid sha256:09bcae54d99e6b9279794ebebf32a67f67a8347c94f3286243fe8d2c0a92f352
+size 59623
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png
index 75634a5633..2e74f12057 100644
--- a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7abc46138c98086dab38fc368d56e06ea6a434bfe61b0023a665b40e66f0aa53
-size 60801
+oid sha256:5d0ccc252fedce22f568f8d26f25a8600c21236e1d489a4dd59ccd63c1085227
+size 62771
diff --git a/screenshots/html/data.js b/screenshots/html/data.js
index eea6b4b636..08d02138ef 100644
--- a/screenshots/html/data.js
+++ b/screenshots/html/data.js
@@ -2,99 +2,99 @@
export const screenshots = [
["en","en-dark","de",],
["features.messages.impl.timeline.components.event_ATimelineItemEventRow_Day_0_en","features.messages.impl.timeline.components.event_ATimelineItemEventRow_Night_0_en",0,],
-["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20581,],
+["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20588,],
["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_0_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_0_en",0,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20581,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20581,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20581,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20581,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20581,],
-["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20581,],
-["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20581,],
-["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20581,],
-["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20581,],
-["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20581,],
-["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20581,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20588,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20588,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20588,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20588,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20588,],
+["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20588,],
+["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20588,],
+["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20588,],
+["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20588,],
+["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20588,],
+["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20588,],
["features.login.impl.accountprovider_AccountProviderView_Day_0_en","features.login.impl.accountprovider_AccountProviderView_Night_0_en",0,],
["features.login.impl.accountprovider_AccountProviderView_Day_1_en","features.login.impl.accountprovider_AccountProviderView_Night_1_en",0,],
["features.login.impl.accountprovider_AccountProviderView_Day_2_en","features.login.impl.accountprovider_AccountProviderView_Night_2_en",0,],
["features.login.impl.accountprovider_AccountProviderView_Day_3_en","features.login.impl.accountprovider_AccountProviderView_Night_3_en",0,],
-["libraries.accountselect.impl_AccountSelectView_Day_0_en","libraries.accountselect.impl_AccountSelectView_Night_0_en",20581,],
-["libraries.accountselect.impl_AccountSelectView_Day_1_en","libraries.accountselect.impl_AccountSelectView_Night_1_en",20581,],
+["libraries.accountselect.impl_AccountSelectView_Day_0_en","libraries.accountselect.impl_AccountSelectView_Night_0_en",20588,],
+["libraries.accountselect.impl_AccountSelectView_Day_1_en","libraries.accountselect.impl_AccountSelectView_Night_1_en",20588,],
["features.messages.impl.actionlist_ActionListViewContent_Day_0_en","features.messages.impl.actionlist_ActionListViewContent_Night_0_en",0,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20581,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20588,],
["features.messages.impl.actionlist_ActionListViewContent_Day_1_en","features.messages.impl.actionlist_ActionListViewContent_Night_1_en",0,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20581,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20581,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20581,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20581,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20581,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_0_en","features.space.impl.addroom_AddRoomToSpaceView_Night_0_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_1_en","features.space.impl.addroom_AddRoomToSpaceView_Night_1_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_2_en","features.space.impl.addroom_AddRoomToSpaceView_Night_2_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_3_en","features.space.impl.addroom_AddRoomToSpaceView_Night_3_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_4_en","features.space.impl.addroom_AddRoomToSpaceView_Night_4_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_5_en","features.space.impl.addroom_AddRoomToSpaceView_Night_5_en",20581,],
-["features.space.impl.addroom_AddRoomToSpaceView_Day_6_en","features.space.impl.addroom_AddRoomToSpaceView_Night_6_en",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20581,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en","",20581,],
-["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20581,],
-["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20581,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20588,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20588,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20588,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20588,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20588,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_0_en","features.space.impl.addroom_AddRoomToSpaceView_Night_0_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_1_en","features.space.impl.addroom_AddRoomToSpaceView_Night_1_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_2_en","features.space.impl.addroom_AddRoomToSpaceView_Night_2_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_3_en","features.space.impl.addroom_AddRoomToSpaceView_Night_3_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_4_en","features.space.impl.addroom_AddRoomToSpaceView_Night_4_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_5_en","features.space.impl.addroom_AddRoomToSpaceView_Night_5_en",20588,],
+["features.space.impl.addroom_AddRoomToSpaceView_Day_6_en","features.space.impl.addroom_AddRoomToSpaceView_Night_6_en",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_0_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_1_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_2_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_3_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_4_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_5_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_6_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_7_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewBlack_8_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_8_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20588,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_8_en","",20588,],
+["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20588,],
+["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20588,],
["libraries.designsystem.theme.components_AllIcons_Icons_en","",0,],
-["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20581,],
-["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20581,],
-["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20581,],
-["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20581,],
-["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20581,],
+["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20588,],
+["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20588,],
+["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20588,],
+["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20588,],
+["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20588,],
["libraries.designsystem.components_Announcement_Day_0_en","libraries.designsystem.components_Announcement_Night_0_en",0,],
-["features.preferences.impl.developer.appsettings_AppDeveloperSettingsPage_Day_0_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsPage_Night_0_en",20581,],
-["features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Day_0_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Night_0_en",20581,],
-["features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Day_1_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Night_1_en",20581,],
-["services.apperror.api_AppErrorView_Day_0_en","services.apperror.api_AppErrorView_Night_0_en",20581,],
+["features.preferences.impl.developer.appsettings_AppDeveloperSettingsPage_Day_0_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsPage_Night_0_en",20588,],
+["features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Day_0_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Night_0_en",20588,],
+["features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Day_1_en","features.preferences.impl.developer.appsettings_AppDeveloperSettingsView_Night_1_en",20588,],
+["services.apperror.api_AppErrorView_Day_0_en","services.apperror.api_AppErrorView_Night_0_en",20588,],
["libraries.designsystem.components.async_AsyncActionView_Day_0_en","libraries.designsystem.components.async_AsyncActionView_Night_0_en",0,],
-["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20581,],
+["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20588,],
["libraries.designsystem.components.async_AsyncActionView_Day_2_en","libraries.designsystem.components.async_AsyncActionView_Night_2_en",0,],
-["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20581,],
+["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20588,],
["libraries.designsystem.components.async_AsyncActionView_Day_4_en","libraries.designsystem.components.async_AsyncActionView_Night_4_en",0,],
-["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20581,],
+["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20588,],
["libraries.designsystem.components.async_AsyncIndicatorFailure_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorFailure_Night_0_en",0,],
["libraries.designsystem.components.async_AsyncIndicatorLoading_Day_0_en","libraries.designsystem.components.async_AsyncIndicatorLoading_Night_0_en",0,],
["libraries.designsystem.components.async_AsyncLoading_Day_0_en","libraries.designsystem.components.async_AsyncLoading_Night_0_en",0,],
-["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20581,],
+["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20588,],
["libraries.matrix.ui.components_AttachmentThumbnail_Day_0_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_0_en",0,],
["libraries.matrix.ui.components_AttachmentThumbnail_Day_1_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_1_en",0,],
["libraries.matrix.ui.components_AttachmentThumbnail_Day_2_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_2_en",0,],
@@ -104,19 +104,19 @@ export const screenshots = [
["libraries.matrix.ui.components_AttachmentThumbnail_Day_6_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_6_en",0,],
["libraries.matrix.ui.components_AttachmentThumbnail_Day_7_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_7_en",0,],
["libraries.matrix.ui.components_AttachmentThumbnail_Day_8_en","libraries.matrix.ui.components_AttachmentThumbnail_Night_8_en",0,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_0_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_1_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_2_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_3_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_4_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_5_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_6_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_7_en","",20581,],
-["features.messages.impl.attachments.preview_AttachmentsPreviewView_8_en","",20581,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_0_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_1_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_2_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_3_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_4_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_5_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_6_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_7_en","",20588,],
+["features.messages.impl.attachments.preview_AttachmentsPreviewView_8_en","",20588,],
["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_0_en",0,],
["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_1_en",0,],
["libraries.mediaviewer.impl.gallery.ui_AudioItemView_Day_2_en","libraries.mediaviewer.impl.gallery.ui_AudioItemView_Night_2_en",0,],
-["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20581,],
+["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20588,],
["libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en","",0,],
["libraries.matrix.ui.components_AvatarPickerSizes_Day_0_en","libraries.matrix.ui.components_AvatarPickerSizes_Night_0_en",0,],
["libraries.matrix.ui.components_AvatarPickerViewRtl_Day_0_en","libraries.matrix.ui.components_AvatarPickerViewRtl_Night_0_en",0,],
@@ -146,22 +146,22 @@ export const screenshots = [
["libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradientDisabled_Night_0_en",0,],
["libraries.designsystem.modifiers_BackgroundVerticalGradient_Day_0_en","libraries.designsystem.modifiers_BackgroundVerticalGradient_Night_0_en",0,],
["libraries.designsystem.components_Badge_Day_0_en","libraries.designsystem.components_Badge_Night_0_en",0,],
-["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20581,],
+["features.home.impl.components_BatteryOptimizationBanner_Day_0_en","features.home.impl.components_BatteryOptimizationBanner_Night_0_en",20588,],
["libraries.designsystem.atomic.atoms_BetaLabel_Day_0_en","libraries.designsystem.atomic.atoms_BetaLabel_Night_0_en",0,],
["libraries.designsystem.components_BigIcon_Day_0_en","libraries.designsystem.components_BigIcon_Night_0_en",0,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20581,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20581,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20588,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20588,],
["libraries.designsystem.theme.components_BottomSheetDragHandle_Day_0_en","libraries.designsystem.theme.components_BottomSheetDragHandle_Night_0_en",0,],
-["features.rageshake.impl.bugreport_BugReportViewDay_0_en","",20581,],
-["features.rageshake.impl.bugreport_BugReportViewDay_1_en","",20581,],
-["features.rageshake.impl.bugreport_BugReportViewDay_2_en","",20581,],
-["features.rageshake.impl.bugreport_BugReportViewDay_3_en","",20581,],
-["features.rageshake.impl.bugreport_BugReportViewDay_4_en","",20581,],
+["features.rageshake.impl.bugreport_BugReportViewDay_0_en","",20588,],
+["features.rageshake.impl.bugreport_BugReportViewDay_1_en","",20588,],
+["features.rageshake.impl.bugreport_BugReportViewDay_2_en","",20588,],
+["features.rageshake.impl.bugreport_BugReportViewDay_3_en","",20588,],
+["features.rageshake.impl.bugreport_BugReportViewDay_4_en","",20588,],
["features.rageshake.impl.bugreport_BugReportViewNight_0_en","",0,],
["features.rageshake.impl.bugreport_BugReportViewNight_1_en","",0,],
["features.rageshake.impl.bugreport_BugReportViewNight_2_en","",0,],
@@ -172,141 +172,141 @@ export const screenshots = [
["features.messages.impl.timeline.components_CallMenuItem_Day_0_en","features.messages.impl.timeline.components_CallMenuItem_Night_0_en",0,],
["features.messages.impl.timeline.components_CallMenuItem_Day_1_en","features.messages.impl.timeline.components_CallMenuItem_Night_1_en",0,],
["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",0,],
-["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20581,],
-["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_en",20581,],
+["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20588,],
+["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_en",20588,],
["features.messages.impl.timeline.components_CallMenuItem_Day_5_en","features.messages.impl.timeline.components_CallMenuItem_Night_5_en",0,],
-["features.messages.impl.timeline.components_CallMenuItem_Day_6_en","features.messages.impl.timeline.components_CallMenuItem_Night_6_en",20581,],
+["features.messages.impl.timeline.components_CallMenuItem_Day_6_en","features.messages.impl.timeline.components_CallMenuItem_Night_6_en",20588,],
["features.messages.impl.timeline.components_CallMenuItem_Day_7_en","features.messages.impl.timeline.components_CallMenuItem_Night_7_en",0,],
["features.call.impl.ui_CallScreenView_Day_0_en","features.call.impl.ui_CallScreenView_Night_0_en",0,],
-["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20581,],
-["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20581,],
-["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20581,],
-["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20581,],
-["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20581,],
-["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_0_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_0_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_10_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_10_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_11_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_11_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_12_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_12_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_13_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_13_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_1_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_1_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_2_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_2_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_3_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_3_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_4_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_4_en",20581,],
+["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20588,],
+["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20588,],
+["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20588,],
+["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20588,],
+["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20588,],
+["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_0_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_0_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_10_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_10_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_11_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_11_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_12_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_12_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_13_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_13_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_1_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_1_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_2_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_2_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_3_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_3_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_4_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_4_en",20588,],
["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_5_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_5_en",0,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_6_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_6_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_7_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_7_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_8_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_8_en",20581,],
-["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_9_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_9_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_0_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_0_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_1_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_1_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_2_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_2_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_3_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_3_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_4_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_4_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_5_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_5_en",20581,],
-["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_6_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_6_en",20581,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_6_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_6_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_7_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_7_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_8_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_8_en",20588,],
+["features.rolesandpermissions.impl.roles_ChangeRolesView_Day_9_en","features.rolesandpermissions.impl.roles_ChangeRolesView_Night_9_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_0_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_0_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_1_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_1_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_2_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_2_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_3_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_3_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_4_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_4_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_5_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_5_en",20588,],
+["features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Day_6_en","features.rolesandpermissions.impl.permissions_ChangeRoomPermissionsView_Night_6_en",20588,],
["features.login.impl.changeserver_ChangeServerView_Day_0_en","features.login.impl.changeserver_ChangeServerView_Night_0_en",0,],
-["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20581,],
-["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20581,],
-["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20581,],
-["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",20581,],
-["features.login.impl.changeserver_ChangeServerView_Day_5_en","features.login.impl.changeserver_ChangeServerView_Night_5_en",20581,],
+["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20588,],
+["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20588,],
+["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20588,],
+["features.login.impl.changeserver_ChangeServerView_Day_4_en","features.login.impl.changeserver_ChangeServerView_Night_4_en",20588,],
+["features.login.impl.changeserver_ChangeServerView_Day_5_en","features.login.impl.changeserver_ChangeServerView_Night_5_en",20588,],
["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,],
-["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20581,],
+["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20588,],
["libraries.designsystem.theme.components_Checkboxes_Toggles_en","",0,],
-["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20581,],
-["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20581,],
-["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20581,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20581,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20581,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20581,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20581,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_4_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_4_en",20581,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20588,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20588,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20588,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20588,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20588,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20588,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20588,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_4_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_4_en",20588,],
["libraries.designsystem.theme.components_CircularProgressIndicator_Progress_Indicators_en","",0,],
["libraries.designsystem.components_ClickableLinkText_Text_en","",0,],
-["features.linknewdevice.impl.screens.confirmation_CodeConfirmationView_Day_0_en","features.linknewdevice.impl.screens.confirmation_CodeConfirmationView_Night_0_en",20581,],
+["features.linknewdevice.impl.screens.confirmation_CodeConfirmationView_Day_0_en","features.linknewdevice.impl.screens.confirmation_CodeConfirmationView_Night_0_en",20588,],
["libraries.designsystem.theme_ColorAliases_Day_0_en","libraries.designsystem.theme_ColorAliases_Night_0_en",0,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20581,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20581,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_2_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_2_en",20581,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_3_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_3_en",20581,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_4_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_4_en",20581,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_5_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_5_en",20581,],
-["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20581,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20588,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20588,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_2_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_2_en",20588,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_3_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_3_en",20588,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_4_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_4_en",20588,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_5_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_5_en",20588,],
+["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20588,],
["libraries.textcomposer_ComposerModeView_Day_1_en","libraries.textcomposer_ComposerModeView_Night_1_en",0,],
["libraries.textcomposer_ComposerModeView_Day_2_en","libraries.textcomposer_ComposerModeView_Night_2_en",0,],
["libraries.textcomposer_ComposerModeView_Day_3_en","libraries.textcomposer_ComposerModeView_Night_3_en",0,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_6_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_7_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_8_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_6_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_7_en","",20581,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_8_en","",20581,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20581,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20581,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20581,],
-["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20581,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_6_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_7_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_8_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_6_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_7_en","",20588,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_8_en","",20588,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20588,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20588,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20588,],
+["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20588,],
["libraries.designsystem.components.dialogs_ConfirmationDialogContent_Dialogs_en","",0,],
["libraries.designsystem.components.dialogs_ConfirmationDialog_Day_0_en","libraries.designsystem.components.dialogs_ConfirmationDialog_Night_0_en",0,],
["features.networkmonitor.api.ui_ConnectivityIndicator_Day_0_en","features.networkmonitor.api.ui_ConnectivityIndicator_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en","libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en",0,],
-["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20581,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20581,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20581,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20581,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20581,],
-["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20581,],
-["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20581,],
-["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20581,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20581,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20581,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20581,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20581,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20581,],
+["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20588,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20588,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20588,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20588,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20588,],
+["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20588,],
+["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20588,],
+["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20588,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20588,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20588,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20588,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20588,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20588,],
["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_0_en",0,],
["libraries.mediaviewer.impl.gallery.ui_DateItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_DateItemView_Night_1_en",0,],
-["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20581,],
-["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20581,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20581,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20581,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20581,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20581,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20581,],
+["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20588,],
+["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20588,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20588,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20588,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20588,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20588,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20588,],
["features.logout.impl.direct_DefaultDirectLogoutView_Day_0_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_0_en",0,],
-["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20581,],
-["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20581,],
-["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20581,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20588,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20588,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20588,],
["features.logout.impl.direct_DefaultDirectLogoutView_Day_4_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_4_en",0,],
-["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20581,],
+["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20588,],
["features.licenses.impl.details_DependenciesDetailsView_Day_0_en","features.licenses.impl.details_DependenciesDetailsView_Night_0_en",0,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20581,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20581,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20581,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20581,],
-["features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en","features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en","features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en",20581,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20581,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20581,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20581,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20588,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20588,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20588,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20588,],
+["features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en","features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en","features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en",20588,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20588,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20588,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20588,],
["libraries.designsystem.theme.components_DialogWithDestructiveButton_Dialog_with_destructive_button_Dialogs_en","",0,],
["libraries.designsystem.theme.components_DialogWithOnlyMessageAndOkButton_Dialog_with_only_message_and_ok_button_Dialogs_en","",0,],
["libraries.designsystem.theme.components_DialogWithThirdButton_Dialog_with_third_button_Dialogs_en","",0,],
@@ -319,20 +319,20 @@ export const screenshots = [
["libraries.designsystem.text_DpScale_1_0f__en","",0,],
["libraries.designsystem.text_DpScale_1_5f__en","",0,],
["libraries.designsystem.theme.components_DropdownMenuItem_Menus_en","",0,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20581,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20581,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20581,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20581,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20581,],
-["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_0_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_0_en",20581,],
-["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_1_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_1_en",20581,],
-["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_2_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_2_en",20581,],
-["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_3_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_3_en",20581,],
-["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_4_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_4_en",20581,],
-["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20581,],
-["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20581,],
-["features.preferences.impl.user.editprofile_EditUserProfileView_Day_2_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_2_en",20581,],
-["features.preferences.impl.user.editprofile_EditUserProfileView_Day_3_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_3_en",20581,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20588,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20588,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20588,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20588,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20588,],
+["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_0_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_0_en",20588,],
+["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_1_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_1_en",20588,],
+["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_2_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_2_en",20588,],
+["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_3_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_3_en",20588,],
+["features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Day_4_en","features.securityandprivacy.impl.editroomaddress_EditRoomAddressView_Night_4_en",20588,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20588,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20588,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_2_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_2_en",20588,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_3_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_3_en",20588,],
["libraries.matrix.ui.components_EditableOrgAvatarRtl_Day_0_en","libraries.matrix.ui.components_EditableOrgAvatarRtl_Night_0_en",0,],
["libraries.matrix.ui.components_EditableOrgAvatar_Day_0_en","libraries.matrix.ui.components_EditableOrgAvatar_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomLargeNoBlurShadow_Night_0_en",0,],
@@ -340,29 +340,29 @@ export const screenshots = [
["libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMediumNoBlurShadow_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Day_0_en","libraries.designsystem.atomic.atoms_ElementLogoAtomMedium_Night_0_en",0,],
["features.messages.impl.timeline.components.customreaction_EmojiItem_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiItem_Night_0_en",0,],
-["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_0_en",20581,],
-["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_1_en",20581,],
+["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_0_en",20588,],
+["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_1_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_1_en",20588,],
["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_2_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_2_en",0,],
["features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Day_3_en","features.messages.impl.timeline.components.customreaction.picker_EmojiPicker_Night_3_en",0,],
["libraries.ui.common.nodes_EmptyView_Day_0_en","libraries.ui.common.nodes_EmptyView_Night_0_en",0,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_0_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_1_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_1_en",20581,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_2_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_2_en",20581,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_3_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_3_en",20581,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_4_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_4_en",20581,],
-["features.linknewdevice.impl.screens.number_EnterNumberView_Day_5_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_5_en",20581,],
-["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20581,],
-["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20581,],
-["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_0_en","features.linknewdevice.impl.screens.error_ErrorView_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_1_en","features.linknewdevice.impl.screens.error_ErrorView_Night_1_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_2_en","features.linknewdevice.impl.screens.error_ErrorView_Night_2_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_3_en","features.linknewdevice.impl.screens.error_ErrorView_Night_3_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_4_en","features.linknewdevice.impl.screens.error_ErrorView_Night_4_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_5_en","features.linknewdevice.impl.screens.error_ErrorView_Night_5_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_6_en","features.linknewdevice.impl.screens.error_ErrorView_Night_6_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_7_en","features.linknewdevice.impl.screens.error_ErrorView_Night_7_en",20581,],
-["features.linknewdevice.impl.screens.error_ErrorView_Day_8_en","features.linknewdevice.impl.screens.error_ErrorView_Night_8_en",20581,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_0_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_1_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_1_en",20588,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_2_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_2_en",20588,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_3_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_3_en",20588,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_4_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_4_en",20588,],
+["features.linknewdevice.impl.screens.number_EnterNumberView_Day_5_en","features.linknewdevice.impl.screens.number_EnterNumberView_Night_5_en",20588,],
+["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20588,],
+["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20588,],
+["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_0_en","features.linknewdevice.impl.screens.error_ErrorView_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_1_en","features.linknewdevice.impl.screens.error_ErrorView_Night_1_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_2_en","features.linknewdevice.impl.screens.error_ErrorView_Night_2_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_3_en","features.linknewdevice.impl.screens.error_ErrorView_Night_3_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_4_en","features.linknewdevice.impl.screens.error_ErrorView_Night_4_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_5_en","features.linknewdevice.impl.screens.error_ErrorView_Night_5_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_6_en","features.linknewdevice.impl.screens.error_ErrorView_Night_6_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_7_en","features.linknewdevice.impl.screens.error_ErrorView_Night_7_en",20588,],
+["features.linknewdevice.impl.screens.error_ErrorView_Day_8_en","features.linknewdevice.impl.screens.error_ErrorView_Night_8_en",20588,],
["features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en","features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_en",0,],
["libraries.designsystem.components_ExpandableBottomSheetLayout_en","",0,],
["libraries.featureflag.ui_FeatureListView_Day_0_en","libraries.featureflag.ui_FeatureListView_Night_0_en",0,],
@@ -382,49 +382,49 @@ export const screenshots = [
["features.messages.impl.timeline.components_FloatingDateBadge_Day_0_en","features.messages.impl.timeline.components_FloatingDateBadge_Night_0_en",0,],
["libraries.designsystem.atomic.pages_FlowStepPage_Day_0_en","libraries.designsystem.atomic.pages_FlowStepPage_Night_0_en",0,],
["features.messages.impl.timeline.focus_FocusRequestStateView_Day_0_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_0_en",0,],
-["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20581,],
-["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20581,],
-["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20581,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20588,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20588,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20588,],
["features.messages.impl.timeline.components_FocusedEvent_Day_0_en","features.messages.impl.timeline.components_FocusedEvent_Night_0_en",0,],
["libraries.textcomposer.components_FormattingOption_Day_0_en","libraries.textcomposer.components_FormattingOption_Night_0_en",0,],
["features.forward.impl_ForwardMessagesView_Day_0_en","features.forward.impl_ForwardMessagesView_Night_0_en",0,],
["features.forward.impl_ForwardMessagesView_Day_1_en","features.forward.impl_ForwardMessagesView_Night_1_en",0,],
["features.forward.impl_ForwardMessagesView_Day_2_en","features.forward.impl_ForwardMessagesView_Night_2_en",0,],
-["features.forward.impl_ForwardMessagesView_Day_3_en","features.forward.impl_ForwardMessagesView_Night_3_en",20581,],
-["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20581,],
+["features.forward.impl_ForwardMessagesView_Day_3_en","features.forward.impl_ForwardMessagesView_Night_3_en",20588,],
+["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20588,],
["features.announcement.impl.fullscreen_FullscreenAnnouncementView_Day_0_en","features.announcement.impl.fullscreen_FullscreenAnnouncementView_Night_0_en",0,],
-["features.announcement.impl.fullscreen_FullscreenAnnouncementView_Day_1_en","features.announcement.impl.fullscreen_FullscreenAnnouncementView_Night_1_en",20581,],
+["features.announcement.impl.fullscreen_FullscreenAnnouncementView_Day_1_en","features.announcement.impl.fullscreen_FullscreenAnnouncementView_Night_1_en",20588,],
["libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButtonCircleShape_Night_0_en",0,],
["libraries.designsystem.components.button_GradientFloatingActionButton_Day_0_en","libraries.designsystem.components.button_GradientFloatingActionButton_Night_0_en",0,],
["features.messages.impl.timeline.components.group_GroupHeaderView_Day_0_en","features.messages.impl.timeline.components.group_GroupHeaderView_Night_0_en",0,],
["libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPageScrollable_Night_0_en",0,],
["libraries.designsystem.atomic.pages_HeaderFooterPage_Day_0_en","libraries.designsystem.atomic.pages_HeaderFooterPage_Night_0_en",0,],
-["features.home.impl.spaces_HomeSpacesView_Day_0_en","features.home.impl.spaces_HomeSpacesView_Night_0_en",20581,],
-["features.home.impl.spaces_HomeSpacesView_Day_1_en","features.home.impl.spaces_HomeSpacesView_Night_1_en",20581,],
-["features.home.impl.spaces_HomeSpacesView_Day_2_en","features.home.impl.spaces_HomeSpacesView_Night_2_en",20581,],
-["features.home.impl.components_HomeTopBarMultiAccount_Day_0_en","features.home.impl.components_HomeTopBarMultiAccount_Night_0_en",20581,],
-["features.home.impl.components_HomeTopBarSpaceFiltersSelected_Day_0_en","features.home.impl.components_HomeTopBarSpaceFiltersSelected_Night_0_en",20581,],
+["features.home.impl.spaces_HomeSpacesView_Day_0_en","features.home.impl.spaces_HomeSpacesView_Night_0_en",20588,],
+["features.home.impl.spaces_HomeSpacesView_Day_1_en","features.home.impl.spaces_HomeSpacesView_Night_1_en",20588,],
+["features.home.impl.spaces_HomeSpacesView_Day_2_en","features.home.impl.spaces_HomeSpacesView_Night_2_en",20588,],
+["features.home.impl.components_HomeTopBarMultiAccount_Day_0_en","features.home.impl.components_HomeTopBarMultiAccount_Night_0_en",20588,],
+["features.home.impl.components_HomeTopBarSpaceFiltersSelected_Day_0_en","features.home.impl.components_HomeTopBarSpaceFiltersSelected_Night_0_en",20588,],
["features.home.impl.components_HomeTopBarSpaces_Day_0_en","features.home.impl.components_HomeTopBarSpaces_Night_0_en",0,],
-["features.home.impl.components_HomeTopBarWithIndicator_Day_0_en","features.home.impl.components_HomeTopBarWithIndicator_Night_0_en",20581,],
-["features.home.impl.components_HomeTopBar_Day_0_en","features.home.impl.components_HomeTopBar_Night_0_en",20581,],
+["features.home.impl.components_HomeTopBarWithIndicator_Day_0_en","features.home.impl.components_HomeTopBarWithIndicator_Night_0_en",20588,],
+["features.home.impl.components_HomeTopBar_Day_0_en","features.home.impl.components_HomeTopBar_Night_0_en",20588,],
["features.home.impl_HomeViewA11y_en","",0,],
-["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20581,],
-["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20581,],
+["features.home.impl_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20588,],
+["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20588,],
["features.home.impl_HomeView_Day_11_en","features.home.impl_HomeView_Night_11_en",0,],
["features.home.impl_HomeView_Day_12_en","features.home.impl_HomeView_Night_12_en",0,],
-["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20581,],
-["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20581,],
-["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20581,],
-["features.home.impl_HomeView_Day_16_en","features.home.impl_HomeView_Night_16_en",20581,],
-["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20581,],
-["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20581,],
-["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20581,],
-["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",20581,],
-["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20581,],
-["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20581,],
-["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20581,],
-["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20581,],
-["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20581,],
+["features.home.impl_HomeView_Day_13_en","features.home.impl_HomeView_Night_13_en",20588,],
+["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20588,],
+["features.home.impl_HomeView_Day_15_en","features.home.impl_HomeView_Night_15_en",20588,],
+["features.home.impl_HomeView_Day_16_en","features.home.impl_HomeView_Night_16_en",20588,],
+["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20588,],
+["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20588,],
+["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20588,],
+["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",20588,],
+["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20588,],
+["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20588,],
+["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20588,],
+["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20588,],
+["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20588,],
["libraries.designsystem.theme.components_HorizontalDivider_Dividers_en","",0,],
["libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Day_0_en","libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Night_0_en",0,],
["libraries.designsystem.theme.components_HorizontalFloatingToolbar_Day_0_en","libraries.designsystem.theme.components_HorizontalFloatingToolbar_Night_0_en",0,],
@@ -435,12 +435,12 @@ export const screenshots = [
["libraries.designsystem.atomic.molecules_IconTitlePlaceholdersRowMolecule_Day_0_en","libraries.designsystem.atomic.molecules_IconTitlePlaceholdersRowMolecule_Night_0_en",0,],
["libraries.designsystem.atomic.molecules_IconTitleSubtitleMolecule_Day_0_en","libraries.designsystem.atomic.molecules_IconTitleSubtitleMolecule_Night_0_en",0,],
["libraries.designsystem.theme.components_IconToggleButton_Toggles_en","",0,],
-["appicon.enterprise_Icon_en","",0,],
["appicon.element_Icon_en","",0,],
+["appicon.enterprise_Icon_en","",0,],
["libraries.designsystem.icons_IconsOther_Day_0_en","libraries.designsystem.icons_IconsOther_Night_0_en",0,],
["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_0_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_0_en",0,],
-["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20581,],
-["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20581,],
+["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20588,],
+["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20588,],
["libraries.mediaviewer.impl.gallery.ui_ImageItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_ImageItemView_Night_0_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_0_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_0_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_10_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_10_en",0,],
@@ -448,119 +448,119 @@ export const screenshots = [
["libraries.matrix.ui.messages.reply_InReplyToView_Day_1_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_1_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_2_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_2_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_3_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_3_en",0,],
-["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20581,],
+["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20588,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_5_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_5_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_6_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_6_en",0,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_7_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_7_en",0,],
-["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20581,],
+["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20588,],
["libraries.matrix.ui.messages.reply_InReplyToView_Day_9_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_9_en",0,],
-["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20581,],
-["features.call.impl.ui_IncomingCallScreen_Day_1_en","features.call.impl.ui_IncomingCallScreen_Night_1_en",20581,],
+["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20588,],
+["features.call.impl.ui_IncomingCallScreen_Day_1_en","features.call.impl.ui_IncomingCallScreen_Night_1_en",20588,],
["features.verifysession.impl.incoming_IncomingVerificationViewA11y_en","",0,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20581,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20581,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20588,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20588,],
["libraries.designsystem.atomic.molecules_InfoListItemMolecule_Day_0_en","libraries.designsystem.atomic.molecules_InfoListItemMolecule_Night_0_en",0,],
["libraries.designsystem.atomic.organisms_InfoListOrganism_Day_0_en","libraries.designsystem.atomic.organisms_InfoListOrganism_Night_0_en",0,],
["libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Day_0_en","libraries.matrix.ui.media_InitialsAvatarBitmapGenerator_Night_0_en",0,],
-["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20581,],
-["features.invitepeople.impl_InvitePeopleView_Day_0_en","features.invitepeople.impl_InvitePeopleView_Night_0_en",20581,],
-["features.invitepeople.impl_InvitePeopleView_Day_10_en","features.invitepeople.impl_InvitePeopleView_Night_10_en",20581,],
+["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20588,],
+["features.invitepeople.impl_InvitePeopleView_Day_0_en","features.invitepeople.impl_InvitePeopleView_Night_0_en",20588,],
+["features.invitepeople.impl_InvitePeopleView_Day_10_en","features.invitepeople.impl_InvitePeopleView_Night_10_en",20588,],
["features.invitepeople.impl_InvitePeopleView_Day_11_en","features.invitepeople.impl_InvitePeopleView_Night_11_en",0,],
-["features.invitepeople.impl_InvitePeopleView_Day_1_en","features.invitepeople.impl_InvitePeopleView_Night_1_en",20581,],
+["features.invitepeople.impl_InvitePeopleView_Day_1_en","features.invitepeople.impl_InvitePeopleView_Night_1_en",20588,],
["features.invitepeople.impl_InvitePeopleView_Day_2_en","features.invitepeople.impl_InvitePeopleView_Night_2_en",0,],
["features.invitepeople.impl_InvitePeopleView_Day_3_en","features.invitepeople.impl_InvitePeopleView_Night_3_en",0,],
-["features.invitepeople.impl_InvitePeopleView_Day_4_en","features.invitepeople.impl_InvitePeopleView_Night_4_en",20581,],
-["features.invitepeople.impl_InvitePeopleView_Day_5_en","features.invitepeople.impl_InvitePeopleView_Night_5_en",20581,],
-["features.invitepeople.impl_InvitePeopleView_Day_6_en","features.invitepeople.impl_InvitePeopleView_Night_6_en",20581,],
-["features.invitepeople.impl_InvitePeopleView_Day_7_en","features.invitepeople.impl_InvitePeopleView_Night_7_en",20581,],
+["features.invitepeople.impl_InvitePeopleView_Day_4_en","features.invitepeople.impl_InvitePeopleView_Night_4_en",20588,],
+["features.invitepeople.impl_InvitePeopleView_Day_5_en","features.invitepeople.impl_InvitePeopleView_Night_5_en",20588,],
+["features.invitepeople.impl_InvitePeopleView_Day_6_en","features.invitepeople.impl_InvitePeopleView_Night_6_en",20588,],
+["features.invitepeople.impl_InvitePeopleView_Day_7_en","features.invitepeople.impl_InvitePeopleView_Night_7_en",20588,],
["features.invitepeople.impl_InvitePeopleView_Day_8_en","features.invitepeople.impl_InvitePeopleView_Night_8_en",0,],
-["features.invitepeople.impl_InvitePeopleView_Day_9_en","features.invitepeople.impl_InvitePeopleView_Night_9_en",20581,],
-["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20581,],
-["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20581,],
+["features.invitepeople.impl_InvitePeopleView_Day_9_en","features.invitepeople.impl_InvitePeopleView_Night_9_en",20588,],
+["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20588,],
+["features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.startchat.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20588,],
["features.joinroom.impl_JoinRoomView_Day_0_en","features.joinroom.impl_JoinRoomView_Night_0_en",0,],
-["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20581,],
-["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20581,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20581,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20581,],
+["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20588,],
+["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20588,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20588,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20588,],
["libraries.designsystem.components_LabelledCheckbox_Toggles_en","",0,],
-["features.preferences.impl.labs_LabsView_Day_0_en","features.preferences.impl.labs_LabsView_Night_0_en",20581,],
-["features.preferences.impl.labs_LabsView_Day_1_en","features.preferences.impl.labs_LabsView_Night_1_en",20581,],
+["features.preferences.impl.labs_LabsView_Day_0_en","features.preferences.impl.labs_LabsView_Night_0_en",20588,],
+["features.preferences.impl.labs_LabsView_Day_1_en","features.preferences.impl.labs_LabsView_Night_1_en",20588,],
["features.leaveroom.impl_LeaveRoomView_Day_0_en","features.leaveroom.impl_LeaveRoomView_Night_0_en",0,],
-["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",20581,],
-["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_0_en","features.space.impl.leave_LeaveSpaceView_Night_0_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_10_en","features.space.impl.leave_LeaveSpaceView_Night_10_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_1_en","features.space.impl.leave_LeaveSpaceView_Night_1_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_2_en","features.space.impl.leave_LeaveSpaceView_Night_2_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_3_en","features.space.impl.leave_LeaveSpaceView_Night_3_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_4_en","features.space.impl.leave_LeaveSpaceView_Night_4_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_5_en","features.space.impl.leave_LeaveSpaceView_Night_5_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_6_en","features.space.impl.leave_LeaveSpaceView_Night_6_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_7_en","features.space.impl.leave_LeaveSpaceView_Night_7_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_8_en","features.space.impl.leave_LeaveSpaceView_Night_8_en",20581,],
-["features.space.impl.leave_LeaveSpaceView_Day_9_en","features.space.impl.leave_LeaveSpaceView_Night_9_en",20581,],
+["features.leaveroom.impl_LeaveRoomView_Day_1_en","features.leaveroom.impl_LeaveRoomView_Night_1_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_2_en","features.leaveroom.impl_LeaveRoomView_Night_2_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_3_en","features.leaveroom.impl_LeaveRoomView_Night_3_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_4_en","features.leaveroom.impl_LeaveRoomView_Night_4_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_5_en","features.leaveroom.impl_LeaveRoomView_Night_5_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_6_en","features.leaveroom.impl_LeaveRoomView_Night_6_en",20588,],
+["features.leaveroom.impl_LeaveRoomView_Day_7_en","features.leaveroom.impl_LeaveRoomView_Night_7_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_0_en","features.space.impl.leave_LeaveSpaceView_Night_0_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_10_en","features.space.impl.leave_LeaveSpaceView_Night_10_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_1_en","features.space.impl.leave_LeaveSpaceView_Night_1_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_2_en","features.space.impl.leave_LeaveSpaceView_Night_2_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_3_en","features.space.impl.leave_LeaveSpaceView_Night_3_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_4_en","features.space.impl.leave_LeaveSpaceView_Night_4_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_5_en","features.space.impl.leave_LeaveSpaceView_Night_5_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_6_en","features.space.impl.leave_LeaveSpaceView_Night_6_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_7_en","features.space.impl.leave_LeaveSpaceView_Night_7_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_8_en","features.space.impl.leave_LeaveSpaceView_Night_8_en",20588,],
+["features.space.impl.leave_LeaveSpaceView_Day_9_en","features.space.impl.leave_LeaveSpaceView_Night_9_en",20588,],
["libraries.designsystem.background_LightGradientBackground_Day_0_en","libraries.designsystem.background_LightGradientBackground_Night_0_en",0,],
["libraries.designsystem.theme.components_LinearProgressIndicator_Progress_Indicators_en","",0,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_0_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_1_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_1_en",20581,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_2_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_2_en",20581,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_3_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_3_en",20581,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_4_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_4_en",20581,],
-["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_5_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_5_en",20581,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_0_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_1_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_1_en",20588,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_2_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_2_en",20588,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_3_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_3_en",20588,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_4_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_4_en",20588,],
+["features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Day_5_en","features.linknewdevice.impl.screens.root_LinkNewDeviceRootView_Night_5_en",20588,],
["features.messages.impl.link_LinkView_Day_0_en","features.messages.impl.link_LinkView_Night_0_en",0,],
-["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20581,],
+["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20588,],
["libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en","",0,],
["libraries.designsystem.components.dialogs_ListDialog_Day_0_en","libraries.designsystem.components.dialogs_ListDialog_Night_0_en",0,],
["libraries.designsystem.theme.components_ListItemPrimaryActionWithIcon_List_item_-_Primary_action_&_Icon_List_items_en","",0,],
@@ -613,47 +613,48 @@ export const screenshots = [
["libraries.designsystem.theme.components_ListSupportingTextLargePadding_List_supporting_text_-_large_padding_List_sections_en","",0,],
["libraries.designsystem.theme.components_ListSupportingTextNoPadding_List_supporting_text_-_no_padding_List_sections_en","",0,],
["libraries.designsystem.theme.components_ListSupportingTextSmallPadding_List_supporting_text_-_small_padding_List_sections_en","",0,],
+["features.location.api_LiveLocationSharingBanner_Day_0_en","features.location.api_LiveLocationSharingBanner_Night_0_en",20591,],
["libraries.textcomposer.components_LiveWaveformView_Day_0_en","libraries.textcomposer.components_LiveWaveformView_Night_0_en",0,],
["appnav.room.joined_LoadingRoomNodeView_Day_0_en","appnav.room.joined_LoadingRoomNodeView_Night_0_en",0,],
-["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20581,],
+["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20588,],
["libraries.designsystem.components_LocationPin_Day_0_en","libraries.designsystem.components_LocationPin_Night_0_en",0,],
["features.location.impl.common.ui_LocationShareRow_Day_0_en","features.location.impl.common.ui_LocationShareRow_Night_0_en",0,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20581,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20581,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20581,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20588,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20588,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20588,],
["appnav.loggedin_LoggedInView_Day_0_en","appnav.loggedin_LoggedInView_Night_0_en",0,],
-["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20581,],
-["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20581,],
-["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20581,],
-["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",20581,],
-["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",20581,],
-["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",20581,],
-["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",20581,],
-["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",20581,],
-["features.login.impl.login_LoginModeView_Day_5_en","features.login.impl.login_LoginModeView_Night_5_en",20581,],
-["features.login.impl.login_LoginModeView_Day_6_en","features.login.impl.login_LoginModeView_Night_6_en",20581,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20581,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20581,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20581,],
-["features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Day_0_en","features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Night_0_en",20581,],
-["features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Day_1_en","features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Night_1_en",20581,],
-["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20581,],
-["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20581,],
-["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20581,],
-["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20581,],
-["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20581,],
-["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20581,],
-["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20581,],
-["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20581,],
-["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20581,],
-["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20581,],
-["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20581,],
-["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20581,],
+["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20588,],
+["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20588,],
+["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20588,],
+["features.login.impl.login_LoginModeView_Day_0_en","features.login.impl.login_LoginModeView_Night_0_en",20588,],
+["features.login.impl.login_LoginModeView_Day_1_en","features.login.impl.login_LoginModeView_Night_1_en",20588,],
+["features.login.impl.login_LoginModeView_Day_2_en","features.login.impl.login_LoginModeView_Night_2_en",20588,],
+["features.login.impl.login_LoginModeView_Day_3_en","features.login.impl.login_LoginModeView_Night_3_en",20588,],
+["features.login.impl.login_LoginModeView_Day_4_en","features.login.impl.login_LoginModeView_Night_4_en",20588,],
+["features.login.impl.login_LoginModeView_Day_5_en","features.login.impl.login_LoginModeView_Night_5_en",20588,],
+["features.login.impl.login_LoginModeView_Day_6_en","features.login.impl.login_LoginModeView_Night_6_en",20588,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20588,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20588,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20588,],
+["features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Day_0_en","features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Night_0_en",20588,],
+["features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Day_1_en","features.login.impl.screens.classic.loginwithclassic_LoginWithClassicView_Night_1_en",20588,],
+["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20588,],
+["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20588,],
+["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20588,],
+["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20588,],
+["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20588,],
+["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20588,],
+["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20588,],
+["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20588,],
+["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20588,],
+["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20588,],
+["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20588,],
+["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20588,],
["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,],
-["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_0_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_0_en",20581,],
-["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_1_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_1_en",20581,],
-["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_2_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_2_en",20581,],
-["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20581,],
+["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_0_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_0_en",20588,],
+["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_1_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_1_en",20588,],
+["features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Day_2_en","features.securityandprivacy.impl.manageauthorizedspaces_ManageAuthorizedSpacesView_Night_2_en",20588,],
+["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20588,],
["libraries.textcomposer.components.markdown_MarkdownTextInput_Day_0_en","libraries.textcomposer.components.markdown_MarkdownTextInput_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomNegative_Night_0_en",0,],
@@ -666,26 +667,26 @@ export const screenshots = [
["libraries.matrix.ui.components_MatrixUserRow_Day_1_en","libraries.matrix.ui.components_MatrixUserRow_Night_1_en",0,],
["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_0_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_0_en",0,],
["libraries.mediaviewer.impl.local.audio_MediaAudioView_Day_1_en","libraries.mediaviewer.impl.local.audio_MediaAudioView_Night_1_en",0,],
-["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20581,],
-["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en",20581,],
-["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20581,],
-["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en",20581,],
-["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en",20581,],
-["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en",20581,],
+["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20588,],
+["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_1_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_1_en",20588,],
+["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20588,],
+["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_1_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_1_en",20588,],
+["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_2_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_2_en",20588,],
+["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_3_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_3_en",20588,],
["libraries.mediaviewer.impl.local.file_MediaFileView_Day_0_en","libraries.mediaviewer.impl.local.file_MediaFileView_Night_0_en",0,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20581,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20581,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20588,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20588,],
["libraries.mediaviewer.impl.local.image_MediaImageView_Day_0_en","libraries.mediaviewer.impl.local.image_MediaImageView_Night_0_en",0,],
["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_0_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_0_en",0,],
["libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Day_1_en","libraries.mediaviewer.impl.local.player_MediaPlayerControllerView_Night_1_en",0,],
@@ -693,10 +694,10 @@ export const screenshots = [
["libraries.mediaviewer.impl.local.video_MediaVideoView_Day_0_en","libraries.mediaviewer.impl.local.video_MediaVideoView_Night_0_en",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_0_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_10_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en","",20581,],
-["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_11_en","",20588,],
+["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_12_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_13_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_14_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_14_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_15_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_16_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_17_en","",0,],
@@ -706,7 +707,7 @@ export const screenshots = [
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_20_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_21_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_22_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_2_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_3_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_4_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_5_en","",0,],
@@ -716,10 +717,10 @@ export const screenshots = [
["libraries.mediaviewer.impl.viewer_MediaViewerViewLandscape_9_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_0_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_10_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20581,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20588,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_15_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_16_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_17_en","",0,],
@@ -729,7 +730,7 @@ export const screenshots = [
["libraries.mediaviewer.impl.viewer_MediaViewerView_20_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_21_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_22_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20581,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20588,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,],
@@ -743,7 +744,7 @@ export const screenshots = [
["libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en","libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en",0,],
["libraries.designsystem.theme.components.previews_Menu_Menus_en","",0,],
["features.messages.impl.messagecomposer_MessageComposerViewVoice_Day_0_en","features.messages.impl.messagecomposer_MessageComposerViewVoice_Night_0_en",0,],
-["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20581,],
+["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20588,],
["features.messages.impl.timeline.components_MessageEventBubble_Day_0_en","features.messages.impl.timeline.components_MessageEventBubble_Night_0_en",0,],
["features.messages.impl.timeline.components_MessageEventBubble_Day_1_en","features.messages.impl.timeline.components_MessageEventBubble_Night_1_en",0,],
["features.messages.impl.timeline.components_MessageEventBubble_Day_2_en","features.messages.impl.timeline.components_MessageEventBubble_Night_2_en",0,],
@@ -752,7 +753,7 @@ export const screenshots = [
["features.messages.impl.timeline.components_MessageEventBubble_Day_5_en","features.messages.impl.timeline.components_MessageEventBubble_Night_5_en",0,],
["features.messages.impl.timeline.components_MessageEventBubble_Day_6_en","features.messages.impl.timeline.components_MessageEventBubble_Night_6_en",0,],
["features.messages.impl.timeline.components_MessageEventBubble_Day_7_en","features.messages.impl.timeline.components_MessageEventBubble_Night_7_en",0,],
-["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20581,],
+["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20588,],
["features.messages.impl.timeline.components_MessageStateEventContainer_Day_0_en","features.messages.impl.timeline.components_MessageStateEventContainer_Night_0_en",0,],
["features.messages.impl.timeline.components_MessagesReactionButtonAdd_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonAdd_Night_0_en",0,],
["features.messages.impl.timeline.components_MessagesReactionButtonExtra_Day_0_en","features.messages.impl.timeline.components_MessagesReactionButtonExtra_Night_0_en",0,],
@@ -761,23 +762,24 @@ export const screenshots = [
["features.messages.impl.timeline.components_MessagesReactionButton_Day_2_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_2_en",0,],
["features.messages.impl.timeline.components_MessagesReactionButton_Day_3_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_3_en",0,],
["features.messages.impl_MessagesViewA11y_en","",0,],
-["features.messages.impl.topbars_MessagesViewTopBar_Day_0_en","features.messages.impl.topbars_MessagesViewTopBar_Night_0_en",20581,],
-["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20581,],
-["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20581,],
-["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20581,],
-["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20581,],
-["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20581,],
-["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20581,],
-["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20581,],
-["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20581,],
-["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20581,],
-["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20581,],
-["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20581,],
-["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20581,],
-["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20581,],
-["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20581,],
+["features.messages.impl.topbars_MessagesViewTopBar_Day_0_en","features.messages.impl.topbars_MessagesViewTopBar_Night_0_en",20588,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20588,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20588,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20588,],
+["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20588,],
+["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20588,],
+["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20591,],
+["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20588,],
+["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20588,],
+["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20588,],
+["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20588,],
+["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20588,],
+["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20588,],
+["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20588,],
+["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20588,],
+["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20588,],
["features.migration.impl_MigrationView_Day_0_en","features.migration.impl_MigrationView_Night_0_en",0,],
-["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20581,],
+["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20588,],
["features.login.impl.screens.classic.missingkeybackup_MissingKeyBackupView_Day_0_en","features.login.impl.screens.classic.missingkeybackup_MissingKeyBackupView_Night_0_en",0,],
["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,],
["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,],
@@ -788,117 +790,117 @@ export const screenshots = [
["libraries.designsystem.components.list_MutipleSelectionListItemSelected_Multiple_selection_List_item_-_selection_in_supporting_text_List_items_en","",0,],
["libraries.designsystem.components.list_MutipleSelectionListItem_Multiple_selection_List_item_-_no_selection_List_items_en","",0,],
["libraries.designsystem.theme.components_NavigationBar_App_Bars_en","",0,],
-["features.home.impl.components_NewNotificationSoundBanner_Day_0_en","features.home.impl.components_NewNotificationSoundBanner_Night_0_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20581,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20581,],
-["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20581,],
+["features.home.impl.components_NewNotificationSoundBanner_Day_0_en","features.home.impl.components_NewNotificationSoundBanner_Night_0_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20588,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20588,],
+["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20588,],
["features.linknewdevice.impl.screens.number.component_NumberTextField_Day_0_en","features.linknewdevice.impl.screens.number.component_NumberTextField_Night_0_en",0,],
["libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en","libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en",0,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_6_en","features.login.impl.screens.onboarding_OnBoardingView_Night_6_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_7_en","features.login.impl.screens.onboarding_OnBoardingView_Night_7_en",20581,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_8_en","features.login.impl.screens.onboarding_OnBoardingView_Night_8_en",20581,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_6_en","features.login.impl.screens.onboarding_OnBoardingView_Night_6_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_7_en","features.login.impl.screens.onboarding_OnBoardingView_Night_7_en",20588,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_8_en","features.login.impl.screens.onboarding_OnBoardingView_Night_8_en",20588,],
["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,],
-["libraries.matrix.ui.components_OrganizationHeader_Day_0_en","libraries.matrix.ui.components_OrganizationHeader_Night_0_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20581,],
+["libraries.matrix.ui.components_OrganizationHeader_Day_0_en","libraries.matrix.ui.components_OrganizationHeader_Night_0_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20588,],
["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_12_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_12_en",0,],
["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_13_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_13_en",0,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20581,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20581,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20588,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20588,],
["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonMediumLowPadding_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonMedium_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonSmall_Buttons_en","",0,],
-["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20581,],
-["features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Day_0_en","features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Night_0_en",20581,],
-["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20581,],
-["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20581,],
-["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20581,],
-["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20581,],
+["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20588,],
+["features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Day_0_en","features.rolesandpermissions.impl.roles_PendingMemberRowWithLongName_Night_0_en",20588,],
+["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20588,],
+["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20588,],
+["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20588,],
+["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20588,],
["features.lockscreen.impl.components_PinEntryTextField_Day_0_en","features.lockscreen.impl.components_PinEntryTextField_Night_0_en",0,],
["features.lockscreen.impl.unlock.keypad_PinKeypad_Day_0_en","features.lockscreen.impl.unlock.keypad_PinKeypad_Night_0_en",0,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_8_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_8_en",20584,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_9_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_9_en",20584,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20581,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_8_en","features.lockscreen.impl.unlock_PinUnlockView_Night_8_en",20584,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_9_en","features.lockscreen.impl.unlock_PinUnlockView_Night_9_en",20584,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_8_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_8_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_9_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_9_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_8_en","features.lockscreen.impl.unlock_PinUnlockView_Night_8_en",20588,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_9_en","features.lockscreen.impl.unlock_PinUnlockView_Night_9_en",20588,],
["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_0_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_0_en",0,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20581,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20581,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20581,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20581,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20581,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20581,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20588,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20588,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20588,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20588,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20588,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20588,],
["libraries.designsystem.atomic.atoms_PlaceholderAtom_Day_0_en","libraries.designsystem.atomic.atoms_PlaceholderAtom_Night_0_en",0,],
["libraries.designsystem.atomic.atoms_PlaybackSpeedButton_Day_0_en","libraries.designsystem.atomic.atoms_PlaybackSpeedButton_Night_0_en",0,],
-["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20581,],
+["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20588,],
["features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en",0,],
["features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewUndisclosedSelected_Night_0_en",0,],
-["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20581,],
-["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20581,],
-["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20581,],
-["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20581,],
-["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20581,],
-["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20581,],
-["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20581,],
+["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20588,],
+["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20588,],
+["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20588,],
+["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20588,],
+["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20588,],
+["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20588,],
+["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20588,],
["features.poll.api.pollcontent_PollTitleView_Day_0_en","features.poll.api.pollcontent_PollTitleView_Night_0_en",0,],
["libraries.designsystem.components.preferences_PreferenceCategory_Preferences_en","",0,],
["libraries.designsystem.components.preferences_PreferenceCheckbox_Preferences_en","",0,],
@@ -912,225 +914,225 @@ export const screenshots = [
["libraries.designsystem.components.preferences_PreferenceRow_Preferences_en","",0,],
["libraries.designsystem.components.preferences_PreferenceSlide_Preferences_en","",0,],
["libraries.designsystem.components.preferences_PreferenceSwitch_Preferences_en","",0,],
-["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewDark_2_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewDark_3_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewDark_4_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewDark_5_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_2_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_3_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_4_en","",20581,],
-["features.preferences.impl.root_PreferencesRootViewLight_5_en","",20581,],
+["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewDark_2_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewDark_3_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewDark_4_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewDark_5_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_2_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_3_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_4_en","",20588,],
+["features.preferences.impl.root_PreferencesRootViewLight_5_en","",20588,],
["features.messages.impl.timeline.components.event_ProgressButton_Day_0_en","features.messages.impl.timeline.components.event_ProgressButton_Night_0_en",0,],
-["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20581,],
-["libraries.designsystem.components_ProgressDialogWithContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithContent_Night_0_en",20581,],
+["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20588,],
+["libraries.designsystem.components_ProgressDialogWithContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithContent_Night_0_en",20588,],
["libraries.designsystem.components_ProgressDialogWithTextAndContent_Day_0_en","libraries.designsystem.components_ProgressDialogWithTextAndContent_Night_0_en",0,],
-["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20581,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20581,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20581,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20581,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20581,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20581,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20581,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20581,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_3_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_3_en",20581,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20581,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20581,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20581,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20581,],
-["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20581,],
-["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20581,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",20581,],
+["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20588,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20588,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20588,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20588,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20588,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20588,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20588,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20588,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_3_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_3_en",20588,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20588,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20588,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20588,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20588,],
+["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20588,],
+["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20588,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_5_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_5_en",20588,],
["libraries.qrcode_QrCodeView_en","",0,],
["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,],
-["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20581,],
-["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20581,],
+["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20588,],
+["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20588,],
["features.rageshake.api.preferences_RageshakePreferencesView_Day_1_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_1_en",0,],
["features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Day_0_en","features.messages.impl.timeline.components.reactionsummary_ReactionSummaryViewContent_Night_0_en",0,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20581,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20581,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20581,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20581,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20581,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20581,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20581,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20588,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20588,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20588,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20588,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20588,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_14_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_14_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20588,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20588,],
["libraries.designsystem.atomic.atoms_RedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_RedIndicatorAtom_Night_0_en",0,],
["features.messages.impl.timeline.components_ReplySwipeIndicator_Day_0_en","features.messages.impl.timeline.components_ReplySwipeIndicator_Night_0_en",0,],
-["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20581,],
-["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20581,],
-["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20581,],
-["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20581,],
-["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20581,],
-["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20581,],
-["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20581,],
-["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20581,],
-["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20581,],
-["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20581,],
-["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20581,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20581,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20581,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20581,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20581,],
-["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20581,],
-["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20581,],
+["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20588,],
+["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20588,],
+["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20588,],
+["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20588,],
+["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20588,],
+["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20588,],
+["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20588,],
+["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20588,],
+["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20588,],
+["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20588,],
+["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20588,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20588,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20588,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20588,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20588,],
+["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20588,],
+["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20588,],
["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_0_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_0_en",0,],
-["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20581,],
-["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20581,],
-["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20581,],
-["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_0_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_0_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_1_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_1_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_2_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_2_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_3_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_3_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_4_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_4_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_5_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_5_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_6_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_6_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_7_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_7_en",20581,],
-["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_8_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_8_en",20581,],
+["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20588,],
+["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20588,],
+["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20588,],
+["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_0_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_0_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_1_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_1_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_2_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_2_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_3_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_3_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_4_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_4_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_5_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_5_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_6_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_6_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_7_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_7_en",20588,],
+["features.rolesandpermissions.impl.root_RolesAndPermissionsView_Day_8_en","features.rolesandpermissions.impl.root_RolesAndPermissionsView_Night_8_en",20588,],
["libraries.matrix.ui.room.address_RoomAddressField_Day_0_en","libraries.matrix.ui.room.address_RoomAddressField_Night_0_en",0,],
["features.roomaliasresolver.impl_RoomAliasResolverView_Day_0_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_0_en",0,],
-["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20581,],
-["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20581,],
+["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20588,],
+["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20588,],
["features.roomdetails.impl_RoomDetailsA11y_en","",0,],
-["features.roomdetails.impl_RoomDetailsDark_0_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_10_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_11_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_12_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_13_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_14_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_15_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_16_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_17_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_18_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_19_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_1_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_20_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_21_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_22_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_2_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_3_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_4_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_5_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_6_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_7_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_8_en","",20581,],
-["features.roomdetails.impl_RoomDetailsDark_9_en","",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_0_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_0_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_1_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_1_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_2_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_2_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_3_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_3_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_4_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_4_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_5_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_5_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_6_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_6_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_7_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_7_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_8_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_8_en",20581,],
-["features.roomdetailsedit.impl_RoomDetailsEditView_Day_9_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_9_en",20581,],
-["features.roomdetails.impl_RoomDetails_0_en","",20581,],
-["features.roomdetails.impl_RoomDetails_10_en","",20581,],
-["features.roomdetails.impl_RoomDetails_11_en","",20581,],
-["features.roomdetails.impl_RoomDetails_12_en","",20581,],
-["features.roomdetails.impl_RoomDetails_13_en","",20581,],
-["features.roomdetails.impl_RoomDetails_14_en","",20581,],
-["features.roomdetails.impl_RoomDetails_15_en","",20581,],
-["features.roomdetails.impl_RoomDetails_16_en","",20581,],
-["features.roomdetails.impl_RoomDetails_17_en","",20581,],
-["features.roomdetails.impl_RoomDetails_18_en","",20581,],
-["features.roomdetails.impl_RoomDetails_19_en","",20581,],
-["features.roomdetails.impl_RoomDetails_1_en","",20581,],
-["features.roomdetails.impl_RoomDetails_20_en","",20581,],
-["features.roomdetails.impl_RoomDetails_21_en","",20581,],
-["features.roomdetails.impl_RoomDetails_22_en","",20581,],
-["features.roomdetails.impl_RoomDetails_2_en","",20581,],
-["features.roomdetails.impl_RoomDetails_3_en","",20581,],
-["features.roomdetails.impl_RoomDetails_4_en","",20581,],
-["features.roomdetails.impl_RoomDetails_5_en","",20581,],
-["features.roomdetails.impl_RoomDetails_6_en","",20581,],
-["features.roomdetails.impl_RoomDetails_7_en","",20581,],
-["features.roomdetails.impl_RoomDetails_8_en","",20581,],
-["features.roomdetails.impl_RoomDetails_9_en","",20581,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20581,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20581,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20581,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20581,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20581,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20581,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20581,],
-["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20581,],
-["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20581,],
+["features.roomdetails.impl_RoomDetailsDark_0_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_10_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_11_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_12_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_13_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_14_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_15_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_16_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_17_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_18_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_19_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_1_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_20_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_21_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_22_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_2_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_3_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_4_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_5_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_6_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_7_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_8_en","",20588,],
+["features.roomdetails.impl_RoomDetailsDark_9_en","",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_0_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_0_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_1_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_1_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_2_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_2_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_3_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_3_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_4_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_4_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_5_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_5_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_6_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_6_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_7_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_7_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_8_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_8_en",20588,],
+["features.roomdetailsedit.impl_RoomDetailsEditView_Day_9_en","features.roomdetailsedit.impl_RoomDetailsEditView_Night_9_en",20588,],
+["features.roomdetails.impl_RoomDetails_0_en","",20588,],
+["features.roomdetails.impl_RoomDetails_10_en","",20588,],
+["features.roomdetails.impl_RoomDetails_11_en","",20588,],
+["features.roomdetails.impl_RoomDetails_12_en","",20588,],
+["features.roomdetails.impl_RoomDetails_13_en","",20588,],
+["features.roomdetails.impl_RoomDetails_14_en","",20588,],
+["features.roomdetails.impl_RoomDetails_15_en","",20588,],
+["features.roomdetails.impl_RoomDetails_16_en","",20588,],
+["features.roomdetails.impl_RoomDetails_17_en","",20588,],
+["features.roomdetails.impl_RoomDetails_18_en","",20588,],
+["features.roomdetails.impl_RoomDetails_19_en","",20588,],
+["features.roomdetails.impl_RoomDetails_1_en","",20588,],
+["features.roomdetails.impl_RoomDetails_20_en","",20588,],
+["features.roomdetails.impl_RoomDetails_21_en","",20588,],
+["features.roomdetails.impl_RoomDetails_22_en","",20588,],
+["features.roomdetails.impl_RoomDetails_2_en","",20588,],
+["features.roomdetails.impl_RoomDetails_3_en","",20588,],
+["features.roomdetails.impl_RoomDetails_4_en","",20588,],
+["features.roomdetails.impl_RoomDetails_5_en","",20588,],
+["features.roomdetails.impl_RoomDetails_6_en","",20588,],
+["features.roomdetails.impl_RoomDetails_7_en","",20588,],
+["features.roomdetails.impl_RoomDetails_8_en","",20588,],
+["features.roomdetails.impl_RoomDetails_9_en","",20588,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20588,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20588,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20588,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20588,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20588,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20588,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20588,],
+["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20588,],
+["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20588,],
["features.home.impl.components_RoomListContentView_Day_2_en","features.home.impl.components_RoomListContentView_Night_2_en",0,],
-["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20581,],
-["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20581,],
-["features.home.impl.components_RoomListContentView_Day_5_en","features.home.impl.components_RoomListContentView_Night_5_en",20581,],
-["features.home.impl.roomlist_RoomListContextMenu_Day_0_en","features.home.impl.roomlist_RoomListContextMenu_Night_0_en",20581,],
-["features.home.impl.roomlist_RoomListContextMenu_Day_1_en","features.home.impl.roomlist_RoomListContextMenu_Night_1_en",20581,],
-["features.home.impl.roomlist_RoomListContextMenu_Day_2_en","features.home.impl.roomlist_RoomListContextMenu_Night_2_en",20581,],
-["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_0_en",20581,],
-["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_1_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_1_en",20581,],
-["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_2_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_2_en",20581,],
-["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20581,],
-["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20581,],
+["features.home.impl.components_RoomListContentView_Day_3_en","features.home.impl.components_RoomListContentView_Night_3_en",20588,],
+["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20588,],
+["features.home.impl.components_RoomListContentView_Day_5_en","features.home.impl.components_RoomListContentView_Night_5_en",20588,],
+["features.home.impl.roomlist_RoomListContextMenu_Day_0_en","features.home.impl.roomlist_RoomListContextMenu_Night_0_en",20588,],
+["features.home.impl.roomlist_RoomListContextMenu_Day_1_en","features.home.impl.roomlist_RoomListContextMenu_Night_1_en",20588,],
+["features.home.impl.roomlist_RoomListContextMenu_Day_2_en","features.home.impl.roomlist_RoomListContextMenu_Night_2_en",20588,],
+["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_0_en",20588,],
+["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_1_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_1_en",20588,],
+["features.home.impl.roomlist_RoomListDeclineInviteMenu_Day_2_en","features.home.impl.roomlist_RoomListDeclineInviteMenu_Night_2_en",20588,],
+["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20588,],
+["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20588,],
["features.home.impl.search_RoomListSearchContent_Day_0_en","features.home.impl.search_RoomListSearchContent_Night_0_en",0,],
-["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20581,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_6_en","features.roomdetails.impl.members_RoomMemberListView_Night_6_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20581,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_8_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_8_en",20581,],
+["features.home.impl.search_RoomListSearchContent_Day_1_en","features.home.impl.search_RoomListSearchContent_Night_1_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20588,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_6_en","features.roomdetails.impl.members_RoomMemberListView_Night_6_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20588,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_8_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_8_en",20588,],
["features.roommembermoderation.impl_RoomMemberModerationView_Day_9_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_9_en",0,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20581,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20581,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20588,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20588,],
["libraries.designsystem.atomic.atoms_RoomPreviewAliasAtom_Day_0_en","libraries.designsystem.atomic.atoms_RoomPreviewAliasAtom_Night_0_en",0,],
-["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20581,],
-["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20581,],
-["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20581,],
-["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20581,],
-["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20581,],
-["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20581,],
+["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20588,],
+["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20588,],
+["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20588,],
+["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20588,],
+["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20588,],
+["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20588,],
["features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en","features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_0_en","features.home.impl.components_RoomSummaryRow_Night_0_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_10_en","features.home.impl.components_RoomSummaryRow_Night_10_en",0,],
@@ -1153,16 +1155,16 @@ export const screenshots = [
["features.home.impl.components_RoomSummaryRow_Day_26_en","features.home.impl.components_RoomSummaryRow_Night_26_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_27_en","features.home.impl.components_RoomSummaryRow_Night_27_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_28_en","features.home.impl.components_RoomSummaryRow_Night_28_en",0,],
-["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20581,],
-["features.home.impl.components_RoomSummaryRow_Day_35_en","features.home.impl.components_RoomSummaryRow_Night_35_en",20581,],
+["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20588,],
+["features.home.impl.components_RoomSummaryRow_Day_35_en","features.home.impl.components_RoomSummaryRow_Night_35_en",20588,],
["features.home.impl.components_RoomSummaryRow_Day_36_en","features.home.impl.components_RoomSummaryRow_Night_36_en",0,],
-["features.home.impl.components_RoomSummaryRow_Day_37_en","features.home.impl.components_RoomSummaryRow_Night_37_en",20581,],
+["features.home.impl.components_RoomSummaryRow_Day_37_en","features.home.impl.components_RoomSummaryRow_Night_37_en",20588,],
["features.home.impl.components_RoomSummaryRow_Day_38_en","features.home.impl.components_RoomSummaryRow_Night_38_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_3_en","features.home.impl.components_RoomSummaryRow_Night_3_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_4_en","features.home.impl.components_RoomSummaryRow_Night_4_en",0,],
@@ -1171,119 +1173,119 @@ export const screenshots = [
["features.home.impl.components_RoomSummaryRow_Day_7_en","features.home.impl.components_RoomSummaryRow_Night_7_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_8_en","features.home.impl.components_RoomSummaryRow_Night_8_en",0,],
["features.home.impl.components_RoomSummaryRow_Day_9_en","features.home.impl.components_RoomSummaryRow_Night_9_en",0,],
-["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20581,],
["features.login.impl.screens.classic.root_RootView_Day_0_en","features.login.impl.screens.classic.root_RootView_Night_0_en",0,],
-["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20581,],
-["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20581,],
+["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20588,],
+["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20588,],
+["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20588,],
["appicon.element_RoundIcon_en","",0,],
["appicon.enterprise_RoundIcon_en","",0,],
["libraries.designsystem.atomic.atoms_RoundedIconAtom_Day_0_en","libraries.designsystem.atomic.atoms_RoundedIconAtom_Night_0_en",0,],
-["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20581,],
-["libraries.designsystem.components.dialogs_SaveChangesDialog_Day_0_en","libraries.designsystem.components.dialogs_SaveChangesDialog_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_0_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_0_en",20581,],
-["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_1_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_1_en",20581,],
-["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_2_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_2_en",20581,],
-["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_3_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_3_en",20581,],
-["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20581,],
-["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20581,],
+["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20588,],
+["libraries.designsystem.components.dialogs_SaveChangesDialog_Day_0_en","libraries.designsystem.components.dialogs_SaveChangesDialog_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_0_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_0_en",20588,],
+["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_1_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_1_en",20588,],
+["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_2_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_2_en",20588,],
+["features.linknewdevice.impl.screens.scan_ScanQrCodeView_Day_3_en","features.linknewdevice.impl.screens.scan_ScanQrCodeView_Night_3_en",20588,],
+["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20588,],
+["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20588,],
["libraries.designsystem.theme.components_SearchBarActiveNoneQuery_Search_views_en","",0,],
["libraries.designsystem.theme.components_SearchBarActiveWithContent_Search_views_en","",0,],
-["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20581,],
+["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20588,],
["libraries.designsystem.theme.components_SearchBarActiveWithQueryNoBackButton_Search_views_en","",0,],
["libraries.designsystem.theme.components_SearchBarActiveWithQuery_Search_views_en","",0,],
["libraries.designsystem.theme.components_SearchBarInactive_Search_views_en","",0,],
["libraries.designsystem.theme.components_SearchFieldsDark_Search_views_en","",0,],
["libraries.designsystem.theme.components_SearchFieldsLight_Search_views_en","",0,],
-["features.startchat.impl.components_SearchMultipleUsersResultItem_en","",20581,],
-["features.startchat.impl.components_SearchSingleUserResultItem_en","",20581,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20581,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20581,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20581,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20581,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20581,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20581,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20581,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20581,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20581,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20581,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_0_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_10_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_11_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_12_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_13_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_14_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_15_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_16_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_17_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_18_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_19_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_1_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_20_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_21_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_22_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_23_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_2_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_3_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_4_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_5_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_6_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_7_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_8_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_9_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_0_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_10_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_11_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_12_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_13_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_14_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_15_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_16_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_17_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_18_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_19_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_1_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_20_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_21_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_22_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_23_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_2_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_3_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_4_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_5_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_6_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_7_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_8_en","",20581,],
-["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_9_en","",20581,],
-["features.createroom.impl.configureroom_SelectParentSpaceBottomSheet_Day_0_en","features.createroom.impl.configureroom_SelectParentSpaceBottomSheet_Night_0_en",20581,],
+["features.startchat.impl.components_SearchMultipleUsersResultItem_en","",20588,],
+["features.startchat.impl.components_SearchSingleUserResultItem_en","",20588,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20588,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20588,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20588,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20588,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20588,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20588,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20588,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20588,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_4_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_4_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20588,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_5_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20588,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_5_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_5_en",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_0_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_10_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_11_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_12_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_13_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_14_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_15_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_16_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_17_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_18_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_19_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_1_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_20_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_21_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_22_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_23_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_2_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_3_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_4_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_5_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_6_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_7_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_8_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewDark_9_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_0_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_10_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_11_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_12_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_13_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_14_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_15_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_16_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_17_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_18_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_19_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_1_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_20_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_21_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_22_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_23_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_2_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_3_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_4_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_5_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_6_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_7_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_8_en","",20588,],
+["features.securityandprivacy.impl.root_SecurityAndPrivacyViewLight_9_en","",20588,],
+["features.createroom.impl.configureroom_SelectParentSpaceBottomSheet_Day_0_en","features.createroom.impl.configureroom_SelectParentSpaceBottomSheet_Night_0_en",20588,],
["libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_SelectedIndicatorAtom_Night_0_en",0,],
["libraries.matrix.ui.components_SelectedRoomRtl_Day_0_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_0_en",0,],
["libraries.matrix.ui.components_SelectedRoomRtl_Day_1_en","libraries.matrix.ui.components_SelectedRoomRtl_Night_1_en",0,],
@@ -1306,35 +1308,37 @@ export const screenshots = [
["libraries.matrix.ui.messages.sender_SenderName_Day_6_en","libraries.matrix.ui.messages.sender_SenderName_Night_6_en",0,],
["libraries.matrix.ui.messages.sender_SenderName_Day_7_en","libraries.matrix.ui.messages.sender_SenderName_Night_7_en",0,],
["libraries.matrix.ui.messages.sender_SenderName_Day_8_en","libraries.matrix.ui.messages.sender_SenderName_Night_8_en",0,],
-["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20581,],
-["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20581,],
-["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20581,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20581,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20581,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20581,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20581,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_0_en","features.location.impl.share_ShareLocationView_Night_0_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_1_en","features.location.impl.share_ShareLocationView_Night_1_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_2_en","features.location.impl.share_ShareLocationView_Night_2_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_3_en","features.location.impl.share_ShareLocationView_Night_3_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_4_en","features.location.impl.share_ShareLocationView_Night_4_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_5_en","features.location.impl.share_ShareLocationView_Night_5_en",20581,],
-["features.location.impl.share_ShareLocationView_Day_6_en","features.location.impl.share_ShareLocationView_Night_6_en",20581,],
+["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20588,],
+["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20588,],
+["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20588,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20588,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20588,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20588,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20588,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_0_en","features.location.impl.share_ShareLocationView_Night_0_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_1_en","features.location.impl.share_ShareLocationView_Night_1_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_2_en","features.location.impl.share_ShareLocationView_Night_2_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_3_en","features.location.impl.share_ShareLocationView_Night_3_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_4_en","features.location.impl.share_ShareLocationView_Night_4_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_5_en","features.location.impl.share_ShareLocationView_Night_5_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_6_en","features.location.impl.share_ShareLocationView_Night_6_en",20588,],
+["features.location.impl.share_ShareLocationView_Day_7_en","features.location.impl.share_ShareLocationView_Night_7_en",20591,],
+["features.location.impl.share_ShareLocationView_Day_8_en","features.location.impl.share_ShareLocationView_Night_8_en",20591,],
["features.share.impl_ShareView_Day_0_en","features.share.impl_ShareView_Night_0_en",0,],
["features.share.impl_ShareView_Day_1_en","features.share.impl_ShareView_Night_1_en",0,],
["features.share.impl_ShareView_Day_2_en","features.share.impl_ShareView_Night_2_en",0,],
-["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20581,],
-["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20581,],
-["features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Day_0_en","features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Night_0_en",20581,],
-["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20581,],
+["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20588,],
+["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20588,],
+["features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Day_0_en","features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Night_0_en",20588,],
+["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20588,],
["libraries.designsystem.components_SimpleModalBottomSheet_Day_0_en","libraries.designsystem.components_SimpleModalBottomSheet_Night_0_en",0,],
["libraries.designsystem.components.dialogs_SingleSelectionDialogContent_Dialogs_en","",0,],
["libraries.designsystem.components.dialogs_SingleSelectionDialog_Day_0_en","libraries.designsystem.components.dialogs_SingleSelectionDialog_Night_0_en",0,],
@@ -1344,106 +1348,106 @@ export const screenshots = [
["libraries.designsystem.components.list_SingleSelectionListItemUnselectedWithSupportingText_Single_selection_List_item_-_no_selection,_supporting_text_List_items_en","",0,],
["libraries.designsystem.components.list_SingleSelectionListItem_Single_selection_List_item_-_no_selection_List_items_en","",0,],
["libraries.designsystem.theme.components_Sliders_Sliders_en","",0,],
-["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20581,],
+["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20588,],
["libraries.designsystem.theme.components_SnackbarWithActionAndCloseButton_Snackbar_with_action_and_close_button_Snackbars_en","",0,],
["libraries.designsystem.theme.components_SnackbarWithActionOnNewLineAndCloseButton_Snackbar_with_action_and_close_button_on_new_line_Snackbars_en","",0,],
["libraries.designsystem.theme.components_SnackbarWithActionOnNewLine_Snackbar_with_action_on_new_line_Snackbars_en","",0,],
["libraries.designsystem.theme.components_SnackbarWithAction_Snackbar_with_action_Snackbars_en","",0,],
["libraries.designsystem.theme.components_Snackbar_Snackbar_Snackbars_en","",0,],
["libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en","",0,],
-["features.home.impl.spacefilters_SpaceFiltersView_Day_0_en","features.home.impl.spacefilters_SpaceFiltersView_Night_0_en",20581,],
-["features.home.impl.spacefilters_SpaceFiltersView_Day_1_en","features.home.impl.spacefilters_SpaceFiltersView_Night_1_en",20581,],
-["libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderRootView_Night_0_en",20581,],
-["libraries.matrix.ui.components_SpaceHeaderView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderView_Night_0_en",20581,],
-["libraries.matrix.ui.components_SpaceInfoRow_Day_0_en","libraries.matrix.ui.components_SpaceInfoRow_Night_0_en",20581,],
+["features.home.impl.spacefilters_SpaceFiltersView_Day_0_en","features.home.impl.spacefilters_SpaceFiltersView_Night_0_en",20588,],
+["features.home.impl.spacefilters_SpaceFiltersView_Day_1_en","features.home.impl.spacefilters_SpaceFiltersView_Night_1_en",20588,],
+["libraries.matrix.ui.components_SpaceHeaderRootView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderRootView_Night_0_en",20588,],
+["libraries.matrix.ui.components_SpaceHeaderView_Day_0_en","libraries.matrix.ui.components_SpaceHeaderView_Night_0_en",20588,],
+["libraries.matrix.ui.components_SpaceInfoRow_Day_0_en","libraries.matrix.ui.components_SpaceInfoRow_Night_0_en",20588,],
["libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Day_0_en","libraries.matrix.ui.components_SpaceMembersViewNoHeroes_Night_0_en",0,],
["libraries.matrix.ui.components_SpaceMembersView_Day_0_en","libraries.matrix.ui.components_SpaceMembersView_Night_0_en",0,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_0_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_0_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_1_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_1_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_2_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_2_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_3_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_3_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_4_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_4_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_5_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_5_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_6_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_6_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_7_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_7_en",20581,],
-["libraries.matrix.ui.components_SpaceRoomItemView_Day_8_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_8_en",20581,],
-["features.space.impl.settings_SpaceSettingsView_Day_0_en","features.space.impl.settings_SpaceSettingsView_Night_0_en",20581,],
-["features.space.impl.settings_SpaceSettingsView_Day_1_en","features.space.impl.settings_SpaceSettingsView_Night_1_en",20581,],
-["features.space.impl.settings_SpaceSettingsView_Day_2_en","features.space.impl.settings_SpaceSettingsView_Night_2_en",20581,],
-["features.space.impl.settings_SpaceSettingsView_Day_3_en","features.space.impl.settings_SpaceSettingsView_Night_3_en",20581,],
-["features.space.impl.root_SpaceView_Day_0_en","features.space.impl.root_SpaceView_Night_0_en",20581,],
-["features.space.impl.root_SpaceView_Day_1_en","features.space.impl.root_SpaceView_Night_1_en",20581,],
-["features.space.impl.root_SpaceView_Day_2_en","features.space.impl.root_SpaceView_Night_2_en",20581,],
-["features.space.impl.root_SpaceView_Day_3_en","features.space.impl.root_SpaceView_Night_3_en",20581,],
-["features.space.impl.root_SpaceView_Day_4_en","features.space.impl.root_SpaceView_Night_4_en",20581,],
-["features.space.impl.root_SpaceView_Day_5_en","features.space.impl.root_SpaceView_Night_5_en",20581,],
-["features.space.impl.root_SpaceView_Day_6_en","features.space.impl.root_SpaceView_Night_6_en",20581,],
-["features.space.impl.root_SpaceView_Day_7_en","features.space.impl.root_SpaceView_Night_7_en",20581,],
-["features.space.impl.root_SpaceView_Day_8_en","features.space.impl.root_SpaceView_Night_8_en",20581,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_0_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_0_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_1_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_1_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_2_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_2_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_3_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_3_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_4_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_4_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_5_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_5_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_6_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_6_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_7_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_7_en",20588,],
+["libraries.matrix.ui.components_SpaceRoomItemView_Day_8_en","libraries.matrix.ui.components_SpaceRoomItemView_Night_8_en",20588,],
+["features.space.impl.settings_SpaceSettingsView_Day_0_en","features.space.impl.settings_SpaceSettingsView_Night_0_en",20588,],
+["features.space.impl.settings_SpaceSettingsView_Day_1_en","features.space.impl.settings_SpaceSettingsView_Night_1_en",20588,],
+["features.space.impl.settings_SpaceSettingsView_Day_2_en","features.space.impl.settings_SpaceSettingsView_Night_2_en",20588,],
+["features.space.impl.settings_SpaceSettingsView_Day_3_en","features.space.impl.settings_SpaceSettingsView_Night_3_en",20588,],
+["features.space.impl.root_SpaceView_Day_0_en","features.space.impl.root_SpaceView_Night_0_en",20588,],
+["features.space.impl.root_SpaceView_Day_1_en","features.space.impl.root_SpaceView_Night_1_en",20588,],
+["features.space.impl.root_SpaceView_Day_2_en","features.space.impl.root_SpaceView_Night_2_en",20588,],
+["features.space.impl.root_SpaceView_Day_3_en","features.space.impl.root_SpaceView_Night_3_en",20588,],
+["features.space.impl.root_SpaceView_Day_4_en","features.space.impl.root_SpaceView_Night_4_en",20588,],
+["features.space.impl.root_SpaceView_Day_5_en","features.space.impl.root_SpaceView_Night_5_en",20588,],
+["features.space.impl.root_SpaceView_Day_6_en","features.space.impl.root_SpaceView_Night_6_en",20588,],
+["features.space.impl.root_SpaceView_Day_7_en","features.space.impl.root_SpaceView_Night_7_en",20588,],
+["features.space.impl.root_SpaceView_Day_8_en","features.space.impl.root_SpaceView_Night_8_en",20588,],
["libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en","",0,],
["libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en","",0,],
["libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en","",0,],
-["features.startchat.impl.root_StartChatView_Day_0_en","features.startchat.impl.root_StartChatView_Night_0_en",20581,],
-["features.startchat.impl.root_StartChatView_Day_1_en","features.startchat.impl.root_StartChatView_Night_1_en",20581,],
-["features.startchat.impl.root_StartChatView_Day_2_en","features.startchat.impl.root_StartChatView_Night_2_en",20581,],
-["features.startchat.impl.root_StartChatView_Day_3_en","features.startchat.impl.root_StartChatView_Night_3_en",20581,],
-["features.startchat.impl.root_StartChatView_Day_4_en","features.startchat.impl.root_StartChatView_Night_4_en",20581,],
-["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20581,],
+["features.startchat.impl.root_StartChatView_Day_0_en","features.startchat.impl.root_StartChatView_Night_0_en",20588,],
+["features.startchat.impl.root_StartChatView_Day_1_en","features.startchat.impl.root_StartChatView_Night_1_en",20588,],
+["features.startchat.impl.root_StartChatView_Day_2_en","features.startchat.impl.root_StartChatView_Night_2_en",20588,],
+["features.startchat.impl.root_StartChatView_Day_3_en","features.startchat.impl.root_StartChatView_Night_3_en",20588,],
+["features.startchat.impl.root_StartChatView_Day_4_en","features.startchat.impl.root_StartChatView_Night_4_en",20588,],
+["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20588,],
["features.location.api_StaticMapView_Day_0_en","features.location.api_StaticMapView_Night_0_en",0,],
-["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20581,],
+["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20588,],
["libraries.designsystem.atomic.pages_SunsetPage_Day_0_en","libraries.designsystem.atomic.pages_SunsetPage_Night_0_en",0,],
["libraries.designsystem.components.button_SuperButton_Day_0_en","libraries.designsystem.components.button_SuperButton_Night_0_en",0,],
["libraries.designsystem.theme.components_Surface_en","",0,],
["libraries.designsystem.theme.components_Switch_Toggles_en","",0,],
-["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20581,],
+["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20588,],
["libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en","",0,],
["libraries.designsystem.theme.components_TextButtonLargeLowPadding_Buttons_en","",0,],
["libraries.designsystem.theme.components_TextButtonLarge_Buttons_en","",0,],
["libraries.designsystem.theme.components_TextButtonMediumLowPadding_Buttons_en","",0,],
["libraries.designsystem.theme.components_TextButtonMedium_Buttons_en","",0,],
["libraries.designsystem.theme.components_TextButtonSmall_Buttons_en","",0,],
-["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20581,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20581,],
-["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20581,],
-["libraries.textcomposer_TextComposerScaledDensityWithReply_en","",20581,],
-["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20581,],
-["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20581,],
+["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20588,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20588,],
+["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20588,],
+["libraries.textcomposer_TextComposerScaledDensityWithReply_en","",20588,],
+["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20588,],
+["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20588,],
["libraries.textcomposer_TextComposerVoice_Day_0_en","libraries.textcomposer_TextComposerVoice_Night_0_en",0,],
["libraries.designsystem.theme.components_TextDark_Text_en","",0,],
-["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20581,],
-["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20581,],
+["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20588,],
+["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20588,],
["libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en","",0,],
["libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en","",0,],
["libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en","",0,],
@@ -1456,17 +1460,17 @@ export const screenshots = [
["libraries.textcomposer.components_TextFormatting_Day_0_en","libraries.textcomposer.components_TextFormatting_Night_0_en",0,],
["libraries.designsystem.theme.components_TextLight_Text_en","",0,],
["features.messages.impl.threads.list_ThreadListItemRow_Day_0_en","features.messages.impl.threads.list_ThreadListItemRow_Night_0_en",0,],
-["features.messages.impl.timeline.components_ThreadSummaryView_Day_0_en","features.messages.impl.timeline.components_ThreadSummaryView_Night_0_en",20581,],
-["features.messages.impl.topbars_ThreadTopBar_Day_0_en","features.messages.impl.topbars_ThreadTopBar_Night_0_en",20581,],
+["features.messages.impl.timeline.components_ThreadSummaryView_Day_0_en","features.messages.impl.timeline.components_ThreadSummaryView_Night_0_en",20588,],
+["features.messages.impl.topbars_ThreadTopBar_Day_0_en","features.messages.impl.topbars_ThreadTopBar_Night_0_en",20588,],
["features.messages.impl.threads.list_ThreadsListView_Day_0_en","features.messages.impl.threads.list_ThreadsListView_Night_0_en",0,],
-["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20581,],
-["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20581,],
-["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20581,],
+["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20588,],
+["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20588,],
+["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20588,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_0_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_1_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_1_en",0,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_2_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_2_en",0,],
-["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20581,],
-["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20581,],
+["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20588,],
+["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20588,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_5_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_5_en",0,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_6_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_6_en",0,],
["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_7_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_7_en",0,],
@@ -1476,18 +1480,18 @@ export const screenshots = [
["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_2_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_3_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemAudioView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemAudioView_Night_4_en",0,],
-["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20588,],
["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_0_en",0,],
["features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Day_1_en","features.messages.impl.timeline.components.virtual_TimelineItemDaySeparatorView_Night_1_en",0,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20581,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowForDirectRoom_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en","",0,],
@@ -1495,18 +1499,18 @@ export const screenshots = [
["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en",0,],
@@ -1515,44 +1519,44 @@ export const screenshots = [
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en",0,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithThreadSummary_Night_0_en",20588,],
["features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en",0,],
-["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20581,],
+["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20588,],
["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_1_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_2_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_3_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemFileView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemFileView_Night_4_en",0,],
-["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20588,],
["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_1_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_2_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemImageView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemImageView_Night_3_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemInformativeView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemInformativeView_Night_0_en",0,],
-["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20581,],
+["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20588,],
["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_0_en",0,],
-["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_1_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_2_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_3_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_4_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20581,],
+["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_1_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_2_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_3_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemLocationView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemLocationView_Night_4_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20588,],
["features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewFew_Night_0_en",0,],
-["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20581,],
-["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20581,],
+["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20588,],
+["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20588,],
["features.messages.impl.timeline.components_TimelineItemReactionsView_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsView_Night_0_en",0,],
-["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20581,],
+["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20588,],
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_0_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_0_en",0,],
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_1_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_1_en",0,],
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_2_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_2_en",0,],
@@ -1561,8 +1565,8 @@ export const screenshots = [
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_5_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_5_en",0,],
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_6_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_6_en",0,],
["features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Day_7_en","features.messages.impl.timeline.components.receipt_TimelineItemReadReceiptView_Night_7_en",0,],
-["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20581,],
-["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20581,],
+["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20588,],
+["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20588,],
["features.messages.impl.timeline.components_TimelineItemStateEventRow_Day_0_en","features.messages.impl.timeline.components_TimelineItemStateEventRow_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemStateView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStateView_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemStickerView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemStickerView_Night_0_en",0,],
@@ -1577,8 +1581,8 @@ export const screenshots = [
["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_3_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_4_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemTextView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemTextView_Night_5_en",0,],
-["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20581,],
-["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20581,],
+["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20588,],
+["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20588,],
["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_1_en",0,],
["features.messages.impl.timeline.components.event_TimelineItemVideoView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemVideoView_Night_2_en",0,],
@@ -1601,84 +1605,84 @@ export const screenshots = [
["features.messages.impl.timeline.components.event_TimelineItemVoiceView_Day_9_en","features.messages.impl.timeline.components.event_TimelineItemVoiceView_Night_9_en",0,],
["features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineLoadingMoreIndicator_Night_0_en",0,],
["features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Day_0_en","features.messages.impl.timeline.components.event_TimelineVideoWithCaptionRow_Night_0_en",0,],
-["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_10_en","features.messages.impl.timeline_TimelineView_Night_10_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20581,],
-["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20581,],
+["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_10_en","features.messages.impl.timeline_TimelineView_Night_10_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20588,],
+["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20588,],
["features.messages.impl.timeline_TimelineView_Day_2_en","features.messages.impl.timeline_TimelineView_Night_2_en",0,],
["features.messages.impl.timeline_TimelineView_Day_3_en","features.messages.impl.timeline_TimelineView_Night_3_en",0,],
-["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20581,],
+["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20588,],
["features.messages.impl.timeline_TimelineView_Day_5_en","features.messages.impl.timeline_TimelineView_Night_5_en",0,],
-["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20581,],
+["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20588,],
["features.messages.impl.timeline_TimelineView_Day_7_en","features.messages.impl.timeline_TimelineView_Night_7_en",0,],
["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",0,],
["features.messages.impl.timeline_TimelineView_Day_9_en","features.messages.impl.timeline_TimelineView_Night_9_en",0,],
["libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en","",0,],
["libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en","",0,],
["libraries.designsystem.theme.components_TopAppBar_App_Bars_en","",0,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20581,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20581,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20588,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20588,],
["features.messages.impl.typing_TypingNotificationView_Day_0_en","features.messages.impl.typing_TypingNotificationView_Night_0_en",0,],
-["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20581,],
-["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20581,],
-["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20581,],
-["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20581,],
-["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20581,],
-["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20581,],
+["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20588,],
+["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20588,],
+["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20588,],
+["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20588,],
+["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20588,],
+["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20588,],
["features.messages.impl.typing_TypingNotificationView_Day_7_en","features.messages.impl.typing_TypingNotificationView_Night_7_en",0,],
["features.messages.impl.typing_TypingNotificationView_Day_8_en","features.messages.impl.typing_TypingNotificationView_Night_8_en",0,],
["libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Day_0_en","libraries.designsystem.atomic.atoms_UnreadIndicatorAtom_Night_0_en",0,],
-["libraries.matrix.ui.components_UnresolvedUserRow_en","",20581,],
+["libraries.matrix.ui.components_UnresolvedUserRow_en","",20588,],
["libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en","libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en",0,],
-["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20581,],
-["features.startchat.impl.components_UserListView_Day_0_en","features.startchat.impl.components_UserListView_Night_0_en",20581,],
-["features.startchat.impl.components_UserListView_Day_1_en","features.startchat.impl.components_UserListView_Night_1_en",20581,],
-["features.startchat.impl.components_UserListView_Day_2_en","features.startchat.impl.components_UserListView_Night_2_en",20581,],
+["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20588,],
+["features.startchat.impl.components_UserListView_Day_0_en","features.startchat.impl.components_UserListView_Night_0_en",20588,],
+["features.startchat.impl.components_UserListView_Day_1_en","features.startchat.impl.components_UserListView_Night_1_en",20588,],
+["features.startchat.impl.components_UserListView_Day_2_en","features.startchat.impl.components_UserListView_Night_2_en",20588,],
["features.startchat.impl.components_UserListView_Day_3_en","features.startchat.impl.components_UserListView_Night_3_en",0,],
["features.startchat.impl.components_UserListView_Day_4_en","features.startchat.impl.components_UserListView_Night_4_en",0,],
["features.startchat.impl.components_UserListView_Day_5_en","features.startchat.impl.components_UserListView_Night_5_en",0,],
["features.startchat.impl.components_UserListView_Day_6_en","features.startchat.impl.components_UserListView_Night_6_en",0,],
-["features.startchat.impl.components_UserListView_Day_7_en","features.startchat.impl.components_UserListView_Night_7_en",20581,],
+["features.startchat.impl.components_UserListView_Day_7_en","features.startchat.impl.components_UserListView_Night_7_en",20588,],
["features.startchat.impl.components_UserListView_Day_8_en","features.startchat.impl.components_UserListView_Night_8_en",0,],
-["features.startchat.impl.components_UserListView_Day_9_en","features.startchat.impl.components_UserListView_Night_9_en",20581,],
+["features.startchat.impl.components_UserListView_Day_9_en","features.startchat.impl.components_UserListView_Night_9_en",20588,],
["features.preferences.impl.user_UserPreferences_Day_0_en","features.preferences.impl.user_UserPreferences_Night_0_en",0,],
["features.preferences.impl.user_UserPreferences_Day_1_en","features.preferences.impl.user_UserPreferences_Night_1_en",0,],
-["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20581,],
-["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20581,],
-["features.userprofile.shared_UserProfileMainActionsSection_Day_0_en","features.userprofile.shared_UserProfileMainActionsSection_Night_0_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20581,],
-["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20581,],
+["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20588,],
+["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20588,],
+["features.userprofile.shared_UserProfileMainActionsSection_Day_0_en","features.userprofile.shared_UserProfileMainActionsSection_Night_0_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20588,],
+["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20588,],
["features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,],
["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,],
["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,],
["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en",0,],
-["features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en","features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en",20581,],
-["features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en","features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en",20581,],
+["features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Day_0_en","features.messages.impl.attachments.preview_VideoQualitySelectorDialog_Night_0_en",20588,],
+["features.preferences.impl.advanced_VideoQualitySelectorDialog_Day_0_en","features.preferences.impl.advanced_VideoQualitySelectorDialog_Night_0_en",20588,],
["features.viewfolder.impl.file_ViewFileView_Day_0_en","features.viewfolder.impl.file_ViewFileView_Night_0_en",0,],
["features.viewfolder.impl.file_ViewFileView_Day_1_en","features.viewfolder.impl.file_ViewFileView_Night_1_en",0,],
["features.viewfolder.impl.file_ViewFileView_Day_2_en","features.viewfolder.impl.file_ViewFileView_Night_2_en",0,],
-["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20581,],
+["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20588,],
["features.viewfolder.impl.file_ViewFileView_Day_4_en","features.viewfolder.impl.file_ViewFileView_Night_4_en",0,],
["features.viewfolder.impl.file_ViewFileView_Day_5_en","features.viewfolder.impl.file_ViewFileView_Night_5_en",0,],
["features.viewfolder.impl.folder_ViewFolderView_Day_0_en","features.viewfolder.impl.folder_ViewFolderView_Night_0_en",0,],
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 8c7b608465..db03a32f18 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -21,6 +21,8 @@ dependencyResolutionManagement {
url = uri("https://www.jitpack.io")
content {
includeModule("com.github.matrix-org", "matrix-analytics-events")
+ // Required transitively by androidx.media3:media3-exoplayer-midi for MIDI playback.
+ includeModule("com.github.philburk", "jsyn")
}
}
google()
diff --git a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
index a473e6bd22..232116b385 100644
--- a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
+++ b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
@@ -23,9 +23,11 @@ import androidx.compose.ui.test.hasContentDescription
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.isDialog
+import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import io.element.android.libraries.ui.strings.CommonStrings
+import org.junit.rules.TestRule
val trueMatcher = SemanticsMatcher("true matcher") { true }
@@ -48,6 +50,14 @@ fun AndroidComposeUiTest.pressBack() {
onNode(hasContentDescription(text)).performClick()
}
+/**
+ * Press the back button in the app bar.
+ */
+fun AndroidComposeTestRule.pressBack() {
+ val text = activity.getString(CommonStrings.action_back)
+ onNode(hasContentDescription(text)).performClick()
+}
+
/**
* Press the back key.
*/
@@ -55,6 +65,13 @@ fun AndroidComposeUiTest.pressBackKey() {
activity!!.onBackPressedDispatcher.onBackPressed()
}
+/**
+ * Press the back key.
+ */
+fun AndroidComposeTestRule.pressBackKey() {
+ activity.onBackPressedDispatcher.onBackPressed()
+}
+
fun SemanticsNodeInteractionsProvider.pressTag(tag: String) {
onNode(hasTestTag(tag)).performClick()
}
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_3_en.png
index b5e7419267..b45afb67bf 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:48fa7b1415694f0a7ebb3de458edee8792f5643f681cc25627560f2e3d8ba491
-size 16331
+oid sha256:49731638f35e9c7583ece7122e3690728f3d4183a65e2e49cd270d02fb93ac70
+size 15950
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_3_en.png
index 1c8ce2991d..14fd900451 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ebf559265b2cd4ebba7c5439b759365ed8d31532988bda5d8c76bb7c8d76dd68
-size 14892
+oid sha256:11a77776662896532ef2999e3b90aa93b3459bf9b7a5f461c06ccb3743612aab
+size 14738
diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Day_1_en.png
new file mode 100644
index 0000000000..d2ab2dcb1e
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Day_1_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48cafd6b98791b64e4cc6a16c602f17e3a886659698c3c93bc4acaf875337e0f
+size 31102
diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Night_1_en.png
new file mode 100644
index 0000000000..c4593656d1
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.qrcode_ShowQrCodeView_Night_1_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3f6f8d1282ae47a5240aec2b2c63a137b8e3e25ec8b746cf2d82d0fa7e0c0a34
+size 30287
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en.png
index afec980e10..e89697a8cc 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3624fe8448ae4af2481e2023a978ffab2d69f2784b7cef41e5ae2e2dbe8fdbd5
-size 17804
+oid sha256:5529e89e00208e38522f5206f5b8d304bd472b27071cab4e0d3c2daf3cb64db0
+size 49741
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en.png
index 8f7f14e64a..37037907c8 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6bd02d39619efbcaa6d96f1e75a0d14a572c43e60bad0c3f84d6a5a48b6fbda1
-size 17395
+oid sha256:fa29aaa82f21912dd5147ffb6fdc457fd5880e8be4abde4f0177d0ab1a412fe2
+size 48245
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png
index 43a49f7320..25302db21d 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:34ce2f0451fb1681648c91771316256e67b1f295f4deb97f6115ae593d82f2ef
-size 83472
+oid sha256:d7c187e173ae6d02d6c95c03bcc24cce91b0922e6aa5a08677732748aab0fc30
+size 85320
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png
index bb68ee4d65..739ff5f268 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eeb2355a693a7ac522028833fea4f0506e1b455e4aee888ed314c2700a9a87af
-size 45454
+oid sha256:8979ec6209ad6e0deb6946e00ce227f3db41a565218afe31b72b889bee224daa
+size 46268
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png
index 77bc91df06..7609f5e725 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b45d35b68d232fc5cbaf3b01156127a77618bcf2197375ad42f61bc7ad8ec400
-size 44161
+oid sha256:16200632461dcbbf0f6211b7064b61a1e2fa04cd34e14946beb12b9e9f4d7b7f
+size 43901
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png
index 9f23841e1d..ef1954720c 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6a7efaa997737bfc6db898987b78077ec3c8039a6d0cce84d770bcabcbdc815e
-size 43161
+oid sha256:2279893a284e620cf487f6370982a14278fd57bb278e53932a5fd7c5cab8e95e
+size 43033
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png
index 308c764795..a0cee002e6 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a8de9a9297383ff1ec552304a49040c44236654dd16ba9ae5f54fddf3e14c617
-size 44764
+oid sha256:5d4da60a94c56b13b65efb797825c54c1e107fe4440f56b1fcac5d47779cbf64
+size 44502
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png
index 13403ea92d..eb330780d8 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ff4c856028887c1390df7b313462e37e0723ff98b9f92aa769b2fc9133ab6ec5
-size 44673
+oid sha256:ee2899f7870b09f287b45b327d5d0462b423ba65afa1087dec1be862507378de
+size 44411
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png
index 59ac3c53af..e09c2dfd95 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:162a9cd8b10b8ec7c33dc926c63d2d04986ca0e29a6cd036771ffc137176e28c
-size 45079
+oid sha256:78ba2ddfdfc47febc0503daa0985a5fdf04ef15bdc391b4a88c3c630b1946b35
+size 46004
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png
index 9d934ba726..cc49f40494 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fcd3e86c18e34e96a2b535340a27a8cb248d48697ce75d1c7c62cde27b3e2ccb
-size 45577
+oid sha256:4a832b0e395498b15e176529ea55c50ed129f6d2330fbec4ff1f8e3dcaeab93f
+size 46543
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png
index cfd42f8af2..e8c0ec1046 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d5a20887fa9a6dd7c96f328f24608e1fcea0326b60cf8a7b43e2387fa19595f5
-size 44932
+oid sha256:d8e738bd873339d195b4190f65a18016f2f0eb1bbc9f513a2b25467cb5f5828c
+size 44745
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png
index b45fd6c6f1..5098ecb3a2 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8087a634dd7bf3893697d8ab599f9694169e878b4484b0d8e9821307a8423d63
-size 44243
+oid sha256:892dd301ab08c6a302e8286d3f86878178130a22baf550402f2102ba98f0d21c
+size 43982
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png
index ddcd78552d..899ef403a4 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f7b9375965be172b7a1a6b00be38c66dc5f73d7d76f6b07fd1cb8defbadae840
-size 41554
+oid sha256:809c597757d6f1385803c1378a494f24309b533168df59c7e06852c1ce34b8d3
+size 41408
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png
index 669af01562..0625fcfe05 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7890cc2fc8e722bfdee5e1c0cdda335c386a2e70a918b710a44a788457dd8497
-size 41507
+oid sha256:3756793e5d92f0fac18e96a49e69ac7ed6901c1195d3e6526088027405e82dbf
+size 41361
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png
index 6b89622e9d..346c9cf052 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e7b4d5f81f605a0858994e50d72fbd17d2f82e0b2e4673ff9baf6e25a103ef55
-size 40392
+oid sha256:099f571485ce8476d4b8a2313610b6c1d03a7d7420132e06d6258b483d640a08
+size 39130
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png
index b0a44326fd..a58193c18f 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fef854b4c908e206ece79491c655fbf0fd5b51883f3d77045c579664331b9058
-size 45195
+oid sha256:66fd2cfb9f343c77b8db0a4fbc0d7a1571a4dfe1d70c78823a4ba03bfbc846eb
+size 44934
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png
index 637549dfc7..37bb88b0fb 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dde778a13f36958fefba950fe0d3470b7277d22fe4eac189c77b0838b3728ef3
-size 44940
+oid sha256:465ecd337f705262c8f533b3b01daa6a548c6ee88752be405609660ddfaf56b1
+size 44676
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png
index cafc853f58..6356cec349 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d5870cd12f6de78ecf72a9dc8e3716e0e3476ecf2f29647fc1eca900f5e030f9
-size 44652
+oid sha256:3cca233c171b6c6709a94163ca1f0024a42ff66200383fdbcaf57b321251522e
+size 44390
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png
index 12efcf7526..3846aec585 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1281394671737e78232cb7d9785b57b8ef2ca50c125f0c0854d101d27efaa939
-size 37910
+oid sha256:9e5e8b39197d115c6190b89fd54033b3319b36dfbf5c6f152dd84e6c79147bbb
+size 37877
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png
index 3d6f26c63c..08ca4ad1e6 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ec2b5711ea9ffacc6aad4f7b16efdcc78603e9eaa9d33abfaa0d867db5aead67
-size 42355
+oid sha256:4899d2ffcc6da1f414f7fb223440b8463250dc5ac07558cfaee2947f95c93362
+size 42236
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png
index 90dd2364d3..062c440463 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4adfa037ff619098067d03f252ba0af1c3c89553ea0c81dcda41f7f0b655baad
-size 42450
+oid sha256:577381a33e7f0a88ceebb7f2be6528c3e99417cf1351b74c134aab948664cc64
+size 42149
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png
index 31daf341c2..1ff34bd6e4 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:105399c3ca12de9e911ccf7b4aaebe87bffeba45b1740d067b5b8e67c5647952
-size 41196
+oid sha256:b2bc2699d8dcf770103726c571a6966eacf173cbbad05c4fa6188815aa9ae231
+size 41052
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png
index 3309d53220..c1decbd918 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5da1fef365731946e08a38250187fe6f3108aff466d7771863c0ba52fb5b7728
-size 42254
+oid sha256:9cba49398954a404def6b37f3cde057cb88d6f59249b943f1689403ccd902326
+size 42024
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png
index fc66173002..379f61db22 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0d5b8a9f7bc2e7f654b018b2f66b5971c21326dd6b64371f330299649daea4c0
-size 45755
+oid sha256:405a29c158295616560152c5790f189a8019bd635a53a69b581c8aa595e6e9ea
+size 45494
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png
index d4ff65b44f..d0ffc70f42 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2dd6b524bd146b4e66621fea59515e6784055f52f6d1d08c393b5be208e5f29a
-size 44657
+oid sha256:3f948e9cc2eb7bc73b0441fbdea72d582a042895b3404c8302b7e182c3481fae
+size 44425
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png
index 4264857e69..2894ac3c71 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:73a27b8df68182a3d0ae4872a14688ae10e5651ec85490c1e46186acc2c60028
-size 44671
+oid sha256:b4702b18ad5d203050140e6e1a18553344f52eb5482fcaf6ab497698b9ec59fd
+size 44432
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png
index f0751a53cd..afabfcecf5 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9bedc6d0b55d94586de728cb4039303c9ecbd8b3a090c401331ae1bf6e0ba426
-size 46396
+oid sha256:4189b58dd1263a81566ea86d9881c02f053ecb2a91ba9442553fbe0f230e6860
+size 47105
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png
index f5f4d4cf3c..9f07ad1624 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d47a7207e83fe770d4925b91b4bb0eee6cb2c494c46b1f3d5d6d0720464392d6
-size 44992
+oid sha256:3fced9019f81e5804ea57c0b1a2750868626ad35b9a7227009a796d289595556
+size 44659
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png
index 54890aa7bd..74c4a9eef1 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:605ea373238bbaa4d3820adf13bf3896d9a5c5b6ceb6c022a7f3b8ae817f921f
-size 43927
+oid sha256:be9bb839a503d169d67d4332a133ce2b3d76b3ff4c52c063436521f8a74c973e
+size 43894
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png
index 385ca39bc9..bd85882fde 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c4dab72328925eb45cd529913972670587ea4257d2ff7affd708295d68e783d7
-size 45579
+oid sha256:82c2781c37b7cefa198f2061a2c8e900b27bd57653db88733be5ff55dfaf5eee
+size 45251
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png
index 064cfc5b27..cac488f3b8 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:76cc029a07c0fb568d9e15864be667478cd9927095f66ec2f590a1466c58a291
-size 45497
+oid sha256:36feab599a6a2d4269b68f42149a6f82832ac0f6f0e9f01fb49adc21b3a58d93
+size 45172
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png
index 3bcd7d1de4..3e7cfcf672 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:42a8b9b5abe3a5a3fe61e27924ca75ea7925e857005d5de3cd3ceb81500f73c2
-size 45981
+oid sha256:04bedd62b5ceba766197dd18da9efb0ff086c2c01c9c19446f8a3c42ed43ad87
+size 46813
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png
index 5dc96aaa2c..27ec9f7a25 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:19cc2df1da3b685668afe309bd305d5ac8447d0997c7ad902685d44daa26239f
-size 46556
+oid sha256:828b065aaeeccd826e98e9601069819d7a75ffabab9820a834cacb627416edc0
+size 47409
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png
index 2b4718d729..f96e1aec74 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5625bb01c24d969adeecdb536e145ba549ef1c10d99e16f7a68c3bd577fbefbc
-size 45804
+oid sha256:4740bcd118f8583334dd1c03b5011e33c5384ea6810d1c83711f538cf9f1d165
+size 45521
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png
index 4f40cab65a..4d88149a93 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3bdd0b00fddd9fc62b5c9c97b5ff766591c0a1822730bd249059ed02508a65ee
-size 45353
+oid sha256:7fab53a63021ddae8384aed8eaf0a3803d06e8c80645ecc13f79a7f5cced6e68
+size 45024
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png
index 74405c8661..fa7e99aef2 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fef392cb892bf6dc746ed59f1279bf9558536ef439715d1834bd88260739949d
-size 42441
+oid sha256:89a2c619412ad9ca43c79cb76ebe72b827da71743dda7044a9b44de2990f160b
+size 42388
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png
index dd6c6a993d..9b27b61083 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c9b7c26c5f0638dbe7731e239fc16bb2ba4330986af7218688a3a12ede2bfd9d
-size 42313
+oid sha256:56ceed440bb51039ffe7e4419477a57a235eed153a0188838e6265c241896a82
+size 42262
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png
index 02be5d5da0..0542085126 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4dd437c614c904bf210e5b51fe017f26cf849e7572b09966e834ac6fd429d347
-size 41380
+oid sha256:3b03e9da2d73cc0e3d0485b73470e576d7ebd4b8b5f375f2a478f1c1524772fa
+size 39948
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png
index 7c037817b4..a320657a26 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:380fbdd2caa485b9fe84a331e64139ccb23998ce1d95158c6345364daa3810b8
-size 46048
+oid sha256:a686a2596b9b85b17c6882aa986b12e13a83a47ed217c4eb6de6aa2cb3ec2d50
+size 45717
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png
index 7b74e5750c..920b670806 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c4610f8488c8c8edf05e2cd3e09470660b2c4db14650907c28367d2b38bce852
-size 45792
+oid sha256:d6bda369c1754e2c07216f4bff0285e017f87b550fe0dc6bb5f127845d52c9b6
+size 45462
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png
index a2e1108c0c..aeaa04b269 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:efb795d2808d7ae5e38eda42105101dce377154c794844f752e4cb80dcabd681
-size 45462
+oid sha256:285045769d912e98df0371c829affd925642c8a20cd0b6b09dfa92ab5f143538
+size 45131
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png
index 2d38f9d8b1..e7fe0e7cef 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7dca0800e7e68e65bd27814b4c86123da40385d6e85153e003ba58ca7689b5f8
-size 38742
+oid sha256:463548e170b48509d68c0993acb000748b19921e5d4be784b07ce83252c8a5bb
+size 38613
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png
index 1fc42278e2..76eb564d8c 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:351183a1b0fb44dc42c790a625ee6aa5740b27fa95b138252b72bf67268f5a16
-size 43015
+oid sha256:c1d19c2b8c6b3c80b68214da2bb9f54a6897a279aa70e2d8cab88c291332cece
+size 42980
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png
index da0c4a9dde..40ab9e310a 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:31f92cc4d97c7129bc37da51e6f0a10612d4f61803762b1709c5d72f1cda86f1
-size 43337
+oid sha256:2057479cad5d3b9a89ec835ee1d06705c6c459f7810c2875bea26b975944bcf7
+size 42960
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png
index e6cae695cf..e549a92821 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8d6a5102a9dd44a6a15dc6b40ec422a115a302506a2b3808a1df84ca34cb323e
-size 41972
+oid sha256:073addf26e8d0b638bce93db99d1fe9740abd89613a1eb8ef5bb4324e489d6fa
+size 41924
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png
index a1947b9c2c..29a8b0b4b1 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1538aa1f1313df1f6cbbc0ed7ef92d264c85b7de0080492a7cba19bbd235131d
-size 43100
+oid sha256:56d72cab4a9d7af568cc497b68d6ca9055874544cfd462c93da37fe368801fdf
+size 42984
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png
index ae9d249cb2..91cf700f52 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4e15030fc182998a37493228d91c888d6b499b6a684b1a4e15d402c9156a40ba
-size 46678
+oid sha256:9141f5fa4e054dc5cf70126309830bc38d564d467a215eaa1130f3601b15e761
+size 46350
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png
index 214dee1111..fe0b629925 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b773cce165a6410140afbf0daf3ec526233b97ea707811a3794e591704237398
-size 45536
+oid sha256:a062b8cbe4dfbd94a5b068b1f7c4654ed8b697a7e98ae4c2bcb6c3e5bf473b49
+size 45289
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png
index 41946442cb..26d59539db 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f28bec4fb21e827f3467bc08ab0f33e917cf76360903b6e7df6282a7589cae7e
-size 45545
+oid sha256:46aafd39e1a93f8d357def4c5f3f024ad0ee13931ebdb9f72475dbc911fd7532
+size 45266
diff --git a/tools/localazy/config.json b/tools/localazy/config.json
index 03ada90c4b..cb9c2ecb0d 100644
--- a/tools/localazy/config.json
+++ b/tools/localazy/config.json
@@ -221,6 +221,7 @@
"screen_notification_settings_mentions_only_disclaimer",
"screen_room_change_.*",
"screen_room_roles_.*",
+ "screen_roomlist_mark_as_.*",
"screen\\.edit_room_address\\..*",
"screen\\.security_and_privacy\\..*"
]
@@ -331,6 +332,7 @@
"screen_blocked_users_.*",
"full_screen_intent_banner_.*",
"troubleshoot_notifications_entry_point_.*",
+ "theme\\..*",
"screen\\.labs\\..*"
]
},