diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
index 43ef188415..bb6bbe87d1 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/quality.yml
@@ -270,7 +270,6 @@ jobs:
- name: Run shellcheck
uses: ludeeus/action-shellcheck@2.0.0
with:
- scandir: ./tools
severity: warning
upload_reports:
diff --git a/.github/workflows/scripts/maestro/local-recording.sh b/.github/workflows/scripts/maestro/local-recording.sh
index 4a800dc5e7..6534d2feca 100755
--- a/.github/workflows/scripts/maestro/local-recording.sh
+++ b/.github/workflows/scripts/maestro/local-recording.sh
@@ -12,8 +12,8 @@ mkdir -p /data/local/tmp/recordings;
FILENAME=/data/local/tmp/recordings/testRecording$COUNT.mp4
while true
do
- ((COUNT++))
+ COUNT=$((COUNT+1))
FILENAME=/data/local/tmp/recordings/testRecording$COUNT.mp4
- echo "\nRecording video file #$COUNT"
+ printf "\nRecording video file #%d\n" $COUNT
screenrecord --bugreport --bit-rate=16m --size 720x1280 $FILENAME
done
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 1e16934f61..03fcfb7bea 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
index 1d248fbfcc..4b0b22eb03 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,45 @@
+Changes in Element X v25.06.3
+=============================
+
+## What's Changed
+### ✨ Features
+* Feature : room version upgrade by @ganfra in https://github.com/element-hq/element-x-android/pull/4862
+* Add a developer option for history sharing on invite by @richvdh in https://github.com/element-hq/element-x-android/pull/4821
+### 🙌 Improvements
+* Change : add tombstoned room decoration by @ganfra in https://github.com/element-hq/element-x-android/pull/4891
+* Show generic notification when Event cannot be resolved by @bmarty in https://github.com/element-hq/element-x-android/pull/4889
+### 🐛 Bugfixes
+* [a11y] Improve screen reader on polls by @bmarty in https://github.com/element-hq/element-x-android/pull/4875
+* fix (event action): allow to edit only if permission to send message by @ganfra in https://github.com/element-hq/element-x-android/pull/4895
+* fix (room upgrade) : room predecessor banner on DM room by @ganfra in https://github.com/element-hq/element-x-android/pull/4896
+* fix (join room) : do not navigate up when join is successful by @ganfra in https://github.com/element-hq/element-x-android/pull/4899
+### 🗣 Translations
+* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4842
+* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/4881
+### Dependency upgrades
+* chore(deps): update plugin dependencycheck to v12.1.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4856
+* fix(deps): update dependency org.maplibre.gl:android-sdk to v11.10.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4858
+* fix(deps): update kotlin to v2.1.21-2.0.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4850
+* fix(deps): update dependency app.cash.turbine:turbine to v1.2.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4865
+* Update dependency com.posthog:posthog-android to v3.18.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4873
+* Update dependency org.maplibre.gl:android-sdk to v11.10.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4879
+* fix(deps): update dependency com.posthog:posthog-android to v3.19.0 by @renovate in https://github.com/element-hq/element-x-android/pull/4882
+* fix(deps): update dependency io.sentry:sentry-android to v8.13.3 by @renovate in https://github.com/element-hq/element-x-android/pull/4870
+* fix(deps): update showkase to v1.0.4 by @renovate in https://github.com/element-hq/element-x-android/pull/4878
+* fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.18 by @renovate in https://github.com/element-hq/element-x-android/pull/4894
+### Others
+* Annotate Composable functions with `@ReadOnlyComposable` where it's possible by @bmarty in https://github.com/element-hq/element-x-android/pull/4859
+* Add documentation on WebViewPipController by @bmarty in https://github.com/element-hq/element-x-android/pull/4861
+* Small cleanup around log tag. by @bmarty in https://github.com/element-hq/element-x-android/pull/4860
+* Another cleanup by @bmarty in https://github.com/element-hq/element-x-android/pull/4869
+* Disable BT audio devices for Element Call on Android < 12 by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4876
+* Add a banner to ask the user to disable battery optimization when Event cannot be resolved from Push by @bmarty in https://github.com/element-hq/element-x-android/pull/4845
+* a11y: improve accessibility on rich text editor options. by @bmarty in https://github.com/element-hq/element-x-android/pull/4886
+* A11Y: improve accessibility on event reactions. by @bmarty in https://github.com/element-hq/element-x-android/pull/4877
+
+
+**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.06.2...v25.06.3
+
Changes in Element X v25.06.2
=============================
diff --git a/README.md b/README.md
index 14acef0de2..20ac1c0536 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ Learn more about why we are building Element X in our blog post: [https://elemen
* [Translations](#translations)
* [Rust SDK](#rust-sdk)
* [Status](#status)
+* [Minimum SDK version](#minimum-sdk-version)
* [Contributing](#contributing)
* [Build instructions](#build-instructions)
* [Support](#support)
@@ -73,6 +74,12 @@ We're doing this as a way to share code between platforms and while we've seen p
This project is in an early rollout and migration phase.
+## Minimum SDK version
+
+Element X Android requires a minimum SDK version of 24 (Android 7.0, Nougat). We aim to support devices running Android 7.0 and above, which covers a wide range of devices still in use today.
+
+Element Android Enterprise requires a minimum SDK version of 33 (Android 13, Tiramisu). For Element Enterprise, we support only devices that still receive security updates, which means devices running Android 13 and above. Android does not have a documented support policy, but some information can be found at [https://endoflife.date/android](https://endoflife.date/android).
+
## Contributing
Want to get actively involved in the project? You're more than welcome! A good way to start is to check the issues that are labelled with the [good first issue](https://github.com/element-hq/element-x-android/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) label. Let us know by commenting the issue that you're starting working on it.
diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml
index 2fd8c27c09..73a2ed405c 100644
--- a/app/src/main/res/xml/locales_config.xml
+++ b/app/src/main/res/xml/locales_config.xml
@@ -4,6 +4,7 @@
+
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 9a07c04f57..043dc75a92 100644
--- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
+++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
@@ -41,6 +41,7 @@ import dagger.assisted.AssistedInject
import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.anvilannotations.ContributesNode
import io.element.android.appnav.loggedin.LoggedInNode
+import io.element.android.appnav.loggedin.MediaPreviewConfigMigration
import io.element.android.appnav.loggedin.SendQueues
import io.element.android.appnav.room.RoomFlowNode
import io.element.android.appnav.room.RoomNavigationTarget
@@ -49,11 +50,11 @@ import io.element.android.features.createroom.api.CreateRoomEntryPoint
import io.element.android.features.ftue.api.FtueEntryPoint
import io.element.android.features.ftue.api.state.FtueService
import io.element.android.features.ftue.api.state.FtueState
+import io.element.android.features.home.api.HomeEntryPoint
import io.element.android.features.logout.api.LogoutEntryPoint
import io.element.android.features.preferences.api.PreferencesEntryPoint
import io.element.android.features.roomdirectory.api.RoomDescription
import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint
-import io.element.android.features.roomlist.api.RoomListEntryPoint
import io.element.android.features.securebackup.api.SecureBackupEntryPoint
import io.element.android.features.share.api.ShareEntryPoint
import io.element.android.features.userprofile.api.UserProfileEntryPoint
@@ -90,6 +91,15 @@ import java.time.Duration
import java.time.Instant
import java.util.Optional
import java.util.UUID
+import kotlin.collections.List
+import kotlin.collections.any
+import kotlin.collections.emptyList
+import kotlin.collections.first
+import kotlin.collections.forEach
+import kotlin.collections.listOf
+import kotlin.collections.mapNotNull
+import kotlin.collections.plus
+import kotlin.collections.setOf
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import kotlin.time.toKotlinDuration
@@ -98,7 +108,7 @@ import kotlin.time.toKotlinDuration
class LoggedInFlowNode @AssistedInject constructor(
@Assisted buildContext: BuildContext,
@Assisted plugins: List,
- private val roomListEntryPoint: RoomListEntryPoint,
+ private val homeEntryPoint: HomeEntryPoint,
private val preferencesEntryPoint: PreferencesEntryPoint,
private val createRoomEntryPoint: CreateRoomEntryPoint,
private val appNavigationStateService: AppNavigationStateService,
@@ -114,6 +124,7 @@ class LoggedInFlowNode @AssistedInject constructor(
private val sendingQueue: SendQueues,
private val logoutEntryPoint: LogoutEntryPoint,
private val incomingVerificationEntryPoint: IncomingVerificationEntryPoint,
+ private val mediaPreviewConfigMigration: MediaPreviewConfigMigration,
snackbarDispatcher: SnackbarDispatcher,
) : BaseFlowNode(
backstack = BackStack(
@@ -160,7 +171,7 @@ class LoggedInFlowNode @AssistedInject constructor(
// Otherwise, the RoomList UI may be incorrectly displayed on top
withTimeout(5.seconds) {
backstack.elements.first { elements ->
- elements.any { it.key.navTarget == NavTarget.RoomList }
+ elements.any { it.key.navTarget == NavTarget.Home }
}
}
@@ -179,13 +190,14 @@ class LoggedInFlowNode @AssistedInject constructor(
appNavigationStateService.onNavigateToSpace(id, MAIN_SPACE)
loggedInFlowProcessor.observeEvents(sessionCoroutineScope)
matrixClient.sessionVerificationService().setListener(verificationListener)
+ mediaPreviewConfigMigration()
ftueService.state
.onEach { ftueState ->
when (ftueState) {
is FtueState.Unknown -> Unit // Nothing to do
is FtueState.Incomplete -> backstack.safeRoot(NavTarget.Ftue)
- is FtueState.Complete -> backstack.safeRoot(NavTarget.RoomList)
+ is FtueState.Complete -> backstack.safeRoot(NavTarget.Home)
}
}
.launchIn(lifecycleScope)
@@ -212,7 +224,7 @@ class LoggedInFlowNode @AssistedInject constructor(
data object LoggedInPermanent : NavTarget
@Parcelize
- data object RoomList : NavTarget
+ data object Home : NavTarget
@Parcelize
data class Room(
@@ -269,8 +281,8 @@ class LoggedInFlowNode @AssistedInject constructor(
}
createNode(buildContext, listOf(callback))
}
- NavTarget.RoomList -> {
- val callback = object : RoomListEntryPoint.Callback {
+ NavTarget.Home -> {
+ val callback = object : HomeEntryPoint.Callback {
override fun onRoomClick(roomId: RoomId) {
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias()))
}
@@ -303,7 +315,7 @@ class LoggedInFlowNode @AssistedInject constructor(
backstack.push(NavTarget.LogoutForNativeSlidingSyncMigrationNeeded)
}
}
- roomListEntryPoint
+ homeEntryPoint
.nodeBuilder(this, buildContext)
.callback(callback)
.build()
@@ -487,7 +499,7 @@ class LoggedInFlowNode @AssistedInject constructor(
clearBackstack: Boolean,
) {
waitForNavTargetAttached { navTarget ->
- navTarget is NavTarget.RoomList
+ navTarget is NavTarget.Home
}
attachChild {
val roomNavTarget = NavTarget.Room(
@@ -504,7 +516,7 @@ class LoggedInFlowNode @AssistedInject constructor(
suspend fun attachUser(userId: UserId) {
waitForNavTargetAttached { navTarget ->
- navTarget is NavTarget.RoomList
+ navTarget is NavTarget.Home
}
attachChild {
backstack.push(
@@ -517,7 +529,7 @@ class LoggedInFlowNode @AssistedInject constructor(
internal suspend fun attachIncomingShare(intent: Intent) {
waitForNavTargetAttached { navTarget ->
- navTarget is NavTarget.RoomList
+ navTarget is NavTarget.Home
}
attachChild {
backstack.push(
@@ -555,7 +567,7 @@ private class AttachRoomOperation(
return if (clearBackstack) {
// Makes sure the room list target is alone in the backstack and stashed
elements.mapNotNull { element ->
- if (element.key.navTarget == LoggedInFlowNode.NavTarget.RoomList) {
+ if (element.key.navTarget == LoggedInFlowNode.NavTarget.Home) {
element.transitionTo(STASHED, this)
} else {
null
diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt
new file mode 100644
index 0000000000..d9ed15318a
--- /dev/null
+++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2025 New Vector 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.appnav.loggedin
+
+import io.element.android.libraries.di.annotations.SessionCoroutineScope
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
+import io.element.android.libraries.preferences.api.store.AppPreferencesStore
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+import timber.log.Timber
+import javax.inject.Inject
+
+/**
+ * This migration is temporary, will be safe to remove after some time.
+ * The goal is to set the server config if it's not set, and remove the local data.
+ */
+class MediaPreviewConfigMigration @Inject constructor(
+ private val mediaPreviewService: MediaPreviewService,
+ private val appPreferencesStore: AppPreferencesStore,
+ @SessionCoroutineScope
+ private val sessionCoroutineScope: CoroutineScope,
+) {
+ @Suppress("DEPRECATION")
+ operator fun invoke() = sessionCoroutineScope.launch {
+ val hideInviteAvatars = appPreferencesStore.getHideInviteAvatarsFlow().first()
+ val mediaPreviewValue = appPreferencesStore.getTimelineMediaPreviewValueFlow().first()
+ if (hideInviteAvatars == null && mediaPreviewValue == null) {
+ // No local data, abort.
+ return@launch
+ }
+ mediaPreviewService
+ .fetchMediaPreviewConfig()
+ .onSuccess { config ->
+ if (config != null) {
+ appPreferencesStore.setHideInviteAvatars(null)
+ appPreferencesStore.setTimelineMediaPreviewValue(null)
+ } else {
+ if (hideInviteAvatars != null) {
+ mediaPreviewService.setHideInviteAvatars(hideInviteAvatars)
+ appPreferencesStore.setHideInviteAvatars(null)
+ }
+ if (mediaPreviewValue != null) {
+ mediaPreviewService.setMediaPreviewValue(mediaPreviewValue)
+ appPreferencesStore.setTimelineMediaPreviewValue(null)
+ }
+ }
+ }
+ .onFailure {
+ Timber.e(it, "Couldn't perform migration, failed to fetch media preview config.")
+ }
+ }
+}
diff --git a/appnav/src/main/res/values-da/translations.xml b/appnav/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..ef5025ed61
--- /dev/null
+++ b/appnav/src/main/res/values-da/translations.xml
@@ -0,0 +1,6 @@
+
+
+ "Log ud og opgradér"
+ "%1$s understøtter ikke længere den gamle protokol. Log ud og log ind igen for at fortsætte med at bruge appen."
+ "Din hjemmeserver understøtter ikke længere den gamle protokol. Log ud og log ind igen for at fortsætte med at bruge appen."
+
diff --git a/appnav/src/main/res/values-in/translations.xml b/appnav/src/main/res/values-in/translations.xml
index 8314323845..e4f445dbc7 100644
--- a/appnav/src/main/res/values-in/translations.xml
+++ b/appnav/src/main/res/values-in/translations.xml
@@ -1,5 +1,6 @@
"Keluar & Tingkatkan"
+ "%1$s tidak lagi mendukung protokol lama. Silakan keluar dan masuk kembali untuk terus menggunakan aplikasi."
"Homeserver Anda tidak lagi mendukung protokol lama. Silakan keluar dan masuk kembali untuk terus menggunakan aplikasi."
diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt
new file mode 100644
index 0000000000..459abc64d4
--- /dev/null
+++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2025 New Vector Ltd.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
+ * Please see LICENSE files in the repository root for full details.
+ */
+
+@file:Suppress("DEPRECATION")
+
+package io.element.android.appnav.loggedin
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.matrix.api.media.MediaPreviewConfig
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.matrix.test.media.FakeMediaPreviewService
+import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+
+class MediaPreviewConfigMigrationTest {
+ @Test
+ fun `when no local data exists, migration does nothing`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore()
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.success(null) }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify no calls were made to set server config
+ // since there's nothing to migrate
+ }
+
+ @Test
+ fun `when local data exists and server has config, clears local data`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore().apply {
+ setHideInviteAvatars(true)
+ setTimelineMediaPreviewValue(MediaPreviewValue.Private)
+ }
+ val serverConfig = MediaPreviewConfig(
+ hideInviteAvatar = false,
+ mediaPreviewValue = MediaPreviewValue.On
+ )
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.success(serverConfig) }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify local data was cleared
+ assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull()
+ assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull()
+ }
+
+ @Test
+ fun `when local hideInviteAvatars exists and server has no config, migrates to server`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore().apply {
+ setHideInviteAvatars(true)
+ }
+ var setHideInviteAvatarsValue: Boolean? = null
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.success(null) },
+ setHideInviteAvatarsResult = { value ->
+ setHideInviteAvatarsValue = value
+ Result.success(Unit)
+ }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify server was updated with local value
+ assertThat(setHideInviteAvatarsValue).isTrue()
+ // Verify local data was cleared
+ assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull()
+ }
+
+ @Test
+ fun `when local mediaPreviewValue exists and server has no config, migrates to server`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore().apply {
+ setTimelineMediaPreviewValue(MediaPreviewValue.Private)
+ }
+ var setMediaPreviewValue: MediaPreviewValue? = null
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.success(null) },
+ setMediaPreviewValueResult = { value ->
+ setMediaPreviewValue = value
+ Result.success(Unit)
+ }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify server was updated with local value
+ assertThat(setMediaPreviewValue).isEqualTo(MediaPreviewValue.Private)
+ // Verify local data was cleared
+ assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull()
+ }
+
+ @Test
+ fun `when both local values exist and server has no config, migrates both to server`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore().apply {
+ setHideInviteAvatars(true)
+ setTimelineMediaPreviewValue(MediaPreviewValue.Off)
+ }
+ var setHideInviteAvatarsValue: Boolean? = null
+ var setMediaPreviewValue: MediaPreviewValue? = null
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.success(null) },
+ setHideInviteAvatarsResult = { value ->
+ setHideInviteAvatarsValue = value
+ Result.success(Unit)
+ },
+ setMediaPreviewValueResult = { value ->
+ setMediaPreviewValue = value
+ Result.success(Unit)
+ }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify server was updated with both local values
+ assertThat(setHideInviteAvatarsValue).isTrue()
+ assertThat(setMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ // Verify local data was cleared
+ assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isNull()
+ assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isNull()
+ }
+
+ @Test
+ fun `when fetch config fails, migration does nothing`() = runTest {
+ val appPreferencesStore = InMemoryAppPreferencesStore().apply {
+ setHideInviteAvatars(true)
+ setTimelineMediaPreviewValue(MediaPreviewValue.Private)
+ }
+ val mediaPreviewService = FakeMediaPreviewService(
+ fetchMediaPreviewConfigResult = { Result.failure(Exception("Network error")) }
+ )
+ val migration = createMigration(appPreferencesStore, mediaPreviewService)
+
+ migration().join()
+
+ // Verify local data was not cleared since migration failed
+ assertThat(appPreferencesStore.getHideInviteAvatarsFlow().first()).isTrue()
+ assertThat(appPreferencesStore.getTimelineMediaPreviewValueFlow().first()).isEqualTo(MediaPreviewValue.Private)
+ }
+
+ private fun TestScope.createMigration(
+ appPreferencesStore: InMemoryAppPreferencesStore,
+ mediaPreviewService: FakeMediaPreviewService
+ ) = MediaPreviewConfigMigration(
+ mediaPreviewService = mediaPreviewService,
+ appPreferencesStore = appPreferencesStore,
+ sessionCoroutineScope = this
+ )
+}
diff --git a/build.gradle.kts b/build.gradle.kts
index 317a6ab5bd..0e585a3d6b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -98,6 +98,10 @@ allprojects {
// Uncomment to suppress Compose Kotlin compiler compatibility warning
// freeCompilerArgs.addAll(listOf("-P", "plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true"))
+
+ // Fix compilation warning for annotations
+ // See https://youtrack.jetbrains.com/issue/KT-73255/Change-defaulting-rule-for-annotations for more details
+ freeCompilerArgs.add("-Xannotation-default-target=first-only")
}
}
}
diff --git a/enterprise b/enterprise
index 4a07c862a2..b7ababb953 160000
--- a/enterprise
+++ b/enterprise
@@ -1 +1 @@
-Subproject commit 4a07c862a23a9fd1418eabf132cf9d6b25ea4927
+Subproject commit b7ababb9537da8bec254b8ed00b5a4122e9f3e3b
diff --git a/fastlane/metadata/android/en-US/changelogs/202507000.txt b/fastlane/metadata/android/en-US/changelogs/202507000.txt
new file mode 100644
index 0000000000..3abd90d7c6
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/202507000.txt
@@ -0,0 +1,2 @@
+Main changes in this version: improve accessibility.
+Full changelog: https://github.com/element-hq/element-x-android/releases
diff --git a/features/analytics/api/src/main/res/values-da/translations.xml b/features/analytics/api/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..e302bae626
--- /dev/null
+++ b/features/analytics/api/src/main/res/values-da/translations.xml
@@ -0,0 +1,7 @@
+
+
+ "Del anonyme brugsdata for at hjælpe os med at identificere problemer."
+ "Du kan læse alle vores vilkår %1$s."
+ "her"
+ "Del analysedata"
+
diff --git a/features/analytics/api/src/main/res/values-fa/translations.xml b/features/analytics/api/src/main/res/values-fa/translations.xml
index 8b672f0f00..62a0e1cc90 100644
--- a/features/analytics/api/src/main/res/values-fa/translations.xml
+++ b/features/analytics/api/src/main/res/values-fa/translations.xml
@@ -1,5 +1,7 @@
+ "داده های استفاده ناشناس را به اشتراک بگذارید تا به ما در شناسایی مشکلات کمک کند."
+ "شما میتوانید تمام شرایط ما را بخوانید%1$s ."
"اینجا"
"هم رسانی دادههای تحلیلی"
diff --git a/features/analytics/impl/src/main/res/values-da/translations.xml b/features/analytics/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..971a12ae37
--- /dev/null
+++ b/features/analytics/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,10 @@
+
+
+ "Vi vil ikke registrere eller profilere nogen personlige data"
+ "Del anonyme brugsdata for at hjælpe os med at identificere problemer."
+ "Du kan læse alle vores vilkår %1$s."
+ "her"
+ "Du kan slå dette fra når som helst"
+ "Vi deler ikke dine data med tredjeparter"
+ "Hjælp med at forbedre %1$s"
+
diff --git a/features/analytics/impl/src/main/res/values-fa/translations.xml b/features/analytics/impl/src/main/res/values-fa/translations.xml
index 713e2636d1..45ac8c1511 100644
--- a/features/analytics/impl/src/main/res/values-fa/translations.xml
+++ b/features/analytics/impl/src/main/res/values-fa/translations.xml
@@ -1,5 +1,8 @@
+ "ما هیچ گونه اطلاعات شخصی را ضبط یا نمایهسازی نمیکنیم"
+ "داده های استفاده ناشناس را به اشتراک بگذارید تا به ما در شناسایی مشکلات کمک کند."
+ "شما میتوانید تمام شرایط ما را بخوانید%1$s ."
"اینجا"
"میتوانید در هر زمان خاموشش کنید"
"دادههایتان را با سومشخصها همنمیرسانیم"
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt
index 0e9ddbe364..c18fef410e 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/data/WidgetMessage.kt
@@ -30,6 +30,9 @@ data class WidgetMessage(
@Serializable
enum class Action {
+ @SerialName("io.element.join")
+ Join,
+
@SerialName("im.vector.hangup")
HangUp,
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureStateProvider.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureStateProvider.kt
index cab5858e4d..f2afcd0196 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureStateProvider.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/pip/PictureInPictureStateProvider.kt
@@ -7,16 +7,6 @@
package io.element.android.features.call.impl.pip
-import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-
-open class PictureInPictureStateProvider : PreviewParameterProvider {
- override val values: Sequence
- get() = sequenceOf(
- aPictureInPictureState(supportPip = true),
- aPictureInPictureState(supportPip = true, isInPictureInPicture = true),
- )
-}
-
fun aPictureInPictureState(
supportPip: Boolean = false,
isInPictureInPicture: Boolean = false,
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt
index e16428de3b..04999c82ab 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt
@@ -48,9 +48,6 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
-import kotlinx.serialization.json.contentOrNull
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
import timber.log.Timber
import java.util.UUID
import kotlin.time.Duration.Companion.seconds
@@ -91,6 +88,7 @@ class CallScreenPresenter @AssistedInject constructor(
var webViewError by remember { mutableStateOf(null) }
val languageTag = languageTagProvider.provideLanguageTag()
val theme = if (ElementTheme.isLightTheme) "light" else "dark"
+
DisposableEffect(Unit) {
coroutineScope.launch {
// Sets the call as joined
@@ -145,17 +143,25 @@ class CallScreenPresenter @AssistedInject constructor(
if (parsedMessage?.direction == WidgetMessage.Direction.FromWidget) {
if (parsedMessage.action == WidgetMessage.Action.Close) {
close(callWidgetDriver.value, navigator)
- } else if (parsedMessage.action == WidgetMessage.Action.SendEvent) {
- // This event is received when a member joins the call, the first one will be the current one
- val type = parsedMessage.data?.jsonObject?.get("type")?.jsonPrimitive?.contentOrNull
- if (type == "org.matrix.msc3401.call.member") {
- isJoinedCall = true
- }
+ } else if (parsedMessage.action == WidgetMessage.Action.Join) {
+ isJoinedCall = true
}
}
}
.launchIn(this)
}
+
+ LaunchedEffect(Unit) {
+ // Wait for the call to be joined, if it takes too long, we display an error
+ delay(10.seconds)
+
+ if (!isJoinedCall) {
+ Timber.w("The call took too long to be joined. Displaying an error before exiting.")
+
+ // This will display a simple 'Sorry, an error occurred' dialog and force the user to exit the call
+ webViewError = ""
+ }
+ }
}
fun handleEvents(event: CallScreenEvents) {
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 7547d8e7c7..88d2e81f8b 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
@@ -11,6 +11,7 @@ import android.annotation.SuppressLint
import android.util.Log
import android.view.ViewGroup
import android.webkit.ConsoleMessage
+import android.webkit.JavascriptInterface
import android.webkit.PermissionRequest
import android.webkit.WebChromeClient
import android.webkit.WebView
@@ -19,7 +20,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
-import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -32,11 +32,9 @@ import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.viewinterop.AndroidView
-import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.call.impl.R
import io.element.android.features.call.impl.pip.PictureInPictureEvents
import io.element.android.features.call.impl.pip.PictureInPictureState
-import io.element.android.features.call.impl.pip.PictureInPictureStateProvider
import io.element.android.features.call.impl.pip.aPictureInPictureState
import io.element.android.features.call.impl.utils.InvalidAudioDeviceReason
import io.element.android.features.call.impl.utils.WebViewAudioManager
@@ -44,13 +42,11 @@ import io.element.android.features.call.impl.utils.WebViewPipController
import io.element.android.features.call.impl.utils.WebViewWidgetMessageInterceptor
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.ProgressDialog
-import io.element.android.libraries.designsystem.components.button.BackButton
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.designsystem.theme.components.TopAppBar
import io.element.android.libraries.ui.strings.CommonStrings
import timber.log.Timber
@@ -60,7 +56,6 @@ interface CallScreenNavigator {
fun close()
}
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun CallScreenView(
state: CallScreenState,
@@ -78,19 +73,6 @@ internal fun CallScreenView(
Scaffold(
modifier = modifier,
- topBar = {
- if (!pipState.isInPictureInPicture) {
- TopAppBar(
- title = { Text(stringResource(R.string.element_call)) },
- navigationIcon = {
- BackButton(
- imageVector = if (pipState.supportPip) CompoundIcons.ArrowLeft() else CompoundIcons.Close(),
- onClick = ::handleBack,
- )
- }
- )
- }
- }
) { padding ->
BackHandler {
handleBack()
@@ -127,9 +109,11 @@ internal fun CallScreenView(
requestPermissions(androidPermissions.toTypedArray(), callback)
},
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()
@@ -282,6 +266,17 @@ private fun WebView.setup(
}
}
+private fun WebView.addBackHandler(onBackPressed: () -> Unit) {
+ addJavascriptInterface(
+ object {
+ @Suppress("unused")
+ @JavascriptInterface
+ fun onBackPressed() = onBackPressed()
+ },
+ "backHandler"
+ )
+}
+
@PreviewsDayNight
@Composable
internal fun CallScreenViewPreview(
@@ -294,18 +289,6 @@ internal fun CallScreenViewPreview(
)
}
-@PreviewsDayNight
-@Composable
-internal fun CallScreenPipViewPreview(
- @PreviewParameter(PictureInPictureStateProvider::class) state: PictureInPictureState,
-) = ElementPreview {
- CallScreenView(
- state = aCallScreenState(),
- pipState = state,
- requestPermissions = { _, _ -> },
- )
-}
-
@PreviewsDayNight
@Composable
internal fun InvalidAudioDeviceDialogPreview() = ElementPreview {
diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt
index 3a77fb4d81..954fa3568f 100644
--- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt
+++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallScreen.kt
@@ -39,6 +39,7 @@ import io.element.android.libraries.designsystem.background.OnboardingBackground
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -74,7 +75,8 @@ internal fun IncomingCallScreen(
name = notificationData.senderName,
url = notificationData.avatarUrl,
size = AvatarSize.IncomingCall,
- )
+ ),
+ avatarType = AvatarType.User,
)
Spacer(modifier = Modifier.height(24.dp))
Text(
diff --git a/features/call/impl/src/main/res/values-cs/translations.xml b/features/call/impl/src/main/res/values-cs/translations.xml
index 6272a9e0ec..5d458dcc1b 100644
--- a/features/call/impl/src/main/res/values-cs/translations.xml
+++ b/features/call/impl/src/main/res/values-cs/translations.xml
@@ -3,5 +3,6 @@
"Probíhající hovor"
"Klepněte pro návrat k hovoru"
"☎️ Probíhá hovor"
+ "Element Call nepodporuje používání Bluetooth zvukových zařízení v této verzi systému Android. Vyberte jiné zvukové zařízení."
"Příchozí Element Call"
diff --git a/features/call/impl/src/main/res/values-cy/translations.xml b/features/call/impl/src/main/res/values-cy/translations.xml
index 4b1edd1b82..cd36fed48f 100644
--- a/features/call/impl/src/main/res/values-cy/translations.xml
+++ b/features/call/impl/src/main/res/values-cy/translations.xml
@@ -3,5 +3,6 @@
"Galwad cyfredol"
"Tapio i ddychwelyd i\'r alwad"
"☎️ Galwad ar y gweill"
+ "Nid yw Element Call yn cefnogi defnyddio dyfeisiau sain Bluetooth yn y fersiwn Android hon. Dewiswch ddyfais sain wahanol."
"Galwad Element"
diff --git a/features/call/impl/src/main/res/values-da/translations.xml b/features/call/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..9bb8c30af2
--- /dev/null
+++ b/features/call/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,8 @@
+
+
+ "Igangværende opkald"
+ "Tryk for at vende tilbage til opkaldet"
+ "☎️ Opkald i gang"
+ "Element Call understøtter desværre ikke brug af Bluetooth-lydenheder i denne Android-version. Vælg venligst en anden lydenhed."
+ "Indgående Element opkald"
+
diff --git a/features/call/impl/src/main/res/values-de/translations.xml b/features/call/impl/src/main/res/values-de/translations.xml
index 6429dbe956..9e2ef1cea4 100644
--- a/features/call/impl/src/main/res/values-de/translations.xml
+++ b/features/call/impl/src/main/res/values-de/translations.xml
@@ -3,5 +3,6 @@
"Laufender Anruf"
"Tippen, um zum Anruf zurückzukehren"
"☎️ Anruf läuft"
+ "In dieser Android-Version unterstützt Element Call derzeit keine Bluetooth-Audiogeräte. Bitte wählen Sie ein anderes Audiogerät aus."
"Eingehender Element Call"
diff --git a/features/call/impl/src/main/res/values-el/translations.xml b/features/call/impl/src/main/res/values-el/translations.xml
index 3dd54c238a..fa80c689da 100644
--- a/features/call/impl/src/main/res/values-el/translations.xml
+++ b/features/call/impl/src/main/res/values-el/translations.xml
@@ -3,5 +3,6 @@
"Συνεχής κλήση"
"Πάτα για να επιστρέψεις στην κλήση"
"☎️ Κλήση σε εξέλιξη"
+ "Το Element Call δεν υποστηρίζει τη χρήση συσκευών ήχου Bluetooth σε αυτήν την έκδοση Android. Επέλεξε μια διαφορετική συσκευή ήχου."
"Εισερχόμενη κλήση Element"
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 05b36cedbc..becc9e5565 100644
--- a/features/call/impl/src/main/res/values-et/translations.xml
+++ b/features/call/impl/src/main/res/values-et/translations.xml
@@ -3,5 +3,6 @@
"Käimasolev kõne"
"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"
diff --git a/features/call/impl/src/main/res/values-hu/translations.xml b/features/call/impl/src/main/res/values-hu/translations.xml
index 18f735cff7..62d359c2bb 100644
--- a/features/call/impl/src/main/res/values-hu/translations.xml
+++ b/features/call/impl/src/main/res/values-hu/translations.xml
@@ -3,5 +3,6 @@
"Folyamatban lévő hívás"
"Koppintson a híváshoz való visszatéréshez"
"☎️ Hívás folyamatban"
+ "Az Element Call nem támogatja a Bluetooth hangeszközök használatát ebben az Android-verzióban. Válasszon másik hangeszközt."
"Bejövő Element hívás"
diff --git a/features/call/impl/src/main/res/values-in/translations.xml b/features/call/impl/src/main/res/values-in/translations.xml
index e900f8fe9a..7da23d6fb7 100644
--- a/features/call/impl/src/main/res/values-in/translations.xml
+++ b/features/call/impl/src/main/res/values-in/translations.xml
@@ -3,5 +3,6 @@
"Panggilan berlangsung"
"Ketuk untuk kembali ke panggilan"
"☎️ Panggilan sedang berlangsung"
+ "Element Call tidak mendukung penggunaan perangkat audio Bluetooth di versi Android ini. Silakan pilih perangkat audio yang berbeda."
"Element Call Masuk"
diff --git a/features/call/impl/src/main/res/values-it/translations.xml b/features/call/impl/src/main/res/values-it/translations.xml
index f88f6f6162..086fc98f55 100644
--- a/features/call/impl/src/main/res/values-it/translations.xml
+++ b/features/call/impl/src/main/res/values-it/translations.xml
@@ -3,5 +3,6 @@
"Chiamata in corso"
"Tocca per tornare alla chiamata"
"☎️ Chiamata in corso"
+ "Element Call non supporta l\'uso di dispositivi audio Bluetooth in questa versione di Android. Seleziona un dispositivo audio diverso."
"Chiamata Element Call in arrivo"
diff --git a/features/call/impl/src/main/res/values-pt-rBR/translations.xml b/features/call/impl/src/main/res/values-pt-rBR/translations.xml
index f9f8873f6d..b0895845ce 100644
--- a/features/call/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/call/impl/src/main/res/values-pt-rBR/translations.xml
@@ -3,5 +3,6 @@
"Chamada em andamento"
"Toque para retornar à chamada"
"☎️ Chamada em andamento"
+ "O Element Call não tem suporte a dispositivos de áudio Bluetooth nesta versão do Android. Por favor, selecione um dispositivo de áudio diferente."
"Chamada do Element recebida"
diff --git a/features/call/impl/src/main/res/values-pt/translations.xml b/features/call/impl/src/main/res/values-pt/translations.xml
index 58ee9d523f..639726bd07 100644
--- a/features/call/impl/src/main/res/values-pt/translations.xml
+++ b/features/call/impl/src/main/res/values-pt/translations.xml
@@ -3,5 +3,6 @@
"Chamada em curso"
"Toca para voltar à chamada"
"☎️ Chamada em curso"
+ "As chamadas do Element não permitem o uso de dispositivos de áudio Bluetooth nesta versão do Android. Por favor, seleciona outro dispositivo."
"A receber chamada da Element"
diff --git a/features/call/impl/src/main/res/values-sk/translations.xml b/features/call/impl/src/main/res/values-sk/translations.xml
index 71188379c2..4e5b7db9f7 100644
--- a/features/call/impl/src/main/res/values-sk/translations.xml
+++ b/features/call/impl/src/main/res/values-sk/translations.xml
@@ -3,5 +3,6 @@
"Prebiehajúci hovor"
"Ťuknutím sa vrátite k hovoru"
"☎️ Prebieha hovor"
+ "Element Call nepodporuje používanie zvukových zariadení Bluetooth v tejto verzii systému Android. Vyberte iné zvukové zariadenie."
"Prichádzajúci hovor Element Call"
diff --git a/features/call/impl/src/main/res/values-uk/translations.xml b/features/call/impl/src/main/res/values-uk/translations.xml
index 9d63049ddc..f03df23bbe 100644
--- a/features/call/impl/src/main/res/values-uk/translations.xml
+++ b/features/call/impl/src/main/res/values-uk/translations.xml
@@ -3,5 +3,6 @@
"Поточний виклик"
"Торкніться, щоб повернутися до виклику"
"☎️ Триває виклик"
+ "Element Call не підтримує використання аудіопристроїв Bluetooth у цій версії Android. Виберіть інший аудіопристрій."
"Вхідний виклик Element"
diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/impl/ui/CallScreenViewTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/impl/ui/CallScreenViewTest.kt
deleted file mode 100644
index 55ed644c47..0000000000
--- a/features/call/impl/src/test/kotlin/io/element/android/features/call/impl/ui/CallScreenViewTest.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2024 New Vector 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
-
-import androidx.activity.ComponentActivity
-import androidx.compose.ui.test.junit4.AndroidComposeTestRule
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import io.element.android.features.call.impl.pip.PictureInPictureEvents
-import io.element.android.features.call.impl.pip.PictureInPictureState
-import io.element.android.features.call.impl.pip.aPictureInPictureState
-import io.element.android.tests.testutils.EventsRecorder
-import io.element.android.tests.testutils.pressBack
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TestRule
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-class CallScreenViewTest {
- @get:Rule val rule = createAndroidComposeRule()
-
- @Test
- fun `clicking on back when pip is not supported hangs up`() {
- val eventsRecorder = EventsRecorder()
- val pipEventsRecorder = EventsRecorder()
- rule.setCallScreenView(
- aCallScreenState(
- eventSink = eventsRecorder
- ),
- aPictureInPictureState(
- supportPip = false,
- eventSink = pipEventsRecorder,
- ),
- )
- rule.pressBack()
- eventsRecorder.assertSize(2)
- eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels }
- eventsRecorder.assertTrue(1) { it == CallScreenEvents.Hangup }
- pipEventsRecorder.assertSize(1)
- pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetPipController }
- }
-
- @Test
- fun `clicking on back when pip is supported enables PiP`() {
- val eventsRecorder = EventsRecorder()
- val pipEventsRecorder = EventsRecorder()
- rule.setCallScreenView(
- aCallScreenState(
- eventSink = eventsRecorder
- ),
- aPictureInPictureState(
- supportPip = true,
- eventSink = pipEventsRecorder,
- ),
- )
- rule.pressBack()
- eventsRecorder.assertSize(1)
- eventsRecorder.assertTrue(0) { it is CallScreenEvents.SetupMessageChannels }
- pipEventsRecorder.assertSize(2)
- pipEventsRecorder.assertTrue(0) { it is PictureInPictureEvents.SetPipController }
- pipEventsRecorder.assertTrue(1) { it == PictureInPictureEvents.EnterPictureInPicture }
- }
-}
-
-private fun AndroidComposeTestRule.setCallScreenView(
- state: CallScreenState,
- pipState: PictureInPictureState,
- requestPermissions: (Array, RequestPermissionCallback) -> Unit = { _, _ -> },
-) {
- setContent {
- CallScreenView(
- state = state,
- pipState = pipState,
- requestPermissions = requestPermissions,
- )
- }
-}
diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt
index 23253a2033..7709066dd0 100644
--- a/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt
+++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/ui/CallScreenPresenterTest.kt
@@ -225,7 +225,7 @@ import kotlin.time.Duration.Companion.seconds
}
@Test
- fun `present - a received room member message makes the call to be active`() = runTest {
+ fun `present - a received 'joined' action makes the call to be active`() = runTest {
val navigator = FakeCallScreenNavigator()
val widgetDriver = FakeMatrixWidgetDriver()
val presenter = createCallScreenPresenter(
@@ -248,13 +248,10 @@ import kotlin.time.Duration.Companion.seconds
messageInterceptor.givenInterceptedMessage(
"""
{
- "action":"send_event",
+ "action":"io.element.join",
"api":"fromWidget",
"widgetId":"1",
- "requestId":"1",
- "data":{
- "type":"org.matrix.msc3401.call.member"
- }
+ "requestId":"1"
}
""".trimIndent()
)
@@ -264,6 +261,40 @@ import kotlin.time.Duration.Companion.seconds
}
}
+ @Test
+ fun `present - if in room mode and no join action is received an error is displayed`() = runTest {
+ val navigator = FakeCallScreenNavigator()
+ val widgetDriver = FakeMatrixWidgetDriver()
+ val presenter = createCallScreenPresenter(
+ callType = CallType.RoomCall(A_SESSION_ID, A_ROOM_ID),
+ widgetDriver = widgetDriver,
+ navigator = navigator,
+ dispatchers = testCoroutineDispatchers(useUnconfinedTestDispatcher = true),
+ screenTracker = FakeScreenTracker {},
+ )
+ val messageInterceptor = FakeWidgetMessageInterceptor()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ // Give it time to load the URL and WidgetDriver
+ advanceTimeBy(1.seconds)
+ skipItems(2)
+ val initialState = awaitItem()
+ assertThat(initialState.isCallActive).isFalse()
+ initialState.eventSink(CallScreenEvents.SetupMessageChannels(messageInterceptor))
+ skipItems(2)
+
+ // Wait for the timeout to trigger
+ advanceTimeBy(10.seconds)
+
+ val finalState = awaitItem()
+ assertThat(finalState.isCallActive).isFalse()
+ // The error dialog that will force the user to leave the call is displayed
+ assertThat(finalState.webViewError).isNotNull()
+ assertThat(finalState.webViewError).isEmpty()
+ }
+ }
+
@Test
fun `present - automatically sets the isInCall state when starting the call and disposing the screen`() = runTest {
val navigator = FakeCallScreenNavigator()
diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt
index a26abd20fd..d39ac4d250 100644
--- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt
+++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt
@@ -15,7 +15,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
-import io.element.android.compound.theme.ElementTheme
import io.element.android.features.createroom.impl.R
import io.element.android.features.createroom.impl.components.UserListView
import io.element.android.features.createroom.impl.userlist.UserListEvents
@@ -23,9 +22,7 @@ import io.element.android.features.createroom.impl.userlist.UserListState
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.ui.strings.CommonStrings
@@ -74,12 +71,7 @@ private fun AddPeopleViewTopBar(
onNextClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(id = R.string.screen_create_room_add_people_title),
- style = ElementTheme.typography.aliasScreenTitle
- )
- },
+ titleStr = stringResource(id = R.string.screen_create_room_add_people_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
val textActionResId = if (hasSelectedUsers) CommonStrings.action_next else CommonStrings.action_skip
diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt
index 2684c8334d..9c468539ab 100644
--- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt
+++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt
@@ -40,13 +40,14 @@ import io.element.android.libraries.designsystem.atomic.atoms.RoundedIconAtom
import io.element.android.libraries.designsystem.atomic.atoms.RoundedIconAtomSize
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.async.AsyncActionViewDefaults
+import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.modifiers.clearFocusOnTap
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
@@ -187,12 +188,7 @@ private fun ConfigureRoomToolbar(
onNextClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_create_room_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_create_room_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
@@ -219,6 +215,8 @@ private fun RoomNameWithAvatar(
) {
UnsavedAvatar(
avatarUri = avatarUri,
+ avatarSize = AvatarSize.EditRoomDetails,
+ avatarType = AvatarType.Room(),
modifier = Modifier.clickable(onClick = onAvatarClick),
)
diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt
index af3675484a..248d331985 100644
--- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt
+++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt
@@ -36,7 +36,6 @@ import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.icons.CompoundDrawables
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.ListSectionHeader
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -137,12 +136,7 @@ private fun CreateRoomRootViewTopBar(
onCloseClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(id = CommonStrings.action_start_chat),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(id = CommonStrings.action_start_chat),
navigationIcon = {
BackButton(
imageVector = CompoundIcons.Close(),
diff --git a/features/createroom/impl/src/main/res/values-bg/translations.xml b/features/createroom/impl/src/main/res/values-bg/translations.xml
index 1de1db624a..fa6dae371c 100644
--- a/features/createroom/impl/src/main/res/values-bg/translations.xml
+++ b/features/createroom/impl/src/main/res/values-bg/translations.xml
@@ -3,10 +3,21 @@
"Нова стая"
"Поканване на хора"
"Възникна грешка при създаването на стаята"
- "Съобщенията в тази стая са шифровани. Шифроването не може да бъде изключено впоследствие."
- "Частна стая (само с покана)"
- "Съобщенията не са шифровани и всеки може да ги прочете. Можете да активирате шифроването на по-късна дата."
+ "Само поканени хора имат достъп до тази стая. Всички съобщения са шифровани от край до край."
+ "Частна стая"
+ "Всеки може да намери тази стая.
+Можете да промените това по всяко време в настройките на стаята."
+ "Общодостъпна стая"
+ "Всеки може да се присъедини към тази стая"
+ "Всеки"
+ "За да бъде тази стая видима в директорията на общодостъпните стаи, ще ви е необходим адрес на стаята."
"Име на стаята"
+ "Видимост на стаята"
"Създаване на стая"
"Тема за разговор (незадължително)"
+ "Присъединяване към стая по адрес"
+ "Не е валиден адрес"
+ "Въведете…"
+ "Стаята не е намерена"
+ "напр. #room-name:matrix.org"
diff --git a/features/createroom/impl/src/main/res/values-da/translations.xml b/features/createroom/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..c9c182b474
--- /dev/null
+++ b/features/createroom/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,30 @@
+
+
+ "Nyt rum"
+ "Invitér folk"
+ "Der opstod en fejl ved oprettelsen af rummet"
+ "Kun inviterede personer kan få adgang til dette rum. Alle meddelelser er ende-til-ende krypteret."
+ "Privat rum"
+ "Alle kan finde dette rum.
+Du kan ændre dette når som helst i rummets indstillinger."
+ "Offentligt rum"
+ "Alle kan deltage i dette rum"
+ "Enhver"
+ "Adgang til rummet"
+ "Alle kan bede om at deltage i rummet, men en administrator eller en moderator skal acceptere anmodningen"
+ "Spørg om at deltage"
+ "Hvis dette rum skal være synligt i det offentlige register, skal du bruge en rum-adresse."
+ "Rummets adresse"
+ "Navn på rum"
+ "Rummets synlighed"
+ "Opret et rum"
+ "Emne (valgfrit)"
+ "Register over rum"
+ "Der opstod en fejl under forsøget på at starte en samtale"
+ "Tilslut dig rummet med adressen"
+ "Ikke en gyldig adresse"
+ "Indtast…"
+ "Matchende rum fundet"
+ "Rum ikke fundet"
+ "f.eks. #rummets-navn:matrix.org"
+
diff --git a/features/createroom/impl/src/main/res/values-el/translations.xml b/features/createroom/impl/src/main/res/values-el/translations.xml
index a225550684..c036b43a05 100644
--- a/features/createroom/impl/src/main/res/values-el/translations.xml
+++ b/features/createroom/impl/src/main/res/values-el/translations.xml
@@ -1,30 +1,30 @@
- "Νέο δωμάτιο"
+ "Νέα αίθουσα"
"Πρόσκληση ατόμων"
- "Παρουσιάστηκε σφάλμα κατά τη δημιουργία του δωματίου"
- "Μόνο άτομα που έχουν προσκληθεί μπορούν να έχουν πρόσβαση σε αυτό το δωμάτιο. Όλα τα μηνύματα είναι κρυπτογραφημένα από άκρο σε άκρο."
- "Ιδιωτικό δωμάτιο"
- "Ο καθένας μπορεί να βρει αυτό το δωμάτιο.
-Μπορείς να το αλλάξεις ανά πάσα στιγμή στις ρυθμίσεις δωματίου."
- "Δημόσιο δωμάτιο"
- "Οποιοσδήποτε μπορεί να συμμετάσχει σε αυτό το δωμάτιο"
+ "Προέκυψε σφάλμα κατά τη δημιουργία της αίθουσας"
+ "Μόνο τα άτομα που έχουν προσκληθεί μπορούν να έχουν πρόσβαση σε αυτή την αίθουσα. Όλα τα μηνύματα είναι κρυπτογραφημένα από άκρο σε άκρο."
+ "Ιδιωτική αίθουσα"
+ "Ο καθένας μπορεί να βρει αυτή την αίθουσα.
+Αυτό μπορείτε να το αλλάξετε ανά πάσα στιγμή στις ρυθμίσεις της αίθουσας."
+ "Δημόσια αίθουσα"
+ "Οποιοσδήποτε μπορεί να συμμετάσχει σε αυτή την αίθουσα"
"Οποιοσδήποτε"
- "Πρόσβαση Δωματίου"
- "Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στο δωμάτιο, αλλά ένας διαχειριστής ή συντονιστής θα πρέπει να αποδεχθεί το αίτημα"
+ "Πρόσβαση στην Αίθουσα"
+ "Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή ένας συντονιστής θα πρέπει να αποδεχτεί το αίτημα"
"Αίτημα συμμετοχής"
- "Για να είναι ορατό αυτό το δωμάτιο στον κατάλογο των δημόσιων δωματίων, θα χρειαστείς μια διεύθυνση δωματίου."
- "Διεύθυνση δωματίου"
- "Όνομα δωματίου"
- "Ορατότητα δωματίου"
- "Δημιούργησε ένα δωμάτιο"
+ "Για να είναι ορατή αυτή η αίθουσα στον δημόσιο κατάλογο αιθουσών, θα χρειαστείτε μια διεύθυνση αίθουσας."
+ "Διεύθυνση αίθουσας"
+ "Όνομα αίθουσας"
+ "Ορατότητα αίθουσας"
+ "Δημιουργία αίθουσας"
"Θέμα (προαιρετικό)"
- "Κατάλογος δωματίων"
+ "Κατάλογος αιθουσών"
"Παρουσιάστηκε σφάλμα κατά την προσπάθεια έναρξης μιας συνομιλίας"
- "Συμμετοχή σε δωμάτιο μέσω διεύθυνσης"
+ "Συμμετοχή σε αίθουσα μέσω διεύθυνσης"
"Μη έγκυρη διεύθυνση"
"Εισάγετε…"
- "Βρέθηκε το αντίστοιχο δωμάτιο"
- "Το δωμάτιο δε βρέθηκε"
- "π.χ. #όνομα-δωματίου:matrix.org"
+ "Βρέθηκε η αντίστοιχη αίθουσα"
+ "Η αίθουσα δεν βρέθηκε"
+ "π.χ. #όνομα-αίθουσας:matrix.org"
diff --git a/features/createroom/impl/src/main/res/values-fa/translations.xml b/features/createroom/impl/src/main/res/values-fa/translations.xml
index b807bfa189..03bc5c3f58 100644
--- a/features/createroom/impl/src/main/res/values-fa/translations.xml
+++ b/features/createroom/impl/src/main/res/values-fa/translations.xml
@@ -18,6 +18,7 @@
"ایجاد اتاق"
"موضوع (اختیاری)"
"فهرست اتاقها"
+ "هنگام تلاش برای شروع چت خطایی روی داد"
"پیوستن به اتاق با نشانی"
"نشانی معتبری نیست"
"ورود…"
diff --git a/features/createroom/impl/src/main/res/values-in/translations.xml b/features/createroom/impl/src/main/res/values-in/translations.xml
index 7fb8b685d2..65f135e617 100644
--- a/features/createroom/impl/src/main/res/values-in/translations.xml
+++ b/features/createroom/impl/src/main/res/values-in/translations.xml
@@ -14,10 +14,17 @@ Anda dapat mengubah ini kapan pun dalam pengaturan ruangan."
"Siapa pun dapat meminta untuk bergabung dengan ruangan tetapi administrator atau moderator harus menerima permintaan tersebut"
"Minta untuk bergabung"
"Supaya ruangan ini terlihat di direktori ruangan publik, Anda memerlukan alamat ruangan."
+ "Alamat ruangan"
"Nama ruangan"
"Keterlihatan ruangan"
"Buat ruangan"
"Topik (opsional)"
"Direktori ruangan"
"Terjadi kesalahan saat mencoba memulai obrolan"
+ "Bergabung dalam ruangan berdasarkan alamat"
+ "Bukan alamat yang valid"
+ "Masuk…"
+ "Ruangan yang cocok ditemukan"
+ "Ruangan tidak ditemukan"
+ "mis. #nama-ruangan:matrix.org"
diff --git a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationView.kt b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationView.kt
index 3b0d8b6e1a..af1bcdad8d 100644
--- a/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationView.kt
+++ b/features/deactivation/impl/src/main/kotlin/io/element/android/features/logout/impl/AccountDeactivationView.kt
@@ -57,7 +57,6 @@ import io.element.android.libraries.designsystem.modifiers.onTabOrEnterKeyFocusN
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.buildAnnotatedStringWithStyledPart
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -85,12 +84,7 @@ fun AccountDeactivationView(
navigationIcon = {
BackButton(onClick = onBackClick)
},
- title = {
- Text(
- text = stringResource(R.string.screen_deactivate_account_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_deactivate_account_title),
)
},
) { padding ->
diff --git a/features/deactivation/impl/src/main/res/values-bg/translations.xml b/features/deactivation/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..34ad5b4772
--- /dev/null
+++ b/features/deactivation/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,5 @@
+
+
+ "Моля, потвърдете, че искате да деактивирате акаунта си. Това действие не може да бъде отменено."
+ "Деактивиране на акаунта"
+
diff --git a/features/deactivation/impl/src/main/res/values-da/translations.xml b/features/deactivation/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..e9d5d9fdda
--- /dev/null
+++ b/features/deactivation/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,14 @@
+
+
+ "Bekræft venligst, at du vil deaktivere din konto. Denne handling kan ikke fortrydes."
+ "Slet alle mine beskeder"
+ "Advarsel: Fremtidige brugere kan muligvis se ufuldstændige samtaler."
+ "Deaktivering af din konto er %1$s, det vil:"
+ "irreversibel"
+ "%1$s din konto (du kan ikke logge ind igen, og dit ID kan ikke genbruges)."
+ "Deaktiver permanent"
+ "Fjern dig fra alle samtalerum"
+ "Slette dine kontooplysninger fra vores identitetsserver."
+ "Dine beskeder vil stadig være synlige for registrerede brugere, men vil ikke være tilgængelige for nye eller uregistrerede brugere, hvis du vælger at slette dem."
+ "Deaktiver konto"
+
diff --git a/features/deactivation/impl/src/main/res/values-el/translations.xml b/features/deactivation/impl/src/main/res/values-el/translations.xml
index 53bd1bbbea..ac645f3063 100644
--- a/features/deactivation/impl/src/main/res/values-el/translations.xml
+++ b/features/deactivation/impl/src/main/res/values-el/translations.xml
@@ -7,7 +7,7 @@
"μη αναστρέψιμο"
"%1$s τον λογαριασμό σου (δεν μπορείς να συνδεθείς ξανά και το αναγνωριστικό σου δεν μπορεί να επαναχρησιμοποιηθεί)."
"Μόνιμη απενεργοποίηση"
- "Σε αφαιρέσει από όλα τα δωμάτια συνομιλίας."
+ "Αποχώρησή σας από όλες τις αίθουσες συνομιλίας."
"Διαγράψει τα στοιχεία του λογαριασμού σου από τον διακομιστή ταυτότητάς μας."
"Τα μηνύματά σου θα εξακολουθούν να είναι ορατά στους εγγεγραμμένους χρήστες, αλλά δεν θα είναι διαθέσιμα σε νέους ή μη εγγεγραμμένους χρήστες εάν επιλέξεις να τα διαγράψεις."
"Απενεργοποίηση λογαριασμού"
diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt
index d15586038b..4e2a3cc1f2 100644
--- a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt
+++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/EnterpriseService.kt
@@ -16,8 +16,6 @@ interface EnterpriseService {
fun defaultHomeserverList(): List
suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String): Boolean
- suspend fun isElementCallAvailable(): Boolean
-
fun semanticColorsLight(): SemanticColors
fun semanticColorsDark(): SemanticColors
diff --git a/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt
new file mode 100644
index 0000000000..c67b94476b
--- /dev/null
+++ b/features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt
@@ -0,0 +1,12 @@
+/*
+ * Copyright 2025 New Vector 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.enterprise.api
+
+interface SessionEnterpriseService {
+ suspend fun isElementCallAvailable(): Boolean
+}
diff --git a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt
index 3b0995c81e..7f4f4b387b 100644
--- a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt
+++ b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultEnterpriseService.kt
@@ -25,8 +25,6 @@ class DefaultEnterpriseService @Inject constructor() : EnterpriseService {
override fun defaultHomeserverList(): List = emptyList()
override suspend fun isAllowedToConnectToHomeserver(homeserverUrl: String) = true
- override suspend fun isElementCallAvailable(): Boolean = true
-
override fun semanticColorsLight(): SemanticColors = compoundColorsLight
override fun semanticColorsDark(): SemanticColors = compoundColorsDark
diff --git a/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt
new file mode 100644
index 0000000000..2728bdad6a
--- /dev/null
+++ b/features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2025 New Vector 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.enterprise.impl
+
+import com.squareup.anvil.annotations.ContributesBinding
+import io.element.android.features.enterprise.api.SessionEnterpriseService
+import io.element.android.libraries.di.SessionScope
+import javax.inject.Inject
+
+@ContributesBinding(SessionScope::class)
+class DefaultSessionEnterpriseService @Inject constructor() : SessionEnterpriseService {
+ override suspend fun isElementCallAvailable(): Boolean = true
+}
diff --git a/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt
new file mode 100644
index 0000000000..b1e70ef045
--- /dev/null
+++ b/features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2025 New Vector 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.enterprise.impl
+
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+
+class DefaultSessionEnterpriseServiceTest {
+ @Test
+ fun `isElementCallAvailable is always true`() = runTest {
+ val service = DefaultSessionEnterpriseService()
+ assertThat(service.isElementCallAvailable()).isTrue()
+ }
+}
diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt
index bc90c77ada..14195e1243 100644
--- a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt
+++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeEnterpriseService.kt
@@ -18,7 +18,6 @@ class FakeEnterpriseService(
private val isEnterpriseUserResult: (SessionId) -> Boolean = { lambdaError() },
private val defaultHomeserverListResult: () -> List = { emptyList() },
private val isAllowedToConnectToHomeserverResult: (String) -> Boolean = { lambdaError() },
- private val isElementCallAvailableResult: () -> Boolean = { lambdaError() },
private val semanticColorsLightResult: () -> SemanticColors = { lambdaError() },
private val semanticColorsDarkResult: () -> SemanticColors = { lambdaError() },
private val firebasePushGatewayResult: () -> String? = { lambdaError() },
@@ -36,10 +35,6 @@ class FakeEnterpriseService(
isAllowedToConnectToHomeserverResult(homeserverUrl)
}
- override suspend fun isElementCallAvailable(): Boolean = simulateLongTask {
- isElementCallAvailableResult()
- }
-
override fun semanticColorsLight(): SemanticColors {
return semanticColorsLightResult()
}
diff --git a/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt
new file mode 100644
index 0000000000..a1e811ed10
--- /dev/null
+++ b/features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2025 New Vector 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.enterprise.test
+
+import io.element.android.features.enterprise.api.SessionEnterpriseService
+import io.element.android.tests.testutils.lambda.lambdaError
+import io.element.android.tests.testutils.simulateLongTask
+
+class FakeSessionEnterpriseService(
+ private val isElementCallAvailableResult: () -> Boolean = { lambdaError() },
+) : SessionEnterpriseService {
+ override suspend fun isElementCallAvailable(): Boolean = simulateLongTask {
+ isElementCallAvailableResult()
+ }
+}
diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInView.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInView.kt
index 69bca0250b..444c311a63 100644
--- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInView.kt
+++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/notifications/NotificationsOptInView.kt
@@ -38,6 +38,7 @@ import io.element.android.libraries.designsystem.components.PageTitle
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
@@ -149,6 +150,7 @@ private fun NotificationRow(
) {
Avatar(
avatarData = AvatarData(id = avatarColorsId, name = avatarLetter, size = AvatarSize.NotificationsOptIn),
+ avatarType = AvatarType.User,
)
Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(12.dp)) {
Box(
diff --git a/features/ftue/impl/src/main/res/values-bg/translations.xml b/features/ftue/impl/src/main/res/values-bg/translations.xml
index 180c2bb7c3..7918ac7a0c 100644
--- a/features/ftue/impl/src/main/res/values-bg/translations.xml
+++ b/features/ftue/impl/src/main/res/values-bg/translations.xml
@@ -1,5 +1,12 @@
+ "Не можете да потвърдите?"
+ "Потвърдете това устройство, за да настроите защитени съобщения."
+ "Потвърдете самоличността си"
+ "Използване на друго устройство"
+ "Използване на ключ за възстановяване"
+ "Устройството е потвърдено"
+ "Използване на друго устройство"
"Можете да промените настройките си по-късно."
"Разрешете известията и никога не пропускайте съобщение"
"Въвеждане на ключ за възстановяване"
diff --git a/features/ftue/impl/src/main/res/values-da/translations.xml b/features/ftue/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..b1ae89a3b4
--- /dev/null
+++ b/features/ftue/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,22 @@
+
+
+ "Kan ikke bekræfte?"
+ "Opret en ny gendannelsesnøgle"
+ "Verificér denne enhed for at konfigurere sikre meddelelser."
+ "Bekræft din identitet"
+ "Brug en anden enhed"
+ "Brug gendannelsesnøgle"
+ "Nu kan du læse eller sende beskeder sikkert, og enhver du samtaler med kan også stole på denne enhed."
+ "Enhed verificeret"
+ "Brug en anden enhed"
+ "Venter på en anden enhed…"
+ "Du kan ændre dine indstillinger senere."
+ "Tillad notifikationer, og gå aldrig glip af en besked"
+ "Indtast gendannelsesnøgle"
+ "Opkald, afstemninger, søgninger og mere vil blive tilføjet senere på året."
+ "Beskedhistorik for krypterede rum er ikke tilgængelig endnu."
+ "Vi vil meget gerne høre fra dig. Fortæl os din mening via indstillingssiden."
+ "Lad os komme i gang!"
+ "Her er, hvad du har brug for at vide:"
+ "Velkommen til %1$s!"
+
diff --git a/features/ftue/impl/src/main/res/values-el/translations.xml b/features/ftue/impl/src/main/res/values-el/translations.xml
index 82686850eb..585f5f0952 100644
--- a/features/ftue/impl/src/main/res/values-el/translations.xml
+++ b/features/ftue/impl/src/main/res/values-el/translations.xml
@@ -14,7 +14,7 @@
"Επέτρεψε τις ειδοποιήσεις και μην χάσεις ούτε ένα μήνυμα"
"Εισαγωγή κλειδιού ανάκτησης"
"Κλήσεις, δημοσκοπήσεις, αναζήτηση και άλλα, θα προστεθούν αργότερα φέτος."
- "Το ιστορικό μηνυμάτων για κρυπτογραφημένα δωμάτια δεν είναι ακόμα διαθέσιμο."
+ "Το ιστορικό μηνυμάτων για κρυπτογραφημένες αίθουσες δεν είναι ακόμη διαθέσιμο."
"Θα θέλαμε να ακούσουμε τη γνώμη σου, πες μας τη γνώμη σου μέσω της σελίδας ρυθμίσεων."
"Πάμε!"
"Να τί πρέπει να ξέρεις:"
diff --git a/features/ftue/impl/src/main/res/values-fa/translations.xml b/features/ftue/impl/src/main/res/values-fa/translations.xml
index c8de5e85ad..72151a1176 100644
--- a/features/ftue/impl/src/main/res/values-fa/translations.xml
+++ b/features/ftue/impl/src/main/res/values-fa/translations.xml
@@ -13,6 +13,9 @@
"میتوانید بعداً تنظیماتتان را تغییر دهید."
"اجازه به آگاهیها و از دست ندادن پیامها"
"ورود کلید بازیابی"
+ "تماس ها، نظرسنجی، جستجو و موارد دیگر در اواخر امسال اضافه خواهند شد."
+ "سابقه پیام برای اتاق های رمزگذاری شده هنوز دردسترس نیست."
+ "ما دوست داریم از شما بشنویم، نظر خود را از طریق صفحه تنظیمات با ما در میان بگذارید."
"بزن بریم!"
"چیزهایی که باید بدانید:"
"به %1$s خوش آمدید!"
diff --git a/features/roomlist/api/build.gradle.kts b/features/home/api/build.gradle.kts
similarity index 86%
rename from features/roomlist/api/build.gradle.kts
rename to features/home/api/build.gradle.kts
index e7486a80c0..c1aee95e67 100644
--- a/features/roomlist/api/build.gradle.kts
+++ b/features/home/api/build.gradle.kts
@@ -9,7 +9,7 @@ plugins {
}
android {
- namespace = "io.element.android.features.roomlist.api"
+ namespace = "io.element.android.features.home.api"
}
dependencies {
diff --git a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt
similarity index 91%
rename from features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt
rename to features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt
index 44a44f26cb..0f6ee581bb 100644
--- a/features/roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt
+++ b/features/home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.api
+package io.element.android.features.home.api
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
@@ -13,7 +13,7 @@ import com.bumble.appyx.core.plugin.Plugin
import io.element.android.libraries.architecture.FeatureEntryPoint
import io.element.android.libraries.matrix.api.core.RoomId
-interface RoomListEntryPoint : FeatureEntryPoint {
+interface HomeEntryPoint : FeatureEntryPoint {
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
interface NodeBuilder {
fun callback(callback: Callback): NodeBuilder
diff --git a/features/roomlist/impl/build.gradle.kts b/features/home/impl/build.gradle.kts
similarity index 95%
rename from features/roomlist/impl/build.gradle.kts
rename to features/home/impl/build.gradle.kts
index e0d795efd6..88184bcbcd 100644
--- a/features/roomlist/impl/build.gradle.kts
+++ b/features/home/impl/build.gradle.kts
@@ -13,7 +13,7 @@ plugins {
}
android {
- namespace = "io.element.android.features.roomlist.impl"
+ namespace = "io.element.android.features.home.impl"
testOptions {
unitTests {
@@ -51,8 +51,10 @@ dependencies {
implementation(projects.features.rageshake.api)
implementation(projects.services.analytics.api)
implementation(libs.androidx.datastore.preferences)
+ implementation(libs.haze)
+ implementation(libs.haze.materials)
implementation(projects.features.reportroom.api)
- api(projects.features.roomlist.api)
+ api(projects.features.home.api)
testImplementation(libs.androidx.compose.ui.test.junit)
testReleaseImplementation(libs.androidx.compose.ui.test.manifest)
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt
similarity index 62%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt
index cb97dda171..3fe5c533d7 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt
@@ -5,30 +5,30 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.squareup.anvil.annotations.ContributesBinding
-import io.element.android.features.roomlist.api.RoomListEntryPoint
+import io.element.android.features.home.api.HomeEntryPoint
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.di.AppScope
import javax.inject.Inject
@ContributesBinding(AppScope::class)
-class DefaultRoomListEntryPoint @Inject constructor() : RoomListEntryPoint {
- override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): RoomListEntryPoint.NodeBuilder {
+class DefaultHomeEntryPoint @Inject constructor() : HomeEntryPoint {
+ override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): HomeEntryPoint.NodeBuilder {
val plugins = ArrayList()
- return object : RoomListEntryPoint.NodeBuilder {
- override fun callback(callback: RoomListEntryPoint.Callback): RoomListEntryPoint.NodeBuilder {
+ return object : HomeEntryPoint.NodeBuilder {
+ override fun callback(callback: HomeEntryPoint.Callback): HomeEntryPoint.NodeBuilder {
plugins += callback
return this
}
override fun build(): Node {
- return parentNode.createNode(buildContext, plugins)
+ return parentNode.createNode(buildContext, plugins)
}
}
}
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt
new file mode 100644
index 0000000000..4632e40d5a
--- /dev/null
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt
@@ -0,0 +1,12 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+sealed interface HomeEvents {
+ data class SelectHomeNavigationBarItem(val item: HomeNavigationBarItem) : HomeEvents
+}
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt
similarity index 82%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListFlowNode.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt
index 208a90e606..4a7e5eb258 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListFlowNode.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl
import android.app.Activity
import android.os.Parcelable
@@ -24,14 +24,14 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.anvilannotations.ContributesNode
+import io.element.android.features.home.api.HomeEntryPoint
+import io.element.android.features.home.impl.components.RoomListMenuAction
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.features.invite.api.InviteData
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteView
import io.element.android.features.invite.api.declineandblock.DeclineInviteAndBlockEntryPoint
import io.element.android.features.logout.api.direct.DirectLogoutView
import io.element.android.features.reportroom.api.ReportRoomEntryPoint
-import io.element.android.features.roomlist.api.RoomListEntryPoint
-import io.element.android.features.roomlist.impl.components.RoomListMenuAction
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase
@@ -41,17 +41,17 @@ import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.parcelize.Parcelize
@ContributesNode(SessionScope::class)
-class RoomListFlowNode @AssistedInject constructor(
+class HomeFlowNode @AssistedInject constructor(
@Assisted buildContext: BuildContext,
@Assisted plugins: List,
- private val presenter: RoomListPresenter,
+ private val presenter: HomePresenter,
private val inviteFriendsUseCase: InviteFriendsUseCase,
private val analyticsService: AnalyticsService,
private val acceptDeclineInviteView: AcceptDeclineInviteView,
private val directLogoutView: DirectLogoutView,
private val reportRoomEntryPoint: ReportRoomEntryPoint,
private val declineInviteAndBlockUserEntryPoint: DeclineInviteAndBlockEntryPoint,
-) : BaseFlowNode(
+) : BaseFlowNode(
backstack = BackStack(
initialElement = NavTarget.Root,
savedStateMap = buildContext.savedStateMap,
@@ -79,27 +79,27 @@ class RoomListFlowNode @AssistedInject constructor(
}
private fun onRoomClick(roomId: RoomId) {
- plugins().forEach { it.onRoomClick(roomId) }
+ plugins().forEach { it.onRoomClick(roomId) }
}
private fun onOpenSettings() {
- plugins().forEach { it.onSettingsClick() }
+ plugins().forEach { it.onSettingsClick() }
}
private fun onCreateRoomClick() {
- plugins().forEach { it.onCreateRoomClick() }
+ plugins().forEach { it.onCreateRoomClick() }
}
private fun onSetUpRecoveryClick() {
- plugins().forEach { it.onSetUpRecoveryClick() }
+ plugins().forEach { it.onSetUpRecoveryClick() }
}
private fun onSessionConfirmRecoveryKeyClick() {
- plugins().forEach { it.onSessionConfirmRecoveryKeyClick() }
+ plugins().forEach { it.onSessionConfirmRecoveryKeyClick() }
}
private fun onRoomSettingsClick(roomId: RoomId) {
- plugins().forEach { it.onRoomSettingsClick(roomId) }
+ plugins().forEach { it.onRoomSettingsClick(roomId) }
}
private fun onReportRoomClick(roomId: RoomId) {
@@ -116,7 +116,7 @@ class RoomListFlowNode @AssistedInject constructor(
inviteFriendsUseCase.execute(activity)
}
RoomListMenuAction.ReportBug -> {
- plugins().forEach { it.onReportBugClick() }
+ plugins().forEach { it.onReportBugClick() }
}
}
}
@@ -126,8 +126,8 @@ class RoomListFlowNode @AssistedInject constructor(
val state = presenter.present()
val activity = requireNotNull(LocalActivity.current)
- RoomListView(
- state = state,
+ HomeView(
+ homeState = state,
onRoomClick = this::onRoomClick,
onSettingsClick = this::onOpenSettings,
onCreateRoomClick = this::onCreateRoomClick,
@@ -140,7 +140,7 @@ class RoomListFlowNode @AssistedInject constructor(
modifier = modifier,
) {
acceptDeclineInviteView.Render(
- state = state.acceptDeclineInviteState,
+ state = state.roomListState.acceptDeclineInviteState,
onAcceptInviteSuccess = this::onRoomClick,
onDeclineInviteSuccess = { },
modifier = Modifier
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeNavigationBarItem.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeNavigationBarItem.kt
new file mode 100644
index 0000000000..5254648f24
--- /dev/null
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeNavigationBarItem.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+import androidx.annotation.StringRes
+import androidx.compose.runtime.Composable
+import io.element.android.compound.tokens.generated.CompoundIcons
+
+enum class HomeNavigationBarItem(
+ @StringRes
+ val labelRes: Int,
+) {
+ Chats(
+ labelRes = R.string.screen_roomlist_main_space_title
+ ),
+ Spaces(
+ // TODO Create a new entry in Localazy
+ labelRes = R.string.screen_roomlist_main_space_title
+ );
+
+ @Composable
+ fun icon() = when (this) {
+ Chats -> CompoundIcons.ChatSolid()
+ // TODO Spaces -> CompoundIcons.Workspace()
+ Spaces -> CompoundIcons.Code()
+ }
+
+ companion object {
+ fun from(index: Int): HomeNavigationBarItem {
+ return entries.getOrElse(index) { Chats }
+ }
+ }
+}
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt
new file mode 100644
index 0000000000..894ed29e8d
--- /dev/null
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import io.element.android.features.home.impl.roomlist.RoomListState
+import io.element.android.features.logout.api.direct.DirectLogoutState
+import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
+import io.element.android.libraries.architecture.Presenter
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
+import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState
+import io.element.android.libraries.featureflag.api.FeatureFlagService
+import io.element.android.libraries.featureflag.api.FeatureFlags
+import io.element.android.libraries.indicator.api.IndicatorService
+import io.element.android.libraries.matrix.api.MatrixClient
+import io.element.android.libraries.matrix.api.sync.SyncService
+import javax.inject.Inject
+
+class HomePresenter @Inject constructor(
+ private val client: MatrixClient,
+ private val syncService: SyncService,
+ private val snackbarDispatcher: SnackbarDispatcher,
+ private val indicatorService: IndicatorService,
+ private val roomListPresenter: Presenter,
+ private val logoutPresenter: Presenter,
+ private val rageshakeFeatureAvailability: RageshakeFeatureAvailability,
+ private val featureFlagService: FeatureFlagService,
+) : Presenter {
+ @Composable
+ override fun present(): HomeState {
+ val matrixUser = client.userProfile.collectAsState()
+ val isOnline by syncService.isOnline.collectAsState()
+ val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() }
+ val roomListState = roomListPresenter.present()
+ val isSpaceFeatureEnabled by remember {
+ featureFlagService.isFeatureEnabledFlow(FeatureFlags.Space)
+ }.collectAsState(initial = false)
+ var currentHomeNavigationBarItemOrdinal by rememberSaveable { mutableIntStateOf(HomeNavigationBarItem.Chats.ordinal) }
+ val currentHomeNavigationBarItem by remember {
+ derivedStateOf {
+ HomeNavigationBarItem.from(currentHomeNavigationBarItemOrdinal)
+ }
+ }
+ LaunchedEffect(Unit) {
+ // Force a refresh of the profile
+ client.getUserProfile()
+ }
+ // Avatar indicator
+ val showAvatarIndicator by indicatorService.showRoomListTopBarIndicator()
+ val directLogoutState = logoutPresenter.present()
+
+ fun handleEvents(event: HomeEvents) {
+ when (event) {
+ is HomeEvents.SelectHomeNavigationBarItem -> {
+ currentHomeNavigationBarItemOrdinal = event.item.ordinal
+ }
+ }
+ }
+
+ val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
+ return HomeState(
+ matrixUser = matrixUser.value,
+ showAvatarIndicator = showAvatarIndicator,
+ hasNetworkConnection = isOnline,
+ currentHomeNavigationBarItem = currentHomeNavigationBarItem,
+ roomListState = roomListState,
+ snackbarMessage = snackbarMessage,
+ canReportBug = canReportBug,
+ directLogoutState = directLogoutState,
+ isSpaceFeatureEnabled = isSpaceFeatureEnabled,
+ eventSink = ::handleEvents,
+ )
+ }
+}
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt
new file mode 100644
index 0000000000..5e6c16d2e4
--- /dev/null
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2023, 2024 New Vector 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.home.impl
+
+import androidx.compose.runtime.Immutable
+import io.element.android.features.home.impl.roomlist.RoomListState
+import io.element.android.features.logout.api.direct.DirectLogoutState
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
+import io.element.android.libraries.matrix.api.user.MatrixUser
+
+@Immutable
+data class HomeState(
+ val matrixUser: MatrixUser,
+ val showAvatarIndicator: Boolean,
+ val hasNetworkConnection: Boolean,
+ val currentHomeNavigationBarItem: HomeNavigationBarItem,
+ val roomListState: RoomListState,
+ val snackbarMessage: SnackbarMessage?,
+ val canReportBug: Boolean,
+ val directLogoutState: DirectLogoutState,
+ val isSpaceFeatureEnabled: Boolean,
+ val eventSink: (HomeEvents) -> Unit,
+) {
+ val displayActions = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats
+}
diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt
new file mode 100644
index 0000000000..7a50296e17
--- /dev/null
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import io.element.android.features.home.impl.roomlist.RoomListState
+import io.element.android.features.home.impl.roomlist.RoomListStateProvider
+import io.element.android.features.home.impl.roomlist.aRoomListState
+import io.element.android.features.home.impl.roomlist.aRoomsContentState
+import io.element.android.features.home.impl.roomlist.generateRoomListRoomSummaryList
+import io.element.android.features.logout.api.direct.DirectLogoutState
+import io.element.android.features.logout.api.direct.aDirectLogoutState
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
+import io.element.android.libraries.matrix.api.core.UserId
+import io.element.android.libraries.matrix.api.user.MatrixUser
+import io.element.android.libraries.ui.strings.CommonStrings
+
+open class HomeStateProvider : PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(
+ aHomeState(),
+ aHomeState(hasNetworkConnection = false),
+ aHomeState(snackbarMessage = SnackbarMessage(CommonStrings.common_verification_complete)),
+ aHomeState(
+ isSpaceFeatureEnabled = true,
+ roomListState = aRoomListState(
+ // Add more rooms to see the blur effect under the NavigationBar
+ contentState = aRoomsContentState(
+ summaries = generateRoomListRoomSummaryList(),
+ )
+ ),
+ ),
+ aHomeState(
+ isSpaceFeatureEnabled = true,
+ currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces,
+ ),
+ ) + RoomListStateProvider().values.map {
+ aHomeState(roomListState = it)
+ }
+}
+
+internal fun aHomeState(
+ matrixUser: MatrixUser = MatrixUser(userId = UserId("@id:domain"), displayName = "User#1"),
+ showAvatarIndicator: Boolean = false,
+ hasNetworkConnection: Boolean = true,
+ snackbarMessage: SnackbarMessage? = null,
+ currentHomeNavigationBarItem: HomeNavigationBarItem = HomeNavigationBarItem.Chats,
+ roomListState: RoomListState = aRoomListState(),
+ canReportBug: Boolean = true,
+ isSpaceFeatureEnabled: Boolean = false,
+ directLogoutState: DirectLogoutState = aDirectLogoutState(),
+ eventSink: (HomeEvents) -> Unit = {}
+) = HomeState(
+ matrixUser = matrixUser,
+ showAvatarIndicator = showAvatarIndicator,
+ hasNetworkConnection = hasNetworkConnection,
+ snackbarMessage = snackbarMessage,
+ canReportBug = canReportBug,
+ directLogoutState = directLogoutState,
+ currentHomeNavigationBarItem = currentHomeNavigationBarItem,
+ roomListState = roomListState,
+ isSpaceFeatureEnabled = isSpaceFeatureEnabled,
+ eventSink = eventSink,
+)
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt
similarity index 53%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt
index b00796c1fe..fb5b9c9ae3 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt
@@ -5,10 +5,15 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+@file:OptIn(ExperimentalHazeMaterialsApi::class)
+package io.element.android.features.home.impl
+
+import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
@@ -19,32 +24,48 @@ import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
+import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
+import androidx.compose.ui.unit.dp
+import dev.chrisbanes.haze.hazeEffect
+import dev.chrisbanes.haze.hazeSource
+import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
+import dev.chrisbanes.haze.materials.HazeMaterials
+import dev.chrisbanes.haze.rememberHazeState
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.features.home.impl.components.RoomListContentView
+import io.element.android.features.home.impl.components.RoomListMenuAction
+import io.element.android.features.home.impl.components.RoomListTopBar
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.roomlist.RoomListContextMenu
+import io.element.android.features.home.impl.roomlist.RoomListDeclineInviteMenu
+import io.element.android.features.home.impl.roomlist.RoomListEvents
+import io.element.android.features.home.impl.roomlist.RoomListState
+import io.element.android.features.home.impl.search.RoomListSearchView
import io.element.android.features.leaveroom.api.LeaveRoomView
import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorContainer
-import io.element.android.features.roomlist.impl.components.RoomListContentView
-import io.element.android.features.roomlist.impl.components.RoomListMenuAction
-import io.element.android.features.roomlist.impl.components.RoomListTopBar
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.search.RoomListSearchView
import io.element.android.libraries.androidutils.throttler.FirstThrottler
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
import io.element.android.libraries.designsystem.theme.components.Icon
+import io.element.android.libraries.designsystem.theme.components.NavigationBar
+import io.element.android.libraries.designsystem.theme.components.NavigationBarItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
+import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost
import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState
import io.element.android.libraries.matrix.api.core.RoomId
@Composable
-fun RoomListView(
- state: RoomListState,
+fun HomeView(
+ homeState: HomeState,
onRoomClick: (RoomId) -> Unit,
onSettingsClick: () -> Unit,
onSetUpRecoveryClick: () -> Unit,
@@ -57,12 +78,13 @@ fun RoomListView(
modifier: Modifier = Modifier,
acceptDeclineInviteView: @Composable () -> Unit,
) {
+ val state: RoomListState = homeState.roomListState
val coroutineScope = rememberCoroutineScope()
val firstThrottler = remember { FirstThrottler(300, coroutineScope) }
ConnectivityIndicatorContainer(
modifier = modifier,
- isOnline = state.hasNetworkConnection,
+ isOnline = homeState.hasNetworkConnection,
) { topPadding ->
Box {
if (state.contextMenu is RoomListState.ContextMenu.Shown) {
@@ -85,8 +107,8 @@ fun RoomListView(
LeaveRoomView(state = state.leaveRoomState)
- RoomListScaffold(
- state = state,
+ HomeScaffold(
+ state = homeState,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = { if (firstThrottler.canHandle()) onRoomClick(it) },
@@ -114,8 +136,8 @@ fun RoomListView(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
-private fun RoomListScaffold(
- state: RoomListState,
+private fun HomeScaffold(
+ state: HomeState,
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomId) -> Unit,
@@ -131,38 +153,106 @@ private fun RoomListScaffold(
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(appBarState)
val snackbarHostState = rememberSnackbarHostState(snackbarMessage = state.snackbarMessage)
+ val roomListState: RoomListState = state.roomListState
+
+ BackHandler(
+ enabled = state.currentHomeNavigationBarItem != HomeNavigationBarItem.Chats,
+ ) {
+ state.eventSink(HomeEvents.SelectHomeNavigationBarItem(HomeNavigationBarItem.Chats))
+ }
+
+ val hazeState = rememberHazeState()
Scaffold(
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
RoomListTopBar(
+ title = stringResource(state.currentHomeNavigationBarItem.labelRes),
matrixUser = state.matrixUser,
showAvatarIndicator = state.showAvatarIndicator,
- areSearchResultsDisplayed = state.searchState.isSearchActive,
- onToggleSearch = { state.eventSink(RoomListEvents.ToggleSearchResults) },
+ areSearchResultsDisplayed = roomListState.searchState.isSearchActive,
+ onToggleSearch = { roomListState.eventSink(RoomListEvents.ToggleSearchResults) },
onMenuActionClick = onMenuActionClick,
onOpenSettings = onOpenSettings,
scrollBehavior = scrollBehavior,
displayMenuItems = state.displayActions,
- displayFilters = state.displayFilters,
- filtersState = state.filtersState,
+ displayFilters = roomListState.displayFilters && state.currentHomeNavigationBarItem == HomeNavigationBarItem.Chats,
+ filtersState = roomListState.filtersState,
canReportBug = state.canReportBug,
)
},
+ bottomBar = {
+ if (state.isSpaceFeatureEnabled) {
+ NavigationBar(
+ containerColor = Color.Transparent,
+ modifier = Modifier
+ .hazeEffect(
+ state = hazeState,
+ style = HazeMaterials.regular(),
+ )
+ ) {
+ HomeNavigationBarItem.entries.forEach { item ->
+ NavigationBarItem(
+ selected = state.currentHomeNavigationBarItem == item,
+ onClick = {
+ state.eventSink(HomeEvents.SelectHomeNavigationBarItem(item))
+ },
+ icon = {
+ Icon(
+ imageVector = item.icon(),
+ contentDescription = null
+ )
+ },
+ label = {
+ Text(stringResource(item.labelRes))
+ }
+ )
+ }
+ }
+ }
+ },
content = { padding ->
- RoomListContentView(
- contentState = state.contentState,
- filtersState = state.filtersState,
- hideInvitesAvatars = state.hideInvitesAvatars,
- eventSink = state.eventSink,
- onSetUpRecoveryClick = onSetUpRecoveryClick,
- onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
- onRoomClick = ::onRoomClick,
- onCreateRoomClick = onCreateRoomClick,
- modifier = Modifier
- .padding(padding)
- .consumeWindowInsets(padding)
- )
+ when (state.currentHomeNavigationBarItem) {
+ HomeNavigationBarItem.Chats -> {
+ RoomListContentView(
+ contentState = roomListState.contentState,
+ filtersState = roomListState.filtersState,
+ hideInvitesAvatars = roomListState.hideInvitesAvatars,
+ eventSink = roomListState.eventSink,
+ onSetUpRecoveryClick = onSetUpRecoveryClick,
+ onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
+ onRoomClick = ::onRoomClick,
+ onCreateRoomClick = onCreateRoomClick,
+ // FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80,
+ // and include provided bottom padding
+ contentBottomPadding = 80.dp + padding.calculateBottomPadding(),
+ modifier = Modifier
+ .padding(
+ top = padding.calculateTopPadding(),
+ bottom = 0.dp,
+ start = padding.calculateStartPadding(LocalLayoutDirection.current),
+ end = padding.calculateEndPadding(LocalLayoutDirection.current),
+ )
+ .consumeWindowInsets(padding)
+ .hazeSource(state = hazeState)
+ )
+ }
+ HomeNavigationBarItem.Spaces -> {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(padding)
+ .consumeWindowInsets(padding)
+ ) {
+ Text(
+ modifier = Modifier.align(Alignment.Center),
+ text = "Spaces are coming soon!",
+ style = ElementTheme.typography.fontBodyLgRegular,
+ color = ElementTheme.colors.textPrimary,
+ )
+ }
+ }
+ }
},
floatingActionButton = {
if (state.displayActions) {
@@ -186,9 +276,9 @@ internal fun RoomListRoomSummary.contentType() = displayType.ordinal
@PreviewsDayNight
@Composable
-internal fun RoomListViewPreview(@PreviewParameter(RoomListStateProvider::class) state: RoomListState) = ElementPreview {
- RoomListView(
- state = state,
+internal fun HomeViewPreview(@PreviewParameter(HomeStateProvider::class) state: HomeState) = ElementPreview {
+ HomeView(
+ homeState = state,
onRoomClick = {},
onSettingsClick = {},
onSetUpRecoveryClick = {},
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BannerPadding.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BannerPadding.kt
similarity index 88%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BannerPadding.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BannerPadding.kt
index a609d5dc7d..389c2aecfb 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BannerPadding.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BannerPadding.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.foundation.layout.padding
import androidx.compose.ui.Modifier
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BatteryOptimizationBanner.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BatteryOptimizationBanner.kt
similarity index 93%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BatteryOptimizationBanner.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BatteryOptimizationBanner.kt
index 8fde1834d2..017ca9592d 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/BatteryOptimizationBanner.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/BatteryOptimizationBanner.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.components.Announcement
import io.element.android.libraries.designsystem.components.AnnouncementType
import io.element.android.libraries.designsystem.preview.ElementPreview
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/ConfirmRecoveryKeyBanner.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/ConfirmRecoveryKeyBanner.kt
similarity index 92%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/ConfirmRecoveryKeyBanner.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/ConfirmRecoveryKeyBanner.kt
index 3ae7750fa3..c833e2914a 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/ConfirmRecoveryKeyBanner.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/ConfirmRecoveryKeyBanner.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.components.Announcement
import io.element.android.libraries.designsystem.components.AnnouncementType
import io.element.android.libraries.designsystem.preview.ElementPreview
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/FullScreenIntentPermissionBanner.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/FullScreenIntentPermissionBanner.kt
similarity index 94%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/FullScreenIntentPermissionBanner.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/FullScreenIntentPermissionBanner.kt
index 339b5f4fa6..e89392da62 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/FullScreenIntentPermissionBanner.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/FullScreenIntentPermissionBanner.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.components.Announcement
import io.element.android.libraries.designsystem.components.AnnouncementType
import io.element.android.libraries.designsystem.preview.ElementPreview
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt
similarity index 88%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt
index b27f21c7f6..993fb0b85c 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Arrangement
@@ -31,22 +31,23 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
-import io.element.android.features.roomlist.impl.R
-import io.element.android.features.roomlist.impl.RoomListContentState
-import io.element.android.features.roomlist.impl.RoomListContentStateProvider
-import io.element.android.features.roomlist.impl.RoomListEvents
-import io.element.android.features.roomlist.impl.SecurityBannerState
-import io.element.android.features.roomlist.impl.contentType
-import io.element.android.features.roomlist.impl.filters.RoomListFilter
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersEmptyStateResources
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.filters.aRoomListFiltersState
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionState
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.contentType
+import io.element.android.features.home.impl.filters.RoomListFilter
+import io.element.android.features.home.impl.filters.RoomListFiltersEmptyStateResources
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.filters.aRoomListFiltersState
+import io.element.android.features.home.impl.filters.selection.FilterSelectionState
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.roomlist.RoomListContentState
+import io.element.android.features.home.impl.roomlist.RoomListContentStateProvider
+import io.element.android.features.home.impl.roomlist.RoomListEvents
+import io.element.android.features.home.impl.roomlist.SecurityBannerState
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
@@ -66,6 +67,7 @@ fun RoomListContentView(
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
onCreateRoomClick: () -> Unit,
+ contentBottomPadding: Dp,
modifier: Modifier = Modifier,
) {
Box(modifier = modifier) {
@@ -93,6 +95,7 @@ fun RoomListContentView(
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = onRoomClick,
+ contentBottomPadding = contentBottomPadding,
)
}
}
@@ -164,6 +167,7 @@ private fun RoomsView(
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
+ contentBottomPadding: Dp,
modifier: Modifier = Modifier,
) {
if (state.summaries.isEmpty() && filtersState.hasAnyFilterSelected) {
@@ -179,6 +183,7 @@ private fun RoomsView(
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = onRoomClick,
+ contentBottomPadding = contentBottomPadding,
modifier = modifier.fillMaxSize(),
)
}
@@ -192,6 +197,7 @@ private fun RoomsViewList(
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onRoomClick: (RoomListRoomSummary) -> Unit,
+ contentBottomPadding: Dp,
modifier: Modifier = Modifier,
) {
val lazyListState = rememberLazyListState()
@@ -210,8 +216,7 @@ private fun RoomsViewList(
LazyColumn(
state = lazyListState,
modifier = modifier,
- // FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80
- contentPadding = PaddingValues(bottom = 80.dp)
+ contentPadding = PaddingValues(bottom = contentBottomPadding)
) {
when (state.securityBannerState) {
SecurityBannerState.SetUpRecovery -> {
@@ -311,7 +316,12 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr
RoomListContentView(
contentState = state,
filtersState = aRoomListFiltersState(
- filterSelectionStates = RoomListFilter.entries.map { FilterSelectionState(it, isSelected = true) }
+ filterSelectionStates = RoomListFilter.entries.map {
+ FilterSelectionState(
+ filter = it,
+ isSelected = true
+ )
+ }
),
hideInvitesAvatars = false,
eventSink = {},
@@ -319,5 +329,6 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr
onConfirmRecoveryKeyClick = {},
onRoomClick = {},
onCreateRoomClick = {},
+ contentBottomPadding = 0.dp,
)
}
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListMenuAction.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListMenuAction.kt
similarity index 81%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListMenuAction.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListMenuAction.kt
index 14f46098ac..9f17fc835e 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListMenuAction.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListMenuAction.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
enum class RoomListMenuAction {
InviteFriends,
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt
similarity index 93%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt
index 1f4c86f579..8071dead3d 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -34,20 +34,23 @@ import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import io.element.android.appconfig.RoomListConfig
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
-import io.element.android.features.roomlist.impl.R
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersView
-import io.element.android.features.roomlist.impl.filters.aRoomListFiltersState
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.filters.RoomListFiltersView
+import io.element.android.features.home.impl.filters.aRoomListFiltersState
import io.element.android.libraries.designsystem.atomic.atoms.RedIndicatorAtom
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatarBloom
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -75,6 +78,7 @@ private val avatarBloomSize = 430.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RoomListTopBar(
+ title: String,
matrixUser: MatrixUser,
showAvatarIndicator: Boolean,
areSearchResultsDisplayed: Boolean,
@@ -89,6 +93,7 @@ fun RoomListTopBar(
modifier: Modifier = Modifier,
) {
DefaultRoomListTopBar(
+ title = title,
matrixUser = matrixUser,
showAvatarIndicator = showAvatarIndicator,
areSearchResultsDisplayed = areSearchResultsDisplayed,
@@ -107,6 +112,7 @@ fun RoomListTopBar(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DefaultRoomListTopBar(
+ title: String,
matrixUser: MatrixUser,
showAvatarIndicator: Boolean,
areSearchResultsDisplayed: Boolean,
@@ -193,7 +199,12 @@ private fun DefaultRoomListTopBar(
scrolledContainerColor = Color.Transparent,
),
title = {
- Text(text = stringResource(id = R.string.screen_roomlist_main_space_title))
+ Text(
+ modifier = Modifier.semantics {
+ heading()
+ },
+ text = title,
+ )
},
navigationIcon = {
NavigationIcon(
@@ -297,6 +308,7 @@ private fun NavigationIcon(
Box {
Avatar(
avatarData = avatarData,
+ avatarType = AvatarType.User,
contentDescription = stringResource(CommonStrings.common_settings),
)
if (showAvatarIndicator) {
@@ -313,6 +325,7 @@ private fun NavigationIcon(
@Composable
internal fun DefaultRoomListTopBarPreview() = ElementPreview {
DefaultRoomListTopBar(
+ title = stringResource(R.string.screen_roomlist_main_space_title),
matrixUser = MatrixUser(UserId("@id:domain"), "Alice"),
showAvatarIndicator = false,
areSearchResultsDisplayed = false,
@@ -332,6 +345,7 @@ internal fun DefaultRoomListTopBarPreview() = ElementPreview {
@Composable
internal fun DefaultRoomListTopBarWithIndicatorPreview() = ElementPreview {
DefaultRoomListTopBar(
+ title = stringResource(R.string.screen_roomlist_main_space_title),
matrixUser = MatrixUser(UserId("@id:domain"), "Alice"),
showAvatarIndicator = true,
areSearchResultsDisplayed = false,
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryPlaceholderRow.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryPlaceholderRow.kt
similarity index 98%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryPlaceholderRow.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryPlaceholderRow.kt
index af980c1b09..f07fe880b3 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryPlaceholderRow.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryPlaceholderRow.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt
similarity index 94%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt
index 1be57d631a..e5a85a7442 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -37,14 +37,15 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
-import io.element.android.features.roomlist.impl.R
-import io.element.android.features.roomlist.impl.RoomListEvents
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryProvider
-import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummaryProvider
+import io.element.android.features.home.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.roomlist.RoomListEvents
import io.element.android.libraries.core.extensions.orEmpty
import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom
-import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
+import io.element.android.libraries.designsystem.components.avatar.Avatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
@@ -172,6 +173,7 @@ private fun RoomSummaryScaffoldRow(
val clickModifier = Modifier.combinedClickable(
onClick = { onClick(room) },
onLongClick = { onLongClick(room) },
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
indication = ripple(),
interactionSource = remember { MutableInteractionSource() }
)
@@ -184,11 +186,13 @@ private fun RoomSummaryScaffoldRow(
.padding(horizontal = 16.dp, vertical = 11.dp)
.height(IntrinsicSize.Min),
) {
- RoomAvatar(
+ Avatar(
avatarData = room.avatarData,
- heroes = room.heroes,
- isTombstoned = room.isTombstoned,
- hideAvatarImage = hideAvatarImage,
+ avatarType = AvatarType.Room(
+ heroes = room.heroes,
+ isTombstoned = room.isTombstoned,
+ ),
+ hideImage = hideAvatarImage,
)
Spacer(modifier = Modifier.width(16.dp))
Column(
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/SetUpRecoveryKeyBanner.kt
similarity index 92%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/SetUpRecoveryKeyBanner.kt
index e1d251de8b..37aed6d130 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/SetUpRecoveryKeyBanner.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/SetUpRecoveryKeyBanner.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.components
+package io.element.android.features.home.impl.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.components.Announcement
import io.element.android.libraries.designsystem.components.AnnouncementType
import io.element.android.libraries.designsystem.preview.ElementPreview
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSource.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
similarity index 97%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSource.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
index 6d59837988..dcda64ca9c 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSource.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSource.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.datasource
+package io.element.android.features.home.impl.datasource
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.androidutils.diff.DiffCacheUpdater
import io.element.android.libraries.androidutils.diff.MutableListDiffCache
import io.element.android.libraries.androidutils.system.DateTimeObserver
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactory.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt
similarity index 93%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactory.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt
index 98b7f8d853..3d77662188 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactory.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.datasource
+package io.element.android.features.home.impl.datasource
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.libraries.core.extensions.orEmpty
import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.api.DateFormatterMode
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/di/RoomListModule.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt
similarity index 53%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/di/RoomListModule.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt
index a9c2f1c80b..ef64512462 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/di/RoomListModule.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt
@@ -5,21 +5,26 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.di
+package io.element.android.features.home.impl.di
import com.squareup.anvil.annotations.ContributesTo
import dagger.Binds
import dagger.Module
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersPresenter
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.search.RoomListSearchPresenter
-import io.element.android.features.roomlist.impl.search.RoomListSearchState
+import io.element.android.features.home.impl.filters.RoomListFiltersPresenter
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.roomlist.RoomListPresenter
+import io.element.android.features.home.impl.roomlist.RoomListState
+import io.element.android.features.home.impl.search.RoomListSearchPresenter
+import io.element.android.features.home.impl.search.RoomListSearchState
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.di.SessionScope
@ContributesTo(SessionScope::class)
@Module
interface RoomListModule {
+ @Binds
+ fun bindRoomListPresenter(presenter: RoomListPresenter): Presenter
+
@Binds
fun bindSearchPresenter(presenter: RoomListSearchPresenter): Presenter
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFilter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFilter.kt
similarity index 90%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFilter.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFilter.kt
index 324dd1eb3d..2c7ebc3573 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFilter.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFilter.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
/**
* Enum class representing the different filters that can be applied to the room list.
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResources.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResources.kt
similarity index 96%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResources.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResources.kt
index a0c4878715..61436a0054 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResources.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResources.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import androidx.annotation.StringRes
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
/**
* Holds the resources for the empty state when filters are applied to the room list.
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEvents.kt
similarity index 86%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEvents.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEvents.kt
index 42559995f6..13fcc656e8 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEvents.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEvents.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
sealed interface RoomListFiltersEvents {
data class ToggleFilter(val filter: RoomListFilter) : RoomListFiltersEvents
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenter.kt
similarity index 94%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenter.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenter.kt
index 0213d3fc15..de3f7eaa0b 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenter.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenter.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.produceState
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionStrategy
+import io.element.android.features.home.impl.filters.selection.FilterSelectionStrategy
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.roomlist.RoomListService
import kotlinx.collections.immutable.toPersistentList
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersState.kt
similarity index 83%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersState.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersState.kt
index 3e72aa680b..bb4146ce84 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersState.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersState.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionState
+import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersStateProvider.kt
similarity index 87%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersStateProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersStateProvider.kt
index e104651af9..8cba01163c 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersStateProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersStateProvider.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionState
+import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import kotlinx.collections.immutable.toImmutableList
class RoomListFiltersStateProvider : PreviewParameterProvider {
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt
similarity index 97%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt
index 214ac44cfd..91b00b1180 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.Spring
@@ -40,6 +40,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -147,7 +148,7 @@ private fun RoomListClearFiltersButton(
modifier = Modifier.align(Alignment.Center),
imageVector = CompoundIcons.Close(),
tint = ElementTheme.colors.iconOnSolidPrimary,
- contentDescription = stringResource(id = io.element.android.libraries.ui.strings.R.string.action_clear),
+ contentDescription = stringResource(id = R.string.screen_roomlist_clear_filters),
)
}
}
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/DefaultFilterSelectionStrategy.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/DefaultFilterSelectionStrategy.kt
similarity index 92%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/DefaultFilterSelectionStrategy.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/DefaultFilterSelectionStrategy.kt
index c89615fea7..26a77da5c7 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/DefaultFilterSelectionStrategy.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/DefaultFilterSelectionStrategy.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters.selection
+package io.element.android.features.home.impl.filters.selection
import com.squareup.anvil.annotations.ContributesBinding
-import io.element.android.features.roomlist.impl.filters.RoomListFilter
+import io.element.android.features.home.impl.filters.RoomListFilter
import io.element.android.libraries.di.SessionScope
import kotlinx.coroutines.flow.MutableStateFlow
import javax.inject.Inject
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionState.kt
similarity index 67%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionState.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionState.kt
index 62ed9f08a3..d604e51f84 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionState.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionState.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters.selection
+package io.element.android.features.home.impl.filters.selection
-import io.element.android.features.roomlist.impl.filters.RoomListFilter
+import io.element.android.features.home.impl.filters.RoomListFilter
data class FilterSelectionState(
val filter: RoomListFilter,
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionStrategy.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionStrategy.kt
similarity index 82%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionStrategy.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionStrategy.kt
index c8d3c09fec..8396a4e2a2 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/selection/FilterSelectionStrategy.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/selection/FilterSelectionStrategy.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters.selection
+package io.element.android.features.home.impl.filters.selection
-import io.element.android.features.roomlist.impl.filters.RoomListFilter
+import io.element.android.features.home.impl.filters.RoomListFilter
import kotlinx.coroutines.flow.StateFlow
interface FilterSelectionStrategy {
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummary.kt
similarity index 97%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummary.kt
index 4b2c1e7afc..3f166a66b4 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummary.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.model
+package io.element.android.features.home.impl.model
import androidx.compose.runtime.Immutable
import io.element.android.features.invite.api.InviteData
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummaryProvider.kt
similarity index 99%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummaryProvider.kt
index 111c4bc86b..f06e5a1a27 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummaryProvider.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.model
+package io.element.android.features.home.impl.model
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.avatar.AvatarData
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomSummaryDisplayType.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomSummaryDisplayType.kt
similarity index 86%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomSummaryDisplayType.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomSummaryDisplayType.kt
index 4b472d8847..8fcef46faf 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomSummaryDisplayType.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomSummaryDisplayType.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.model
+package io.element.android.features.home.impl.model
/**
* Represents the type of display for a room list item.
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt
similarity index 94%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt
index 5825c0a1e5..a421c239cb 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
import io.element.android.libraries.fullscreenintent.api.aFullScreenIntentPermissionsState
import io.element.android.libraries.matrix.api.core.RoomId
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenu.kt
similarity index 98%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenu.kt
index 10a591bcbd..27883e88d5 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenu.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
@@ -19,6 +19,7 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.features.home.impl.R
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenu.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt
similarity index 96%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenu.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt
index 0f986999f8..c6b91a02fc 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenu.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -20,7 +20,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt
similarity index 91%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListEvents.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt
index b17b45b86b..4ba37d810b 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListEvents.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.matrix.api.core.RoomId
sealed interface RoomListEvents {
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt
similarity index 88%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt
index 9e8199cd80..45e4dd4238 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -23,32 +23,27 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import im.vector.app.features.analytics.plan.Interaction
+import io.element.android.features.home.impl.datasource.RoomListDataSource
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.search.RoomListSearchEvents
+import io.element.android.features.home.impl.search.RoomListSearchState
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents.AcceptInvite
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents.DeclineInvite
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
import io.element.android.features.leaveroom.api.LeaveRoomEvent.ShowConfirmation
import io.element.android.features.leaveroom.api.LeaveRoomState
-import io.element.android.features.logout.api.direct.DirectLogoutState
-import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
-import io.element.android.features.roomlist.impl.datasource.RoomListDataSource
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.search.RoomListSearchEvents
-import io.element.android.features.roomlist.impl.search.RoomListSearchState
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
-import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
-import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState
+import io.element.android.libraries.core.coroutine.mapState
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
-import io.element.android.libraries.indicator.api.IndicatorService
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.libraries.matrix.api.roomlist.RoomList
-import io.element.android.libraries.matrix.api.sync.SyncService
import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
@@ -77,12 +72,9 @@ private const val SUBSCRIBE_TO_VISIBLE_ROOMS_DEBOUNCE_IN_MILLIS = 300L
class RoomListPresenter @Inject constructor(
private val client: MatrixClient,
- private val syncService: SyncService,
- private val snackbarDispatcher: SnackbarDispatcher,
private val leaveRoomPresenter: Presenter,
private val roomListDataSource: RoomListDataSource,
private val featureFlagService: FeatureFlagService,
- private val indicatorService: IndicatorService,
private val filtersPresenter: Presenter,
private val searchPresenter: Presenter,
private val sessionPreferencesStore: SessionPreferencesStore,
@@ -91,9 +83,7 @@ class RoomListPresenter @Inject constructor(
private val fullScreenIntentPermissionsPresenter: Presenter,
private val batteryOptimizationPresenter: Presenter,
private val notificationCleaner: NotificationCleaner,
- private val logoutPresenter: Presenter,
private val appPreferencesStore: AppPreferencesStore,
- private val rageshakeFeatureAvailability: RageshakeFeatureAvailability,
private val seenInvitesStore: SeenInvitesStore,
) : Presenter {
private val encryptionService: EncryptionService = client.encryptionService()
@@ -102,32 +92,27 @@ class RoomListPresenter @Inject constructor(
override fun present(): RoomListState {
val coroutineScope = rememberCoroutineScope()
val leaveRoomState = leaveRoomPresenter.present()
- val matrixUser = client.userProfile.collectAsState()
- val isOnline by syncService.isOnline.collectAsState()
val filtersState = filtersPresenter.present()
val searchState = searchPresenter.present()
val acceptDeclineInviteState = acceptDeclineInvitePresenter.present()
- val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() }
LaunchedEffect(Unit) {
roomListDataSource.launchIn(this)
- // Force a refresh of the profile
- client.getUserProfile()
}
var securityBannerDismissed by rememberSaveable { mutableStateOf(false) }
// Avatar indicator
- val showAvatarIndicator by indicatorService.showRoomListTopBarIndicator()
val hideInvitesAvatar by remember {
- appPreferencesStore.getHideInviteAvatarsFlow()
- }.collectAsState(initial = false)
+ client
+ .mediaPreviewService()
+ .mediaPreviewConfigFlow
+ .mapState { config -> config.hideInviteAvatar }
+ }.collectAsState()
val contextMenu = remember { mutableStateOf(RoomListState.ContextMenu.Hidden) }
val declineInviteMenu = remember { mutableStateOf(RoomListState.DeclineInviteMenu.Hidden) }
- val directLogoutState = logoutPresenter.present()
-
fun handleEvents(event: RoomListEvents) {
when (event) {
is RoomListEvents.UpdateVisibleRange -> coroutineScope.launch {
@@ -162,26 +147,18 @@ class RoomListPresenter @Inject constructor(
}
}
- val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
-
val contentState = roomListContentState(securityBannerDismissed)
val canReportRoom by produceState(false) { value = client.canReportRoom() }
return RoomListState(
- matrixUser = matrixUser.value,
- showAvatarIndicator = showAvatarIndicator,
- snackbarMessage = snackbarMessage,
- hasNetworkConnection = isOnline,
contextMenu = contextMenu.value,
declineInviteMenu = declineInviteMenu.value,
leaveRoomState = leaveRoomState,
filtersState = filtersState,
- canReportBug = canReportBug,
searchState = searchState,
contentState = contentState,
acceptDeclineInviteState = acceptDeclineInviteState,
- directLogoutState = directLogoutState,
hideInvitesAvatars = hideInvitesAvatar,
canReportRoom = canReportRoom,
eventSink = ::handleEvents,
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
similarity index 77%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
index 0cf6147df7..4cfa82fbfc 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
@@ -5,44 +5,34 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.runtime.Immutable
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.search.RoomListSearchState
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
import io.element.android.features.leaveroom.api.LeaveRoomState
-import io.element.android.features.logout.api.direct.DirectLogoutState
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.search.RoomListSearchState
-import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
import io.element.android.libraries.matrix.api.core.RoomId
-import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.push.api.battery.BatteryOptimizationState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
@Immutable
data class RoomListState(
- val matrixUser: MatrixUser,
- val showAvatarIndicator: Boolean,
- val hasNetworkConnection: Boolean,
- val snackbarMessage: SnackbarMessage?,
val contextMenu: ContextMenu,
val declineInviteMenu: DeclineInviteMenu,
val leaveRoomState: LeaveRoomState,
val filtersState: RoomListFiltersState,
- val canReportBug: Boolean,
val searchState: RoomListSearchState,
val contentState: RoomListContentState,
val acceptDeclineInviteState: AcceptDeclineInviteState,
- val directLogoutState: DirectLogoutState,
val hideInvitesAvatars: Boolean,
val canReportRoom: Boolean,
val eventSink: (RoomListEvents) -> Unit,
) {
val displayFilters = contentState is RoomListContentState.Rooms
- val displayActions = true
sealed interface ContextMenu {
data object Hidden : ContextMenu
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateContextMenuShownProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateContextMenuShownProvider.kt
similarity index 95%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateContextMenuShownProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateContextMenuShownProvider.kt
index 2f347a1659..0cd3117de4 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateContextMenuShownProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateContextMenuShownProvider.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.matrix.api.core.RoomId
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt
similarity index 69%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt
index cb4818ddd1..0e4600c16a 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt
@@ -5,39 +5,34 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.filters.aRoomListFiltersState
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.model.aRoomListRoomSummary
+import io.element.android.features.home.impl.model.anInviteSender
+import io.element.android.features.home.impl.search.RoomListSearchState
+import io.element.android.features.home.impl.search.aRoomListSearchState
+import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
-import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState
import io.element.android.features.leaveroom.api.LeaveRoomState
import io.element.android.features.leaveroom.api.aLeaveRoomState
-import io.element.android.features.logout.api.direct.DirectLogoutState
-import io.element.android.features.logout.api.direct.aDirectLogoutState
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.filters.aRoomListFiltersState
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType
-import io.element.android.features.roomlist.impl.model.aRoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.anInviteSender
-import io.element.android.features.roomlist.impl.search.RoomListSearchState
-import io.element.android.features.roomlist.impl.search.aRoomListSearchState
+import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
-import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
-import io.element.android.libraries.matrix.api.core.UserId
-import io.element.android.libraries.matrix.api.user.MatrixUser
+import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.push.api.battery.aBatteryOptimizationState
-import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
+import kotlinx.collections.immutable.toPersistentList
open class RoomListStateProvider : PreviewParameterProvider {
override val values: Sequence
get() = sequenceOf(
aRoomListState(),
- aRoomListState(snackbarMessage = SnackbarMessage(CommonStrings.common_verification_complete)),
- aRoomListState(hasNetworkConnection = false),
aRoomListState(contextMenu = aContextMenuShown(roomName = null)),
aRoomListState(contextMenu = aContextMenuShown(roomName = "A nice room name")),
aRoomListState(contextMenu = aContextMenuShown(isFavorite = true)),
@@ -51,41 +46,39 @@ open class RoomListStateProvider : PreviewParameterProvider {
}
internal fun aRoomListState(
- matrixUser: MatrixUser = MatrixUser(userId = UserId("@id:domain"), displayName = "User#1"),
- showAvatarIndicator: Boolean = false,
- hasNetworkConnection: Boolean = true,
- snackbarMessage: SnackbarMessage? = null,
contextMenu: RoomListState.ContextMenu = RoomListState.ContextMenu.Hidden,
declineInviteMenu: RoomListState.DeclineInviteMenu = RoomListState.DeclineInviteMenu.Hidden,
leaveRoomState: LeaveRoomState = aLeaveRoomState(),
searchState: RoomListSearchState = aRoomListSearchState(),
filtersState: RoomListFiltersState = aRoomListFiltersState(),
- canReportBug: Boolean = true,
contentState: RoomListContentState = aRoomsContentState(),
acceptDeclineInviteState: AcceptDeclineInviteState = anAcceptDeclineInviteState(),
- directLogoutState: DirectLogoutState = aDirectLogoutState(),
hideInvitesAvatars: Boolean = false,
canReportRoom: Boolean = true,
eventSink: (RoomListEvents) -> Unit = {}
) = RoomListState(
- matrixUser = matrixUser,
- showAvatarIndicator = showAvatarIndicator,
- hasNetworkConnection = hasNetworkConnection,
- snackbarMessage = snackbarMessage,
contextMenu = contextMenu,
declineInviteMenu = declineInviteMenu,
leaveRoomState = leaveRoomState,
filtersState = filtersState,
- canReportBug = canReportBug,
searchState = searchState,
contentState = contentState,
acceptDeclineInviteState = acceptDeclineInviteState,
- directLogoutState = directLogoutState,
hideInvitesAvatars = hideInvitesAvatars,
canReportRoom = canReportRoom,
eventSink = eventSink,
)
+internal fun anAcceptDeclineInviteState(
+ acceptAction: AsyncAction = AsyncAction.Uninitialized,
+ declineAction: AsyncAction = AsyncAction.Uninitialized,
+ eventSink: (AcceptDeclineInviteEvents) -> Unit = {}
+) = AcceptDeclineInviteState(
+ acceptAction = acceptAction,
+ declineAction = declineAction,
+ eventSink = eventSink,
+)
+
internal fun aRoomListRoomSummaryList(): ImmutableList {
return persistentListOf(
aRoomListRoomSummary(
@@ -121,3 +114,18 @@ internal fun aRoomListRoomSummaryList(): ImmutableList {
),
)
}
+
+internal fun generateRoomListRoomSummaryList(
+ numberOfRooms: Int = 10,
+): ImmutableList {
+ return List(numberOfRooms) { index ->
+ aRoomListRoomSummary(
+ name = "Room#$index",
+ numberOfUnreadMessages = 0,
+ timestamp = "14:16",
+ lastMessage = "A message",
+ avatarData = AvatarData("!id$index", "${(65 + index % 26).toChar()}", size = AvatarSize.RoomListItem),
+ id = "!roomId$index:domain",
+ )
+ }.toPersistentList()
+}
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchDataSource.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchDataSource.kt
similarity index 90%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchDataSource.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchDataSource.kt
index 34152a7e65..6840809480 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchDataSource.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchDataSource.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
-import io.element.android.features.roomlist.impl.datasource.RoomListRoomSummaryFactory
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.datasource.RoomListRoomSummaryFactory
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.roomlist.RoomList
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchEvents.kt
similarity index 87%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchEvents.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchEvents.kt
index b8248d09f5..26f713da81 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchEvents.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchEvents.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
sealed interface RoomListSearchEvents {
data object ToggleSearchVisibility : RoomListSearchEvents
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenter.kt
similarity index 97%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenter.kt
index 7a6ec51259..b4d151fe02 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenter.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenter.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchState.kt
similarity index 76%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchState.kt
index e6bac06ca5..9d50f52a33 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchState.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchState.kt
@@ -5,9 +5,9 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummary
import kotlinx.collections.immutable.ImmutableList
data class RoomListSearchState(
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt
similarity index 84%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt
index 640adc7306..503e334418 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchStateProvider.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt
@@ -5,11 +5,11 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-import io.element.android.features.roomlist.impl.aRoomListRoomSummaryList
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.roomlist.aRoomListRoomSummaryList
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt
similarity index 95%
rename from features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt
rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt
index bfb2011dd5..29c8078c09 100644
--- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt
+++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
@@ -34,10 +34,10 @@ import androidx.compose.ui.res.stringResource
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.roomlist.impl.RoomListEvents
-import io.element.android.features.roomlist.impl.components.RoomSummaryRow
-import io.element.android.features.roomlist.impl.contentType
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.components.RoomSummaryRow
+import io.element.android.features.home.impl.contentType
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.roomlist.RoomListEvents
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.modifiers.applyIf
import io.element.android.libraries.designsystem.preview.ElementPreview
diff --git a/features/roomlist/impl/src/main/res/values-be/translations.xml b/features/home/impl/src/main/res/values-be/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-be/translations.xml
rename to features/home/impl/src/main/res/values-be/translations.xml
diff --git a/features/home/impl/src/main/res/values-bg/translations.xml b/features/home/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..8a555ebbb8
--- /dev/null
+++ b/features/home/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,33 @@
+
+
+ "Потвърдете ключа си за възстановяване, за да запазите достъп до хранилището за ключове и историята на съобщенията си."
+ "Въведете ключа си за възстановяване"
+ "Хранилището ви за ключове не е синхронизирано"
+ "Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?"
+ "Отказване на покана"
+ "Няма покани"
+ "%1$s (%2$s) ви покани"
+ "Създаване на нов разговор или стая"
+ "Започнете, като изпратите съобщение на някого."
+ "Все още няма чатове."
+ "Любими"
+ "Можете да добавите чат към фаворизираните си в настройките на чата.
+Засега можете да премахнете избора на филтрите, за да видите другите си чатове."
+ "Все още нямате фаворизирани чатове"
+ "Покани"
+ "Нямате чакащи покани."
+ "Нисък приоритет"
+ "Можете да премахнете избора на филтрите, за да видите другите си чатове"
+ "Хора"
+ "Все още нямате директни съобщения"
+ "Стаи"
+ "Все още не сте в никоя стая"
+ "Непрочетени"
+ "Поздравления!
+Нямате непрочетени съобщения!"
+ "Всички чатове"
+ "Отбелязване като прочетено"
+ "Отбелязване като непрочетено"
+ "Изглежда, че използвате ново устройство. Потвърдете с друго устройство за достъп до вашите шифровани съобщения."
+ "Потвърдете, че сте вие"
+
diff --git a/features/roomlist/impl/src/main/res/values-cs/translations.xml b/features/home/impl/src/main/res/values-cs/translations.xml
similarity index 92%
rename from features/roomlist/impl/src/main/res/values-cs/translations.xml
rename to features/home/impl/src/main/res/values-cs/translations.xml
index 7c15f1c82a..9fcea2887a 100644
--- a/features/roomlist/impl/src/main/res/values-cs/translations.xml
+++ b/features/home/impl/src/main/res/values-cs/translations.xml
@@ -1,5 +1,8 @@
+ "Zakažte optimalizaci baterie pro tuto aplikaci, abyste měli jistotu, že budou přijata všechna oznámení."
+ "Zakázat optimalizaci"
+ "Nepřicházejí vám oznámení?"
"Vygenerujte nový klíč pro obnovení, který lze použít k obnovení historie šifrovaných zpráv v případě, že ztratíte přístup ke svým zařízením."
"Nastavení obnovy"
"Nastavení obnovy"
diff --git a/features/roomlist/impl/src/main/res/values-cy/translations.xml b/features/home/impl/src/main/res/values-cy/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-cy/translations.xml
rename to features/home/impl/src/main/res/values-cy/translations.xml
index 7d779e0904..9b44b0fc3f 100644
--- a/features/roomlist/impl/src/main/res/values-cy/translations.xml
+++ b/features/home/impl/src/main/res/values-cy/translations.xml
@@ -1,5 +1,8 @@
+ "Analluogwch optimeiddio batri ar gyfer yr ap hwn, er mwyn sicrhau bod pob hysbysiad yn cael ei dderbyn."
+ "Analluogi optimeiddio"
+ "Hysbysiadau ddim yn cyrraedd?"
"Adferwch eich hunaniaeth cryptograffig a hanes negeseuon gydag allwedd adfer os ydych wedi colli eich holl ddyfeisiau presennol."
"Gosod adfer"
"Gosodwch adferiad i ddiogelu eich cyfrif"
@@ -18,6 +21,7 @@
"Mae hon yn broses un tro, diolch am aros."
"Creu eich cyfrif."
"Crëwch sgwrs neu ystafell newydd"
+ "Clirio\'r hidlau"
"Cychwynnwch arni trwy anfon neges at rywun."
"Dim sgyrsiau eto."
"Ffefrynnau"
@@ -40,6 +44,7 @@ Does gennych chi ddim negeseuon heb eu darllen!"
"Sgyrsiau"
"Marcio fel wedi\'i ddarllen"
"Marcio fel heb ei ddarllen"
+ "Mae\'r ystafell hon wedi\'i huwchraddio"
"Mae\'n debyg eich bod chi\'n defnyddio dyfais newydd. Dilyswch gyda dyfais arall i gael mynediad at eich negeseuon wedi\'u hamgryptio."
"Gwiriwch mai chi sydd yna"
diff --git a/features/home/impl/src/main/res/values-da/translations.xml b/features/home/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..ae32f7ab66
--- /dev/null
+++ b/features/home/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,50 @@
+
+
+ "Deaktiver batterioptimering for denne app for at sikre, at alle notifikationer dukker op."
+ "Deaktivér optimering"
+ "Modtager du ikke notifikationer?"
+ "Gendan din kryptografiske identitet og meddelelseshistorik med en gendannelsesnøgle, hvis du har mistet alle dine eksisterende enheder."
+ "Opsæt gendannelse"
+ "Konfigurer gendannelse for at beskytte din konto"
+ "Bekræft din gendannelsesnøgle for at bevare adgangen til nøglelager og meddelelseshistorik."
+ "Indtast din gendannelsesnøgle"
+ "Har du glemt din gendannelsesnøgle?"
+ "Dit nøglelager er ikke synkroniseret"
+ "For at sikre, at du aldrig går glip af et vigtigt opkald, skal du ændre dine indstillinger til at tillade underretninger i fuld skærm, når din telefon er låst."
+ "Gør din opkaldsoplevelse bedre"
+ "Er du sikker på, at du vil afvise invitationen til at deltage i %1$s?"
+ "Afvis invitation"
+ "Er du sikker på, at du vil afvise denne private samtale med %1$s?"
+ "Afvis samtale"
+ "Ingen invitationer"
+ "%1$s(%2$s ) inviterede dig"
+ "Dette er en engangsproces, tak for din tålmodighed."
+ "Sætter din konto op."
+ "Opret en ny samtale eller et nyt rum"
+ "Ryd filtre"
+ "Kom i gang ved at sende en besked til nogen."
+ "Ingen samtaler endnu."
+ "Favoritter"
+ "Du kan tilføje en samtale til dine favoritter i samtaleindstillingerne.
+For nu kan du fravælge filtre for at se dine andre samtaler"
+ "Du har endnu ingen foretrukne samtaler"
+ "Invitationer"
+ "Du har ingen afventende invitationer."
+ "Lav prioritet"
+ "Du kan fravælge filtre for at se dine andre samtaler"
+ "Du har ingen samtaler til dette valg"
+ "Mennesker"
+ "Du har ingen DM\'er endnu"
+ "Rum"
+ "Du er ikke i noget rum endnu"
+ "Ulæste"
+ "Tillykke!
+Du har ingen ulæste beskeder!"
+ "Anmodning om at deltage sendt"
+ "Samtaler"
+ "Marker som læst"
+ "Marker som ulæst"
+ "Dette rum er blevet opgraderet"
+ "Det ser ud til, at du bruger en ny enhed. Bekræft med en anden enhed for at få adgang til dine krypterede meddelelser."
+ "Bekræft, at det er dig"
+
diff --git a/features/roomlist/impl/src/main/res/values-de/translations.xml b/features/home/impl/src/main/res/values-de/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-de/translations.xml
rename to features/home/impl/src/main/res/values-de/translations.xml
index bd09aad06d..7f2613809c 100644
--- a/features/roomlist/impl/src/main/res/values-de/translations.xml
+++ b/features/home/impl/src/main/res/values-de/translations.xml
@@ -1,5 +1,8 @@
+ "Deaktiviere die Batterieoptimierung für diese App, um sicherzustellen, dass alle Benachrichtigungen empfangen werden."
+ "Optimierung deaktivieren"
+ "Kommen die Benachrichtigungen nicht an?"
"Falls Sie alle vorhandenen Geräte verloren haben, stellen Sie Ihre kryptografische Identität und Ihren Nachrichtenverlauf mit einem Wiederherstellungsschlüssel wieder her."
"Wiederherstellung einrichten"
"Wiederherstellung einrichten"
@@ -18,6 +21,7 @@
"Dies ist ein einmaliger Vorgang, danke fürs Warten."
"Dein Konto wird eingerichtet."
"Eine Unterthaltung oder Raum erstellen"
+ "Filter zurücksetzen"
"Beginnen Sie, indem Sie jemandem eine Nachricht senden."
"Noch keine Chats."
"Favoriten"
@@ -40,6 +44,7 @@ Sie haben keine ungelesenen Nachrichten!"
"Chats"
"Als gelesen markieren"
"Als ungelesen markieren"
+ "Dieser Raum wurde aktualisiert."
"Sie verwenden anscheinend ein neues Gerät. Verifizieren Sie es mit einem anderen Gerät, um Zugriff auf ihre verschlüsselten Nachrichten zu erhalten."
"Bestätigen Sie ihre Identität"
diff --git a/features/roomlist/impl/src/main/res/values-el/translations.xml b/features/home/impl/src/main/res/values-el/translations.xml
similarity index 82%
rename from features/roomlist/impl/src/main/res/values-el/translations.xml
rename to features/home/impl/src/main/res/values-el/translations.xml
index 596592f594..692aace0ab 100644
--- a/features/roomlist/impl/src/main/res/values-el/translations.xml
+++ b/features/home/impl/src/main/res/values-el/translations.xml
@@ -1,5 +1,8 @@
+ "Απενεργοποίησε τη βελτιστοποίηση μπαταρίας για αυτήν την εφαρμογή, για να βεβαιωθείς ότι λαμβάνονται όλες οι ειδοποιήσεις."
+ "Απενεργοποίηση βελτιστοποίησης"
+ "Δεν φτάνουν οι ειδοποιήσεις;"
"Δημιούργησε ένα νέο κλειδί ανάκτησης που μπορεί να χρησιμοποιηθεί για την επαναφορά του ιστορικού των κρυπτογραφημένων μηνυμάτων σου σε περίπτωση που χάσεις την πρόσβαση στις συσκευές σου."
"Ρύθμιση ανάκτησης"
"Ρύθμιση ανάκτησης"
@@ -7,7 +10,7 @@
"Εισήγαγε το κλειδί ανάκτησης"
"Ξέχασες το κλειδί ανάκτησης;"
"Ο χώρος αποθήκευσης κλειδιών σου δεν είναι συγχρονισμένος"
- "Για να διασφαλίσεις ότι δεν θα χάσεις ποτέ μια σημαντική κλήση, άλλαξε τις ρυθμίσεις σου για να επιτρέψεις τις ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σου είναι κλειδωμένο."
+ "Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο."
"Βελτίωσε την εμπειρία κλήσεων"
"Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;"
"Απόρριψη πρόσκλησης"
@@ -17,7 +20,7 @@
"%1$s (%2$s) σέ προσκάλεσε"
"Αυτή είναι μια εφάπαξ διαδικασία, ευχαριστώ που περίμενες."
"Ρύθμιση του λογαριασμού σου."
- "Δημιουργία νέας συνομιλίας ή δωματίου"
+ "Δημιουργία νέας συνομιλίας ή αίθουσας"
"Ξεκίνησε στέλνοντας μηνύματα σε κάποιον."
"Δεν υπάρχουν συνομιλίες ακόμα."
"Αγαπημένα"
@@ -31,8 +34,8 @@
"Δεν έχεις συνομιλίες για αυτήν την επιλογή"
"Άτομα"
"Δεν έχεις ακόμα ΠΜ"
- "Δωμάτια"
- "Δεν είσαι ακόμα σε κανένα δωμάτιο"
+ "Αίθουσες"
+ "Δεν είστε ακόμα σε κάποια αίθουσα"
"Μη αναγνωσμένα"
"Συγχαρητήρια!
Δεν έχεις μη αναγνωσμένα μηνύματα!"
@@ -40,6 +43,7 @@
"Συνομιλίες"
"Επισήμανση ως αναγνωσμένου"
"Επισήμανση ως μη αναγνωσμένου"
+ "Αυτή η αίθουσα έχει αναβαθμιστεί"
"Φαίνεται ότι χρησιμοποιείς μια νέα συσκευή. Επαλήθευσε με άλλη συσκευή για πρόσβαση στα κρυπτογραφημένα σου μηνύματα."
"Επαλήθευσε ότι είσαι εσύ"
diff --git a/features/roomlist/impl/src/main/res/values-en-rUS/translations.xml b/features/home/impl/src/main/res/values-en-rUS/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-en-rUS/translations.xml
rename to features/home/impl/src/main/res/values-en-rUS/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-es/translations.xml b/features/home/impl/src/main/res/values-es/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-es/translations.xml
rename to features/home/impl/src/main/res/values-es/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-et/translations.xml b/features/home/impl/src/main/res/values-et/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-et/translations.xml
rename to features/home/impl/src/main/res/values-et/translations.xml
index ecba029e6e..f8dd7fc086 100644
--- a/features/roomlist/impl/src/main/res/values-et/translations.xml
+++ b/features/home/impl/src/main/res/values-et/translations.xml
@@ -1,5 +1,8 @@
+ "Kui tahad olla kindel, et näed õigel ajal kõiki teavitusi, siis palun lülita akukasutuse optimeerimine välja."
+ "Lülita akukasutuse optimeerimine välja"
+ "Sa ei näe kõiki teavitusi?"
"Loo uus taastevõti, mida saad kasutada oma krüptitud sõnumite ajaloo taastamisel olukorras, kus kaotad ligipääsu oma seadmetele."
"Seadista andmete taastamine"
"Seadista taastamine"
@@ -18,6 +21,7 @@
"Tänud, et ootad - seda toimingut on vaja teha vaid üks kord."
"Seadistame sinu kasutajakontot."
"Loo uus vestlus või jututuba"
+ "Tühjenda filtrid"
"Alustamiseks saada kellelegi sõnum."
"Veel pole vestlusi."
"Lemmikud"
@@ -40,6 +44,7 @@ Sul pole ühtegi lugemata sõnumit!"
"Vestlused"
"Märgi loetuks"
"Märgi mitteloetuks"
+ "See jututuba on uuendatud"
"Tundub, et kasutad uut seadet. Oma krüptitud sõnumite lugemiseks verifitseeri ta mõne muu oma seadmega."
"Verifitseeri, et see oled sina"
diff --git a/features/roomlist/impl/src/main/res/values-eu/translations.xml b/features/home/impl/src/main/res/values-eu/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-eu/translations.xml
rename to features/home/impl/src/main/res/values-eu/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-fa/translations.xml b/features/home/impl/src/main/res/values-fa/translations.xml
similarity index 92%
rename from features/roomlist/impl/src/main/res/values-fa/translations.xml
rename to features/home/impl/src/main/res/values-fa/translations.xml
index f2b8757107..ef436cbe90 100644
--- a/features/roomlist/impl/src/main/res/values-fa/translations.xml
+++ b/features/home/impl/src/main/res/values-fa/translations.xml
@@ -34,5 +34,6 @@
"گپها"
"علامتگذاری به عنوان خوانده شده"
"نشان به ناخوانده"
+ "به نظر می رسد از دستگاه جدیدی استفاده می کنید. برای دسترسی به پیام های رمزگذاری شده خود، با دستگاه دیگری این دستگاه را تأیید کنید."
"تأیید کنید که خودتانید"
diff --git a/features/roomlist/impl/src/main/res/values-fi/translations.xml b/features/home/impl/src/main/res/values-fi/translations.xml
similarity index 97%
rename from features/roomlist/impl/src/main/res/values-fi/translations.xml
rename to features/home/impl/src/main/res/values-fi/translations.xml
index 910564ba32..10da41c88b 100644
--- a/features/roomlist/impl/src/main/res/values-fi/translations.xml
+++ b/features/home/impl/src/main/res/values-fi/translations.xml
@@ -40,6 +40,7 @@ Sinulla ei ole lukemattomia viestejä!"
"Keskustelut"
"Merkitse luetuksi"
"Merkitse lukemattomaksi"
+ "Tämä huone on päivitetty"
"Vaikuttaisi siltä, että käytät uutta laitetta. Vahvista toisella laitteella nähdäksesi salatut viestit."
"Vahvista, että se olet sinä"
diff --git a/features/roomlist/impl/src/main/res/values-fr/translations.xml b/features/home/impl/src/main/res/values-fr/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-fr/translations.xml
rename to features/home/impl/src/main/res/values-fr/translations.xml
index 4ffd377d4f..3f86a64810 100644
--- a/features/roomlist/impl/src/main/res/values-fr/translations.xml
+++ b/features/home/impl/src/main/res/values-fr/translations.xml
@@ -1,5 +1,8 @@
+ "Désactivez l’optimisation de la batterie pour cette application afin de vous assurer que toutes les notifications sont reçues."
+ "Désactiver l’optimisation"
+ "Ils vous manque des notifications?"
"Générez une nouvelle clé de récupération qui peut être utilisée pour restaurer l’historique de vos messages chiffrés au cas où vous perdriez l’accès à vos appareils."
"Configurer la sauvegarde"
"Configurer la récupération"
@@ -18,6 +21,7 @@
"Il s’agit d’une opération ponctuelle, merci d’attendre quelques instants."
"Configuration de votre compte."
"Créer une nouvelle discussion ou un nouveau salon"
+ "Supprimer les filtres"
"Commencez par envoyer un message à quelqu’un."
"Aucune discussion pour le moment."
"Favoris"
@@ -40,6 +44,7 @@ Vous n’avez plus de messages non-lus !"
"Conversations"
"Marquer comme lu"
"Marquer comme non lu"
+ "Ce salon a été mis à niveau."
"Il semblerait que vous utilisiez un nouvel appareil. Vérifiez la session avec un autre de vos appareils pour accéder à vos messages chiffrés."
"Vérifier que c’est bien vous"
diff --git a/features/roomlist/impl/src/main/res/values-hu/translations.xml b/features/home/impl/src/main/res/values-hu/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-hu/translations.xml
rename to features/home/impl/src/main/res/values-hu/translations.xml
index 4c1b882ef6..e0763e4c6f 100644
--- a/features/roomlist/impl/src/main/res/values-hu/translations.xml
+++ b/features/home/impl/src/main/res/values-hu/translations.xml
@@ -1,5 +1,8 @@
+ "Kapcsolja ki az alkalmazás akkumulátor-optimalizálását, hogy biztosan megkapja az összes értesítést."
+ "Optimalizálás letiltása"
+ "Nem érkeznek meg az értesítések?"
"Hozzon létre egy új helyreállítási kulcsot, amellyel visszaállíthatja a titkosított üzenetek előzményeit, ha elveszíti az eszközökhöz való hozzáférést."
"Helyreállítás beállítása"
"Helyreállítás beállítása a fiókja védelméhez"
@@ -18,6 +21,7 @@
"Ez egy egyszeri folyamat, köszönjük a türelmét."
"A fiók beállítása."
"Új beszélgetés vagy szoba létrehozása"
+ "Szűrők törlése"
"Kezdje azzal, hogy üzenetet küld valakinek."
"Még nincsenek csevegések."
"Kedvencek"
@@ -40,6 +44,7 @@ Nincs olvasatlan üzenete!"
"Összes csevegés"
"Megjelölés olvasottként"
"Megjelölés olvasatlanként"
+ "A szoba verzióját frissítették"
"Úgy tűnik, hogy új eszközt használ. Ellenőrizze egy másik eszközzel, hogy a továbbiakban elérje a titkosított üzeneteket."
"Ellenőrizze, hogy Ön az"
diff --git a/features/roomlist/impl/src/main/res/values-in/translations.xml b/features/home/impl/src/main/res/values-in/translations.xml
similarity index 89%
rename from features/roomlist/impl/src/main/res/values-in/translations.xml
rename to features/home/impl/src/main/res/values-in/translations.xml
index 2b390790e1..b3e16b4c25 100644
--- a/features/roomlist/impl/src/main/res/values-in/translations.xml
+++ b/features/home/impl/src/main/res/values-in/translations.xml
@@ -1,5 +1,8 @@
+ "Nonaktifkan pengoptimalan baterai untuk aplikasi ini, untuk memastikan semua notifikasi diterima."
+ "Nonaktifkan optimasi"
+ "Notifikasi tidak masuk?"
"Buat kunci pemulihan baru yang dapat digunakan untuk memulihkan riwayat pesan terenkripsi Anda jika Anda kehilangan akses ke perangkat Anda."
"Siapkan pemulihan"
"Siapkan pemulihan"
@@ -18,6 +21,7 @@
"Ini adalah proses satu kali, terima kasih telah menunggu."
"Menyiapkan akun Anda."
"Buat percakapan atau ruangan baru"
+ "Hapus filter"
"Mulailah dengan mengirim pesan kepada seseorang."
"Belum ada obrolan."
"Favorit"
@@ -40,6 +44,7 @@ Anda tidak memiliki pesan yang belum dibaca!"
"Semua Obrolan"
"Tandai sebagai dibaca"
"Tandai sebagai belum dibaca"
+ "Ruangan ini telah ditingkatkan"
"Sepertinya Anda menggunakan perangkat baru. Verifikasi dengan perangkat lain untuk mengakses pesan terenkripsi Anda selanjutnya."
"Verifikasi bahwa ini Anda"
diff --git a/features/roomlist/impl/src/main/res/values-it/translations.xml b/features/home/impl/src/main/res/values-it/translations.xml
similarity index 88%
rename from features/roomlist/impl/src/main/res/values-it/translations.xml
rename to features/home/impl/src/main/res/values-it/translations.xml
index 981fb27d96..88ff0eb3be 100644
--- a/features/roomlist/impl/src/main/res/values-it/translations.xml
+++ b/features/home/impl/src/main/res/values-it/translations.xml
@@ -1,5 +1,8 @@
+ "Disabilita l\'ottimizzazione della batteria per questa app, per assicurarti che tutte le notifiche vengano ricevute."
+ "Disabilita l\'ottimizzazione"
+ "Le notifiche non arrivano?"
"Genera una nuova chiave di recupero che può essere usata per ripristinare la cronologia dei messaggi crittografati nel caso in cui tu perda l\'accesso ai tuoi dispositivi."
"Configura il recupero"
"Configura il ripristino"
@@ -18,6 +21,7 @@
"Si tratta di una procedura che si effettua una sola volta, grazie per l\'attesa."
"Configurazione del tuo account."
"Crea una nuova conversazione o stanza"
+ "Elimina filtri"
"Inizia inviando un messaggio a qualcuno."
"Ancora nessuna conversazione."
"Preferiti"
@@ -40,6 +44,7 @@ Non hai messaggi non letti!"
"Tutte le conversazioni"
"Segna come letto"
"Segna come non letto"
+ "Questa stanza è stata aggiornata"
"Sembra che tu stia usando un nuovo dispositivo. Verificati con un altro dispositivo per accedere ai tuoi messaggi cifrati."
"Verifica che sei tu"
diff --git a/features/roomlist/impl/src/main/res/values-ka/translations.xml b/features/home/impl/src/main/res/values-ka/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-ka/translations.xml
rename to features/home/impl/src/main/res/values-ka/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-lt/translations.xml b/features/home/impl/src/main/res/values-lt/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-lt/translations.xml
rename to features/home/impl/src/main/res/values-lt/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-nb/translations.xml b/features/home/impl/src/main/res/values-nb/translations.xml
similarity index 90%
rename from features/roomlist/impl/src/main/res/values-nb/translations.xml
rename to features/home/impl/src/main/res/values-nb/translations.xml
index b4fc0b1950..2ce6733b8a 100644
--- a/features/roomlist/impl/src/main/res/values-nb/translations.xml
+++ b/features/home/impl/src/main/res/values-nb/translations.xml
@@ -1,5 +1,8 @@
+ "Deaktiver batterioptimalisering for denne appen for å sikre at alle varsler mottas."
+ "Deaktiver optimalisering"
+ "Kommer ikke varslene frem?"
"Gjenopprett din kryptografiske identitet og meldingshistorikk med en gjenopprettingsnøkkel hvis du har mistet alle dine brukte enheter."
"Konfigurer gjenoppretting"
"Konfigurer gjenoppretting for å beskytte kontoen din"
@@ -40,6 +43,7 @@ Du har ingen uleste meldinger!"
"Chatter"
"Marker som lest"
"Merk som ulest"
+ "Dette rommet har blitt oppgradert"
"Det ser ut til at du bruker en ny enhet. Bekreft med en annen enhet for å få tilgang til de krypterte meldingene dine."
"Bekreft at det er deg"
diff --git a/features/roomlist/impl/src/main/res/values-nl/translations.xml b/features/home/impl/src/main/res/values-nl/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-nl/translations.xml
rename to features/home/impl/src/main/res/values-nl/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-pl/translations.xml b/features/home/impl/src/main/res/values-pl/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-pl/translations.xml
rename to features/home/impl/src/main/res/values-pl/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-pt-rBR/translations.xml b/features/home/impl/src/main/res/values-pt-rBR/translations.xml
similarity index 89%
rename from features/roomlist/impl/src/main/res/values-pt-rBR/translations.xml
rename to features/home/impl/src/main/res/values-pt-rBR/translations.xml
index 01b75db869..871a2bcc5c 100644
--- a/features/roomlist/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/home/impl/src/main/res/values-pt-rBR/translations.xml
@@ -1,5 +1,8 @@
+ "Desative a otimização de bateria para este app, para que tenha certeza que todas as notificações sejam recebidas."
+ "Desativar otimização"
+ "As notificações não chegam?"
"Recupere sua identidade criptográfica e o histórico de mensagens com uma chave de recuperação se você tiver perdido todos os dispositivos existentes."
"Configurar a recuperação"
"Configure a recuperação para proteger sua conta"
@@ -18,6 +21,7 @@
"Este é um processo único, obrigado por esperar."
"Configurando sua conta."
"Criar uma nova conversa ou sala"
+ "Limpar filtros"
"Comece enviando uma mensagem para alguém."
"Ainda não há conversas."
"Favoritos"
@@ -40,6 +44,7 @@ Você não tem nenhuma mensagem não lida!"
"Conversas"
"Marcar como lido"
"Marcar como não lido"
+ "Esta sala foi atualizada"
"Parece que você está usando um novo dispositivo. Verifique com outro dispositivo para acessar suas mensagens criptografadas."
"Verifique se é você"
diff --git a/features/roomlist/impl/src/main/res/values-pt/translations.xml b/features/home/impl/src/main/res/values-pt/translations.xml
similarity index 89%
rename from features/roomlist/impl/src/main/res/values-pt/translations.xml
rename to features/home/impl/src/main/res/values-pt/translations.xml
index b332c4f1f8..daba977faa 100644
--- a/features/roomlist/impl/src/main/res/values-pt/translations.xml
+++ b/features/home/impl/src/main/res/values-pt/translations.xml
@@ -1,5 +1,8 @@
+ "Desativa as otimizações de bateria para esta aplicação, de modo a garantir que todas as notificações chegam."
+ "Desativar otimizações"
+ "As notificações não chegam?"
"Recupera a tua identidade criptográfica e o histórico de mensagens com uma chave de recuperação se tiveres perdido todos os teus dispositivos existentes."
"Configurar recuperação"
"Configurar a recuperação"
@@ -18,6 +21,7 @@
"Este processo só acontece uma única vez, obrigado por esperares."
"A configurar a tua conta…"
"Criar uma nova conversa ou sala"
+ "Limpar filtros"
"Começa por enviar uma mensagem a alguém."
"Ainda não tens conversas."
"Favoritas"
@@ -40,6 +44,7 @@ Não tens nenhuma mensagem por ler!"
"Conversas"
"Marcar como lida"
"Marcar como não lida"
+ "Esta sala foi atualizada"
"Parece que estás a utilizar um novo dispositivo. Verifica-o com um outro para poderes aceder às tuas mensagens cifradas."
"Verifica que és tu"
diff --git a/features/roomlist/impl/src/main/res/values-ro/translations.xml b/features/home/impl/src/main/res/values-ro/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-ro/translations.xml
rename to features/home/impl/src/main/res/values-ro/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-ru/translations.xml b/features/home/impl/src/main/res/values-ru/translations.xml
similarity index 97%
rename from features/roomlist/impl/src/main/res/values-ru/translations.xml
rename to features/home/impl/src/main/res/values-ru/translations.xml
index 1ae52ac1a5..a70efcfdfd 100644
--- a/features/roomlist/impl/src/main/res/values-ru/translations.xml
+++ b/features/home/impl/src/main/res/values-ru/translations.xml
@@ -40,6 +40,7 @@
"Все чаты"
"Пометить как прочитанное"
"Отметить как непрочитанное"
+ "Эта комната была обновлена"
"Похоже, вы используете новое устройство. Чтобы получить доступ к зашифрованным сообщениям пройдите подтверждение с другим устройством."
"Подтвердите, что это вы"
diff --git a/features/roomlist/impl/src/main/res/values-sk/translations.xml b/features/home/impl/src/main/res/values-sk/translations.xml
similarity index 89%
rename from features/roomlist/impl/src/main/res/values-sk/translations.xml
rename to features/home/impl/src/main/res/values-sk/translations.xml
index 9898a0cbad..ade2c192c7 100644
--- a/features/roomlist/impl/src/main/res/values-sk/translations.xml
+++ b/features/home/impl/src/main/res/values-sk/translations.xml
@@ -1,5 +1,8 @@
+ "Vypnite optimalizáciu batérie pre túto aplikáciu, aby ste sa uistili, že sú prijaté všetky upozornenia."
+ "Zakázať optimalizáciu"
+ "Oznámenia neprichádzajú?"
"Vytvorte nový kľúč na obnovenie, ktorý môžete použiť na obnovenie vašej histórie šifrovaných správ v prípade straty prístupu k vašim zariadeniam."
"Nastaviť obnovenie"
"Nastaviť obnovenie"
@@ -18,6 +21,7 @@
"Ide o jednorazový proces, ďakujeme za trpezlivosť."
"Nastavenie vášho účtu."
"Vytvorte novú konverzáciu alebo miestnosť"
+ "Vyčistiť filtre"
"Začnite tým, že niekomu pošlete správu."
"Zatiaľ žiadne konverzácie."
"Obľúbené"
@@ -40,6 +44,7 @@ Nemáte žiadne neprečítané správy!"
"Všetky konverzácie"
"Označiť ako prečítané"
"Označiť ako neprečítané"
+ "Táto miestnosť bola aktualizovaná"
"Vyzerá to tak, že používate nové zariadenie. Overte svoj prístup k zašifrovaným správam pomocou vášho druhého zariadenia."
"Overte, že ste to vy"
diff --git a/features/roomlist/impl/src/main/res/values-sv/translations.xml b/features/home/impl/src/main/res/values-sv/translations.xml
similarity index 97%
rename from features/roomlist/impl/src/main/res/values-sv/translations.xml
rename to features/home/impl/src/main/res/values-sv/translations.xml
index 9cc2fe2f99..ab00fd3dd3 100644
--- a/features/roomlist/impl/src/main/res/values-sv/translations.xml
+++ b/features/home/impl/src/main/res/values-sv/translations.xml
@@ -40,6 +40,7 @@ Du har inga olästa meddelanden!"
"Alla chattar"
"Markera som läst"
"Markera som oläst"
+ "Det här rummet har uppgraderats"
"Det verkar som om du använder en ny enhet. Verifiera med en annan enhet för att komma åt dina krypterade meddelanden."
"Verifiera att det är du"
diff --git a/features/roomlist/impl/src/main/res/values-tr/translations.xml b/features/home/impl/src/main/res/values-tr/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-tr/translations.xml
rename to features/home/impl/src/main/res/values-tr/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-uk/translations.xml b/features/home/impl/src/main/res/values-uk/translations.xml
similarity index 90%
rename from features/roomlist/impl/src/main/res/values-uk/translations.xml
rename to features/home/impl/src/main/res/values-uk/translations.xml
index 16836724df..57d750d029 100644
--- a/features/roomlist/impl/src/main/res/values-uk/translations.xml
+++ b/features/home/impl/src/main/res/values-uk/translations.xml
@@ -1,5 +1,8 @@
+ "Вимкніть оптимізацію акумулятора для цього застосунку, щоб надходили всі сповіщення."
+ "Вимкнути оптимізацію"
+ "Не надходять сповіщення?"
"Відновіть свою криптографічну ідентичність та історію повідомлень за допомогою ключа відновлення, якщо ви втратили всі наявні пристрої."
"Налаштувати відновлення"
"Налаштуйте відновлення для захисту свого облікового запису"
@@ -40,6 +43,7 @@
"Бесіди"
"Позначити прочитаним"
"Позначити непрочитаним"
+ "Цю кімнату оновлено"
"Схоже, ви використовуєте новий пристрій. Щоб отримати доступ до зашифрованих повідомлень, підтвердьте особу за допомогою іншого пристрою."
"Підтвердьте, що це ви"
diff --git a/features/roomlist/impl/src/main/res/values-ur/translations.xml b/features/home/impl/src/main/res/values-ur/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-ur/translations.xml
rename to features/home/impl/src/main/res/values-ur/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-uz/translations.xml b/features/home/impl/src/main/res/values-uz/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-uz/translations.xml
rename to features/home/impl/src/main/res/values-uz/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-zh-rTW/translations.xml b/features/home/impl/src/main/res/values-zh-rTW/translations.xml
similarity index 100%
rename from features/roomlist/impl/src/main/res/values-zh-rTW/translations.xml
rename to features/home/impl/src/main/res/values-zh-rTW/translations.xml
diff --git a/features/roomlist/impl/src/main/res/values-zh/translations.xml b/features/home/impl/src/main/res/values-zh/translations.xml
similarity index 95%
rename from features/roomlist/impl/src/main/res/values-zh/translations.xml
rename to features/home/impl/src/main/res/values-zh/translations.xml
index e7e97040dd..4ca91cb796 100644
--- a/features/roomlist/impl/src/main/res/values-zh/translations.xml
+++ b/features/home/impl/src/main/res/values-zh/translations.xml
@@ -1,5 +1,7 @@
+ "禁用优化"
+ "通知未送达?"
"生成新的恢复密钥,该密钥可用于在您无法访问设备时恢复加密的消息历史记录。"
"设置恢复"
"设置恢复"
diff --git a/features/roomlist/impl/src/main/res/values/localazy.xml b/features/home/impl/src/main/res/values/localazy.xml
similarity index 98%
rename from features/roomlist/impl/src/main/res/values/localazy.xml
rename to features/home/impl/src/main/res/values/localazy.xml
index 90432433c2..58afb06591 100644
--- a/features/roomlist/impl/src/main/res/values/localazy.xml
+++ b/features/home/impl/src/main/res/values/localazy.xml
@@ -21,6 +21,7 @@
"This is a one time process, thanks for waiting."
"Setting up your account."
"Create a new conversation or room"
+ "Clear filters"
"Get started by messaging someone."
"No chats yet."
"Favourites"
diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/FakeDateTimeObserver.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/FakeDateTimeObserver.kt
new file mode 100644
index 0000000000..6cbebb3135
--- /dev/null
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/FakeDateTimeObserver.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+import io.element.android.libraries.androidutils.system.DateTimeObserver
+import kotlinx.coroutines.flow.MutableSharedFlow
+
+class FakeDateTimeObserver : DateTimeObserver {
+ override val changes = MutableSharedFlow(extraBufferCapacity = 1)
+
+ fun given(event: DateTimeObserver.Event) {
+ changes.tryEmit(event)
+ }
+}
diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt
new file mode 100644
index 0000000000..6913ea19bf
--- /dev/null
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2025 New Vector 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.home.impl
+
+import app.cash.molecule.RecompositionMode
+import app.cash.molecule.moleculeFlow
+import app.cash.turbine.test
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.home.impl.roomlist.aRoomListState
+import io.element.android.features.logout.api.direct.aDirectLogoutState
+import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
+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.indicator.api.IndicatorService
+import io.element.android.libraries.indicator.test.FakeIndicatorService
+import io.element.android.libraries.matrix.api.MatrixClient
+import io.element.android.libraries.matrix.api.sync.SyncService
+import io.element.android.libraries.matrix.api.user.MatrixUser
+import io.element.android.libraries.matrix.test.AN_AVATAR_URL
+import io.element.android.libraries.matrix.test.AN_EXCEPTION
+import io.element.android.libraries.matrix.test.A_USER_ID
+import io.element.android.libraries.matrix.test.A_USER_NAME
+import io.element.android.libraries.matrix.test.FakeMatrixClient
+import io.element.android.libraries.matrix.test.sync.FakeSyncService
+import io.element.android.tests.testutils.WarmUpRule
+import io.element.android.tests.testutils.test
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Rule
+import org.junit.Test
+
+class HomePresenterTest {
+ @get:Rule
+ val warmUpRule = WarmUpRule()
+
+ @Test
+ fun `present - should start with no user and then load user with success`() = runTest {
+ val matrixClient = FakeMatrixClient(
+ userDisplayName = null,
+ userAvatarUrl = null,
+ )
+ matrixClient.givenGetProfileResult(matrixClient.sessionId, Result.success(MatrixUser(matrixClient.sessionId, A_USER_NAME, AN_AVATAR_URL)))
+ val presenter = createHomePresenter(
+ client = matrixClient,
+ rageshakeFeatureAvailability = { false },
+ )
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ assertThat(initialState.matrixUser).isEqualTo(MatrixUser(A_USER_ID))
+ assertThat(initialState.canReportBug).isFalse()
+ val withUserState = awaitItem()
+ assertThat(withUserState.matrixUser.userId).isEqualTo(A_USER_ID)
+ assertThat(withUserState.matrixUser.displayName).isEqualTo(A_USER_NAME)
+ assertThat(withUserState.matrixUser.avatarUrl).isEqualTo(AN_AVATAR_URL)
+ assertThat(withUserState.showAvatarIndicator).isFalse()
+ assertThat(withUserState.isSpaceFeatureEnabled).isFalse()
+ }
+ }
+
+ @Test
+ fun `present - space feature enabled`() = runTest {
+ val presenter = createHomePresenter(
+ featureFlagService = FakeFeatureFlagService(
+ initialState = mapOf(FeatureFlags.Space.key to true),
+ ),
+ )
+ presenter.test {
+ skipItems(1)
+ val initialState = awaitItem()
+ assertThat(initialState.isSpaceFeatureEnabled).isTrue()
+ }
+ }
+
+ @Test
+ fun `present - show avatar indicator`() = runTest {
+ val indicatorService = FakeIndicatorService()
+ val presenter = createHomePresenter(
+ indicatorService = indicatorService,
+ )
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ assertThat(initialState.showAvatarIndicator).isFalse()
+ indicatorService.setShowRoomListTopBarIndicator(true)
+ val finalState = awaitItem()
+ assertThat(finalState.showAvatarIndicator).isTrue()
+ }
+ }
+
+ @Test
+ fun `present - should start with no user and then load user with error`() = runTest {
+ val matrixClient = FakeMatrixClient(
+ userDisplayName = null,
+ userAvatarUrl = null,
+ )
+ matrixClient.givenGetProfileResult(matrixClient.sessionId, Result.failure(AN_EXCEPTION))
+ val presenter = createHomePresenter(client = matrixClient)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ assertThat(initialState.matrixUser).isEqualTo(MatrixUser(matrixClient.sessionId))
+ // No new state is coming
+ }
+ }
+
+ @Test
+ fun `present - NavigationBar change`() = runTest {
+ val presenter = createHomePresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ assertThat(initialState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Chats)
+ initialState.eventSink(HomeEvents.SelectHomeNavigationBarItem(HomeNavigationBarItem.Spaces))
+ val finalState = awaitItem()
+ assertThat(finalState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Spaces)
+ }
+ }
+
+ private fun TestScope.createHomePresenter(
+ client: MatrixClient = FakeMatrixClient(),
+ syncService: SyncService = FakeSyncService(),
+ snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher(),
+ rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true },
+ indicatorService: IndicatorService = FakeIndicatorService(),
+ featureFlagService: FeatureFlagService = FakeFeatureFlagService()
+ ) = HomePresenter(
+ client = client,
+ syncService = syncService,
+ snackbarDispatcher = snackbarDispatcher,
+ indicatorService = indicatorService,
+ logoutPresenter = { aDirectLogoutState() },
+ roomListPresenter = { aRoomListState() },
+ rageshakeFeatureAvailability = rageshakeFeatureAvailability,
+ featureFlagService = featureFlagService,
+ )
+}
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSourceTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
similarity index 97%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSourceTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
index bcb6552d30..03fe2efd94 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListDataSourceTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListDataSourceTest.kt
@@ -5,11 +5,11 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.datasource
+package io.element.android.features.home.impl.datasource
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
-import io.element.android.features.roomlist.impl.FakeDateTimeObserver
+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
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactoryTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactoryTest.kt
similarity index 92%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactoryTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactoryTest.kt
index 86c0981d4f..95444b6c4f 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/datasource/RoomListRoomSummaryFactoryTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactoryTest.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.datasource
+package io.element.android.features.home.impl.datasource
import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt
similarity index 97%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt
index 67ef79ac81..3f4f45afae 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt
@@ -5,10 +5,10 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import com.google.common.truth.Truth.assertThat
-import io.element.android.features.roomlist.impl.R
+import io.element.android.features.home.impl.R
import org.junit.Test
class RoomListFiltersEmptyStateResourcesTest {
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt
similarity index 95%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenterTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt
index 560e5f938e..a71afca607 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersPresenterTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersPresenterTest.kt
@@ -5,14 +5,14 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
-import io.element.android.features.roomlist.impl.filters.selection.DefaultFilterSelectionStrategy
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionState
+import io.element.android.features.home.impl.filters.selection.DefaultFilterSelectionStrategy
+import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
import io.element.android.tests.testutils.awaitLastSequentialItem
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersViewTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersViewTest.kt
similarity index 90%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersViewTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersViewTest.kt
index 0041ef988d..1fd37d9252 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersViewTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersViewTest.kt
@@ -5,13 +5,13 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.filters
+package io.element.android.features.home.impl.filters
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
-import io.element.android.features.roomlist.impl.R
-import io.element.android.features.roomlist.impl.filters.selection.FilterSelectionState
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import io.element.android.libraries.testtags.TestTags
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.clickOn
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListBaseRoomSummaryTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt
similarity index 98%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListBaseRoomSummaryTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt
index e6bfb1a9cb..55b3f1ffee 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListBaseRoomSummaryTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.model
+package io.element.android.features.home.impl.model
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.designsystem.components.avatar.AvatarData
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenuTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenuTest.kt
similarity index 98%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenuTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenuTest.kt
index 6becb39e7a..b336178d22 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenuTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenuTest.kt
@@ -5,12 +5,13 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
+import io.element.android.features.home.impl.R
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureCalledOnceWithParam
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenuTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt
similarity index 96%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenuTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt
index 8c75027ec5..48a51b87bb 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListDeclineInviteMenuTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt
@@ -5,12 +5,12 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
-import io.element.android.features.roomlist.impl.model.aRoomListRoomSummary
+import io.element.android.features.home.impl.model.aRoomListRoomSummary
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureCalledOnceWithParam
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt
similarity index 86%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt
index 3184a44a1c..bc0163585f 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt
@@ -5,43 +5,37 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import im.vector.app.features.analytics.plan.Interaction
+import io.element.android.features.home.impl.FakeDateTimeObserver
+import io.element.android.features.home.impl.datasource.RoomListDataSource
+import io.element.android.features.home.impl.datasource.aRoomListRoomSummaryFactory
+import io.element.android.features.home.impl.filters.RoomListFiltersState
+import io.element.android.features.home.impl.filters.aRoomListFiltersState
+import io.element.android.features.home.impl.model.createRoomListRoomSummary
+import io.element.android.features.home.impl.search.RoomListSearchEvents
+import io.element.android.features.home.impl.search.RoomListSearchState
+import io.element.android.features.home.impl.search.aRoomListSearchState
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
-import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState
import io.element.android.features.invite.test.InMemorySeenInvitesStore
import io.element.android.features.leaveroom.api.LeaveRoomEvent
import io.element.android.features.leaveroom.api.LeaveRoomState
import io.element.android.features.leaveroom.api.aLeaveRoomState
-import io.element.android.features.logout.api.direct.aDirectLogoutState
-import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
-import io.element.android.features.roomlist.impl.datasource.RoomListDataSource
-import io.element.android.features.roomlist.impl.datasource.aRoomListRoomSummaryFactory
-import io.element.android.features.roomlist.impl.filters.RoomListFiltersState
-import io.element.android.features.roomlist.impl.filters.aRoomListFiltersState
-import io.element.android.features.roomlist.impl.model.createRoomListRoomSummary
-import io.element.android.features.roomlist.impl.search.RoomListSearchEvents
-import io.element.android.features.roomlist.impl.search.RoomListSearchState
-import io.element.android.features.roomlist.impl.search.aRoomListSearchState
-import io.element.android.libraries.androidutils.system.DateTimeObserver
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
-import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
import io.element.android.libraries.eventformatter.test.FakeRoomLastMessageFormatter
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.fullscreenintent.api.aFullScreenIntentPermissionsState
-import io.element.android.libraries.indicator.api.IndicatorService
-import io.element.android.libraries.indicator.test.FakeIndicatorService
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.SessionId
@@ -49,18 +43,12 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.roomlist.RoomList
-import io.element.android.libraries.matrix.api.sync.SyncService
import io.element.android.libraries.matrix.api.sync.SyncState
import io.element.android.libraries.matrix.api.timeline.ReceiptType
-import io.element.android.libraries.matrix.api.user.MatrixUser
-import io.element.android.libraries.matrix.test.AN_AVATAR_URL
-import io.element.android.libraries.matrix.test.AN_EXCEPTION
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.A_SESSION_ID
-import io.element.android.libraries.matrix.test.A_USER_ID
-import io.element.android.libraries.matrix.test.A_USER_NAME
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
@@ -89,7 +77,6 @@ import io.element.android.tests.testutils.lambda.value
import io.element.android.tests.testutils.test
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runTest
@@ -101,65 +88,6 @@ class RoomListPresenterTest {
@get:Rule
val warmUpRule = WarmUpRule()
- @Test
- fun `present - should start with no user and then load user with success`() = runTest {
- val matrixClient = FakeMatrixClient(
- userDisplayName = null,
- userAvatarUrl = null,
- )
- matrixClient.givenGetProfileResult(matrixClient.sessionId, Result.success(MatrixUser(matrixClient.sessionId, A_USER_NAME, AN_AVATAR_URL)))
- val presenter = createRoomListPresenter(
- client = matrixClient,
- rageshakeFeatureAvailability = { false },
- )
- moleculeFlow(RecompositionMode.Immediate) {
- presenter.present()
- }.test {
- val initialState = awaitItem()
- assertThat(initialState.matrixUser).isEqualTo(MatrixUser(A_USER_ID))
- assertThat(initialState.canReportBug).isFalse()
- val withUserState = awaitItem()
- assertThat(withUserState.matrixUser.userId).isEqualTo(A_USER_ID)
- assertThat(withUserState.matrixUser.displayName).isEqualTo(A_USER_NAME)
- assertThat(withUserState.matrixUser.avatarUrl).isEqualTo(AN_AVATAR_URL)
- assertThat(withUserState.showAvatarIndicator).isFalse()
- }
- }
-
- @Test
- fun `present - show avatar indicator`() = runTest {
- val indicatorService = FakeIndicatorService()
- val presenter = createRoomListPresenter(
- indicatorService = indicatorService,
- )
- moleculeFlow(RecompositionMode.Immediate) {
- presenter.present()
- }.test {
- val initialState = awaitItem()
- assertThat(initialState.showAvatarIndicator).isFalse()
- indicatorService.setShowRoomListTopBarIndicator(true)
- val finalState = awaitItem()
- assertThat(finalState.showAvatarIndicator).isTrue()
- }
- }
-
- @Test
- fun `present - should start with no user and then load user with error`() = runTest {
- val matrixClient = FakeMatrixClient(
- userDisplayName = null,
- userAvatarUrl = null,
- )
- matrixClient.givenGetProfileResult(matrixClient.sessionId, Result.failure(AN_EXCEPTION))
- val presenter = createRoomListPresenter(client = matrixClient)
- moleculeFlow(RecompositionMode.Immediate) {
- presenter.present()
- }.test {
- val initialState = awaitItem()
- assertThat(initialState.matrixUser).isEqualTo(MatrixUser(matrixClient.sessionId))
- // No new state is coming
- }
- }
-
@Test
fun `present - load 1 room with success`() = runTest {
val roomListService = FakeRoomListService()
@@ -673,8 +601,6 @@ class RoomListPresenterTest {
private fun TestScope.createRoomListPresenter(
client: MatrixClient = FakeMatrixClient(),
- syncService: SyncService = FakeSyncService(),
- snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher(),
leaveRoomState: LeaveRoomState = aLeaveRoomState(),
dateFormatter: DateFormatter = FakeDateFormatter(),
roomLastMessageFormatter: RoomLastMessageFormatter = FakeRoomLastMessageFormatter(),
@@ -686,13 +612,9 @@ class RoomListPresenterTest {
acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() },
notificationCleaner: NotificationCleaner = FakeNotificationCleaner(),
appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(),
- rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true },
seenInvitesStore: SeenInvitesStore = InMemorySeenInvitesStore(),
- indicatorService: IndicatorService = FakeIndicatorService(),
) = RoomListPresenter(
client = client,
- syncService = syncService,
- snackbarDispatcher = snackbarDispatcher,
leaveRoomPresenter = { leaveRoomState },
roomListDataSource = RoomListDataSource(
roomListService = client.roomListService,
@@ -706,7 +628,6 @@ class RoomListPresenterTest {
dateTimeObserver = FakeDateTimeObserver(),
),
featureFlagService = featureFlagService,
- indicatorService = indicatorService,
searchPresenter = searchPresenter,
sessionPreferencesStore = sessionPreferencesStore,
filtersPresenter = filtersPresenter,
@@ -715,17 +636,7 @@ class RoomListPresenterTest {
fullScreenIntentPermissionsPresenter = { aFullScreenIntentPermissionsState() },
batteryOptimizationPresenter = { aBatteryOptimizationState() },
notificationCleaner = notificationCleaner,
- logoutPresenter = { aDirectLogoutState() },
appPreferencesStore = appPreferencesStore,
- rageshakeFeatureAvailability = rageshakeFeatureAvailability,
seenInvitesStore = seenInvitesStore,
)
}
-
-class FakeDateTimeObserver : DateTimeObserver {
- override val changes = MutableSharedFlow(extraBufferCapacity = 1)
-
- fun given(event: DateTimeObserver.Event) {
- changes.tryEmit(event)
- }
-}
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
similarity index 83%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
index faf3fcfb5c..3837fe6f55 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt
@@ -5,6 +5,6 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
internal fun RoomListState.contentAsRooms() = contentState as RoomListContentState.Rooms
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt
similarity index 93%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt
index 60da841e96..0465926abc 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListViewTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl
+package io.element.android.features.home.impl.roomlist
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
@@ -16,9 +16,12 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTouchInput
import androidx.test.ext.junit.runners.AndroidJUnit4
-import io.element.android.features.roomlist.impl.components.RoomListMenuAction
-import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
-import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType
+import io.element.android.features.home.impl.HomeView
+import io.element.android.features.home.impl.R
+import io.element.android.features.home.impl.aHomeState
+import io.element.android.features.home.impl.components.RoomListMenuAction
+import io.element.android.features.home.impl.model.RoomListRoomSummary
+import io.element.android.features.home.impl.model.RoomSummaryDisplayType
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
@@ -32,11 +35,14 @@ import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class RoomListViewTest {
- @get:Rule val rule = createAndroidComposeRule()
+ @get:Rule
+ val rule = createAndroidComposeRule()
+ @Config(qualifiers = "h1024dp")
@Test
fun `displaying the view automatically sends a couple of UpdateVisibleRangeEvents`() {
val eventsRecorder = EventsRecorder()
@@ -50,7 +56,7 @@ class RoomListViewTest {
eventsRecorder.assertList(
listOf(
RoomListEvents.UpdateVisibleRange(IntRange.EMPTY),
- RoomListEvents.UpdateVisibleRange(0..2),
+ RoomListEvents.UpdateVisibleRange(0..5),
)
)
}
@@ -272,8 +278,8 @@ private fun AndroidComposeTestRule.setRoomL
onDeclineInviteAndBlockUser: (RoomListRoomSummary) -> Unit = EnsureNeverCalledWithParam(),
) {
setSafeContent {
- RoomListView(
- state = state,
+ HomeView(
+ homeState = aHomeState(roomListState = state),
onRoomClick = onRoomClick,
onSettingsClick = onSettingsClick,
onSetUpRecoveryClick = onSetUpRecoveryClick,
diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt
similarity index 97%
rename from features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt
rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt
index 5d69d21c1e..7649b6141e 100644
--- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchPresenterTest.kt
+++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/search/RoomListSearchPresenterTest.kt
@@ -5,13 +5,13 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.features.roomlist.impl.search
+package io.element.android.features.home.impl.search
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
-import io.element.android.features.roomlist.impl.datasource.aRoomListRoomSummaryFactory
+import io.element.android.features.home.impl.datasource.aRoomListRoomSummaryFactory
import io.element.android.libraries.dateformatter.test.FakeDateFormatter
import io.element.android.libraries.eventformatter.test.FakeRoomLastMessageFormatter
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/AcceptInvite.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/AcceptInvite.kt
index c4d520a6b8..716cd7f907 100644
--- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/AcceptInvite.kt
+++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/AcceptInvite.kt
@@ -10,16 +10,23 @@ package io.element.android.features.invite.impl
import com.squareup.anvil.annotations.ContributesBinding
import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.features.invite.api.SeenInvitesStore
+import io.element.android.libraries.core.extensions.mapFailure
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
+import io.element.android.libraries.matrix.api.exception.ClientException
+import io.element.android.libraries.matrix.api.exception.ErrorKind
import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.push.api.notifications.NotificationCleaner
import javax.inject.Inject
interface AcceptInvite {
suspend operator fun invoke(roomId: RoomId): Result
+
+ sealed class Failures : Exception() {
+ data object InvalidInvite : Failures()
+ }
}
@ContributesBinding(SessionScope::class)
@@ -37,6 +44,15 @@ class DefaultAcceptInvite @Inject constructor(
).onSuccess {
notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId)
seenInvitesStore.markAsUnSeen(roomId)
+ }.mapFailure {
+ if (it is ClientException.MatrixApi) {
+ when (it.kind) {
+ ErrorKind.Unknown -> AcceptInvite.Failures.InvalidInvite
+ else -> it
+ }
+ } else {
+ it
+ }
}.map { roomId }
}
}
diff --git a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteStateProvider.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteStateProvider.kt
similarity index 62%
rename from features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteStateProvider.kt
rename to features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteStateProvider.kt
index 4c33f9e48f..9896de1d3e 100644
--- a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/acceptdecline/AcceptDeclineInviteStateProvider.kt
+++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteStateProvider.kt
@@ -1,14 +1,18 @@
/*
- * Copyright 2024 New Vector Ltd.
+ * Copyright 2025 New Vector 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.invite.api.acceptdecline
+package io.element.android.features.invite.impl.acceptdecline
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.invite.api.InviteData
+import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
+import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
+import io.element.android.features.invite.api.acceptdecline.ConfirmingDeclineInvite
+import io.element.android.features.invite.impl.AcceptInvite
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.RoomId
@@ -18,26 +22,37 @@ open class AcceptDeclineInviteStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized,
declineAction: AsyncAction = AsyncAction.Uninitialized,
eventSink: (AcceptDeclineInviteEvents) -> Unit = {}
diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteView.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteView.kt
index 2585300431..9c672594e0 100644
--- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteView.kt
+++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/acceptdecline/AcceptDeclineInviteView.kt
@@ -15,8 +15,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.invite.api.InviteData
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
-import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteStateProvider
import io.element.android.features.invite.api.acceptdecline.ConfirmingDeclineInvite
+import io.element.android.features.invite.impl.AcceptInvite
import io.element.android.features.invite.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
@@ -39,6 +39,16 @@ fun AcceptDeclineInviteView(
onErrorDismiss = {
state.eventSink(InternalAcceptDeclineInviteEvents.DismissAcceptError)
},
+ errorTitle = {
+ stringResource(CommonStrings.common_something_went_wrong)
+ },
+ errorMessage = { error ->
+ if (error is AcceptInvite.Failures.InvalidInvite) {
+ stringResource(CommonStrings.error_invalid_invite)
+ } else {
+ stringResource(CommonStrings.error_network_or_server_issue)
+ }
+ }
)
AsyncActionView(
async = state.declineAction,
@@ -46,6 +56,12 @@ fun AcceptDeclineInviteView(
onErrorDismiss = {
state.eventSink(InternalAcceptDeclineInviteEvents.DismissDeclineError)
},
+ errorTitle = {
+ stringResource(CommonStrings.common_something_went_wrong)
+ },
+ errorMessage = {
+ stringResource(CommonStrings.error_network_or_server_issue)
+ },
confirmationDialog = { confirming ->
// Note: confirming will always be of type ConfirmingDeclineInvite.
if (confirming is ConfirmingDeclineInvite) {
diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockView.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockView.kt
index c313382b27..05110f982c 100644
--- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockView.kt
+++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/declineandblock/DeclineAndBlockView.kt
@@ -25,7 +25,6 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.features.invite.impl.R
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.async.AsyncActionView
@@ -33,7 +32,6 @@ import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -63,12 +61,7 @@ fun DeclineAndBlockView(
Scaffold(
topBar = {
TopAppBar(
- title = {
- Text(
- stringResource(R.string.screen_decline_and_block_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_decline_and_block_title),
navigationIcon = {
BackButton(onClick = onBackClick)
}
diff --git a/features/invite/impl/src/main/res/values-bg/translations.xml b/features/invite/impl/src/main/res/values-bg/translations.xml
index 3418954ad6..5e3c9a6fbd 100644
--- a/features/invite/impl/src/main/res/values-bg/translations.xml
+++ b/features/invite/impl/src/main/res/values-bg/translations.xml
@@ -1,5 +1,6 @@
+ "Блокиране на потребителя"
"Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?"
"Отказване на покана"
"Няма покани"
diff --git a/features/invite/impl/src/main/res/values-da/translations.xml b/features/invite/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..6093a431bc
--- /dev/null
+++ b/features/invite/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,18 @@
+
+
+ "Du vil ikke se nogen beskeder eller rum-invitationer fra denne bruger"
+ "Bloker bruger"
+ "Anmeld dette rum til din kontoudbyder."
+ "Beskriv årsagen til anmeldelsen…"
+ "Afvis og blokér"
+ "Er du sikker på, at du vil afvise invitationen til at deltage i %1$s?"
+ "Afvis invitation"
+ "Er du sikker på, at du vil afvise denne private samtale med %1$s?"
+ "Afvis samtale"
+ "Ingen invitationer"
+ "%1$s(%2$s ) inviterede dig"
+ "Ja, afvis og blokér"
+ "Er du sikker på, at du vil afvise invitationen til at deltage i dette rum? Dette forhindrer også %1$s i at kontakte dig eller invitere dig til andre rum."
+ "Afvis invitation og blokér"
+ "Afvis og blokér"
+
diff --git a/features/invite/impl/src/main/res/values-el/translations.xml b/features/invite/impl/src/main/res/values-el/translations.xml
index e7e55379f6..96f10b2950 100644
--- a/features/invite/impl/src/main/res/values-el/translations.xml
+++ b/features/invite/impl/src/main/res/values-el/translations.xml
@@ -1,8 +1,8 @@
- "Δε θα δείτε μηνύματα ή προσκλήσεις δωματίου από αυτόν τον χρήστη"
+ "Δεν θα βλέπετε μηνύματα ή προσκλήσεις αίθουσας από αυτόν τον χρήστη"
"Αποκλεισμός χρήστη"
- "Αναφέρετε αυτό το δωμάτιο στον πάροχο του λογαριασμού σας."
+ "Αναφέρετε αυτή την αίθουσα στον πάροχο του λογαριασμού σας."
"Περιγράψτε τον λόγο αναφοράς…"
"Απόρριψη και αποκλεισμός"
"Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;"
@@ -12,7 +12,7 @@
"Χωρίς προσκλήσεις"
"%1$s (%2$s) σέ προσκάλεσε"
"Ναι, απόρριψη και αποκλεισμός"
- "Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτό το δωμάτιο; Αυτό θα εμποδίσει επίσης το χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε δωμάτια."
+ "Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτήν την αίθουσα; Αυτό θα εμποδίσει επίσης τον χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε αίθουσες."
"Απόρριψη πρόσκλησης και αποκλεισμός"
"Απόρριψη και αποκλεισμός"
diff --git a/features/invite/impl/src/main/res/values-in/translations.xml b/features/invite/impl/src/main/res/values-in/translations.xml
index 97866a9043..6f8ab15610 100644
--- a/features/invite/impl/src/main/res/values-in/translations.xml
+++ b/features/invite/impl/src/main/res/values-in/translations.xml
@@ -1,9 +1,18 @@
+ "Anda tidak akan melihat pesan atau undangan ruangan dari pengguna ini"
+ "Blokir pengguna"
+ "Laporkan ruangan ini ke penyedia akun Anda."
+ "Jelaskan alasan untuk melaporkan…"
+ "Tolak dan blokir"
"Apakah Anda yakin ingin menolak undangan untuk bergabung ke %1$s?"
"Tolak undangan"
"Apakah Anda yakin ingin menolak obrolan pribadi dengan %1$s?"
"Tolak obrolan"
"Tidak ada undangan"
"%1$s (%2$s) mengundang Anda"
+ "Ya, tolak & blokir"
+ "Apakah Anda yakin ingin menolak undangan untuk bergabung dengan ruangan ini? Ini juga akan mencegah %1$s menghubungi Anda atau mengundang Anda ke ruangan."
+ "Tolak undangan & blokir"
+ "Tolak dan blokir"
diff --git a/features/invite/impl/src/main/res/values-it/translations.xml b/features/invite/impl/src/main/res/values-it/translations.xml
index 624fc02842..d88183f90a 100644
--- a/features/invite/impl/src/main/res/values-it/translations.xml
+++ b/features/invite/impl/src/main/res/values-it/translations.xml
@@ -1,5 +1,10 @@
+ "Non vedrai alcun messaggio o invito ad una stanza da parte di questo utente"
+ "Blocca utente"
+ "Segnala questa stanza al fornitore del tuo account."
+ "Descrivi il motivo della segnalazione…"
+ "Rifiuta e blocca"
"Vuoi davvero rifiutare l\'invito ad entrare in %1$s?"
"Rifiuta l\'invito"
"Vuoi davvero rifiutare questa conversazione privata con %1$s?"
diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt
index 7d3b64f6f4..6206c2426a 100644
--- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt
+++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt
@@ -34,7 +34,7 @@ import io.element.android.features.roomdirectory.api.RoomDescription
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runUpdatingState
-import io.element.android.libraries.core.extensions.mapFailure
+import io.element.android.libraries.core.coroutine.mapState
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
@@ -50,7 +50,6 @@ import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.room.preview.RoomPreviewInfo
import io.element.android.libraries.matrix.ui.model.toInviteSender
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import java.util.Optional
@@ -68,7 +67,6 @@ class JoinRoomPresenter @AssistedInject constructor(
private val forgetRoom: ForgetRoom,
private val acceptDeclineInvitePresenter: Presenter,
private val buildMeta: BuildMeta,
- private val appPreferencesStore: AppPreferencesStore,
private val seenInvitesStore: SeenInvitesStore,
) : Presenter {
interface Factory {
@@ -95,8 +93,11 @@ class JoinRoomPresenter @AssistedInject constructor(
var knockMessage by rememberSaveable { mutableStateOf("") }
var isDismissingContent by remember { mutableStateOf(false) }
val hideInviteAvatars by remember {
- appPreferencesStore.getHideInviteAvatarsFlow()
- }.collectAsState(initial = false)
+ matrixClient
+ .mediaPreviewService()
+ .mediaPreviewConfigFlow
+ .mapState { config -> config.hideInviteAvatar }
+ }.collectAsState()
val canReportRoom by produceState(false) { value = matrixClient.canReportRoom() }
val contentState by produceState(
@@ -222,13 +223,7 @@ class JoinRoomPresenter @AssistedInject constructor(
roomIdOrAlias = roomIdOrAlias,
serverNames = serverNames,
trigger = trigger
- ).mapFailure {
- if (it is ClientException.MatrixApi && it.kind == ErrorKind.Forbidden) {
- JoinRoomFailures.UnauthorizedJoin
- } else {
- it
- }
- }
+ )
}
}
diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt
index e027b5ed9c..5b9f8007a3 100644
--- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt
+++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt
@@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.core.RoomAlias
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
import io.element.android.libraries.matrix.api.room.RoomType
+import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.ui.model.InviteSender
internal const val MAX_KNOCK_MESSAGE_LENGTH = 500
@@ -36,7 +37,7 @@ data class JoinRoomState(
val canReportRoom: Boolean,
val eventSink: (JoinRoomEvents) -> Unit
) {
- val isJoinActionUnauthorized = joinAction is AsyncAction.Failure && joinAction.error is JoinRoomFailures.UnauthorizedJoin
+ val isJoinActionUnauthorized = joinAction is AsyncAction.Failure && joinAction.error is JoinRoom.Failures.UnauthorizedJoin
val joinAuthorisationStatus = when (contentState) {
is ContentState.Loaded -> {
when {
@@ -107,7 +108,3 @@ sealed interface JoinAuthorisationStatus {
data object Unknown : JoinAuthorisationStatus
data object Unauthorized : JoinAuthorisationStatus
}
-
-sealed class JoinRoomFailures : Exception() {
- data object UnauthorizedJoin : JoinRoomFailures()
-}
diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt
index 4a5039e364..8f891fe645 100644
--- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt
+++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt
@@ -9,8 +9,8 @@ package io.element.android.features.joinroom.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.invite.api.InviteData
+import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
-import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
@@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
import io.element.android.libraries.matrix.api.exception.ClientException
import io.element.android.libraries.matrix.api.room.RoomType
+import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.ui.model.InviteSender
open class JoinRoomStateProvider : PreviewParameterProvider {
@@ -44,7 +45,7 @@ open class JoinRoomStateProvider : PreviewParameterProvider {
),
aJoinRoomState(
contentState = aLoadedContentState(joinAuthorisationStatus = JoinAuthorisationStatus.CanJoin),
- joinAction = AsyncAction.Failure(JoinRoomFailures.UnauthorizedJoin)
+ joinAction = AsyncAction.Failure(JoinRoom.Failures.UnauthorizedJoin)
),
aJoinRoomState(
contentState = aLoadedContentState(joinAuthorisationStatus = JoinAuthorisationStatus.CanJoin),
@@ -198,6 +199,16 @@ fun aJoinRoomState(
eventSink = eventSink
)
+internal fun anAcceptDeclineInviteState(
+ acceptAction: AsyncAction = AsyncAction.Uninitialized,
+ declineAction: AsyncAction = AsyncAction.Uninitialized,
+ eventSink: (AcceptDeclineInviteEvents) -> Unit = {}
+) = AcceptDeclineInviteState(
+ acceptAction = acceptAction,
+ declineAction = declineAction,
+ eventSink = eventSink,
+)
+
internal fun anInviteSender(
userId: UserId = UserId("@bob:domain"),
displayName: String = "Bob",
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 b63bdff347..cdeac0afe9 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
@@ -31,6 +31,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
+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.tooling.preview.PreviewParameter
@@ -53,6 +55,7 @@ import io.element.android.libraries.designsystem.components.BigIcon
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.button.SuperButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
@@ -92,7 +95,11 @@ fun JoinRoomView(
vertical = 32.dp
),
topBar = {
- JoinRoomTopBar(contentState = state.contentState, onBackClick = onBackClick)
+ JoinRoomTopBar(
+ contentState = state.contentState,
+ hideAvatarImage = state.hideAvatarsImages,
+ onBackClick = onBackClick,
+ )
},
content = {
JoinRoomContent(
@@ -490,7 +497,11 @@ private fun DefaultLoadedContent(
RoomPreviewOrganism(
modifier = modifier,
avatar = {
- Avatar(contentState.avatarData(AvatarSize.RoomHeader), hideImage = hideAvatarImage)
+ Avatar(
+ contentState.avatarData(AvatarSize.RoomHeader),
+ hideImage = hideAvatarImage,
+ avatarType = AvatarType.Room(),
+ )
},
title = {
if (contentState.name != null) {
@@ -545,6 +556,7 @@ private fun DefaultLoadedContent(
@Composable
private fun JoinRoomTopBar(
contentState: ContentState,
+ hideAvatarImage: Boolean,
onBackClick: () -> Unit,
) {
TopAppBar(
@@ -561,9 +573,17 @@ private fun JoinRoomTopBar(
modifier = titleModifier,
verticalAlignment = Alignment.CenterVertically
) {
- Avatar(avatarData = contentState.avatarData(AvatarSize.TimelineRoom))
+ Avatar(
+ avatarData = contentState.avatarData(AvatarSize.TimelineRoom),
+ hideImage = hideAvatarImage,
+ avatarType = AvatarType.Room(),
+ )
Text(
- modifier = Modifier.padding(horizontal = 8.dp),
+ modifier = Modifier
+ .padding(horizontal = 8.dp)
+ .semantics {
+ heading()
+ },
text = contentState.name,
style = ElementTheme.typography.fontBodyLgMedium,
maxLines = 1,
diff --git a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt
index 7142133eb1..5e85c0abbc 100644
--- a/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt
+++ b/features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/di/JoinRoomModule.kt
@@ -22,7 +22,6 @@ import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
import io.element.android.libraries.matrix.api.room.join.JoinRoom
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import java.util.Optional
@Module
@@ -37,7 +36,6 @@ object JoinRoomModule {
forgetRoom: ForgetRoom,
acceptDeclineInvitePresenter: Presenter,
buildMeta: BuildMeta,
- appPreferencesStore: AppPreferencesStore,
seenInvitesStore: SeenInvitesStore,
): JoinRoomPresenter.Factory {
return object : JoinRoomPresenter.Factory {
@@ -61,7 +59,6 @@ object JoinRoomModule {
cancelKnockRoom = cancelKnockRoom,
acceptDeclineInvitePresenter = acceptDeclineInvitePresenter,
buildMeta = buildMeta,
- appPreferencesStore = appPreferencesStore,
seenInvitesStore = seenInvitesStore,
)
}
diff --git a/features/joinroom/impl/src/main/res/values-bg/translations.xml b/features/joinroom/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..e9f7c38fcf
--- /dev/null
+++ b/features/joinroom/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "Присъединяване към стаята"
+
diff --git a/features/joinroom/impl/src/main/res/values-da/translations.xml b/features/joinroom/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..c27ff74145
--- /dev/null
+++ b/features/joinroom/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,32 @@
+
+
+ "Du blev spærret fra dette rum af %1$s."
+ "Du blev spærret fra dette rum"
+ "Årsag: %1$s."
+ "Annuller anmodning"
+ "Ja, annullér"
+ "Er du sikker på, at du vil annullere din anmodning om at deltage i dette rum?"
+ "Annullér anmodning om at deltage"
+ "Ja, afvis og blokér"
+ "Er du sikker på, at du vil afvise invitationen til at deltage i dette rum? Dette forhindrer også %1$s i at kontakte dig eller invitere dig til andre rum."
+ "Afvis invitation og blokér"
+ "Afvis og blokér"
+ "Deltagelse i rummet fejlede."
+ "Dette rum er enten kun for gæster, eller der kan være sat begrænsninger for adgangen på klyngeniveau."
+ "Glem dette rum"
+ "Du har brug for en invitation for at deltage i dette rum"
+ "Deltag i rummet"
+ "Du skal muligvis være inviteret eller være medlem af en klynge for at deltage."
+ "Send anmodning om at deltage"
+ "Besked (valgfrit)"
+ "Du vil modtage en invitation til at deltage i rummet, hvis din anmodning accepteres."
+ "Anmodning om at deltage sendt"
+ "Vi kunne ikke forhåndsvise rummet. Dette kan skyldes netværks- eller serverproblemer."
+ "Vi kunne ikke forhåndsvise rummet"
+ "%1$s understøtter ikke klynger endnu. Du kan få adgang til klynger på nettet."
+ "Klynger er ikke understøttet endnu"
+ "Klik på knappen nedenfor, og en rumadministrator vil blive underrettet. Du kan deltage i samtalen, når din anmodning er godkendt."
+ "Du skal være medlem af dette rum for at kunne se meddelelseshistorikken."
+ "Vil du deltage i dette rum?"
+ "Forhåndsvisning er ikke tilgængelig"
+
diff --git a/features/joinroom/impl/src/main/res/values-el/translations.xml b/features/joinroom/impl/src/main/res/values-el/translations.xml
index aea667f51c..9a7296b93b 100644
--- a/features/joinroom/impl/src/main/res/values-el/translations.xml
+++ b/features/joinroom/impl/src/main/res/values-el/translations.xml
@@ -1,32 +1,32 @@
- "Σας απαγορεύτηκε η είσοδος σε αυτό το δωμάτιο από το χρήστη %1$s."
- "Σας απαγορεύτηκε η είσοδος σε αυτό το δωμάτιο"
+ "Αποκλειστήκατε από αυτή την αίθουσα από το χρήστη %1$s."
+ "Σας απαγορεύτηκε η είσοδος σε αυτή την αίθουσα"
"Αιτία: %1$s."
"Ακύρωση αιτήματος"
"Ναι, ακύρωση"
- "Σίγουρα θες να ακυρώσεις το αίτημά σου για συμμετοχή σε αυτό το δωμάτιο;"
+ "Είστε βέβαιοι ότι θέλετε να ακυρώσετε το αίτημά σας να συμμετάσχετε σε αυτή την αίθουσα;"
"Ακύρωση αίτησης συμμετοχής"
"Ναι, απόρριψη και αποκλεισμός"
- "Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτό το δωμάτιο; Αυτό θα εμποδίσει επίσης το χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε δωμάτια."
+ "Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτήν την αίθουσα; Αυτό θα εμποδίσει επίσης τον χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε αίθουσες."
"Απόρριψη πρόσκλησης και αποκλεισμός"
"Απόρριψη και αποκλεισμός"
- "Η είσοδος στο δωμάτιο απέτυχε."
- "Αυτό το δωμάτιο είναι είτε μόνο για πρόσκληση είτε ενδέχεται να υπάρχουν περιορισμοί στην πρόσβαση σε επίπεδο χώρου."
- "Ξεχάστε αυτό το δωμάτιο"
- "Χρειάζεστε πρόσκληση για να συμμετάσχετε σε αυτό το δωμάτιο"
- "Συμμετοχή στο δωμάτιο"
+ "Η συμμετοχή στην αίθουσα απέτυχε."
+ "Αυτή η αίθουσα είναι είτε μόνο για προσκεκλημένους είτε ενδέχεται να υπάρχουν περιορισμοί πρόσβασης σε επίπεδο χώρου."
+ "Ξεχάστε αυτή την αίθουσα"
+ "Χρειάζεστε πρόσκληση για να συμμετάσχετε σε αυτή την αίθουσα"
+ "Συμμετοχή στην αίθουσα"
"Ενδέχεται να χρειαστεί να προσκληθείτε ή να είστε μέλος ενός χώρου για να συμμετάσχετε."
"Χτύπα για συμμετοχή"
"Μήνυμα (προαιρετικό)"
- "Θα λάβεις πρόσκληση για συμμετοχή στο δωμάτιο εάν το αίτημά σου γίνει αποδεκτό."
+ "Θα λάβετε πρόσκληση για να συμμετάσχετε στην αίθουσα, εάν το αίτημά σας γίνει αποδεκτό."
"Το αίτημα συμμετοχής στάλθηκε"
- "Δεν μπορέσαμε να εμφανίσουμε την προεπισκόπηση δωματίου. Αυτό μπορεί να οφείλεται σε προβλήματα δικτύου ή διακομιστή."
- "Δεν μπορέσαμε να εμφανίσουμε αυτήν την προεπισκόπηση δωματίου"
+ "Δεν μπορέσαμε να εμφανίσουμε την προεπισκόπηση της αίθουσας. Αυτό μπορεί να οφείλεται σε προβλήματα δικτύου ή διακομιστή."
+ "Δεν μπορέσαμε να εμφανίσουμε αυτή την προεπισκόπηση αίθουσας"
"Το %1$s δεν υποστηρίζει ακόμα χώρους. Μπορείς να έχεις πρόσβαση σε χώρους στον ιστό."
"Οι Χώροι δεν υποστηρίζονται ακόμα"
- "Κάνε κλικ στο παρακάτω κουμπί και ένας διαχειριστής δωματίου θα ειδοποιηθεί. Θα μπορείς να συμμετάσχεις στη συνομιλία μόλις εγκριθεί."
- "Πρέπει να είσαι μέλος αυτού του δωματίου για να δεις το ιστορικό μηνυμάτων."
- "Θες να συμμετάσχεις σε αυτό το δωμάτιο;"
+ "Κάντε κλικ στο παρακάτω κουμπί και θα ειδοποιηθεί ένας διαχειριστής της αίθουσας. Μόλις εγκριθείτε, θα μπορείτε να συμμετάσχετε στη συζήτηση."
+ "Πρέπει να είστε μέλος αυτής της αίθουσας για να δείτε το ιστορικό των μηνυμάτων."
+ "Θέλετε να συμμετάσχετε σε αυτή την αίθουσα;"
"Η προεπισκόπηση δεν είναι διαθέσιμη"
diff --git a/features/joinroom/impl/src/main/res/values-in/translations.xml b/features/joinroom/impl/src/main/res/values-in/translations.xml
index 4988e2dd58..16c078c6ff 100644
--- a/features/joinroom/impl/src/main/res/values-in/translations.xml
+++ b/features/joinroom/impl/src/main/res/values-in/translations.xml
@@ -1,14 +1,28 @@
+ "Anda dicekal dari ruangan ini oleh %1$s."
+ "Anda dicekal dari ruangan ini"
+ "Alasan: %1$s."
"Batalkan permintaan"
"Ya, batalkan"
"Apakah Anda yakin ingin membatalkan permintaan Anda untuk bergabung dengan ruangan ini?"
"Batalkan permintaan untuk bergabung"
+ "Ya, tolak & blokir"
+ "Apakah Anda yakin ingin menolak undangan untuk bergabung dengan ruangan ini? Ini juga akan mencegah %1$s menghubungi Anda atau mengundang Anda ke ruangan."
+ "Tolak undangan & blokir"
+ "Tolak dan blokir"
+ "Bergabung dalam ruangan gagal."
+ "Ruangan ini hanya untuk undangan atau mungkin ada pembatasan akses pada tingkat space."
+ "Lupakan ruangan ini"
+ "Anda memerlukan undangan untuk bergabung dalam ruangan ini"
"Gabung dengan ruangan"
+ "Anda mungkin perlu diundang atau menjadi anggota space untuk bergabung."
"Ketuk untuk bergabung"
"Pesan (opsional)"
"Anda akan menerima undangan untuk bergabung dengan ruangan jika permintaan Anda diterima."
"Permintaan untuk bergabung dikirim"
+ "Kami tidak dapat menampilkan pratinjau ruangan. Ini mungkin karena masalah jaringan atau server."
+ "Kami tidak dapat menampilkan pratinjau ruangan ini"
"%1$s belum mendukung space. Anda dapat mengakses space di web."
"Space belum didukung"
"Klik tombol di bawah ini dan administrator kamar akan diberi tahu. Anda akan dapat bergabung dengan percakapan setelah disetujui."
diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt
index c751dc971f..8a475668ae 100644
--- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt
+++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt
@@ -13,7 +13,6 @@ import io.element.android.features.invite.api.InviteData
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteEvents
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
-import io.element.android.features.invite.api.acceptdecline.anAcceptDeclineInviteState
import io.element.android.features.invite.api.toInviteData
import io.element.android.features.invite.test.InMemorySeenInvitesStore
import io.element.android.features.joinroom.impl.di.CancelKnockRoom
@@ -36,6 +35,7 @@ import io.element.android.libraries.matrix.api.exception.ErrorKind
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomMembershipDetails
import io.element.android.libraries.matrix.api.room.RoomType
+import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.A_ROOM_ID
@@ -52,8 +52,6 @@ import io.element.android.libraries.matrix.test.room.aRoomPreviewInfo
import io.element.android.libraries.matrix.test.room.join.FakeJoinRoom
import io.element.android.libraries.matrix.ui.model.InviteSender
import io.element.android.libraries.matrix.ui.model.toInviteSender
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
-import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.any
import io.element.android.tests.testutils.lambda.assert
@@ -304,7 +302,7 @@ class JoinRoomPresenterTest {
val presenter = createJoinRoomPresenter(
roomDescription = Optional.of(roomDescription),
joinRoomLambda = { _, _, _ ->
- Result.failure(ClientException.MatrixApi(ErrorKind.Forbidden, "403", "Forbidden", null))
+ Result.failure(JoinRoom.Failures.UnauthorizedJoin)
},
)
presenter.test {
@@ -316,7 +314,7 @@ class JoinRoomPresenterTest {
assertThat(state.joinAction).isEqualTo(AsyncAction.Loading)
}
awaitItem().also { state ->
- assertThat(state.joinAction).isEqualTo(AsyncAction.Failure(JoinRoomFailures.UnauthorizedJoin))
+ assertThat(state.joinAction).isEqualTo(AsyncAction.Failure(JoinRoom.Failures.UnauthorizedJoin))
assertThat(state.joinAuthorisationStatus).isEqualTo(JoinAuthorisationStatus.Unauthorized)
}
}
@@ -1057,7 +1055,6 @@ class JoinRoomPresenterTest {
forgetRoom: ForgetRoom = FakeForgetRoom(),
buildMeta: BuildMeta = aBuildMeta(applicationName = "AppName"),
acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() },
- appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(),
seenInvitesStore: SeenInvitesStore = InMemorySeenInvitesStore(),
): JoinRoomPresenter {
return JoinRoomPresenter(
@@ -1073,7 +1070,6 @@ class JoinRoomPresenterTest {
forgetRoom = forgetRoom,
buildMeta = buildMeta,
acceptDeclineInvitePresenter = acceptDeclineInvitePresenter,
- appPreferencesStore = appPreferencesStore,
seenInvitesStore = seenInvitesStore,
)
}
diff --git a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomViewTest.kt b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomViewTest.kt
index 00d73db03b..0205c1cac0 100644
--- a/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomViewTest.kt
+++ b/features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomViewTest.kt
@@ -15,6 +15,7 @@ import io.element.android.features.invite.api.InviteData
import io.element.android.features.invite.test.anInviteData
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomType
+import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.test.room.aRoomMember
import io.element.android.libraries.matrix.ui.model.toInviteSender
import io.element.android.libraries.ui.strings.CommonStrings
@@ -199,9 +200,9 @@ class JoinRoomViewTest {
canReportRoom = false,
eventSink = eventsRecorder,
)
- rule.setJoinRoomView(state = joinRoomState,)
- rule.clickOn(R.string.screen_join_room_decline_and_block_button_title)
- eventsRecorder.assertSingle(JoinRoomEvents.DeclineInvite(inviteData, true))
+ rule.setJoinRoomView(state = joinRoomState)
+ rule.clickOn(R.string.screen_join_room_decline_and_block_button_title)
+ eventsRecorder.assertSingle(JoinRoomEvents.DeclineInvite(inviteData, true))
}
@Test
@@ -239,7 +240,7 @@ class JoinRoomViewTest {
rule.setJoinRoomView(
aJoinRoomState(
contentState = aLoadedContentState(),
- joinAction = AsyncAction.Failure(JoinRoomFailures.UnauthorizedJoin),
+ joinAction = AsyncAction.Failure(JoinRoom.Failures.UnauthorizedJoin),
eventSink = eventsRecorder,
),
onBackClick = it
diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt
index 186a578945..992098dc91 100644
--- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt
+++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/AvatarRow.kt
@@ -26,6 +26,7 @@ import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toPx
@@ -36,6 +37,7 @@ import kotlinx.collections.immutable.toImmutableList
* Draw a row of avatars (they must all have the same size), from start to end.
* @param avatarDataList the avatars to render. Note: they will all be rendered, the caller may
* want to limit the list size
+ * @param avatarType the type of avatars to render
* @param modifier Jetpack Compose modifier
* @param overlapRatio the overlap ration. When 0f, avatars will render without overlap, when 1f
* only the first avatar will be visible
@@ -43,6 +45,7 @@ import kotlinx.collections.immutable.toImmutableList
@Composable
fun AvatarRow(
avatarDataList: ImmutableList,
+ avatarType: AvatarType,
modifier: Modifier = Modifier,
overlapRatio: Float = 0.5f,
) {
@@ -58,35 +61,36 @@ fun AvatarRow(
.forEachIndexed { index, avatarData ->
Avatar(
modifier = Modifier
- .padding(start = avatarSize * (1 - overlapRatio) * (lastItemIndex - index))
- .graphicsLayer {
- compositingStrategy = CompositingStrategy.Offscreen
+ .padding(start = avatarSize * (1 - overlapRatio) * (lastItemIndex - index))
+ .graphicsLayer {
+ compositingStrategy = CompositingStrategy.Offscreen
+ }
+ .drawWithContent {
+ // Draw content and clear the pixels for the avatar on the left (right in RTL).
+ drawContent()
+ val xOffset = if (isRtl) {
+ size.width - avatarSizePx * (overlapRatio - 0.5f)
+ } else {
+ 0f + avatarSizePx * (overlapRatio - 0.5f)
}
- .drawWithContent {
- // Draw content and clear the pixels for the avatar on the left (right in RTL).
- drawContent()
- val xOffset = if (isRtl) {
- size.width - avatarSizePx * (overlapRatio - 0.5f)
- } else {
- 0f + avatarSizePx * (overlapRatio - 0.5f)
- }
- if (index < lastItemIndex) {
- drawCircle(
- color = Color.Black,
- center = Offset(
- x = xOffset,
- y = size.height / 2,
- ),
- radius = avatarSizePx / 2,
- blendMode = BlendMode.Clear,
- )
- }
+ if (index < lastItemIndex) {
+ drawCircle(
+ color = Color.Black,
+ center = Offset(
+ x = xOffset,
+ y = size.height / 2,
+ ),
+ radius = avatarSizePx / 2,
+ blendMode = BlendMode.Clear,
+ )
}
- .size(size = avatarSize)
- // Keep internal padding, it has the advantage to not reduce the size of the Avatar image,
- // which is already small in our use case.
- .padding(2.dp),
+ }
+ .size(size = avatarSize)
+ // Keep internal padding, it has the advantage to not reduce the size of the Avatar image,
+ // which is already small in our use case.
+ .padding(2.dp),
avatarData = avatarData,
+ avatarType = avatarType,
)
}
}
@@ -122,6 +126,7 @@ private fun ContentToPreview(overlapRatio: Float) {
size = AvatarSize.RoomListItem,
)
}.toImmutableList(),
+ avatarType = AvatarType.User,
overlapRatio = overlapRatio,
)
}
diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt
index 09ac8bff59..334bb531ae 100644
--- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt
+++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt
@@ -39,6 +39,7 @@ import io.element.android.libraries.designsystem.components.async.AsyncIndicator
import io.element.android.libraries.designsystem.components.async.rememberAsyncIndicatorState
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
@@ -195,7 +196,10 @@ private fun KnockRequestAvatarView(
Box(modifier) {
when (knockRequests.size) {
0 -> Unit
- 1 -> Avatar(knockRequests.first().getAvatarData(AvatarSize.KnockRequestBanner))
+ 1 -> Avatar(
+ avatarData = knockRequests.first().getAvatarData(AvatarSize.KnockRequestBanner),
+ avatarType = AvatarType.User,
+ )
else -> KnockRequestAvatarListView(knockRequests)
}
}
@@ -214,6 +218,7 @@ private fun KnockRequestAvatarListView(
.toImmutableList()
AvatarRow(
avatarDataList = avatars,
+ avatarType = AvatarType.User,
modifier = modifier,
)
}
diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt
index 3b90fe7e11..987125f451 100644
--- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt
+++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt
@@ -56,12 +56,12 @@ import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ButtonSize
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
@@ -318,7 +318,10 @@ private fun KnockRequestItem(
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 12.dp)
) {
- Avatar(knockRequest.getAvatarData(AvatarSize.KnockRequestItem))
+ Avatar(
+ avatarData = knockRequest.getAvatarData(AvatarSize.KnockRequestItem),
+ avatarType = AvatarType.User,
+ )
Spacer(modifier = Modifier.width(16.dp))
Column {
// Name and date
@@ -475,12 +478,7 @@ private fun KnockRequestsEmptyList(
@Composable
private fun KnockRequestsListTopBar(onBackClick: () -> Unit) {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_knock_requests_list_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_knock_requests_list_title),
navigationIcon = { BackButton(onClick = onBackClick) },
)
}
diff --git a/features/knockrequests/impl/src/main/res/values-da/translations.xml b/features/knockrequests/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..30ac6a8d30
--- /dev/null
+++ b/features/knockrequests/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,36 @@
+
+
+ "Ja, acceptér alle"
+ "Er du sikker på, at du vil acceptere alle anmodninger om at deltage?"
+ "Acceptér alle anmodninger"
+ "Acceptér alle"
+ "Vi kunne ikke acceptere alle anmodninger. Vil du prøve igen?"
+ "Kunne ikke acceptere alle anmodninger"
+ "Accepterer alle anmodninger om at deltage"
+ "Vi kunne ikke acceptere denne anmodning. Vil du prøve igen?"
+ "Kunne ikke acceptere anmodningen"
+ "Accepterer anmodning om at deltage"
+ "Ja, afvis og spær"
+ "Er du sikker på, at du vil afvise og spærre %1$s? Denne bruger vil ikke kunne anmode om adgang til at deltage i dette rum igen."
+ "Afvis og spær for deres adgang til rummet"
+ "Afviser og spærrer for adgang"
+ "Ja, afvis"
+ "Er du sikker på, at du vil afvise %1$ss anmodning om at deltage i dette rum?"
+ "Afvis adgang"
+ "Afvis og spær"
+ "Vi kunne ikke afvise denne anmodning. Vil du prøve igen?"
+ "Anmodningen kunne ikke afvises"
+ "Afviser anmodning om at deltage"
+ "Når nogen beder om at deltage i rummet, kan du se deres anmodning her."
+ "Ingen ventende anmodning om at deltage"
+ "Indlæser anmodninger om at deltage…"
+ "Anmodninger om at deltage"
+
+ - "%1$s + %2$d anden ønsker at deltage i dette rum"
+ - "%1$s + %2$d andre ønsker at deltage i dette rum"
+
+ "Se alle"
+ "Accepter"
+ "%1$s ønsker at deltage i dette rum"
+ "Se"
+
diff --git a/features/knockrequests/impl/src/main/res/values-el/translations.xml b/features/knockrequests/impl/src/main/res/values-el/translations.xml
index 8d9bbd4f6d..2066b2e293 100644
--- a/features/knockrequests/impl/src/main/res/values-el/translations.xml
+++ b/features/knockrequests/impl/src/main/res/values-el/translations.xml
@@ -11,26 +11,26 @@
"Αποτυχία αποδοχής αιτήματος"
"Γίνεται αποδοχή αιτήματος συμμετοχής"
"Ναι, απόρριψη και αποκλεισμός"
- "Σίγουρα θες να απορρίψειε και να αποκλείσεις τον χρήστη %1$s; Αυτός ο χρήστης δεν θα μπορεί να ζητήσει πρόσβαση για να συμμετάσχει ξανά σε αυτό το δωμάτιο."
+ "Είστε σίγουροι ότι θέλετε να απορρίψετε και να αποκλείσετε το χρήστη %1$s; Αυτός ο χρήστης δεν θα μπορέσει να ζητήσει ξανά πρόσβαση για να συμμετάσχει σε αυτή την αίθουσα."
"Απόρριψη και αποκλεισμός πρόσβασης"
"Γίνεται απόρριψη και αποκλεισμός πρόσβασης"
"Ναι, απόρριψη"
- "Σίγουρα θες να απορρίψεις το αίτημα του χρήστη %1$s να συμμετάσχει στο δωμάτιο;"
+ "Είστε σίγουροι ότι θέλετε να απορρίψετε το αίτημα του %1$s να συμμετάσχετε σε αυτήν την αίθουσα;"
"Απόρριψη πρόσβασης"
"Απόρριψη και αποκλεισμός"
"Δεν μπορέσαμε να απορρίψουμε αυτό το αίτημα. Θα θέλατε να προσπαθήσετε ξανά;"
"Απέτυχε η απόρριψη του αιτήματος"
"Γίνεται απόρριψη αιτήματος συμμετοχής"
- "Όταν κάποιος θα ζητήσει να συμμετάσχει στο δωμάτιο, θα μπορείς να δεις το αίτημά του εδώ."
+ "Όταν κάποιος θα ζητήσει να συμμετάσχει στην αίθουσα, θα μπορείτε να δείτε το αίτημά του εδώ."
"Δεν υπάρχει εκκρεμές αίτημα συμμετοχής"
"Φόρτωση αιτημάτων συμμετοχής…"
"Αιτήματα συμμετοχής"
- - "Οι χρήστες %1$s +%2$d ακόμη θέλουν να συμμετάσχουν σε αυτό το δωμάτιο"
- - "Οι χρήστες %1$s +%2$d ακόμη θέλουν να συμμετάσχουν σε αυτό το δωμάτιο"
+ - "%1$s +%2$d άλλοι θέλουν να συμμετάσχουν σε αυτή την αίθουσα"
+ - "%1$s +%2$d άλλοι θέλουν να συμμετάσχουν σε αυτή την αίθουσα"
"Προβολή όλων"
"Αποδοχή"
- "Ο χρήστης %1$s θέλει να μπει σε αυτό το δωμάτιο"
+ "%1$s θέλει να συμμετάσχει σε αυτή την αίθουσα"
"Προβολή"
diff --git a/features/leaveroom/api/src/main/res/values-da/translations.xml b/features/leaveroom/api/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..5a1364be0c
--- /dev/null
+++ b/features/leaveroom/api/src/main/res/values-da/translations.xml
@@ -0,0 +1,7 @@
+
+
+ "Er du sikker på, at du vil forlade denne samtale? Denne samtale er ikke offentlig, og du kan ikke deltage igen uden en invitation."
+ "Er du sikker på, at du vil forlade dette rum? Du er den eneste person her. Hvis du går, vil ingen kunne tilslutte sig det i fremtiden, heller ikke dig."
+ "Er du sikker på, at du vil forlade dette rum? Rummet er ikke offentligt, så du vil ikke kunne deltage igen uden en invitation."
+ "Er du sikker på, at du ønsker at forlade rummet?"
+
diff --git a/features/leaveroom/api/src/main/res/values-el/translations.xml b/features/leaveroom/api/src/main/res/values-el/translations.xml
index 09295f805b..b6ea1a6caf 100644
--- a/features/leaveroom/api/src/main/res/values-el/translations.xml
+++ b/features/leaveroom/api/src/main/res/values-el/translations.xml
@@ -1,7 +1,7 @@
"Είσαι σίγουρος ότι θέλεις να αποχωρήσεις από αυτή τη συζήτηση; Αυτή η συνομιλία δεν είναι δημόσια και δεν θα μπορείς να συμμετάσχεις ξανά χωρίς πρόσκληση."
- "Σίγουρα θες να φύγεις από αυτό το δωμάτιο; Είσαι το μόνο άτομο εδώ. Εάν φύγεις, κανείς δεν θα μπορεί να συμμετάσχει στο μέλλον, ούτε και \'σύ."
- "Σίγουρα θες να φύγεις από αυτό το δωμάτιο; Αυτό το δωμάτιο δεν είναι δημόσιο και δεν θα μπορείς να συμμετάσχεις ξανά χωρίς πρόσκληση."
- "Θες σίγουρα να φύγεις από το δωμάτιο;"
+ "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτή την αίθουσα; Είστε το μόνο άτομο εδώ. Αν αποχωρήσετε, κανείς δεν θα μπορεί να ενταχθεί στο μέλλον, ούτε εσείς."
+ "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν την αίθουσα; Αυτή η αίθουσα δεν είναι δημόσια και δεν θα μπορέσετε να επανενταχτείτε χωρίς πρόσκληση."
+ "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από την αίθουσα;"
diff --git a/features/leaveroom/api/src/main/res/values-fa/translations.xml b/features/leaveroom/api/src/main/res/values-fa/translations.xml
new file mode 100644
index 0000000000..3c5a4cddec
--- /dev/null
+++ b/features/leaveroom/api/src/main/res/values-fa/translations.xml
@@ -0,0 +1,6 @@
+
+
+ "آیا مطمئن هستید که می خواهید این اتاق را ترک کنید؟ شما تنها کسی هستید که اینجا هستید. اگر ترک کنید، هیچ کس نمی تواند در آینده به آن بپیوندد.از جمله خود شما."
+ "آیا مطمئن هستید که می خواهید از این اتاق خارج شوید؟ این اتاق عمومی نیست و نمیتوانید بدون دعوت دوباره بپیوندید."
+ "آیا مطمئن هستید که می خواهید اتاق را ترک کنید؟"
+
diff --git a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt
index 4943e75185..915d65b71f 100644
--- a/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt
+++ b/features/leaveroom/impl/src/main/kotlin/io/element/android/features/leaveroom/impl/LeaveRoomPresenter.kt
@@ -78,7 +78,8 @@ private suspend fun showLeaveRoomAlert(
val roomInfo = room.roomInfoFlow.first()
confirmation.value = when {
roomInfo.isDm -> Dm(roomId)
- !roomInfo.isPublic -> PrivateRoom(roomId)
+ // If unknown, assume the room is private
+ roomInfo.isPublic == null || roomInfo.isPublic == false -> PrivateRoom(roomId)
roomInfo.joinedMembersCount == 1L -> LastUserInRoom(roomId)
else -> Generic(roomId)
}
diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt
index 9267064f89..063579414f 100644
--- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt
+++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/details/DependenciesDetailsView.kt
@@ -23,7 +23,6 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
@OptIn(ExperimentalMaterial3Api::class)
@@ -37,7 +36,7 @@ fun DependenciesDetailsView(
modifier = modifier,
topBar = {
TopAppBar(
- title = { Text(text = licenseItem.safeName) },
+ titleStr = licenseItem.safeName,
navigationIcon = { BackButton(onClick = onBack) },
)
},
diff --git a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt
index 61e4ace265..3419665b65 100644
--- a/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt
+++ b/features/licenses/impl/src/main/kotlin/io/element/android/features/licenses/impl/list/DependencyLicensesListView.kt
@@ -47,7 +47,7 @@ fun DependencyLicensesListView(
modifier = modifier,
topBar = {
TopAppBar(
- title = { Text(text = stringResource(CommonStrings.common_open_source_licenses)) },
+ titleStr = stringResource(CommonStrings.common_open_source_licenses),
navigationIcon = { BackButton(onClick = onBackClick) },
)
},
diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt
index 53d1855e2a..32df5af6c5 100644
--- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt
+++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/send/SendLocationView.kt
@@ -30,7 +30,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.location.api.Location
import io.element.android.features.location.api.internal.centerBottomEdge
@@ -42,7 +41,6 @@ import io.element.android.features.location.impl.common.PermissionRationaleDialo
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.BottomSheetScaffold
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -162,12 +160,7 @@ fun SendLocationView(
sheetSwipeEnabled = false,
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(CommonStrings.screen_share_location_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(CommonStrings.screen_share_location_title),
navigationIcon = {
BackButton(onClick = navigateUp)
},
diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt
index 81dd4c98f6..03d2a3c714 100644
--- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt
+++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt
@@ -21,7 +21,6 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.compound.tokens.generated.TypographyTokens
import io.element.android.features.location.api.internal.rememberTileStyleUrl
@@ -31,7 +30,6 @@ import io.element.android.features.location.impl.common.PermissionRationaleDialo
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.IconButton
@@ -101,12 +99,7 @@ fun ShowLocationView(
modifier = modifier,
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(CommonStrings.screen_view_location_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(CommonStrings.screen_view_location_title),
navigationIcon = {
BackButton(
onClick = onBackClick,
diff --git a/features/lockscreen/impl/src/main/res/values-da/translations.xml b/features/lockscreen/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..ffbd657970
--- /dev/null
+++ b/features/lockscreen/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,38 @@
+
+
+ "biometrisk godkendelse"
+ "biometrisk oplåsning"
+ "Lås op med biometri"
+ "Bekræft biometri"
+ "Glemt PIN-kode?"
+ "Skift PIN-kode"
+ "Tillad biometrisk oplåsning"
+ "Fjern PIN-koden"
+ "Er du sikker på, at du vil fjerne PIN-koden?"
+ "Fjern PIN-koden?"
+ "Tillad %1$s"
+ "Jeg foretrækker at bruge PIN-kode"
+ "Spar dig selv lidt tid og brug den %1$s til at låse appen op hver gang"
+ "Vælg PIN-kode"
+ "Bekræft PIN-kode"
+ "Lås %1$s for at tilføje ekstra sikkerhed til dine samtaler.
+
+Vælg noget mindeværdigt. Hvis du glemmer denne pinkode, bliver du logget ud af appen."
+ "Du kan ikke vælge dette som din PIN-kode af sikkerhedsmæssige årsager"
+ "Vælg en anden PIN-kode"
+ "Indtast venligst den samme PIN-kode to gange"
+ "PIN-koderne stemmer ikke overens"
+ "Du vil være nødt til at logge ind igen og oprette en ny PIN-kode for at fortsætte."
+ "Du bliver logget ud"
+
+ - "Du har %1$d forsøg på at låse op"
+ - "Du har %1$d forsøg på at låse op"
+
+
+ - "Forkert PIN-kode. Du har %1$d chance mere"
+ - "Forkert PIN-kode. Du har %1$d flere chancer"
+
+ "Brug biometri"
+ "Brug PIN-kode"
+ "Logger ud…"
+
diff --git a/features/lockscreen/impl/src/main/res/values-el/translations.xml b/features/lockscreen/impl/src/main/res/values-el/translations.xml
index e4e7d566b6..d36cbd4e84 100644
--- a/features/lockscreen/impl/src/main/res/values-el/translations.xml
+++ b/features/lockscreen/impl/src/main/res/values-el/translations.xml
@@ -2,7 +2,7 @@
"βιομετρική ταυτοποίηση"
"βιομετρικό ξεκλείδωμα"
- "Ξεκλείδωμα με βιομετρικά"
+ "Ξεκλείδωμα με βιομετρικά στοιχεία"
"Επιβεβαίωσε τον βιομετρικό έλεγχο ταυτότητας"
"Ξέχασες το PIN;"
"Αλλαγή κωδικού PIN"
@@ -15,9 +15,9 @@
"Εξοικονόμησε χρόνο και χρησιμοποίησε %1$s για να ξεκλειδώσεις την εφαρμογή κάθε φορά"
"Επέλεξε PIN"
"Επιβεβαίωση PIN"
- "Κλείδωμα του %1$s για να προσθέσεις επιπλέον ασφάλεια στις συνομιλίες σου.
+ "Κλειδώστε το %1$s για να προσθέσετε επιπλέον ασφάλεια στις συνομιλίες σας.
-Επέλεξε κάτι αξιομνημόνευτο. Εάν ξεχάσεις αυτό το PIN, θα αποσυνδεθείς από την εφαρμογή."
+Επιλέξτε κάτι που θα θυμάστε εύκολα. Εάν ξεχάσετε αυτό το PIN, θα αποσυνδεθείτε από την εφαρμογή."
"Δεν μπορείς να το επιλέξεις ως κωδικό PIN για λόγους ασφαλείας"
"Επέλεξε διαφορετικό PIN"
"Παρακαλώ εισήγαγε το ίδιο PIN δύο φορές"
@@ -25,8 +25,8 @@
"Θα χρειαστεί να συνδεθείς ξανά και να δημιουργήσεις ένα νέο PIN για να προχωρήσεις"
"Έχεις αποσυνδεθεί"
- - "Έχεις %1$d προσπάθεια για ξεκλείδωμα"
- - "Έχεις %1$d προσπάθειες για ξεκλείδωμα"
+ - "Έχετε %1$d προσπάθεια να ξεκλειδώσετε"
+ - "Έχετε %1$d προσπάθειες να ξεκλειδώσετε"
- "Λάθος PIN. Έχεις %1$d ακόμη ευκαιρία"
diff --git a/features/lockscreen/impl/src/main/res/values-fa/translations.xml b/features/lockscreen/impl/src/main/res/values-fa/translations.xml
index b311024aaa..2d224ea302 100644
--- a/features/lockscreen/impl/src/main/res/values-fa/translations.xml
+++ b/features/lockscreen/impl/src/main/res/values-fa/translations.xml
@@ -15,12 +15,23 @@
"زمیانتان را ذخیره کرده و از %1$s برای قفلگشایی هربارهٔ کاره استفاده کنید"
"گزینش پین"
"تأیید پین"
+ "قفل %1$s برای افزودن امنیت بیشتر به گفتگوهایتان.
+
+چیزی به یاد ماندنی انتخاب کنید. اگر این پین را فراموش کنید، از برنامه خارج خواهید شد."
"به دلیل امنیتی نمیتوانید این پین را برگزینید"
"گزینشی پینی متفاوت"
"لطفاً یک پین را دو بار وارد کنید"
"پینها مطابق نیستند"
"برای ادامه باید دوباره وارد شده و پینی جدید ایجاد کنید"
"دارید خارج میشوید"
+
+ - "شما %1$d تلاش برای باز کردن قفل دارید"
+ - "شما %1$d تلاش برای باز کردن قفل دارید"
+
+
+ - "پین اشتباه است. شما %1$d شانس دیگر دارید"
+ - "پین اشتباه است. شما %1$d شانس دیگر دارید"
+
"استفاده از زیستسنجی"
"استفاده از پین"
"خارج شدن…"
diff --git a/features/login/impl/build.gradle.kts b/features/login/impl/build.gradle.kts
index 1d92cf00c9..a4f20fb97d 100644
--- a/features/login/impl/build.gradle.kts
+++ b/features/login/impl/build.gradle.kts
@@ -43,6 +43,7 @@ dependencies {
implementation(projects.libraries.permissions.api)
implementation(projects.libraries.qrcode)
implementation(projects.libraries.oidc.api)
+ implementation(projects.libraries.uiUtils)
implementation(libs.androidx.browser)
implementation(platform(libs.network.retrofit.bom))
implementation(libs.androidx.webkit)
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountView.kt
index 87ea174540..2ad96edf75 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountView.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountView.kt
@@ -36,7 +36,6 @@ import io.element.android.libraries.designsystem.components.async.AsyncActionVie
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.LinearProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
@@ -56,12 +55,7 @@ fun CreateAccountView(
modifier = modifier,
topBar = {
TopAppBar(
- title = {
- Text(
- stringResource(R.string.screen_create_account_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_create_account_title),
navigationIcon = {
BackButton(onClick = onBackClick)
},
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt
index 6ea5bfa488..5e0cc054fc 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingEvents.kt
@@ -12,5 +12,6 @@ sealed interface OnBoardingEvents {
val defaultAccountProvider: String
) : OnBoardingEvents
+ data object OnVersionClick : OnBoardingEvents
data object ClearError : OnBoardingEvents
}
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt
index f4696133fe..37dce8e4b5 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt
@@ -9,9 +9,12 @@ package io.element.android.features.login.impl.screens.onboarding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@@ -24,6 +27,7 @@ import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
+import io.element.android.libraries.ui.utils.MultipleTapToUnlock
class OnBoardingPresenter @AssistedInject constructor(
@Assisted private val params: OnBoardingNode.Params,
@@ -40,6 +44,8 @@ class OnBoardingPresenter @AssistedInject constructor(
): OnBoardingPresenter
}
+ private val multipleTapToUnlock = MultipleTapToUnlock()
+
@Composable
override fun present(): OnBoardingState {
val localCoroutineScope = rememberCoroutineScope()
@@ -70,6 +76,7 @@ class OnBoardingPresenter @AssistedInject constructor(
featureFlagService.isFeatureEnabled(FeatureFlags.QrCodeLogin)
}
val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() }
+ var showReportBug by rememberSaveable { mutableStateOf(false) }
val loginMode by loginHelper.collectLoginMode()
@@ -82,6 +89,13 @@ class OnBoardingPresenter @AssistedInject constructor(
loginHint = params.loginHint?.takeIf { forcedAccountProvider == null },
)
OnBoardingEvents.ClearError -> loginHelper.clearError()
+ OnBoardingEvents.OnVersionClick -> {
+ if (canReportBug) {
+ if (multipleTapToUnlock.unlock(localCoroutineScope)) {
+ showReportBug = true
+ }
+ }
+ }
}
}
@@ -91,8 +105,9 @@ class OnBoardingPresenter @AssistedInject constructor(
mustChooseAccountProvider = mustChooseAccountProvider,
canLoginWithQrCode = canLoginWithQrCode,
canCreateAccount = defaultAccountProvider == null && canConnectToAnyHomeserver && OnBoardingConfig.CAN_CREATE_ACCOUNT,
- canReportBug = canReportBug,
+ canReportBug = canReportBug && showReportBug,
loginMode = loginMode,
+ version = buildMeta.versionName,
eventSink = ::handleEvent,
)
}
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt
index 98484a1fc2..1e55c3af2d 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt
@@ -17,6 +17,7 @@ data class OnBoardingState(
val canLoginWithQrCode: Boolean,
val canCreateAccount: Boolean,
val canReportBug: Boolean,
+ val version: String,
val loginMode: AsyncData,
val eventSink: (OnBoardingEvents) -> Unit,
) {
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt
index 9be36719e2..cdf77da523 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt
@@ -30,6 +30,7 @@ fun anOnBoardingState(
canLoginWithQrCode: Boolean = false,
canCreateAccount: Boolean = false,
canReportBug: Boolean = false,
+ version: String = "1.0.0",
loginMode: AsyncData = AsyncData.Uninitialized,
eventSink: (OnBoardingEvents) -> Unit = {},
) = OnBoardingState(
@@ -39,6 +40,7 @@ fun anOnBoardingState(
canLoginWithQrCode = canLoginWithQrCode,
canCreateAccount = canCreateAccount,
canReportBug = canReportBug,
+ version = version,
loginMode = loginMode,
eventSink = eventSink,
)
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt
index 99ab348b06..6c67e75cd1 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt
@@ -202,12 +202,23 @@ private fun OnBoardingButtons(
// Add a report problem text button. Use a Text since we need a special theme here.
Text(
modifier = Modifier
- .padding(16.dp)
- .clickable(onClick = onReportProblem),
+ .clickable(onClick = onReportProblem)
+ .padding(16.dp),
text = stringResource(id = CommonStrings.common_report_a_problem),
style = ElementTheme.typography.fontBodySmRegular,
color = ElementTheme.colors.textSecondary,
)
+ } else {
+ Text(
+ modifier = Modifier
+ .clickable {
+ state.eventSink(OnBoardingEvents.OnVersionClick)
+ }
+ .padding(16.dp),
+ text = stringResource(id = R.string.screen_onboarding_app_version, state.version),
+ style = ElementTheme.typography.fontBodySmRegular,
+ color = ElementTheme.colors.textSecondary,
+ )
}
}
}
diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt
index afa7dbe8a1..13bfd9e38e 100644
--- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt
+++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt
@@ -25,7 +25,6 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
-import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
@@ -57,6 +56,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.TextField
+import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.ui.strings.CommonStrings
diff --git a/features/login/impl/src/main/res/values-bg/translations.xml b/features/login/impl/src/main/res/values-bg/translations.xml
index 808dbfade9..bd321a9c5a 100644
--- a/features/login/impl/src/main/res/values-bg/translations.xml
+++ b/features/login/impl/src/main/res/values-bg/translations.xml
@@ -26,6 +26,7 @@
"Добре дошли в %1$s. Супер зареден за скорост и простота."
"Бъдете в стихията си"
"Повторен опит"
+ "Вашият код за потвърждение"
"Промяна на доставчика на акаунт"
"Matrix е отворена мрежа за сигурна, децентрализирана комуникация."
"Това е мястото, където ще живеят вашите разговори — точно както бихте използвали имейл доставчик, за да съхранявате вашите имейли."
diff --git a/features/login/impl/src/main/res/values-cy/translations.xml b/features/login/impl/src/main/res/values-cy/translations.xml
index 3f787fbf99..a9e4b61541 100644
--- a/features/login/impl/src/main/res/values-cy/translations.xml
+++ b/features/login/impl/src/main/res/values-cy/translations.xml
@@ -34,6 +34,7 @@
"Mae Matrix yn rhwydwaith agored ar gyfer cyfathrebu diogel, datganoledig."
"Croeso nôl!"
"Mewngofnodi i %1$s"
+ "Fersiwn %1$s"
"Mewngofnodwch â llaw"
"Mewngofnodi i %1$s"
"Mewngofnodwch gyda chod QR"
diff --git a/features/login/impl/src/main/res/values-da/translations.xml b/features/login/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..cefd0b75a4
--- /dev/null
+++ b/features/login/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,95 @@
+
+
+ "Skift kontoudbyder"
+ "Hjemmeserverens adresse"
+ "Indtast et søgeudtryk eller en domæneadresse."
+ "Søg efter en virksomhed, et fællesskab eller en privat server."
+ "Find en kontoudbyder"
+ "Det er her, dine samtaler vil bo - ligesom du ville bruge en e-mail-udbyder til at opbevare dine e-mails."
+ "Du er ved at logge ind på %s"
+ "Det er her, dine samtaler vil bo - ligesom du ville bruge en e-mail-udbyder til at opbevare dine e-mails."
+ "Du er ved at oprette en konto på %s"
+ "Matrix.org er en stor, gratis server på det offentlige Matrix-netværk til sikker, decentraliseret kommunikation, drevet af Matrix.org Foundation."
+ "Anden"
+ "Brug en anden kontoudbyder, f.eks. din egen private server eller en arbejdskonto."
+ "Skift kontoudbyder"
+ "Vi kunne ikke nå denne hjemmeserver. Kontroller, at du har indtastet hjemmeserverens URL korrekt. Hvis URL-adressen er korrekt, skal du kontakte administratoren på din hjemmeserver for at få yderligere hjælp."
+ "Serveren er ikke tilgængelig på grund af et problem i .well-known-filen:
+%1$s"
+ "Den valgte kontoudbyder understøtter ikke sliding sync. En opgradering af serveren er nødvendig for at bruge %1$s."
+ "%1$s har ikke tilladelse til at oprette forbindelse til %2$s."
+ "Denne app er konfigureret til at tillade: %1$s."
+ "Kontoudbyder %1$s er ikke tilladt."
+ "URL-adressen på din hjemmeserver"
+ "Indtast en domæneadresse."
+ "Hvad er adressen på din server?"
+ "Vælg din server"
+ "Opret konto"
+ "Denne konto er blevet deaktiveret."
+ "Forkert brugernavn og/eller adgangskode"
+ "Dette er ikke en gyldig brugeridentifikation. Forventet format: \'@bruger:hjemmeserver.org\'"
+ "Denne server er konfigureret til at bruge opdateringstokens. Disse understøttes ikke, når du bruger adgangskodebaseret login."
+ "Den valgte hjemmeserver understøtter ikke adgangskode eller OIDC-login. Kontakt venligst din administrator eller vælg en anden hjemmeserver."
+ "Indtast dine oplysninger"
+ "Matrix er et åbent netværk for sikker, decentraliseret kommunikation."
+ "Velkommen tilbage!"
+ "Log ind på %1$s"
+ "Version %1$s"
+ "Log ind manuelt"
+ "Log ind på %1$s"
+ "Log ind med QR-kode"
+ "Opret konto"
+ "Velkommen til den hurtigste %1$s nogensinde. Supercharged til hastighed og enkelhed."
+ "Velkommen til %1$s. Ladet med hastighed og enkelhed."
+ "Vær i dit rette Element"
+ "Etablerer en sikker forbindelse"
+ "Der kunne ikke oprettes en sikker forbindelse til den nye enhed. Dine eksisterende enheder er stadig sikre, og du behøver ikke bekymre dig om dem."
+ "Hvad nu?"
+ "Prøv at logge ind igen med en QR-kode, hvis dette skyldtes et netværksproblem"
+ "Hvis du støder på det samme problem, kan du prøve et andet wifi-netværk eller bruge dine mobildata i stedet for wifi"
+ "Hvis det ikke virker, skal du logge ind manuelt"
+ "Forbindelsen er ikke sikker"
+ "Du bliver bedt om at indtaste de to cifre, der vises på denne enhed."
+ "Indtast nummeret herunder på din anden enhed"
+ "Log på din anden enhed, og prøv derefter igen, eller brug en anden enhed, der allerede er logget på."
+ "Den anden enhed er ikke logget ind"
+ "Login blev annulleret på den anden enhed."
+ "Anmodning om login annulleret"
+ "Login blev afvist på den anden enhed."
+ "Login afvist"
+ "Login er udløbet. Prøv venligst igen."
+ "Login blev ikke afsluttet i tide"
+ "Din anden enhed understøtter ikke at logge ind på %s med en QR-kode.
+
+Prøv at logge ind manuelt, eller scan QR-koden med en anden enhed."
+ "QR-kode understøttes ikke"
+ "Din kontoudbyder understøtter ikke %1$s."
+ "%1$s understøttes ikke"
+ "Klar til at scanne"
+ "Åbn %1$s på en stationær enhed"
+ "Klik på din avatar"
+ "Vælg %1$s"
+ "\"Tilknyt ny enhed\""
+ "Scan QR-koden med denne enhed"
+ "Kun tilgængeligt, hvis din kontoudbyder understøtter det."
+ "Åbn %1$s på en anden enhed for at få QR-koden"
+ "Brug den QR-kode, der bliver vist på den anden enhed."
+ "Prøv igen"
+ "Forkert QR-kode"
+ "Gå til kameraindstillinger"
+ "Du skal give tilladelse til at %1$s kan benytte enhedens kamera, for at fortsætte."
+ "Tillad kameraadgang for at scanne QR-koden"
+ "Scan QR-koden"
+ "Begynd forfra"
+ "Der opstod en uventet fejl. Prøv venligst igen."
+ "Venter på din anden enhed"
+ "Din kontoudbyder kan bede om følgende kode for at bekræfte login."
+ "Din bekræftelseskode"
+ "Skift kontoudbyder"
+ "En privat server til Element-medarbejdere."
+ "Matrix er et åbent netværk for sikker, decentraliseret kommunikation."
+ "Det er her, dine samtaler vil bo - ligesom du ville bruge en e-mail-udbyder til at opbevare dine e-mails."
+ "Du er ved at logge ind på %1$s"
+ "Vælg din kontoudbyder"
+ "Du er ved at oprette en konto på %1$s"
+
diff --git a/features/login/impl/src/main/res/values-de/translations.xml b/features/login/impl/src/main/res/values-de/translations.xml
index 672608484f..6dbfdcf032 100644
--- a/features/login/impl/src/main/res/values-de/translations.xml
+++ b/features/login/impl/src/main/res/values-de/translations.xml
@@ -34,6 +34,7 @@
"Matrix ist ein offenes Netzwerk für eine sichere, dezentrale Kommunikation."
"Willkommen zurück!"
"Anmelden bei %1$s"
+ "Version %1$s"
"Manuell anmelden"
"Bei %1$s anmelden"
"Mit QR-Code anmelden"
diff --git a/features/login/impl/src/main/res/values-el/translations.xml b/features/login/impl/src/main/res/values-el/translations.xml
index 742c86ad73..047cd3baa0 100644
--- a/features/login/impl/src/main/res/values-el/translations.xml
+++ b/features/login/impl/src/main/res/values-el/translations.xml
@@ -16,7 +16,12 @@
"Δεν μπορούσαμε να επικοινωνήσουμε με αυτόν τον οικιακό διακομιστή. Βεβαιώσου ότι έχεις εισαγάγει σωστά τη διεύθυνση URL του αρχικού διακομιστή. Εάν η διεύθυνση URL είναι σωστή, επικοινώνησε με τον διαχειριστή του κεντρικού διακομιστή για περαιτέρω βοήθεια."
"Ο διακομιστής δεν είναι διαθέσιμος λόγω προβλήματος στο αρχείο .well-known:
%1$s"
+ "Ο επιλεγμένος πάροχος λογαριασμού δεν υποστηρίζει sliding sync. Απαιτείται αναβάθμιση στο διακομιστή για χρήση του %1$s."
+ "%1$s δεν επιτρέπεται να συνδεθεί με %2$s."
+ "Αυτή η εφαρμογή έχει ρυθμιστεί ώστε να επιτρέπει: %1$s."
+ "Ο πάροχος %1$s λογαριασμού δεν επιτρέπεται."
"URL οικιακού διακομιστή"
+ "Εισήγαγε μια διεύθυνση τομέα."
"Ποια είναι η διεύθυνση του διακομιστή σου;"
"Επέλεξε το διακομιστή σου"
"Δημιουργία λογαριασμού"
@@ -30,6 +35,7 @@
"Καλωσόρισες ξανά!"
"Συνδέσου στο %1$s"
"Σύνδεση χειροκίνητα"
+ "Συνδέσου στο %1$s"
"Συνδέσου με κωδικό QR"
"Δημιουργία λογαριασμού"
"Καλώς ήλθατε στο γρηγορότερο %1$s όλων των εποχών. Υπερτροφοδοτούμενο με ταχύτητα και απλότητα."
@@ -83,5 +89,6 @@
"Το Matrix είναι ένα ανοιχτό δίκτυο για ασφαλή, αποκεντρωμένη επικοινωνία."
"Εδώ θα ζουν οι συνομιλίες σου - όπως θα χρησιμοποιούσες έναν πάροχο email για να διατηρήσεις τα email σου."
"Πρόκειται να συνδεθείς στο %1$s"
+ "Επέλεξε πάροχο λογαριασμού"
"Πρόκειται να δημιουργήσεις έναν λογαριασμό στο %1$s"
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 90451ed170..9cdc09404c 100644
--- a/features/login/impl/src/main/res/values-et/translations.xml
+++ b/features/login/impl/src/main/res/values-et/translations.xml
@@ -34,6 +34,7 @@
"Matrix on avatud võrk turvalise ja hajutatud suhtluse jaoks."
"Tere tulemast tagasi!"
"Logi sisse serverisse %1$s"
+ "Versioon %1$s"
"Logi sisse käsitsi"
"Logi sisse teenusesse %1$s"
"Logi sisse QR-koodi alusel"
diff --git a/features/login/impl/src/main/res/values-fa/translations.xml b/features/login/impl/src/main/res/values-fa/translations.xml
index 071e28046f..625b03db4b 100644
--- a/features/login/impl/src/main/res/values-fa/translations.xml
+++ b/features/login/impl/src/main/res/values-fa/translations.xml
@@ -13,6 +13,7 @@
"دیگر"
"استفاده از فراهم کنندهٔ حسابی دیگر چون کارساز خصوصی خوتان یا حسابی کاری."
"تغییر فراهم کنندهٔ حساب"
+ "ما نتوانستیم به این سرور خانگی برسیم. لطفاً بررسی کنید که URL سرور اصلی را به درستی وارد کرده اید. اگر URL صحیح است، برای کمک بیشتر با مدیر سرور خانگی خود تماس بگیرید."
"نشانی کارساز خانگی"
"ورود نشانی دامنه."
"نشانی کارسازتان چیست؟"
@@ -21,6 +22,7 @@
"این حساب از کار افتاده است."
"نام کاربری یا گذرواژه نامعتبر است"
"این یک شناسه کاربری معتبر نیست. قالب صحیح: «@user:homeserver.or"
+ "سرور اصلی انتخاب شده از رمز عبور یا ورود OIDC پشتیبانی نمی کند. لطفا با مدیر خود تماس بگیرید یا یک سرور خانگی دیگر را انتخاب کنید."
"جزییاتتان را وارد کنید"
"ماتریکس شبکهای بار برای ارتباطات نامتمرکز و امن است."
"خوش برگشتید!"
@@ -72,6 +74,7 @@
"ممکن است فراهم کنندهٔ حسابتان کد زیر را برای تأیید ورود بخواهد."
"کد تأییدتان"
"تغییر فراهم کنندهٔ حساب"
+ "یک سرور خصوصی برای کارمندان Element."
"ماتریکس شبکهای بار برای ارتباطات نامتمرکز و امن است."
"جایی که گفتوگوهایتان خواهند زیست — درست مثل استفادهتان از فراهم کنندهٔ رایانامهای برای نگه داشتن رایانامههایتان."
"دارید به %1$s وارد میشوید"
diff --git a/features/login/impl/src/main/res/values-fr/translations.xml b/features/login/impl/src/main/res/values-fr/translations.xml
index 71129d054e..62d5ebc6af 100644
--- a/features/login/impl/src/main/res/values-fr/translations.xml
+++ b/features/login/impl/src/main/res/values-fr/translations.xml
@@ -34,6 +34,7 @@
"Matrix est un réseau ouvert pour une communication sécurisée et décentralisée."
"Content de vous revoir !"
"Connectez-vous à %1$s"
+ "Version %1$s"
"Se connecter manuellement"
"Se connecter à %1$s"
"Se connecter avec un QR code"
diff --git a/features/login/impl/src/main/res/values-in/translations.xml b/features/login/impl/src/main/res/values-in/translations.xml
index f7d658e739..63d703febd 100644
--- a/features/login/impl/src/main/res/values-in/translations.xml
+++ b/features/login/impl/src/main/res/values-in/translations.xml
@@ -14,9 +14,14 @@
"Gunakan penyedia akun yang berbeda, seperti server pribadi Anda sendiri atau akun kerja."
"Ubah penyedia akun"
"Kami tidak dapat menjangkau server ini. Periksa apakah Anda telah memasukkan URL homeserver dengan benar. Jika URL sudah benar, hubungi administrator homeserver Anda untuk bantuan lebih lanjut."
- "Sliding sync tidak tersedia karena adanya masalah dalam berkas .well-known:
+ "Server tidak tersedia karena ada masalah dalam berkas .well-known:
%1$s"
+ "Penyedia akun yang dipilih tidak mendukung sinkronisasi geser. Peningkatan server diperlukan untuk digunakan %1$s."
+ "%1$s tidak diizinkan untuk terhubung ke %2$s."
+ "Aplikasi ini telah diatur untuk mengizinkan: %1$s."
+ "Penyedia akun %1$s tidak diizinkan."
"URL Homeserver"
+ "Masukkan alamat domain."
"Apa alamat server Anda?"
"Pilih server Anda"
"Buat akun"
@@ -29,7 +34,9 @@
"Matrix adalah jaringan terbuka untuk komunikasi yang aman dan terdesentralisasi."
"Selamat datang kembali!"
"Masuk ke %1$s"
+ "Versi %1$s"
"Masuk secara manual"
+ "Masuk ke %1$s"
"Masuk dengan kode QR"
"Buat akun"
"Selamat datang di %1$s tercepat yang pernah ada. Berdaya besar untuk kecepatan dan kesederhanaan."
@@ -83,5 +90,6 @@ Coba masuk secara manual, atau pindai kode QR dengan perangkat lain."
"Matrix adalah jaringan terbuka untuk komunikasi yang aman dan terdesentralisasi."
"Di sinilah percakapan Anda akan berlangsung — sama seperti Anda menggunakan penyedia surel untuk menyimpan surel Anda."
"Anda akan masuk ke %1$s"
+ "Pilih penyedia akun"
"Anda akan membuat akun di %1$s"
diff --git a/features/login/impl/src/main/res/values-it/translations.xml b/features/login/impl/src/main/res/values-it/translations.xml
index b294e498e6..b88207f985 100644
--- a/features/login/impl/src/main/res/values-it/translations.xml
+++ b/features/login/impl/src/main/res/values-it/translations.xml
@@ -14,9 +14,14 @@
"Utilizza un provider di account diverso, ad esempio il tuo server privato o un account di lavoro."
"Cambia fornitore dell\'account"
"Non siamo riusciti a raggiungere questo homeserver. Verifica di aver inserito correttamente l\'URL. Se l\'URL è corretto, contatta l\'amministratore del homeserver per ulteriore assistenza."
- "La sliding sync non è disponibile per un problema nel file well-known:
+ "Il server non è disponibile per un problema nel file well-known:
%1$s"
+ "Il fornitore di account selezionato non supporta la Sliding sync. Per utilizzare %1$s è necessario un aggiornamento del server."
+ "%1$s non è autorizzato a connettersi a %2$s."
+ "Questa app è stata configurata per consentire: %1$s."
+ "Fornitore dell\'account %1$s non consentito."
"URL dell\'homeserver"
+ "Inserisci un indirizzo di dominio."
"Qual è l\'indirizzo del tuo server?"
"Seleziona il tuo server"
"Crea account"
@@ -29,7 +34,9 @@
"Matrix è una rete aperta per comunicazioni sicure e decentralizzate."
"Bentornato!"
"Accedi a %1$s"
+ "Versione %1$s"
"Accedi manualmente"
+ "Accedi a %1$s"
"Accedi con codice QR"
"Crea account"
"Benvenuti nell\'%1$s più veloce di sempre. Potenziato per velocità e semplicità."
@@ -83,5 +90,6 @@ Prova ad accedere manualmente o scansiona il codice QR con un altro dispositivo.
"Matrix è una rete aperta per comunicazioni sicure e decentralizzate."
"Qui è dove vivranno le tue conversazioni — proprio come useresti un fornitore di posta elettronica per conservare le tue email."
"Stai per accedere a %1$s"
+ "Scegli il fornitore dell\'account"
"Stai per creare un account su %1$s"
diff --git a/features/login/impl/src/main/res/values-pt-rBR/translations.xml b/features/login/impl/src/main/res/values-pt-rBR/translations.xml
index 58e3f0bc6b..0a6b788bd6 100644
--- a/features/login/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/login/impl/src/main/res/values-pt-rBR/translations.xml
@@ -14,7 +14,12 @@
"Use um provedor de conta diferente, como seu próprio servidor privado ou uma conta corporativa."
"Alterar provedor da conta"
"Não conseguimos acessar esse servidor. Verifique se você inseriu a URL do servidor corretamente. Se a URL estiver correta, entre em contato com o administrador do servidor para obter mais ajuda."
+ "O servidor não está disponível devido à um problema no arquivo .well-known:
+%1$s"
"O provedor de conta selecionado não é compatível com a sliding sync. É necessária uma atualização do servidor para que você possa usar o %1$s."
+ "O %1$s não tem permissão para se conectar a %2$s."
+ "Este app foi configurado para permitir: %1$s."
+ "O provedor de conta %1$s não é permitido."
"URL do servidor"
"Insira um endereço de domínio."
"Qual é o endereço do seu servidor?"
@@ -29,7 +34,9 @@
"A Matrix é uma rede aberta para comunicação segura e descentralizada."
"Bem-vindo de volta!"
"Iniciar sessão em %1$s"
+ "Versão %1$s"
"Iniciar sessão manualmente"
+ "Entrar em %1$s"
"Iniciar sessão com código QR"
"Criar conta"
"Bem-vindo ao mais rápido %1$s de todos os tempos. Turbinado para velocidade e simplicidade."
@@ -83,5 +90,6 @@ Tente fazer login manualmente ou escanear o código QR com outro dispositivo."
"A Matrix é uma rede aberta para comunicação segura e descentralizada."
"Aqui é onde suas conversas vão ficar — assim como você usa um provedor de e-mails para manter seus e-mails."
"Você está prestes a fazer login em %1$s"
+ "Escolher um provedor de conta"
"Você está prestes a criar uma conta em %1$s"
diff --git a/features/login/impl/src/main/res/values-pt/translations.xml b/features/login/impl/src/main/res/values-pt/translations.xml
index d74a35ec92..1b60edf146 100644
--- a/features/login/impl/src/main/res/values-pt/translations.xml
+++ b/features/login/impl/src/main/res/values-pt/translations.xml
@@ -34,6 +34,7 @@
"A Matrix é uma rede aberta de comunicação descentralizada e segura."
"Bem-vindo(a) de volta!"
"Iniciar sessão em %1$s"
+ "Versão %1$s"
"Iniciar sessão manualmente"
"Iniciar sessão em %1$s"
"Iniciar sessão com código QR"
diff --git a/features/login/impl/src/main/res/values-sk/translations.xml b/features/login/impl/src/main/res/values-sk/translations.xml
index 81ebff5711..e9ce127552 100644
--- a/features/login/impl/src/main/res/values-sk/translations.xml
+++ b/features/login/impl/src/main/res/values-sk/translations.xml
@@ -34,6 +34,7 @@
"Matrix je otvorená sieť pre bezpečnú a decentralizovanú komunikáciu."
"Vitajte späť!"
"Prihlásiť sa do %1$s"
+ "Verzia %1$s"
"Prihlásiť sa manuálne"
"Prihlásiť sa do %1$s"
"Prihlásiť sa pomocou QR kódu"
diff --git a/features/login/impl/src/main/res/values-uk/translations.xml b/features/login/impl/src/main/res/values-uk/translations.xml
index b1cff7d9d9..47e0933d05 100644
--- a/features/login/impl/src/main/res/values-uk/translations.xml
+++ b/features/login/impl/src/main/res/values-uk/translations.xml
@@ -89,5 +89,6 @@
"Matrix — це відкрита мережа для безпечної, децентралізованої комунікації."
"Тут розміщуватимуться ваші розмови — так само як у поштовій скриньці для зберігання своїх електронних листів."
"Ви збираєтесь увійти в %1$s"
+ "Вибір постачальника облікового запису"
"Ви збираєтеся створити обліковий запис на %1$s"
diff --git a/features/login/impl/src/main/res/values/localazy.xml b/features/login/impl/src/main/res/values/localazy.xml
index 4f4d98baaf..d0840f1983 100644
--- a/features/login/impl/src/main/res/values/localazy.xml
+++ b/features/login/impl/src/main/res/values/localazy.xml
@@ -34,6 +34,7 @@
"Matrix is an open network for secure, decentralised communication."
"Welcome back!"
"Sign in to %1$s"
+ "Version %1$s"
"Sign in manually"
"Sign in to %1$s"
"Sign in with QR code"
diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateTest.kt
new file mode 100644
index 0000000000..1acac2713a
--- /dev/null
+++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateTest.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2025 New Vector 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.login.impl.screens.chooseaccountprovider
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.login.impl.accountprovider.anAccountProvider
+import io.element.android.features.login.impl.login.LoginMode
+import io.element.android.libraries.architecture.AsyncData
+import org.junit.Test
+
+class ChooseAccountProviderStateTest {
+ @Test
+ fun `submitEnabled returns false when there is no selectedAccountProvider`() {
+ val sut = aChooseAccountProviderState(
+ selectedAccountProvider = null,
+ )
+ assertThat(sut.submitEnabled).isFalse()
+ }
+
+ @Test
+ fun `submitEnabled returns true when there is a selectedAccountProvider`() {
+ val sut = aChooseAccountProviderState(
+ selectedAccountProvider = anAccountProvider(),
+ )
+ assertThat(sut.submitEnabled).isTrue()
+ }
+
+ @Test
+ fun `submitEnabled returns false when there is a selectedAccountProvider but there is an error`() {
+ val sut = aChooseAccountProviderState(
+ selectedAccountProvider = anAccountProvider(),
+ loginMode = AsyncData.Failure(Throwable("Error")),
+ )
+ assertThat(sut.submitEnabled).isFalse()
+ }
+
+ @Test
+ fun `submitEnabled returns false when there is a selectedAccountProvider but the result is successful`() {
+ val sut = aChooseAccountProviderState(
+ selectedAccountProvider = anAccountProvider(),
+ loginMode = AsyncData.Success(LoginMode.PasswordLogin),
+ )
+ assertThat(sut.submitEnabled).isFalse()
+ }
+}
diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt
index 7749d1502b..3e59528427 100644
--- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt
+++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenterTest.kt
@@ -83,19 +83,40 @@ class OnBoardingPresenterTest {
assertThat(initialState.canLoginWithQrCode).isFalse()
assertThat(initialState.productionApplicationName).isEqualTo("B")
assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT)
- assertThat(initialState.canReportBug).isTrue()
+ assertThat(initialState.canReportBug).isFalse()
assertThat(awaitItem().canLoginWithQrCode).isTrue()
}
}
@Test
- fun `present - rageshake not available`() = runTest {
+ fun `present - clicking on version 7 times has no effect if rageshake not available`() = runTest {
val presenter = createPresenter(
rageshakeFeatureAvailability = { false },
)
presenter.test {
skipItems(1)
- assertThat(awaitItem().canReportBug).isFalse()
+ awaitItem().also { state ->
+ assertThat(state.canReportBug).isFalse()
+ repeat(7) {
+ state.eventSink(OnBoardingEvents.OnVersionClick)
+ }
+ }
+ expectNoEvents()
+ }
+ }
+
+ @Test
+ fun `present - clicking on version 7 times will reveal the report a problem button`() = runTest {
+ val presenter = createPresenter()
+ presenter.test {
+ skipItems(1)
+ awaitItem().also { state ->
+ assertThat(state.canReportBug).isFalse()
+ repeat(7) {
+ state.eventSink(OnBoardingEvents.OnVersionClick)
+ }
+ }
+ assertThat(awaitItem().canReportBug).isTrue()
}
}
diff --git a/features/logout/impl/src/main/res/values-da/translations.xml b/features/logout/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..bbf6a49399
--- /dev/null
+++ b/features/logout/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,18 @@
+
+
+ "Er du sikker på, at du vil logge ud?"
+ "Log ud"
+ "Log ud"
+ "Logger ud…"
+ "Du er ved at logge ud af din sidste session. Hvis du logger ud nu, mister du adgangen til dine krypterede meddelelser."
+ "Du har slået sikkerhedskopiering fra"
+ "Dine nøgler blev stadig sikkerhedskopieret, da du gik offline. Opret forbindelse igen, så dine nøgler kan sikkerhedskopieres, før du logger ud."
+ "Dine nøgler bliver stadig sikkerhedskopieret"
+ "Vent på, at dette er fuldført, før du logger ud."
+ "Dine nøgler bliver stadig sikkerhedskopieret"
+ "Log ud"
+ "Du er ved at logge ud af din sidste session. Hvis du logger af nu, mister du adgangen til dine krypterede meddelelser."
+ "Gendannelse er ikke konfigureret"
+ "Du er ved at logge ud af din sidste session. Hvis du logger af nu, kan du miste adgangen til dine krypterede meddelelser."
+ "Har du gemt din gendannelsesnøgle?"
+
diff --git a/features/logout/impl/src/main/res/values-fa/translations.xml b/features/logout/impl/src/main/res/values-fa/translations.xml
index 46cfa54539..4bf6be1b89 100644
--- a/features/logout/impl/src/main/res/values-fa/translations.xml
+++ b/features/logout/impl/src/main/res/values-fa/translations.xml
@@ -9,6 +9,7 @@
"لطفاً پیش از خروج منتظر پایانش شوید."
"کلیدهایتان هنوز در حال پشتیبان گیریند"
"خروج"
+ "شما در آستانه خروج از آخرین جلسه خود هستید. اگر اکنون از سیستم خارج شوید، دسترسی به پیام های رمزگذاری شده تان را از دست خواهید داد."
"بازگردانی برپا نشده"
"کلید بازیابیتان را ذخیره کردهاید؟"
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt
deleted file mode 100644
index 28908498ff..0000000000
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright 2023, 2024 New Vector 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(ExperimentalMaterial3Api::class)
-
-package io.element.android.features.messages.impl
-
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.ime
-import androidx.compose.foundation.layout.windowInsetsPadding
-import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.SheetValue
-import androidx.compose.material3.rememberBottomSheetScaffoldState
-import androidx.compose.material3.rememberStandardBottomSheetState
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.derivedStateOf
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Shape
-import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.layout.Measurable
-import androidx.compose.ui.layout.SubcomposeLayout
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.min
-import io.element.android.libraries.core.data.tryOrNull
-import io.element.android.libraries.designsystem.theme.components.BottomSheetScaffold
-import kotlin.math.roundToInt
-
-/**
- * A [BottomSheetScaffold] that allows the sheet to be expanded the screen height
- * of the sheet contents.
- *
- * @param content The main content.
- * @param sheetContent The sheet content.
- * @param sheetDragHandle The drag handle for the sheet.
- * @param sheetSwipeEnabled Whether the sheet can be swiped. This value is ignored and swipe is disabled if the sheet content overflows.
- * @param sheetShape The shape of the sheet.
- * @param sheetTonalElevation The tonal elevation of the sheet.
- * @param sheetShadowElevation The shadow elevation of the sheet.
- * @param modifier The modifier for the layout.
- * @param sheetContentKey The key for the sheet content. If the key changes, the sheet will be remeasured.
- */
-@Suppress(
- "ContentTrailingLambda",
- // False positive
- "MultipleEmitters",
-)
-@OptIn(ExperimentalMaterial3Api::class)
-@Composable
-internal fun ExpandableBottomSheetScaffold(
- content: @Composable (padding: PaddingValues) -> Unit,
- // False positive, it's not being reused
- @Suppress("ContentSlotReused")
- sheetContent: @Composable (subcomposing: Boolean) -> Unit,
- sheetDragHandle: @Composable () -> Unit,
- sheetSwipeEnabled: Boolean,
- sheetShape: Shape,
- sheetTonalElevation: Dp,
- sheetShadowElevation: Dp,
- modifier: Modifier = Modifier,
- sheetContentKey: Int? = null,
-) {
- val scaffoldState = rememberBottomSheetScaffoldState(
- bottomSheetState = rememberStandardBottomSheetState(
- initialValue = SheetValue.PartiallyExpanded,
- skipHiddenState = true,
- )
- )
-
- // If the content overflows, we disable swipe to prevent the sheet from intercepting
- // scroll events of the sheet content.
- var contentOverflows by remember { mutableStateOf(false) }
- val sheetSwipeEnabledIfPossible by remember(contentOverflows, sheetSwipeEnabled) {
- derivedStateOf {
- sheetSwipeEnabled && !contentOverflows
- }
- }
-
- LaunchedEffect(sheetSwipeEnabledIfPossible) {
- if (!sheetSwipeEnabledIfPossible) {
- scaffoldState.bottomSheetState.partialExpand()
- }
- }
-
- @Composable
- fun Scaffold(
- sheetContent: @Composable () -> Unit,
- dragHandle: @Composable () -> Unit,
- peekHeight: Dp,
- ) {
- BottomSheetScaffold(
- modifier = Modifier,
- scaffoldState = scaffoldState,
- sheetPeekHeight = peekHeight,
- sheetSwipeEnabled = sheetSwipeEnabledIfPossible,
- sheetDragHandle = dragHandle,
- sheetShape = sheetShape,
- content = content,
- sheetContent = { sheetContent() },
- sheetTonalElevation = sheetTonalElevation,
- sheetShadowElevation = sheetShadowElevation,
- )
- }
-
- SubcomposeLayout(
- modifier = modifier.windowInsetsPadding(WindowInsets.ime),
- measurePolicy = { constraints: Constraints ->
- val sheetContentSub = subcompose(Slot.SheetContent(sheetContentKey)) { sheetContent(true) }.map {
- it.measure(Constraints(maxWidth = constraints.maxWidth))
- }.first()
- val dragHandleSub = subcompose(Slot.DragHandle) { sheetDragHandle() }.map {
- it.measure(Constraints(maxWidth = constraints.maxWidth))
- }.firstOrNull()
- val dragHandleHeight = dragHandleSub?.height?.toDp() ?: 0.dp
-
- val maxHeight = constraints.maxHeight.toDp()
- val contentHeight = sheetContentSub.measuredHeight.toDp() + dragHandleHeight
-
- contentOverflows = contentHeight > maxHeight
-
- val peekHeight = min(
- // prevent the sheet from expanding beyond the screen
- maxHeight,
- contentHeight
- )
-
- val scaffoldPlaceables = subcompose(Slot.Scaffold) {
- Scaffold({
- Layout(
- modifier = Modifier.fillMaxHeight(),
- measurePolicy = { measurables, constraints ->
- val constraintHeight = constraints.maxHeight
- val offset = tryOrNull { scaffoldState.bottomSheetState.requireOffset() } ?: 0f
- val height = Integer.max(peekHeight.roundToPx(), constraintHeight - offset.roundToInt())
- val top = measurables[0].measure(
- constraints.copy(
- minHeight = height,
- maxHeight = height
- )
- )
- layout(constraints.maxWidth, constraints.maxHeight) {
- top.place(x = 0, y = 0)
- }
- },
- content = { sheetContent(false) }
- )
- }, sheetDragHandle, peekHeight)
- }.map { measurable: Measurable ->
- measurable.measure(constraints)
- }
- val scaffoldPlaceable = scaffoldPlaceables.first()
- layout(constraints.maxWidth, constraints.maxHeight) {
- scaffoldPlaceable.place(0, 0)
- }
- }
- )
-}
-
-private sealed interface Slot {
- data class SheetContent(val key: Int?) : Slot
- data object DragHandle : Slot
- data object Scaffold : Slot
-}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
index a772015787..7c52cc9bab 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
@@ -26,24 +26,21 @@ import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBars
+import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.mutableIntStateOf
-import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
-import androidx.compose.ui.input.nestedscroll.NestedScrollSource
-import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
+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.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -83,10 +80,13 @@ import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorVi
import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.libraries.androidutils.ui.hideKeyboard
import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule
+import io.element.android.libraries.designsystem.components.ExpandableBottomSheetLayout
+import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
-import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
+import io.element.android.libraries.designsystem.components.rememberExpandableBottomSheetLayoutState
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toAnnotatedString
@@ -111,7 +111,6 @@ import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.wysiwyg.link.Link
import kotlinx.collections.immutable.ImmutableList
import timber.log.Timber
-import kotlin.random.Random
import kotlin.time.Duration.Companion.milliseconds
@Composable
@@ -185,69 +184,117 @@ fun MessagesView(
state.customReactionState.eventSink(CustomReactionEvents.ShowCustomReactionSheet(event))
}
- Scaffold(
- modifier = modifier,
- contentWindowInsets = WindowInsets.statusBars,
- topBar = {
- Column {
- ConnectivityIndicatorView(isOnline = state.hasNetworkConnection)
- MessagesViewTopBar(
- roomName = state.roomName,
- roomAvatar = state.roomAvatar,
- isTombstoned = state.isTombstoned,
- heroes = state.heroes,
- roomCallState = state.roomCallState,
- dmUserIdentityState = state.dmUserVerificationState,
- onBackClick = { hidingKeyboard { onBackClick() } },
- onRoomDetailsClick = { hidingKeyboard { onRoomDetailsClick() } },
- onJoinCallClick = onJoinCallClick,
- )
- }
+ val expandableState = rememberExpandableBottomSheetLayoutState()
+ ExpandableBottomSheetLayout(
+ modifier = modifier
+ .fillMaxSize()
+ .imePadding()
+ .systemBarsPadding(),
+ content = {
+ Scaffold(
+ contentWindowInsets = WindowInsets.statusBars,
+ topBar = {
+ Column {
+ ConnectivityIndicatorView(isOnline = state.hasNetworkConnection)
+ MessagesViewTopBar(
+ roomName = state.roomName,
+ roomAvatar = state.roomAvatar,
+ isTombstoned = state.isTombstoned,
+ heroes = state.heroes,
+ roomCallState = state.roomCallState,
+ dmUserIdentityState = state.dmUserVerificationState,
+ onBackClick = { hidingKeyboard { onBackClick() } },
+ onRoomDetailsClick = { hidingKeyboard { onRoomDetailsClick() } },
+ onJoinCallClick = onJoinCallClick,
+ )
+ }
+ },
+ content = { padding ->
+ Box(
+ modifier = Modifier
+ .padding(padding)
+ .consumeWindowInsets(padding)
+ ) {
+ MessagesViewContent(
+ state = state,
+ onContentClick = ::onContentClick,
+ onMessageLongClick = ::onMessageLongClick,
+ onUserDataClick = {
+ hidingKeyboard {
+ state.eventSink(MessagesEvents.OnUserClicked(it))
+ }
+ },
+ onLinkClick = { link, customTab ->
+ if (customTab) {
+ onLinkClick(link.url, true)
+ // Do not check those links, they are internal link only
+ } else {
+ state.linkState.eventSink(LinkEvents.OnLinkClick(link))
+ }
+ },
+ onReactionClick = ::onEmojiReactionClick,
+ onReactionLongClick = ::onEmojiReactionLongClick,
+ onMoreReactionsClick = ::onMoreReactionsClick,
+ onReadReceiptClick = { event ->
+ state.readReceiptBottomSheetState.eventSink(ReadReceiptBottomSheetEvents.EventSelected(event))
+ },
+ onSendLocationClick = onSendLocationClick,
+ onCreatePollClick = onCreatePollClick,
+ onSwipeToReply = { targetEvent ->
+ state.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, targetEvent))
+ },
+ forceJumpToBottomVisibility = forceJumpToBottomVisibility,
+ onJoinCallClick = onJoinCallClick,
+ onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick,
+ knockRequestsBannerView = knockRequestsBannerView,
+ )
+
+ SuggestionsPickerView(
+ modifier = Modifier
+ .shadow(10.dp)
+ .background(ElementTheme.colors.bgCanvasDefault)
+ .align(Alignment.BottomStart)
+ .heightIn(max = 230.dp),
+ roomId = state.roomId,
+ roomName = state.roomName,
+ roomAvatarData = state.roomAvatar,
+ suggestions = state.composerState.suggestions,
+ onSelectSuggestion = {
+ state.composerState.eventSink(MessageComposerEvents.InsertSuggestion(it))
+ }
+ )
+ }
+ },
+ snackbarHost = {
+ SnackbarHost(
+ snackbarHostState,
+ modifier = Modifier.navigationBarsPadding()
+ )
+ },
+ )
},
- content = { padding ->
- MessagesViewContent(
+ bottomSheetContent = {
+ MessagesViewComposerBottomSheetContents(
state = state,
- modifier = Modifier
- .padding(padding)
- .consumeWindowInsets(padding),
- onContentClick = ::onContentClick,
- onMessageLongClick = ::onMessageLongClick,
- onUserDataClick = {
- hidingKeyboard {
- state.eventSink(MessagesEvents.OnUserClicked(it))
- }
+ onLinkClick = { url, customTab -> onLinkClick(url, customTab) },
+ onRoomSuccessorClick = { roomId ->
+ state.timelineState.eventSink(TimelineEvents.NavigateToRoom(roomId = roomId))
},
- onLinkClick = { link, customTab ->
- if (customTab) {
- onLinkClick(link.url, true)
- // Do not check those links, they are internal link only
- } else {
- state.linkState.eventSink(LinkEvents.OnLinkClick(link))
- }
- },
- onReactionClick = ::onEmojiReactionClick,
- onReactionLongClick = ::onEmojiReactionLongClick,
- onMoreReactionsClick = ::onMoreReactionsClick,
- onReadReceiptClick = { event ->
- state.readReceiptBottomSheetState.eventSink(ReadReceiptBottomSheetEvents.EventSelected(event))
- },
- onSendLocationClick = onSendLocationClick,
- onCreatePollClick = onCreatePollClick,
- onSwipeToReply = { targetEvent ->
- state.eventSink(MessagesEvents.HandleAction(TimelineItemAction.Reply, targetEvent))
- },
- forceJumpToBottomVisibility = forceJumpToBottomVisibility,
- onJoinCallClick = onJoinCallClick,
- onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick,
- knockRequestsBannerView = knockRequestsBannerView,
)
},
- snackbarHost = {
- SnackbarHost(
- snackbarHostState,
- modifier = Modifier.navigationBarsPadding()
- )
+ sheetDragHandle = if (state.composerState.showTextFormatting) {
+ @Composable { BottomSheetDragHandle() }
+ } else {
+ @Composable {}
},
+ isSwipeGestureEnabled = state.composerState.showTextFormatting,
+ state = expandableState,
+ sheetShape = if (state.composerState.showTextFormatting || state.composerState.suggestions.isNotEmpty()) {
+ MaterialTheme.shapes.large
+ } else {
+ RectangleShape
+ },
+ maxBottomSheetContentHeight = 360.dp,
)
ActionListView(
@@ -347,88 +394,49 @@ private fun MessagesViewContent(
)
}
- // This key is used to force the sheet to be remeasured when the content changes.
- // Any state change that should trigger a height size should be added to the list of remembered values here.
- val sheetResizeContentKey = remember { mutableIntStateOf(0) }
- LaunchedEffect(
- state.composerState.textEditorState.lineCount,
- state.composerState.showTextFormatting,
- ) {
- sheetResizeContentKey.intValue = Random.nextInt()
- }
-
- ExpandableBottomSheetScaffold(
- sheetDragHandle = if (state.composerState.showTextFormatting) {
- @Composable { BottomSheetDragHandle() }
- } else {
- @Composable {}
- },
- sheetSwipeEnabled = state.composerState.showTextFormatting,
- sheetShape = if (state.composerState.showTextFormatting || state.composerState.suggestions.isNotEmpty()) {
- MaterialTheme.shapes.large
- } else {
- RectangleShape
- },
- content = { paddingValues ->
- Box(modifier = Modifier.padding(paddingValues)) {
- val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior(
- pinnedMessagesCount = state.pinnedMessagesBannerState.pinnedMessagesCount(),
+ Box {
+ val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior(
+ pinnedMessagesCount = (state.pinnedMessagesBannerState as? PinnedMessagesBannerState.Visible)?.pinnedMessagesCount() ?: 0,
+ )
+ TimelineView(
+ state = state.timelineState,
+ timelineProtectionState = state.timelineProtectionState,
+ onUserDataClick = onUserDataClick,
+ onLinkClick = { link -> onLinkClick(link, false) },
+ onContentClick = onContentClick,
+ onMessageLongClick = onMessageLongClick,
+ onSwipeToReply = onSwipeToReply,
+ onReactionClick = onReactionClick,
+ onReactionLongClick = onReactionLongClick,
+ onMoreReactionsClick = onMoreReactionsClick,
+ onReadReceiptClick = onReadReceiptClick,
+ forceJumpToBottomVisibility = forceJumpToBottomVisibility,
+ onJoinCallClick = onJoinCallClick,
+ nestedScrollConnection = scrollBehavior.nestedScrollConnection,
+ )
+ AnimatedVisibility(
+ visible = state.pinnedMessagesBannerState is PinnedMessagesBannerState.Visible && scrollBehavior.isVisible,
+ enter = expandVertically(),
+ exit = shrinkVertically(),
+ ) {
+ fun focusOnPinnedEvent(eventId: EventId) {
+ state.timelineState.eventSink(
+ TimelineEvents.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds)
)
- TimelineView(
- state = state.timelineState,
- timelineProtectionState = state.timelineProtectionState,
- onUserDataClick = onUserDataClick,
- onLinkClick = { link -> onLinkClick(link, false) },
- onContentClick = onContentClick,
- onMessageLongClick = onMessageLongClick,
- onSwipeToReply = onSwipeToReply,
- onReactionClick = onReactionClick,
- onReactionLongClick = onReactionLongClick,
- onMoreReactionsClick = onMoreReactionsClick,
- onReadReceiptClick = onReadReceiptClick,
- forceJumpToBottomVisibility = forceJumpToBottomVisibility,
- onJoinCallClick = onJoinCallClick,
- nestedScrollConnection = scrollBehavior.nestedScrollConnection,
- )
- AnimatedVisibility(
- visible = state.pinnedMessagesBannerState is PinnedMessagesBannerState.Visible && scrollBehavior.isVisible,
- enter = expandVertically(),
- exit = shrinkVertically(),
- ) {
- fun focusOnPinnedEvent(eventId: EventId) {
- state.timelineState.eventSink(
- TimelineEvents.FocusOnEvent(eventId = eventId, debounce = FOCUS_ON_PINNED_EVENT_DEBOUNCE_DURATION_IN_MILLIS.milliseconds)
- )
- }
- PinnedMessagesBannerView(
- state = state.pinnedMessagesBannerState,
- onClick = ::focusOnPinnedEvent,
- onViewAllClick = onViewAllPinnedMessagesClick,
- )
- }
- knockRequestsBannerView()
}
- },
- sheetContent = { subcomposing: Boolean ->
- MessagesViewComposerBottomSheetContents(
- subcomposing = subcomposing,
- state = state,
- onRoomSuccessorClick = { roomId ->
- state.timelineState.eventSink(TimelineEvents.NavigateToRoom(roomId = roomId))
- },
- onLinkClick = { url, customTab -> onLinkClick(Link(url), customTab) },
+ PinnedMessagesBannerView(
+ state = state.pinnedMessagesBannerState,
+ onClick = ::focusOnPinnedEvent,
+ onViewAllClick = onViewAllPinnedMessagesClick,
)
- },
- sheetContentKey = sheetResizeContentKey.intValue,
- sheetTonalElevation = 0.dp,
- sheetShadowElevation = if (state.composerState.suggestions.isNotEmpty()) 16.dp else 0.dp,
- )
+ }
+ knockRequestsBannerView()
+ }
}
}
@Composable
private fun MessagesViewComposerBottomSheetContents(
- subcomposing: Boolean,
state: MessagesState,
onRoomSuccessorClick: (RoomId) -> Unit,
onLinkClick: (String, Boolean) -> Unit,
@@ -439,23 +447,6 @@ private fun MessagesViewComposerBottomSheetContents(
}
state.userEventPermissions.canSendMessage -> {
Column(modifier = Modifier.fillMaxWidth()) {
- SuggestionsPickerView(
- modifier = Modifier
- .heightIn(max = 230.dp)
- // Consume all scrolling, preventing the bottom sheet from being dragged when interacting with the list of suggestions
- .nestedScroll(object : NestedScrollConnection {
- override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
- return available
- }
- }),
- roomId = state.roomId,
- roomName = state.roomName,
- roomAvatarData = state.roomAvatar,
- suggestions = state.composerState.suggestions,
- onSelectSuggestion = {
- state.composerState.eventSink(MessageComposerEvents.InsertSuggestion(it))
- }
- )
// Do not show the identity change if user is composing a Rich message or is seeing suggestion(s).
if (state.composerState.suggestions.isEmpty() &&
state.composerState.textEditorState is TextEditorState.Markdown) {
@@ -473,7 +464,6 @@ private fun MessagesViewComposerBottomSheetContents(
MessageComposerView(
state = state.composerState,
voiceMessageState = state.voiceMessageComposerState,
- subcomposing = subcomposing,
enableVoiceMessages = state.enableVoiceMessages,
modifier = Modifier.fillMaxWidth(),
)
@@ -563,13 +553,19 @@ private fun RoomAvatarAndNameRow(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically
) {
- RoomAvatar(
+ Avatar(
avatarData = roomAvatar,
- heroes = heroes,
- isTombstoned = isTombstoned,
+ avatarType = AvatarType.Room(
+ heroes = heroes,
+ isTombstoned = isTombstoned,
+ ),
)
Text(
- modifier = Modifier.padding(horizontal = 8.dp),
+ modifier = Modifier
+ .padding(horizontal = 8.dp)
+ .semantics {
+ heading()
+ },
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/actionlist/ActionListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt
index a16f1efa19..78b4b43112 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt
@@ -39,7 +39,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics
-import androidx.compose.ui.semantics.onClick
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.traversalIndex
import androidx.compose.ui.text.style.TextAlign
@@ -74,6 +73,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt
import io.element.android.features.messages.impl.utils.messagesummary.DefaultMessageSummaryFormatter
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -256,7 +256,12 @@ private fun MessageSummary(
modifier: Modifier = Modifier,
) {
val content: @Composable () -> Unit
- val icon: @Composable () -> Unit = { Avatar(avatarData = event.senderAvatar.copy(size = AvatarSize.MessageActionSender)) }
+ val icon: @Composable () -> Unit = {
+ Avatar(
+ avatarData = event.senderAvatar.copy(size = AvatarSize.MessageActionSender),
+ avatarType = AvatarType.User,
+ )
+ }
val contentStyle = ElementTheme.typography.fontBodyMdRegular.copy(color = ElementTheme.colors.textSecondary)
@Composable
@@ -448,19 +453,11 @@ private fun EmojiButton(
.size(48.dp)
.background(backgroundColor, CircleShape)
.clickable(
- enabled = true,
+ onClickLabel = a11yClickLabel,
onClick = { onClick(emoji) },
indication = ripple(bounded = false, radius = emojiRippleRadius),
interactionSource = remember { MutableInteractionSource() }
- )
- .semantics {
- onClick(
- label = a11yClickLabel,
- ) {
- onClick(emoji)
- true
- }
- },
+ ),
contentAlignment = Alignment.Center
) {
Text(
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt
index 5c54d3a68e..e7dac45cd8 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt
@@ -24,7 +24,12 @@ open class AttachmentsPreviewStateProvider : PreviewParameterProvider
get() = sequenceOf(
anAttachmentsPreviewState(),
- anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Processing(displayProgress = false)),
+ anAttachmentsPreviewState(
+ sendActionState = SendActionState.Sending.Processing(displayProgress = false),
+ textEditorState = aTextEditorStateMarkdown(
+ initialText = "This is a caption!"
+ )
+ ),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Processing(displayProgress = true)),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.ReadyToUpload(aMediaUploadInfo())),
anAttachmentsPreviewState(sendActionState = SendActionState.Sending.Uploading(0.5f, aMediaUploadInfo())),
@@ -55,15 +60,15 @@ fun aMediaUploadInfo(
filePath: String = "file://path",
thumbnailFilePath: String? = null,
) = MediaUploadInfo.Image(
- file = File(filePath),
- imageInfo = ImageInfo(
- height = 100,
- width = 100,
- mimetype = MimeTypes.Jpeg,
- size = 1000,
- thumbnailInfo = null,
- thumbnailSource = null,
- blurhash = null,
- ),
- thumbnailFile = thumbnailFilePath?.let { File(it) },
- )
+ file = File(filePath),
+ imageInfo = ImageInfo(
+ height = 100,
+ width = 100,
+ mimetype = MimeTypes.Jpeg,
+ size = 1000,
+ thumbnailInfo = null,
+ thumbnailSource = null,
+ blurhash = null,
+ ),
+ thumbnailFile = thumbnailFilePath?.let { File(it) },
+)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt
index 42c68255e8..b3d8e5bf2d 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt
@@ -33,7 +33,6 @@ import kotlinx.coroutines.launch
internal fun MessageComposerView(
state: MessageComposerState,
voiceMessageState: VoiceMessageComposerState,
- subcomposing: Boolean,
enableVoiceMessages: Boolean,
modifier: Modifier = Modifier,
) {
@@ -98,7 +97,6 @@ internal fun MessageComposerView(
modifier = modifier,
state = state.textEditorState,
voiceMessageState = voiceMessageState.voiceMessageState,
- subcomposing = subcomposing,
onRequestFocus = ::onRequestFocus,
onSendMessage = ::sendMessage,
composerMode = state.mode,
@@ -131,14 +129,12 @@ internal fun MessageComposerViewPreview(
state = state,
voiceMessageState = aVoiceMessageComposerState(),
enableVoiceMessages = true,
- subcomposing = false,
)
MessageComposerView(
modifier = Modifier.height(200.dp),
state = state,
voiceMessageState = aVoiceMessageComposerState(),
enableVoiceMessages = true,
- subcomposing = false,
)
DisabledComposerView()
}
@@ -155,7 +151,6 @@ internal fun MessageComposerViewVoicePreview(
state = aMessageComposerState(),
voiceMessageState = state,
enableVoiceMessages = true,
- subcomposing = false,
)
}
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt
index cc8f536f5f..93703377eb 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt
@@ -27,6 +27,7 @@ import io.element.android.features.messages.impl.R
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatar.anAvatarData
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -98,6 +99,11 @@ private fun SuggestionItemView(
is ResolvedSuggestion.Member -> suggestion.roomMember.getAvatarData(avatarSize)
is ResolvedSuggestion.Alias -> suggestion.getAvatarData(avatarSize)
}
+ val avatarType = when (suggestion) {
+ is ResolvedSuggestion.Alias -> AvatarType.Room()
+ ResolvedSuggestion.AtRoom,
+ is ResolvedSuggestion.Member -> AvatarType.User
+ }
val title = when (suggestion) {
is ResolvedSuggestion.AtRoom -> stringResource(R.string.screen_room_mentions_at_room_title)
is ResolvedSuggestion.Member -> suggestion.roomMember.displayName
@@ -108,9 +114,11 @@ private fun SuggestionItemView(
is ResolvedSuggestion.Member -> suggestion.roomMember.userId.value
is ResolvedSuggestion.Alias -> suggestion.roomAlias.value
}
-
- Avatar(avatarData = avatarData, modifier = Modifier.padding(start = 16.dp, top = 12.dp, bottom = 12.dp))
-
+ Avatar(
+ avatarData = avatarData,
+ avatarType = avatarType,
+ modifier = Modifier.padding(start = 16.dp, top = 12.dp, bottom = 12.dp),
+ )
Column(
modifier = Modifier
.fillMaxWidth()
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt
index ff36ba8999..785de15954 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt
@@ -10,14 +10,31 @@ package io.element.android.features.messages.impl.pinned.banner
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.text.AnnotatedString
import io.element.android.libraries.designsystem.text.toAnnotatedString
import io.element.android.libraries.ui.strings.CommonStrings
@Immutable
sealed interface PinnedMessagesBannerState {
data object Hidden : PinnedMessagesBannerState
- sealed interface Visible : PinnedMessagesBannerState
+ @Immutable
+ sealed interface Visible : PinnedMessagesBannerState {
+ fun pinnedMessagesCount() = when (this) {
+ is Loading -> expectedPinnedMessagesCount
+ is Loaded -> loadedPinnedMessagesCount
+ }
+
+ fun currentPinnedMessageIndex() = when (this) {
+ is Loading -> expectedPinnedMessagesCount - 1
+ is Loaded -> currentPinnedMessageIndex
+ }
+
+ @Composable
+ fun formattedMessage() = when (this) {
+ is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString()
+ is Loaded -> currentPinnedMessage.formatted
+ }
+ }
+
data class Loading(val expectedPinnedMessagesCount: Int) : Visible
data class Loaded(
val currentPinnedMessage: PinnedMessagesBannerItem,
@@ -25,23 +42,4 @@ sealed interface PinnedMessagesBannerState {
val loadedPinnedMessagesCount: Int,
val eventSink: (PinnedMessagesBannerEvents) -> Unit
) : Visible
-
- fun pinnedMessagesCount() = when (this) {
- is Hidden -> 0
- is Loading -> expectedPinnedMessagesCount
- is Loaded -> loadedPinnedMessagesCount
- }
-
- fun currentPinnedMessageIndex() = when (this) {
- is Hidden -> 0
- is Loading -> expectedPinnedMessagesCount - 1
- is Loaded -> currentPinnedMessageIndex
- }
-
- @Composable
- fun formattedMessage() = when (this) {
- is Hidden -> AnnotatedString("")
- is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString()
- is Loaded -> currentPinnedMessage.formatted
- }
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt
index aef0848b1e..194cc433f4 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt
@@ -78,7 +78,7 @@ fun PinnedMessagesBannerView(
@Composable
private fun PinnedMessagesBannerRow(
- state: PinnedMessagesBannerState,
+ state: PinnedMessagesBannerState.Visible,
onClick: (EventId) -> Unit,
onViewAllClick: () -> Unit,
modifier: Modifier = Modifier,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt
index a5dae403eb..86cd8c740f 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListView.kt
@@ -23,7 +23,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import im.vector.app.features.analytics.plan.Interaction
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.messages.impl.actionlist.ActionListEvents
import io.element.android.features.messages.impl.actionlist.ActionListView
@@ -46,7 +45,6 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.ui.strings.CommonStrings
@@ -100,12 +98,7 @@ private fun PinnedMessagesListTopBar(
modifier: Modifier = Modifier,
) {
TopAppBar(
- title = {
- Text(
- text = state.title(),
- style = ElementTheme.typography.fontBodyLgMedium
- )
- },
+ titleStr = state.title(),
navigationIcon = { BackButton(onClick = onBackClick) },
modifier = modifier,
)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
index d2c5d05e1a..d3d9e1e37a 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
@@ -35,7 +35,6 @@ import io.element.android.libraries.designsystem.components.async.AsyncActionVie
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
@@ -63,12 +62,7 @@ fun ReportMessageView(
Scaffold(
topBar = {
TopAppBar(
- title = {
- Text(
- stringResource(CommonStrings.action_report_content),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(CommonStrings.action_report_content),
navigationIcon = {
BackButton(onClick = onBackClick)
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
index c8bae78f13..22853d4151 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
@@ -46,7 +46,6 @@ import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.messageFromMeBackground
import io.element.android.libraries.designsystem.theme.messageFromOtherBackground
-import io.element.android.libraries.designsystem.utils.LocalUiTestMode
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.ui.utils.time.isTalkbackActive
@@ -111,9 +110,7 @@ fun MessageEventBubble(
state.isMine -> ElementTheme.colors.messageFromMeBackground
else -> ElementTheme.colors.messageFromOtherBackground
}
- // If we're running in UI test mode, we want to use a different shape to avoid
- // this issue: https://issuetracker.google.com/issues/366255137
- val bubbleShape = if (LocalUiTestMode.current) RoundedCornerShape(12.dp) else bubbleShape()
+ val bubbleShape = bubbleShape()
val radiusPx = (avatarRadius + SENDER_AVATAR_BORDER_WIDTH).toPx()
val yOffsetPx = -(NEGATIVE_MARGIN_FOR_BUBBLE + avatarRadius).toPx()
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageStateEventContainer.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageStateEventContainer.kt
index ac9be4de74..c988679626 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageStateEventContainer.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageStateEventContainer.kt
@@ -17,10 +17,12 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Surface
+import io.element.android.libraries.ui.strings.CommonStrings
private val CORNER_RADIUS = 8.dp
@@ -41,6 +43,7 @@ fun MessageStateEventContainer(
.combinedClickable(
onClick = onClick,
onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
indication = ripple(),
interactionSource = interactionSource
),
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt
index b0026fb449..8c2a1d9ff6 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt
@@ -31,7 +31,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
-import androidx.compose.ui.semantics.onClick
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -52,6 +51,7 @@ import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.ui.media.MediaRequestData
+import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@Suppress("ModifierClickableOrder") // This is needed to display the right ripple shape
@@ -85,15 +85,6 @@ fun MessagesReactionButton(
}
}
- val a11yClickLabel = if (content is MessagesReactionsButtonContent.Reaction) {
- a11yReactionAction(
- emoji = content.reaction.key,
- userAlreadyReacted = content.isHighlighted
- )
- } else {
- ""
- }
-
Surface(
modifier = modifier
.background(Color.Transparent)
@@ -107,6 +98,13 @@ fun MessagesReactionButton(
.clip(RoundedCornerShape(corner = CornerSize(12.dp)))
.combinedClickable(
onClick = onClick,
+ onClickLabel = (content as? MessagesReactionsButtonContent.Reaction)?.let {
+ a11yReactionAction(
+ emoji = content.reaction.key,
+ userAlreadyReacted = content.isHighlighted
+ )
+ },
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
onLongClick = onLongClick
)
// Inner border, to highlight when selected
@@ -115,14 +113,6 @@ fun MessagesReactionButton(
.padding(vertical = 4.dp, horizontal = 10.dp)
.clearAndSetSemantics {
contentDescription = a11yText
- if (content is MessagesReactionsButtonContent.Reaction) {
- onClick(
- label = a11yClickLabel
- ) {
- onClick()
- true
- }
- }
},
color = buttonColor
) {
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 ed26d6558e..ca34184491 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
@@ -33,6 +33,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt
import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.features.roomcall.api.RoomCallStateProvider
import io.element.android.libraries.designsystem.components.avatar.Avatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp
@@ -50,12 +51,20 @@ internal fun TimelineItemCallNotifyView(
modifier = modifier
.fillMaxWidth()
.border(1.dp, ElementTheme.colors.borderInteractiveSecondary, RoundedCornerShape(8.dp))
- .combinedClickable(enabled = true, onClick = {}, onLongClick = { onLongClick(event) })
+ .combinedClickable(
+ enabled = true,
+ onClick = {},
+ onLongClick = { onLongClick(event) },
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
.padding(12.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
- Avatar(avatarData = event.senderAvatar)
+ Avatar(
+ avatarData = event.senderAvatar,
+ avatarType = AvatarType.User,
+ )
Column(modifier = Modifier.weight(1f)) {
Text(
text = event.safeSenderName,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
index 18d0658dd6..1b798de14f 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
@@ -76,6 +76,7 @@ import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
import io.element.android.libraries.designsystem.components.EqualWidthColumn
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.swipe.SwipeableActionsState
@@ -441,6 +442,7 @@ private fun MessageSenderInformation(
.clip(CircleShape)
.clickable(onClick = onClick),
avatarData = senderAvatar,
+ avatarType = AvatarType.User,
)
SenderName(
modifier = Modifier
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
index 45ff052ee6..a32f36ced6 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
@@ -14,8 +14,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource
-import androidx.compose.ui.semantics.clearAndSetSemantics
-import androidx.compose.ui.semantics.contentDescription
import io.element.android.features.messages.impl.R
import io.element.android.features.messages.impl.timeline.TimelineEvents
import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
@@ -27,7 +25,6 @@ import io.element.android.features.messages.impl.timeline.components.layout.Cont
import io.element.android.features.messages.impl.timeline.components.receipt.ReadReceiptViewState
import io.element.android.features.messages.impl.timeline.components.receipt.TimelineItemReadReceiptView
import io.element.android.features.messages.impl.timeline.model.TimelineItem
-import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent
import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionEvent
import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState
import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState
@@ -35,6 +32,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.user.MatrixUser
+import io.element.android.libraries.ui.utils.time.isTalkbackActive
import io.element.android.wysiwyg.link.Link
@Composable
@@ -143,16 +141,7 @@ private fun TimelineItemGroupedEventsRowContent(
},
) {
Column(modifier = modifier.animateContentSize()) {
- val groupedEventsTitle = pluralStringResource(
- id = R.plurals.screen_room_timeline_state_changes,
- count = timelineItem.events.size,
- timelineItem.events.size
- )
GroupHeaderView(
- modifier = Modifier.clearAndSetSemantics {
- val groupedEventsContent = timelineItem.events.reversed().joinToString(separator = "\n") { (it.content as TimelineItemStateContent).body }
- contentDescription = groupedEventsTitle + groupedEventsContent
- },
text = pluralStringResource(
id = R.plurals.screen_room_timeline_state_changes,
count = timelineItem.events.size,
@@ -164,7 +153,13 @@ private fun TimelineItemGroupedEventsRowContent(
)
if (isExpanded) {
Column {
- timelineItem.events.forEach { subGroupEvent ->
+ timelineItem.events.let {
+ if (isTalkbackActive()) {
+ it.reversed()
+ } else {
+ it
+ }
+ }.forEach { subGroupEvent ->
TimelineItemRow(
timelineItem = subGroupEvent,
timelineRoomInfo = timelineRoomInfo,
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 c537c89b6d..ffbcfee305 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
@@ -145,14 +145,15 @@ internal fun TimelineItemRow(
// Custom clickable that applies over the whole item for accessibility
.then(
if (isTalkbackActive()) {
- Modifier.combinedClickable(
- onClick = { onContentClick(timelineItem) },
- onLongClick = { onLongClick(timelineItem) }
- )
- } else {
- Modifier
- }
- ),
+ Modifier.combinedClickable(
+ onClick = { onContentClick(timelineItem) },
+ onLongClick = { onLongClick(timelineItem) },
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
+ } else {
+ Modifier
+ }
+ ),
event = timelineItem,
timelineRoomInfo = timelineRoomInfo,
renderReadReceipts = renderReadReceipts,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt
index dd16f2faf3..dc7cfb2d52 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemStickerView.kt
@@ -66,7 +66,18 @@ fun TimelineItemStickerView(
modifier = Modifier
.fillMaxSize()
.then(if (isLoaded) Modifier.background(Color.White) else Modifier)
- .then(if (onContentClick != null) Modifier.combinedClickable(onClick = onContentClick, onLongClick = onLongClick) else Modifier),
+ .then(
+ if (onContentClick != null) {
+ Modifier
+ .combinedClickable(
+ onClick = onContentClick,
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
+ } else {
+ Modifier
+ }
+ ),
model = MediaRequestData(
source = content.preferredMediaSource,
kind = MediaRequestData.Kind.File(
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/group/GroupHeaderView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/group/GroupHeaderView.kt
index 0a8662eab4..22825b532c 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/group/GroupHeaderView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/group/GroupHeaderView.kt
@@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -24,6 +25,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -49,7 +53,15 @@ fun GroupHeaderView(
Box(
modifier = modifier
- .fillMaxWidth(),
+ .fillMaxWidth()
+ .toggleable(
+ value = isExpanded,
+ onValueChange = { onClick() },
+ role = Role.DropdownList,
+ )
+ .clearAndSetSemantics {
+ contentDescription = text
+ },
contentAlignment = Alignment.Center
) {
Surface(
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryView.kt
index c14d792252..081d93465f 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryView.kt
@@ -62,6 +62,7 @@ import io.element.android.features.messages.impl.timeline.model.AggregatedReacti
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp
@@ -249,7 +250,10 @@ private fun SenderRow(
.semantics(mergeDescendants = true) {},
verticalAlignment = Alignment.CenterVertically
) {
- Avatar(avatarData)
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Column(
modifier = Modifier.padding(start = 12.dp),
) {
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt
index 8493bad765..fd6e5cea53 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt
@@ -37,6 +37,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.messages.impl.timeline.model.ReadReceiptData
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatar.getBestName
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -65,11 +66,11 @@ fun TimelineItemReadReceiptView(
ReadReceiptsAvatars(
receipts = state.receipts,
modifier = Modifier
- .clip(RoundedCornerShape(4.dp))
- .clickable {
- onReadReceiptsClick()
- }
- .padding(2.dp)
+ .clip(RoundedCornerShape(4.dp))
+ .clickable {
+ onReadReceiptsClick()
+ }
+ .padding(2.dp)
)
}
}
@@ -112,9 +113,9 @@ private fun ReadReceiptsRow(
) {
Row(
modifier = modifier
- .fillMaxWidth()
- .height(AvatarSize.TimelineReadReceipt.dp + 8.dp)
- .padding(horizontal = 18.dp),
+ .fillMaxWidth()
+ .height(AvatarSize.TimelineReadReceipt.dp + 8.dp)
+ .padding(horizontal = 18.dp),
horizontalArrangement = Arrangement.End,
verticalAlignment = Alignment.CenterVertically,
) {
@@ -154,15 +155,16 @@ private fun ReadReceiptsAvatars(
.forEachIndexed { index, readReceiptData ->
Box(
modifier = Modifier
- .padding(end = (12.dp + avatarStrokeSize * 2) * index)
- .size(size = avatarSize + avatarStrokeSize * 2)
- .clip(CircleShape)
- .background(avatarStrokeColor)
- .zIndex(index.toFloat()),
+ .padding(end = (12.dp + avatarStrokeSize * 2) * index)
+ .size(size = avatarSize + avatarStrokeSize * 2)
+ .clip(CircleShape)
+ .background(avatarStrokeColor)
+ .zIndex(index.toFloat()),
contentAlignment = Alignment.Center,
) {
Avatar(
avatarData = readReceiptData.avatarData,
+ avatarType = AvatarType.User,
)
}
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemDaySeparatorView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemDaySeparatorView.kt
index 2e0c874535..08fe34b724 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemDaySeparatorView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemDaySeparatorView.kt
@@ -14,6 +14,8 @@ import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -36,6 +38,10 @@ internal fun TimelineItemDaySeparatorView(
contentAlignment = Alignment.Center,
) {
Text(
+ modifier = Modifier
+ .semantics {
+ heading()
+ },
text = model.formattedDate,
style = ElementTheme.typography.fontBodyMdMedium,
color = ElementTheme.colors.textPrimary,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoView.kt
index a9467a9a8f..cd22006804 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/debug/EventDebugInfoView.kt
@@ -44,7 +44,6 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
@@ -72,12 +71,7 @@ fun EventDebugInfoView(
Scaffold(
topBar = {
TopAppBar(
- title = {
- Text(
- text = "Debug event info",
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = "Debug event info",
navigationIcon = { BackButton(onClick = onBackClick) }
)
},
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt
index 00cde0f880..b4c2576a65 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenter.kt
@@ -14,16 +14,16 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import io.element.android.libraries.architecture.Presenter
+import io.element.android.libraries.core.coroutine.mapState
import io.element.android.libraries.matrix.api.core.EventId
-import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.media.isPreviewEnabled
import io.element.android.libraries.matrix.api.room.BaseRoom
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import kotlinx.collections.immutable.toImmutableSet
import javax.inject.Inject
class TimelineProtectionPresenter @Inject constructor(
- private val appPreferencesStore: AppPreferencesStore,
+ private val mediaPreviewService: MediaPreviewService,
private val room: BaseRoom,
) : Presenter {
private val allowedEvents = mutableStateOf>(setOf())
@@ -31,8 +31,8 @@ class TimelineProtectionPresenter @Inject constructor(
@Composable
override fun present(): TimelineProtectionState {
val mediaPreviewValue = remember {
- appPreferencesStore.getTimelineMediaPreviewValueFlow()
- }.collectAsState(initial = MediaPreviewValue.On)
+ mediaPreviewService.mediaPreviewConfigFlow.mapState { config -> config.mediaPreviewValue }
+ }.collectAsState()
val roomInfo = room.roomInfoFlow.collectAsState()
val protectionState by remember {
derivedStateOf {
diff --git a/features/messages/impl/src/main/res/values-bg/translations.xml b/features/messages/impl/src/main/res/values-bg/translations.xml
index 284177448c..bd910f2e58 100644
--- a/features/messages/impl/src/main/res/values-bg/translations.xml
+++ b/features/messages/impl/src/main/res/values-bg/translations.xml
@@ -18,6 +18,7 @@
"Анкета"
"Форматиране на текст"
"Хронологията на съобщенията не е налична в момента."
+ "Всеки"
"Добавяне на емоджи"
"Това е началото на %1$s."
"Това е началото на този разговор."
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 3b43f897e2..3f5f94e595 100644
--- a/features/messages/impl/src/main/res/values-cs/translations.xml
+++ b/features/messages/impl/src/main/res/values-cs/translations.xml
@@ -35,8 +35,20 @@
"Zobrazit méně"
"Zpráva zkopírována"
"Nemáte oprávnění zveřejňovat příspěvky v této místnosti"
+
+ - "%1$d člen reagoval s %2$s"
+ - "%1$d členové reagovali s %2$s"
+ - "%1$d členů reagovalo s %2$s"
+
+
+ - "Vy a %1$d člen jste reagovali s %2$s"
+ - "Vy a %1$d členové jste reagovali s %2$s"
+ - "Vy a %1$d členů reagovalo s %2$s"
+
+ "Reagovali jste s %1$s"
"Zobrazit méně"
"Zobrazit více"
+ "Zobrazit souhrn reakcí"
"Nové"
- "%1$d změna místnosti"
diff --git a/features/messages/impl/src/main/res/values-cy/translations.xml b/features/messages/impl/src/main/res/values-cy/translations.xml
index 9cf82d6522..eb277d2f75 100644
--- a/features/messages/impl/src/main/res/values-cy/translations.xml
+++ b/features/messages/impl/src/main/res/values-cy/translations.xml
@@ -35,8 +35,10 @@
"Dangos llai"
"Neges wedi\'i chopïo"
"Does gennych chi ddim caniatâd i bostio i\'r ystafell hon"
+ "Rydych chi wedi ymateb gyda %1$s"
"Dangos llai"
"Dangos rhagor"
+ "Dangos crynodeb o ymatebion"
"Newydd"
- "%1$d newid ystafelloedd"
@@ -46,6 +48,10 @@
- "%1$d newid ystafell"
- "%1$d newid ystafell"
+ "Neidio i ystafell newydd"
+ "Mae\'r ystafell hon wedi\'i disodli ac nid yw\'n weithredol mwyach"
+ "Gweld hen negeseuon"
+ "Mae\'r ystafell hon yn barhad o ystafell arall"
- "%1$s, %2$s a %3$d arall"
- "%1$s, %2$s a %3$d arall"
diff --git a/features/messages/impl/src/main/res/values-da/translations.xml b/features/messages/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..a249db99f3
--- /dev/null
+++ b/features/messages/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,68 @@
+
+
+ "Aktiviteter"
+ "Flag"
+ "Mad og drikke"
+ "Dyr og natur"
+ "Objekter"
+ "Smileys og mennesker"
+ "Rejser og steder"
+ "Symboler"
+ "Bloker bruger"
+ "Marker, hvis du vil skjule alle nuværende og fremtidige beskeder fra denne bruger"
+ "Denne meddelelse vil blive indberettet til administratoren af din hjemmeserver. De vil ikke være i stand til at læse nogen krypterede meddelelser."
+ "Årsag til indberetning af dette indhold"
+ "Kamera"
+ "Tag billede"
+ "Optag video"
+ "Vedhæftning"
+ "Foto- og videobibliotek"
+ "Lokation"
+ "Afstemning"
+ "Tekstformatering"
+ "Beskedhistorikken er i øjeblikket ikke tilgængelig."
+ "Beskedhistorikken er ikke tilgængelig i dette rum. Bekræft denne enhed for at se din beskedhistorik."
+ "Vil du invitere dem igen?"
+ "Du er alene i denne samtale"
+ "Giv hele rummet besked"
+ "Alle"
+ "Send igen"
+ "Din besked kunne ikke sendes"
+ "Tilføj emoji"
+ "Dette er begyndelsen på %1$s."
+ "Dette er begyndelsen på denne samtale."
+ "Ikke-understøttet opkald. Spørg, om den, der ringer op, kan bruge den nye Element X-app."
+ "Vis mindre"
+ "Beskeden er kopieret"
+ "Du har ikke tilladelse til at slå noget op i dette rum"
+
+ - "%1$d medlem reagerede med %2$s"
+ - "%1$d medlemmer reagerede med %2$s"
+
+
+ - "Du og %1$d medlem reagerede med %2$s"
+ - "Du og %1$d medlemmer reagerede med %2$s"
+
+ "Du reagerede med %1$s"
+ "Vis mindre"
+ "Vis mere"
+ "Vis oversigt over reaktioner"
+ "Ny"
+
+ - "%1$d rumændring"
+ - "%1$d rumændringer"
+
+ "Gå til nyt rum"
+ "Dette rum er blevet erstattet og er ikke længere aktivt"
+ "Se ældre beskeder"
+ "Dette rum er en fortsættelse af et andet rum"
+
+ - "%1$s, %2$s og %3$d anden"
+ - "%1$s, %2$s og %3$d andre"
+
+
+ - "%1$s skriver"
+ - "%1$s skriver"
+
+ "%1$s og %2$s"
+
diff --git a/features/messages/impl/src/main/res/values-de/translations.xml b/features/messages/impl/src/main/res/values-de/translations.xml
index 56faa43e6c..4b2d3cff0c 100644
--- a/features/messages/impl/src/main/res/values-de/translations.xml
+++ b/features/messages/impl/src/main/res/values-de/translations.xml
@@ -35,13 +35,27 @@
"Weniger anzeigen"
"Nachricht wurde kopiert"
"Du bist nicht berechtigt, in diesem Raum zu schreiben"
+
+ - "%1$d Mitglied reagierte mit %2$s"
+ - "%1$d Mitglieder reagierten mit %2$s"
+
+
+ - "Du und %1$d Mitglied reagierten mit %2$s"
+ - "Du und %1$d Mitglieder reagierten mit %2$s"
+
+ "Du hast reagiert mit %1$s"
"Weniger anzeigen"
"Mehr anzeigen"
+ "Zusammenfassung der Reaktionen anzeigen"
"Neu"
- "%1$d Raumänderung"
- "%1$d Raumänderungen"
+ "Zum neuen Raum springen"
+ "Dieser Raum wurde ersetzt und ist nicht mehr aktiv"
+ "Alte Nachrichten ansehen"
+ "Dieser Raum ist eine Fortsetzung eines anderen Raums"
- "%1$s, %2$s und %3$d weitere Person"
- "%1$s, %2$s und %3$d weitere Person"
diff --git a/features/messages/impl/src/main/res/values-el/translations.xml b/features/messages/impl/src/main/res/values-el/translations.xml
index 954ab07a64..2b64d3ce98 100644
--- a/features/messages/impl/src/main/res/values-el/translations.xml
+++ b/features/messages/impl/src/main/res/values-el/translations.xml
@@ -21,10 +21,10 @@
"Δημοσκόπηση"
"Μορφοποίηση Κειμένου"
"Το ιστορικό μηνυμάτων δεν είναι διαθέσιμο προς το παρόν."
- "Το ιστορικό μηνυμάτων δεν είναι διαθέσιμο σε αυτό το δωμάτιο. Επαλήθευσε αυτήν τη συσκευή για να δεις το ιστορικό μηνυμάτων σου."
+ "Το ιστορικό μηνυμάτων δεν είναι διαθέσιμο σε αυτή την αίθουσα. Επαληθεύστε αυτή τη συσκευή για να δείτε το ιστορικό των μηνυμάτων σας."
"Θα ήθελες να τους προσκαλέσεις και συ;"
"Είσαι μόνος σε αυτή τη συνομιλία"
- "Ειδοποίησε όλο το δωμάτιο"
+ "Ειδοποιήστε όλη την αίθουσα"
"Όλοι"
"Αποστολή ξανά"
"Το μήνυμά σου απέτυχε να σταλεί"
@@ -34,14 +34,28 @@
"Μη υποστηριζόμενη κλήση. Ρώτα εάν ο καλών μπορεί να χρησιμοποιήσει τη νέα εφαρμογή Element X."
"Εμφάνιση λιγότερων"
"Το μήνυμα αντιγράφηκε"
- "Δεν έχεις άδεια να δημοσιεύσεις σε αυτό το δωμάτιο"
+ "Δεν έχετε δικαιώματα για να δημοσιεύσετε σε αυτήν την αίθουσα"
+
+ - "%1$d μέλος αντέδρασε με %2$s"
+ - "%1$d μέλη αντέδρασαν με %2$s"
+
+
+ - "Εσύ και %1$d μέλος αντιδράσατε με %2$s"
+ - "Εσύ και τα %1$d μέλη αντιδράσατε με %2$s"
+
+ "Αντέδρασες με %1$s"
"Εμφάνιση λιγότερων"
"Εμφάνιση περισσότερων"
+ "Εμφάνιση περίληψης αντιδράσεων"
"Νέο"
- - "%1$d αλλαγή δωματίου"
- - "%1$d αλλαγές δωματίου"
+ - "%1$d αλλαγή αίθουσας"
+ - "%1$d αλλαγές αίθουσας"
+ "Μετάβαση σε νέα αίθουσα"
+ "Αυτή η αίθουσα έχει αντικατασταθεί και δεν είναι πλέον ενεργή"
+ "Δες παλιά μηνύματα"
+ "Αυτή η αίθουσα αποτελεί συνέχεια μιας άλλης αίθουσας"
- "%1$s, %2$s και %3$d ακόμη"
- "%1$s, %2$s και %3$d ακόμη"
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 13a187cedc..6d369a083a 100644
--- a/features/messages/impl/src/main/res/values-et/translations.xml
+++ b/features/messages/impl/src/main/res/values-et/translations.xml
@@ -35,13 +35,27 @@
"Näita vähem"
"Sõnum on kopeeritud"
"Sul pole õigusi siia jututuppa kirjutada"
+
+ - "%1$d liige reageeris: %2$s"
+ - "%1$d liige reageerisid: %2$s"
+
+
+ - "Sina ja veel %1$d liige reageeris: %2$s"
+ - "Sina ja veel %1$d liiget reageerisid: %2$s"
+
+ "Sina reageerisid: %1$s"
"Näita vähem"
"Näita rohkem"
+ "Näita reageerimiste kokkuvõtet"
"Uus"
- "%1$d jututoa muudatus"
- "%1$d jututoa muudatust"
+ "Hüppa uude jututuppa"
+ "See jututuba on asendatud uuega ning pole enam aktiivne"
+ "Vaata vanu sõnumeid"
+ "See jututuba on varasema jututoa jätk"
- "%1$s, %2$s ja veel %3$d osaleja"
- "%1$s, %2$s ja veel %3$d osalejat"
diff --git a/features/messages/impl/src/main/res/values-fa/translations.xml b/features/messages/impl/src/main/res/values-fa/translations.xml
index b539950608..58201d9537 100644
--- a/features/messages/impl/src/main/res/values-fa/translations.xml
+++ b/features/messages/impl/src/main/res/values-fa/translations.xml
@@ -9,6 +9,8 @@
"سفر و مکانها"
"نمادها"
"انسداد کاربر"
+ "اگر میخواهید همه پیامهای فعلی و آینده را از این کاربر را پنهان کنید، علامت بزنید"
+ "این پیام به مدیر سرور خانگی شما گزارش خواهد شد. آنها قادر به خواندن پیام های رمزگذاری شده نخواهند بود."
"دلیل گزارش این محتوا"
"دوربین"
"عکس گرفتن"
@@ -18,6 +20,7 @@
"مکان"
"نظرسنجی"
"قالببندی متن"
+ "تاریخچه پیام درحال حاضر دردسترس نیست."
"میخواهید دوباره دعوتش کنید؟"
"در این گپ تنهایید"
"آگاهی به تمام اتاق"
@@ -33,5 +36,9 @@
"نمایش کمتر"
"نمایش بیشتر"
"جدید"
+
+ - "%1$dتغییر اتاق"
+ - "%1$dتغییر اتاق"
+
"%1$s و %2$s"
diff --git a/features/messages/impl/src/main/res/values-fi/translations.xml b/features/messages/impl/src/main/res/values-fi/translations.xml
index e689f9e406..912e610b60 100644
--- a/features/messages/impl/src/main/res/values-fi/translations.xml
+++ b/features/messages/impl/src/main/res/values-fi/translations.xml
@@ -42,6 +42,10 @@
- "%1$d muutos huoneeseen"
- "%1$d muutosta huoneeseen"
+ "Siirry uuteen huoneeseen"
+ "Tämä huone on korvattu, eikä se ole enää aktiivinen"
+ "Katso vanhoja viestejä"
+ "Tämä huone on jatkoa toiselle huoneelle"
- "%1$s, %2$s ja %3$d muu"
- "%1$s, %2$s ja %3$d muuta"
diff --git a/features/messages/impl/src/main/res/values-fr/translations.xml b/features/messages/impl/src/main/res/values-fr/translations.xml
index 2f45ed5e56..87465ddf36 100644
--- a/features/messages/impl/src/main/res/values-fr/translations.xml
+++ b/features/messages/impl/src/main/res/values-fr/translations.xml
@@ -46,11 +46,16 @@
"Vous avez réagi avec %1$s"
"Afficher moins"
"Afficher plus"
+ "Afficher le résumé des réactions"
"Nouveau"
- "%1$d changement dans le salon"
- "%1$d changements dans le salon"
+ "Aller dans le nouveau salon"
+ "Ce salon a été remplacé et n’est plus actif"
+ "Voir les anciens messages"
+ "Ce salon est la continuation du salon précédent"
- "%1$s, %2$s et %3$d autre"
- "%1$s, %2$s et %3$d autres"
diff --git a/features/messages/impl/src/main/res/values-hu/translations.xml b/features/messages/impl/src/main/res/values-hu/translations.xml
index 6fce42474c..9e7de8616d 100644
--- a/features/messages/impl/src/main/res/values-hu/translations.xml
+++ b/features/messages/impl/src/main/res/values-hu/translations.xml
@@ -35,13 +35,27 @@
"Kevesebb megjelenítése"
"Üzenet másolva"
"Nincs jogosultsága arra, hogy bejegyzést tegyen közzé ebben a szobában"
+
+ - "%1$d tag reagált így: %2$s"
+ - "%1$d tag reagált így: %2$s"
+
+
+ - "Ön és %1$d tag reagáltak így: %2$s"
+ - "Ön és %1$d tag reagáltak így: %2$s"
+
+ "Ezzel reagált: %1$s"
"Kevesebb megjelenítése"
"Több megjelenítése"
+ "Reakció-összefoglaló megjelenítése"
"Új"
- "%1$d szobaváltozás"
- "%1$d szobaváltozás"
+ "Ugrás az új szobába"
+ "Ezt a szobát lecserélték, és már nem aktív."
+ "Régi üzenetek megtekintése"
+ "Ez a szoba egy másik szoba folytatása"
- "%1$s, %2$s és %3$d további felhasználó"
- "%1$s, %2$s és %3$d további felhasználó"
diff --git a/features/messages/impl/src/main/res/values-in/translations.xml b/features/messages/impl/src/main/res/values-in/translations.xml
index c1c526b298..253e521c88 100644
--- a/features/messages/impl/src/main/res/values-in/translations.xml
+++ b/features/messages/impl/src/main/res/values-in/translations.xml
@@ -35,12 +35,24 @@
"Tampilkan lebih sedikit"
"Pesan disalin"
"Anda tidak memiliki izin untuk mengirim di ruangan ini"
+
+ - "%1$d anggota bereaksi dengan %2$s"
+
+
+ - "Anda dan %1$d anggota bereaksi dengan %2$s"
+
+ "Anda bereaksi dengan %1$s"
"Tampilkan lebih sedikit"
"Tampilkan lebih banyak"
+ "Tampilkan ringkasan reaksi"
"Baru"
- "%1$d perubahan ruangan"
+ "Lompat ke ruangan baru"
+ "Ruangan ini telah diganti dan tidak lagi aktif"
+ "Lihat pesan lama"
+ "Ruangan ini adalah lanjutan dari ruangan lain"
- "%1$s, %2$s, dan %3$d lainnya"
diff --git a/features/messages/impl/src/main/res/values-it/translations.xml b/features/messages/impl/src/main/res/values-it/translations.xml
index 229a02b714..69c6c996a9 100644
--- a/features/messages/impl/src/main/res/values-it/translations.xml
+++ b/features/messages/impl/src/main/res/values-it/translations.xml
@@ -35,13 +35,27 @@
"Mostra meno"
"Messaggio copiato"
"Non sei autorizzato a postare in questa stanza"
+
+ - "un membro ha reagito con %2$s"
+ - "%1$d membri hanno reagito con %2$s"
+
+
+ - "Tu e un altro membro avete reagito con %2$s"
+ - "Tu e %1$d altri membri avete reagito con %2$s"
+
+ "Hai reagito con %1$s"
"Mostra meno"
"Mostra di più"
+ "Mostra il riepilogo delle reazioni"
"Nuovo"
- "%1$d modifica alla stanza"
- "%1$d modifiche alla stanza"
+ "Vai alla nuova stanza"
+ "Questa stanza è stata sostituita e non è più attiva"
+ "Visualizza i vecchi messaggi"
+ "Questa stanza è la continuazione di un\'altra stanza"
- "%1$s, %2$s e %3$d altro"
- "%1$s, %2$s e altri %3$d"
diff --git a/features/messages/impl/src/main/res/values-nb/translations.xml b/features/messages/impl/src/main/res/values-nb/translations.xml
index f5fb2229fa..acb6762a1b 100644
--- a/features/messages/impl/src/main/res/values-nb/translations.xml
+++ b/features/messages/impl/src/main/res/values-nb/translations.xml
@@ -46,11 +46,16 @@
"Du reagerte med %1$s"
"Vis mindre"
"Vis mer"
+ "Vis sammendrag av reaksjoner"
"Ny"
- "%1$d romendring"
- "%1$d romendringer"
+ "Gå til nytt rom"
+ "Dette rommet har blitt erstattet og er ikke lenger aktivt"
+ "Se gamle meldinger"
+ "Dette rommet er en fortsettelse av et annet rom"
- "%1$s, %2$s og %3$d annet"
- "%1$s, %2$s og %3$d andre"
diff --git a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml
index b94905323c..9688adc49d 100644
--- a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml
@@ -35,13 +35,27 @@
"Mostrar menos"
"Mensagem copiada"
"Você não tem permissão para postar nesta sala"
+
+ - "%1$d membro reagiu com %2$s"
+ - "%1$d membros reagiram com %2$s"
+
+
+ - "Você e mais %1$d membro reagiram com %2$s"
+ - "Você e mais %1$d membros reagiram com %2$s"
+
+ "Você reagiu com %1$s"
"Mostrar menos"
"Mostrar mais"
+ "Mostrar resumo das reações"
"Novo"
- "%1$d alteração na sala"
- "%1$d alterações na sala"
+ "Ir para a sala nova"
+ "Esta sala foi substituída e não está mais ativa"
+ "Ver mensagens antigas"
+ "Esta sala é a continuação de outra sala"
- "%1$s, %2$s e %3$d outro"
- "%1$s, %2$s e %3$d outros"
diff --git a/features/messages/impl/src/main/res/values-pt/translations.xml b/features/messages/impl/src/main/res/values-pt/translations.xml
index 3eaa774960..4759a6aeb9 100644
--- a/features/messages/impl/src/main/res/values-pt/translations.xml
+++ b/features/messages/impl/src/main/res/values-pt/translations.xml
@@ -35,13 +35,27 @@
"Mostrar menos"
"Mensagem copiada"
"Não tens permissão para publicar nesta sala"
+
+ - "%1$d membro reagiu com %2$s"
+ - "%1$d membros reagiram com %2$s"
+
+
+ - "Tu e %1$d membro reagiram com %2$s"
+ - "Tu e %1$d membros reagiram com %2$s"
+
+ "Reagiste com %1$s"
"Mostrar menos"
"Mostrar mais"
+ "Mostrar sumário de reações"
"Novas"
- "%1$d alteração à sala"
- "%1$d alterações à sala"
+ "Ir para a nova sala"
+ "Esta sala foi substituída e já não se encontra ativa"
+ "Ver mensagens antigas"
+ "Esta sala é a continuação de uma outra"
- "%1$s, %2$s e %3$d outro"
- "%1$s, %2$s e %3$d outros"
diff --git a/features/messages/impl/src/main/res/values-ru/translations.xml b/features/messages/impl/src/main/res/values-ru/translations.xml
index 084829ba49..b8c3cc237f 100644
--- a/features/messages/impl/src/main/res/values-ru/translations.xml
+++ b/features/messages/impl/src/main/res/values-ru/translations.xml
@@ -43,6 +43,10 @@
- "%1$d изменения в комнате"
- "%1$d изменений в комнате"
+ "Перейти в новую комнату"
+ "Эта комната была заменена и больше не активна"
+ "Посмотреть старые сообщения"
+ "Эта комната является продолжением другой комнаты"
- "%1$s, %2$s и %3$d"
- "%1$s, %2$s и другие %3$d"
diff --git a/features/messages/impl/src/main/res/values-sk/translations.xml b/features/messages/impl/src/main/res/values-sk/translations.xml
index 215e7f4cc4..23c664c5d4 100644
--- a/features/messages/impl/src/main/res/values-sk/translations.xml
+++ b/features/messages/impl/src/main/res/values-sk/translations.xml
@@ -35,14 +35,30 @@
"Zobraziť menej"
"Správa skopírovaná"
"Nemáte povolenie uverejňovať príspevky v tejto miestnosti"
+
+ - "%1$d člen reagoval s %2$s"
+ - "%1$d členovia reagovali s %2$s"
+ - "%1$d členov reagovalo s %2$s"
+
+
+ - "Vy a %1$d člen reagoval s %2$s"
+ - "Vy a %1$d členovia reagovali s %2$s"
+ - "Vy a %1$d členov reagovalo s %2$s"
+
+ "Reagovali ste s %1$s"
"Zobraziť menej"
"Zobraziť viac"
+ "Zobraziť súhrn reakcií"
"Nové"
- "%1$d zmena miestnosti"
- "%1$d zmeny miestnosti"
- "%1$d zmien miestnosti"
+ "Prejsť do novej miestnosti"
+ "Táto miestnosť bola nahradená a už nie je aktívna"
+ "Zobraziť staré správy"
+ "Táto miestnosť je pokračovaním inej miestnosti"
- "%1$s, %2$s a %3$d ďalší"
- "%1$s, %2$s a %3$d ďalší"
diff --git a/features/messages/impl/src/main/res/values-sv/translations.xml b/features/messages/impl/src/main/res/values-sv/translations.xml
index 6846c7e333..bb803b396f 100644
--- a/features/messages/impl/src/main/res/values-sv/translations.xml
+++ b/features/messages/impl/src/main/res/values-sv/translations.xml
@@ -42,6 +42,10 @@
- "%1$d rumsändring"
- "%1$d rumsändringar"
+ "Hoppa till nytt rum"
+ "Det här rummet har ersatts och är inte längre aktivt"
+ "Se gamla meddelanden"
+ "Det här rummet är en fortsättning på ett annat rum"
- "%1$s, %2$s och %3$d annan"
- "%1$s, %2$s och %3$d andra"
diff --git a/features/messages/impl/src/main/res/values-uk/translations.xml b/features/messages/impl/src/main/res/values-uk/translations.xml
index bb11dec6d7..b8f9ec0b68 100644
--- a/features/messages/impl/src/main/res/values-uk/translations.xml
+++ b/features/messages/impl/src/main/res/values-uk/translations.xml
@@ -35,14 +35,30 @@
"Показувати менше"
"Повідомлення скопійовано"
"У вас немає дозволу на публікацію в цій кімнаті"
+
+ - "%1$d учасник відреагував з %2$s"
+ - "%1$d учасники відреагували з %2$s"
+ - "%1$d учасників відреагували з %2$s"
+
+
+ - "Ви та ще %1$d учасник відреагували з %2$s"
+ - "Ви та ще %1$d учасники відреагували з %2$s"
+ - "Ви та ще %1$d учасників відреагували з %2$s"
+
+ "Ви відреагували за допомогою %1$s"
"Показувати менше"
"Показати більше"
+ "Показати підсумок реакцій"
"Нове"
- "%1$d зміна в кімнаті"
- "%1$d зміни в кімнаті"
- "%1$d змін у кімнаті"
+ "Перейти до нової кімнати"
+ "Цю кімнату замінили, і вона більше не активна."
+ "Перегляд давніших повідомлень"
+ "Ця кімната є продовженням іншої кімнати"
- "%1$s%2$s та %3$d інший"
- "%1$s%2$s та %3$d інші"
diff --git a/features/messages/impl/src/main/res/values/localazy.xml b/features/messages/impl/src/main/res/values/localazy.xml
index 984eb1231f..2d208bef49 100644
--- a/features/messages/impl/src/main/res/values/localazy.xml
+++ b/features/messages/impl/src/main/res/values/localazy.xml
@@ -46,6 +46,7 @@
"You reacted with %1$s"
"Show less"
"Show more"
+ "Show reactions summary"
"New"
- "%1$d room change"
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt
new file mode 100644
index 0000000000..10290610dc
--- /dev/null
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2025 New Vector 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
+
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.messages.impl.attachments.preview.SendActionState
+import io.element.android.features.messages.impl.attachments.preview.aMediaUploadInfo
+import io.element.android.libraries.mediaupload.api.MediaUploadInfo
+import org.junit.Test
+
+class SendActionStateTest {
+ @Test
+ fun `mediaUploadInfo() should return the value from Uploading class`() {
+ val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo()
+ val state: SendActionState = SendActionState.Sending.Uploading(
+ progress = 0.5f,
+ mediaUploadInfo = aMediaUploadInfo()
+ )
+ assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo)
+ }
+}
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt
index ecd069585f..f1fcd7e787 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt
@@ -62,7 +62,7 @@ class PinnedMessagesBannerPresenterTest {
val presenter = createPinnedMessagesBannerPresenter(room = room)
presenter.test {
skipItems(2)
- val loadingState = awaitItem()
+ val loadingState = awaitItem() as PinnedMessagesBannerState.Loading
assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1))
assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1)
assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0)
@@ -167,7 +167,8 @@ class PinnedMessagesBannerPresenterTest {
val presenter = createPinnedMessagesBannerPresenter(room = room)
presenter.test {
skipItems(2)
- awaitItem().also { loadingState ->
+ awaitItem().also { state ->
+ val loadingState = state as PinnedMessagesBannerState.Loading
assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1))
assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1)
assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0)
diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt
index ac8e2a5290..49f30716a8 100644
--- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt
+++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/protection/TimelineProtectionPresenterTest.kt
@@ -8,17 +8,19 @@
package io.element.android.features.messages.impl.timeline.protection
import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.matrix.api.media.MediaPreviewConfig
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
import io.element.android.libraries.matrix.api.room.BaseRoom
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.test.AN_EVENT_ID
+import io.element.android.libraries.matrix.test.media.FakeMediaPreviewService
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
import io.element.android.libraries.matrix.test.room.aRoomInfo
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
-import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.test
import kotlinx.collections.immutable.persistentSetOf
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
@@ -38,10 +40,10 @@ class TimelineProtectionPresenterTest {
@Test
fun `present - media preview value off`() = runTest {
- val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Off)
- val presenter = createPresenter(appPreferencesStore)
+ val mediaPreviewConfig = MediaPreviewConfig(mediaPreviewValue = MediaPreviewValue.Off, hideInviteAvatar = false)
+ val mediaPreviewService = FakeMediaPreviewService(mediaPreviewConfigFlow = MutableStateFlow(mediaPreviewConfig))
+ val presenter = createPresenter(mediaPreviewService = mediaPreviewService)
presenter.test {
- skipItems(1)
val initialState = awaitItem()
assertThat(initialState.protectionState).isEqualTo(ProtectionState.RenderOnly(persistentSetOf()))
// ShowContent with null should have no effect.
@@ -54,11 +56,11 @@ class TimelineProtectionPresenterTest {
@Test
fun `present - media preview value private in public room`() = runTest {
- val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Private)
+ val mediaPreviewConfig = MediaPreviewConfig(mediaPreviewValue = MediaPreviewValue.Private, hideInviteAvatar = false)
+ val mediaPreviewService = FakeMediaPreviewService(mediaPreviewConfigFlow = MutableStateFlow(mediaPreviewConfig))
val room = FakeBaseRoom(initialRoomInfo = aRoomInfo(joinRule = JoinRule.Public))
- val presenter = createPresenter(appPreferencesStore, room)
+ val presenter = createPresenter(mediaPreviewService = mediaPreviewService, room = room)
presenter.test {
- skipItems(1)
val initialState = awaitItem()
assertThat(initialState.protectionState).isEqualTo(ProtectionState.RenderOnly(persistentSetOf()))
// ShowContent with null should have no effect.
@@ -71,9 +73,10 @@ class TimelineProtectionPresenterTest {
@Test
fun `present - media preview value private in non public room`() = runTest {
- val appPreferencesStore = InMemoryAppPreferencesStore(timelineMediaPreviewValue = MediaPreviewValue.Private)
+ val mediaPreviewConfig = MediaPreviewConfig(mediaPreviewValue = MediaPreviewValue.Private, hideInviteAvatar = false)
+ val mediaPreviewService = FakeMediaPreviewService(mediaPreviewConfigFlow = MutableStateFlow(mediaPreviewConfig))
val room = FakeBaseRoom(initialRoomInfo = aRoomInfo(joinRule = JoinRule.Invite))
- val presenter = createPresenter(appPreferencesStore, room)
+ val presenter = createPresenter(mediaPreviewService = mediaPreviewService, room = room)
presenter.test {
val initialState = awaitItem()
assertThat(initialState.protectionState).isEqualTo(ProtectionState.RenderAll)
@@ -84,10 +87,10 @@ class TimelineProtectionPresenterTest {
}
private fun createPresenter(
- appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(),
room: BaseRoom = FakeBaseRoom(),
+ mediaPreviewService: MediaPreviewService = FakeMediaPreviewService(),
) = TimelineProtectionPresenter(
- appPreferencesStore = appPreferencesStore,
+ mediaPreviewService = mediaPreviewService,
room = room,
)
}
diff --git a/features/poll/api/src/main/res/values-cs/translations.xml b/features/poll/api/src/main/res/values-cs/translations.xml
new file mode 100644
index 0000000000..888f9efbad
--- /dev/null
+++ b/features/poll/api/src/main/res/values-cs/translations.xml
@@ -0,0 +1,9 @@
+
+
+
+ - "%1$d procento z celkového počtu hlasů"
+ - "%1$d procenta z celkového počtu hlasů"
+ - "%1$d procent z celkového počtu hlasů"
+
+ "Toto je vítězná odpověď"
+
diff --git a/features/poll/api/src/main/res/values-cy/translations.xml b/features/poll/api/src/main/res/values-cy/translations.xml
new file mode 100644
index 0000000000..9be4adc91e
--- /dev/null
+++ b/features/poll/api/src/main/res/values-cy/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "Dyma\'r ateb buddugol"
+
diff --git a/features/poll/api/src/main/res/values-da/translations.xml b/features/poll/api/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..1024970e20
--- /dev/null
+++ b/features/poll/api/src/main/res/values-da/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d% af de samlede stemmer"
+ - "%1$d procent af det samlede antal stemmer"
+
+ "Dette er det vindende svar"
+
diff --git a/features/poll/api/src/main/res/values-de/translations.xml b/features/poll/api/src/main/res/values-de/translations.xml
new file mode 100644
index 0000000000..b80268d03e
--- /dev/null
+++ b/features/poll/api/src/main/res/values-de/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d Prozent der Stimmen insgesamt"
+ - "%1$d Prozent der Gesamtstimmen"
+
+ "Das ist die Gewinnerantwort"
+
diff --git a/features/poll/api/src/main/res/values-el/translations.xml b/features/poll/api/src/main/res/values-el/translations.xml
new file mode 100644
index 0000000000..fcd34977d3
--- /dev/null
+++ b/features/poll/api/src/main/res/values-el/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d τοις εκατό των συνολικών ψήφων"
+ - "%1$d τοις εκατό του συνόλου των ψήφων"
+
+ "Αυτή είναι η νικητήρια απάντηση"
+
diff --git a/features/poll/api/src/main/res/values-et/translations.xml b/features/poll/api/src/main/res/values-et/translations.xml
new file mode 100644
index 0000000000..a57d937d4f
--- /dev/null
+++ b/features/poll/api/src/main/res/values-et/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d protsent kõikidest antud häältest"
+ - "%1$d protsenti kõikidest antud häältest"
+
+ "See vastus võitis"
+
diff --git a/features/poll/api/src/main/res/values-hu/translations.xml b/features/poll/api/src/main/res/values-hu/translations.xml
new file mode 100644
index 0000000000..3bb3181295
--- /dev/null
+++ b/features/poll/api/src/main/res/values-hu/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "az összes szavazat %1$d százaléka"
+ - "az összes szavazat %1$d százaléka"
+
+ "Ez a győztes válasz"
+
diff --git a/features/poll/api/src/main/res/values-in/translations.xml b/features/poll/api/src/main/res/values-in/translations.xml
new file mode 100644
index 0000000000..1810031c93
--- /dev/null
+++ b/features/poll/api/src/main/res/values-in/translations.xml
@@ -0,0 +1,7 @@
+
+
+
+ - "%1$d persen dari total suara"
+
+ "Ini adalah jawaban yang menang"
+
diff --git a/features/poll/api/src/main/res/values-it/translations.xml b/features/poll/api/src/main/res/values-it/translations.xml
new file mode 100644
index 0000000000..1a634bd625
--- /dev/null
+++ b/features/poll/api/src/main/res/values-it/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d percento dei voti totali"
+ - "%1$d percento dei voti totali"
+
+ "Questa è la risposta vincente"
+
diff --git a/features/poll/api/src/main/res/values-pt-rBR/translations.xml b/features/poll/api/src/main/res/values-pt-rBR/translations.xml
new file mode 100644
index 0000000000..88681aca30
--- /dev/null
+++ b/features/poll/api/src/main/res/values-pt-rBR/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d por cento de todos os votos"
+ - "%1$d por cento de todos os votos"
+
+ "Esta é a resposta vencedora"
+
diff --git a/features/poll/api/src/main/res/values-pt/translations.xml b/features/poll/api/src/main/res/values-pt/translations.xml
new file mode 100644
index 0000000000..f1292fee2f
--- /dev/null
+++ b/features/poll/api/src/main/res/values-pt/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ - "%1$d porcento de todos os votos"
+ - "%1$d porcento de todos os votos"
+
+ "Esta é a reposta vencedora"
+
diff --git a/features/poll/api/src/main/res/values-sk/translations.xml b/features/poll/api/src/main/res/values-sk/translations.xml
new file mode 100644
index 0000000000..42a6d22945
--- /dev/null
+++ b/features/poll/api/src/main/res/values-sk/translations.xml
@@ -0,0 +1,9 @@
+
+
+
+ - "%1$d percento z celkového počtu hlasov"
+ - "%1$d percentá z celkového počtu hlasov"
+ - "%1$d percent z celkového počtu hlasov"
+
+ "Toto je víťazná odpoveď"
+
diff --git a/features/poll/api/src/main/res/values-uk/translations.xml b/features/poll/api/src/main/res/values-uk/translations.xml
new file mode 100644
index 0000000000..bbb1618deb
--- /dev/null
+++ b/features/poll/api/src/main/res/values-uk/translations.xml
@@ -0,0 +1,9 @@
+
+
+
+ - "%1$d відсоток від усіх голосів"
+ - "%1$d відсотки від усіх голосів"
+ - "%1$d відсотків від усіх голосів"
+
+ "Ця відповідь перемогла"
+
diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt
index 038fb397f3..ce6a8682b6 100644
--- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt
+++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt
@@ -31,7 +31,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.tooling.preview.PreviewParameter
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.poll.impl.R
import io.element.android.libraries.designsystem.components.button.BackButton
@@ -39,7 +38,6 @@ import io.element.android.libraries.designsystem.components.dialogs.Confirmation
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.IconSource
@@ -209,14 +207,9 @@ private fun CreatePollTopAppBar(
onSaveClick: () -> Unit = {},
) {
TopAppBar(
- title = {
- Text(
- text = when (mode) {
- CreatePollState.Mode.New -> stringResource(id = R.string.screen_create_poll_title)
- CreatePollState.Mode.Edit -> stringResource(id = R.string.screen_edit_poll_title)
- },
- style = ElementTheme.typography.aliasScreenTitle,
- )
+ titleStr = when (mode) {
+ CreatePollState.Mode.New -> stringResource(id = R.string.screen_create_poll_title)
+ CreatePollState.Mode.Edit -> stringResource(id = R.string.screen_edit_poll_title)
},
navigationIcon = {
BackButton(onClick = onBackClick)
diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
index 1101276577..0ff1ef57a5 100644
--- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
+++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
@@ -42,7 +42,6 @@ import io.element.android.features.poll.impl.history.model.PollHistoryItem
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.SegmentedButton
@@ -77,12 +76,7 @@ fun PollHistoryView(
modifier = modifier,
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_polls_history_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_polls_history_title),
navigationIcon = {
BackButton(onClick = goBack)
},
diff --git a/features/poll/impl/src/main/res/values-cs/translations.xml b/features/poll/impl/src/main/res/values-cs/translations.xml
index ac1ebfb8dd..b5c7f325ad 100644
--- a/features/poll/impl/src/main/res/values-cs/translations.xml
+++ b/features/poll/impl/src/main/res/values-cs/translations.xml
@@ -5,6 +5,7 @@
"Anonymní hlasování"
"Volba %1$d"
"Vaše změny nebyly uloženy. Opravdu se chcete vrátit?"
+ "Smazat možnost %1$s"
"Otázka nebo téma"
"Čeho se hlasování týká?"
"Vytvořit hlasování"
diff --git a/features/poll/impl/src/main/res/values-cy/translations.xml b/features/poll/impl/src/main/res/values-cy/translations.xml
index 49cf5f02cf..d325c1348e 100644
--- a/features/poll/impl/src/main/res/values-cy/translations.xml
+++ b/features/poll/impl/src/main/res/values-cy/translations.xml
@@ -5,6 +5,7 @@
"Cuddio pleidleisiau"
"Dewis %1$d"
"Dyw eich newidiadau heb gael eu cadw. Ydych chi\'n siŵr eich bod am fynd nôl?"
+ "Dileu opsiwn %1$s"
"Cwestiwn neu bwnc"
"Am beth mae\'r bleidlais?"
"Creu Pleidlais"
diff --git a/features/poll/impl/src/main/res/values-da/translations.xml b/features/poll/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..84ab5de145
--- /dev/null
+++ b/features/poll/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,20 @@
+
+
+ "Tilføj mulighed"
+ "Vis først resultater, når afstemningen er slut"
+ "Skjul stemmer"
+ "Mulighed %1$d"
+ "Dine ændringer er ikke blevet gemt. Er du sikker på, at du vil gå tilbage?"
+ "Slet mulighed %1$s"
+ "Spørgsmål eller emne"
+ "Hvad handler afstemningen om?"
+ "Opret afstemning"
+ "Er du sikker på, at du ønsker at slette denne afstemning?"
+ "Slet afstemning"
+ "Redigér afstemning"
+ "Kan ikke finde nogen igangværende afstemninger."
+ "Kan ikke finde nogen tidligere afstemninger."
+ "Igangværende"
+ "Tidligere"
+ "Afstemninger"
+
diff --git a/features/poll/impl/src/main/res/values-de/translations.xml b/features/poll/impl/src/main/res/values-de/translations.xml
index f525f79666..a7c2939d42 100644
--- a/features/poll/impl/src/main/res/values-de/translations.xml
+++ b/features/poll/impl/src/main/res/values-de/translations.xml
@@ -5,6 +5,7 @@
"Anonyme Umfrage"
"Option %1$d"
"Ihre Änderungen wurden nicht gespeichert. Sind Sie sicher, dass Sie zurückgehen wollen?"
+ "Lösche Option %1$s"
"Frage oder Thema"
"Worum geht es bei der Umfrage?"
"Umfrage erstellen"
diff --git a/features/poll/impl/src/main/res/values-el/translations.xml b/features/poll/impl/src/main/res/values-el/translations.xml
index e13ba7746a..108c9c6bce 100644
--- a/features/poll/impl/src/main/res/values-el/translations.xml
+++ b/features/poll/impl/src/main/res/values-el/translations.xml
@@ -5,6 +5,7 @@
"Απόκρυψη ψήφων"
"Επιλογή %1$d"
"Οι αλλαγές σου δεν έχουν αποθηκευτεί. Σίγουρα θες να πας πίσω;"
+ "Διαγραφή επιλογής %1$s"
"Ερώτηση ή θέμα"
"Τί αφορά η δημοσκόπηση;"
"Δημιουργία Δημοσκόπησης"
diff --git a/features/poll/impl/src/main/res/values-et/translations.xml b/features/poll/impl/src/main/res/values-et/translations.xml
index 4257685e75..8312856e87 100644
--- a/features/poll/impl/src/main/res/values-et/translations.xml
+++ b/features/poll/impl/src/main/res/values-et/translations.xml
@@ -5,6 +5,7 @@
"Peida hääled"
"Valik %1$d"
"Sinu tehtud muudatused pole veel salvestatud. Kas sa oled kindel, et soovid minna tagasi?"
+ "Kustuta valik: %1$s"
"Küsimus või teema"
"Mis on küsitluse teema?"
"Loo küsitlus"
diff --git a/features/poll/impl/src/main/res/values-hu/translations.xml b/features/poll/impl/src/main/res/values-hu/translations.xml
index 310c1a77db..ed6a79363f 100644
--- a/features/poll/impl/src/main/res/values-hu/translations.xml
+++ b/features/poll/impl/src/main/res/values-hu/translations.xml
@@ -5,6 +5,7 @@
"Szavazatok elrejtése"
"%1$d. lehetőség"
"A módosítások nem lettek mentve. Biztos, hogy visszalép?"
+ "Lehetőség törlése: %1$s"
"Kérdés vagy téma"
"Miről szól ez a szavazás?"
"Szavazás létrehozása"
diff --git a/features/poll/impl/src/main/res/values-in/translations.xml b/features/poll/impl/src/main/res/values-in/translations.xml
index f55dccd75d..99250c4bef 100644
--- a/features/poll/impl/src/main/res/values-in/translations.xml
+++ b/features/poll/impl/src/main/res/values-in/translations.xml
@@ -5,6 +5,7 @@
"Pemungutan suara anonim"
"Opsi %1$d"
"Perubahan Anda belum disimpan. Apakah Anda yakin ingin kembali?"
+ "Hapus opsi %1$s"
"Pertanyaan atau topik"
"Tentang apa pemungutan suara ini?"
"Buat pemungutan suara"
diff --git a/features/poll/impl/src/main/res/values-it/translations.xml b/features/poll/impl/src/main/res/values-it/translations.xml
index bf7190db23..3ffbf03afa 100644
--- a/features/poll/impl/src/main/res/values-it/translations.xml
+++ b/features/poll/impl/src/main/res/values-it/translations.xml
@@ -5,6 +5,7 @@
"Nascondi voti"
"Opzione %1$d"
"Le modifiche non sono state salvate. Vuoi davvero tornare indietro?"
+ "Elimina l\'opzione %1$s"
"Domanda o argomento"
"Di cosa parla il sondaggio?"
"Crea sondaggio"
diff --git a/features/poll/impl/src/main/res/values-pt-rBR/translations.xml b/features/poll/impl/src/main/res/values-pt-rBR/translations.xml
index 3be7be89b9..d1eb60cc23 100644
--- a/features/poll/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/poll/impl/src/main/res/values-pt-rBR/translations.xml
@@ -5,6 +5,7 @@
"Ocultar votos"
"Opção %1$d"
"Suas alterações não foram salvas. Tem certeza de que você quer voltar?"
+ "Apagar opção %1$s"
"Pergunta ou tópico"
"Sobre o que é a enquete?"
"Criar enquete"
diff --git a/features/poll/impl/src/main/res/values-pt/translations.xml b/features/poll/impl/src/main/res/values-pt/translations.xml
index 456b03b317..26bacb9f13 100644
--- a/features/poll/impl/src/main/res/values-pt/translations.xml
+++ b/features/poll/impl/src/main/res/values-pt/translations.xml
@@ -5,6 +5,7 @@
"Ocultar votos"
"Opção %1$d"
"As tuas alterações não foram guardadas. Tens a certeza que queres voltar atrás?"
+ "Eliminar opção %1$s"
"Pergunta ou tópico"
"De que trata a sondagem?"
"Criar sondagem"
diff --git a/features/poll/impl/src/main/res/values-sk/translations.xml b/features/poll/impl/src/main/res/values-sk/translations.xml
index 57f2ff1fb7..a3c5129105 100644
--- a/features/poll/impl/src/main/res/values-sk/translations.xml
+++ b/features/poll/impl/src/main/res/values-sk/translations.xml
@@ -5,6 +5,7 @@
"Anonymná anketa"
"Možnosť %1$d"
"Vaše zmeny neboli uložené. Naozaj sa chcete vrátiť?"
+ "Odstrániť možnosť %1$s"
"Otázka alebo téma"
"O čom je anketa?"
"Vytvoriť anketu"
diff --git a/features/poll/impl/src/main/res/values-uk/translations.xml b/features/poll/impl/src/main/res/values-uk/translations.xml
index ec1a7bda20..1e62e17a61 100644
--- a/features/poll/impl/src/main/res/values-uk/translations.xml
+++ b/features/poll/impl/src/main/res/values-uk/translations.xml
@@ -5,6 +5,7 @@
"Приховати голоси"
"Варіант %1$d"
"Внесені зміни не збережено. Ви впевнені, що хочете повернутися?"
+ "Видалити варіант %1$s"
"Питання або тема"
"Про що йдеться в опитуванні?"
"Створити опитування"
diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts
index 6fb6e4a55b..8eb3c5d860 100644
--- a/features/preferences/impl/build.gradle.kts
+++ b/features/preferences/impl/build.gradle.kts
@@ -66,6 +66,7 @@ dependencies {
implementation(projects.libraries.permissions.api)
implementation(projects.libraries.push.api)
implementation(projects.libraries.pushproviders.api)
+ implementation(projects.libraries.uiUtils)
implementation(projects.libraries.fullscreenintent.api)
implementation(projects.features.rageshake.api)
implementation(projects.features.lockscreen.api)
@@ -74,8 +75,8 @@ dependencies {
implementation(projects.features.licenses.api)
implementation(projects.features.logout.api)
implementation(projects.features.deactivation.api)
+ implementation(projects.features.home.api)
implementation(projects.features.invite.api)
- implementation(projects.features.roomlist.api)
implementation(projects.services.analytics.api)
implementation(projects.services.analytics.compose)
implementation(projects.services.appnavstate.api)
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 41ac9bb0f4..be5f11116c 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
@@ -12,23 +12,26 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
import io.element.android.compound.theme.Theme
import io.element.android.compound.theme.mapToTheme
import io.element.android.libraries.architecture.Presenter
-import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject
class AdvancedSettingsPresenter @Inject constructor(
private val appPreferencesStore: AppPreferencesStore,
private val sessionPreferencesStore: SessionPreferencesStore,
+ private val mediaPreviewConfigStateStore: MediaPreviewConfigStateStore,
+ @SessionCoroutineScope
+ private val sessionCoroutineScope: CoroutineScope,
) : Presenter {
@Composable
override fun present(): AdvancedSettingsState {
- val localCoroutineScope = rememberCoroutineScope()
val isDeveloperModeEnabled by remember {
appPreferencesStore.isDeveloperModeEnabledFlow()
}.collectAsState(initial = false)
@@ -41,13 +44,8 @@ class AdvancedSettingsPresenter @Inject constructor(
val theme = remember {
appPreferencesStore.getThemeFlow().mapToTheme()
}.collectAsState(initial = Theme.System)
- val hideInviteAvatars by remember {
- appPreferencesStore.getHideInviteAvatarsFlow()
- }.collectAsState(false)
- val timelineMediaPreviewValue by remember {
- appPreferencesStore.getTimelineMediaPreviewValueFlow()
- }.collectAsState(initial = MediaPreviewValue.On)
+ val mediaPreviewConfigState = mediaPreviewConfigStateStore.state()
val themeOption by remember {
derivedStateOf {
@@ -61,28 +59,24 @@ class AdvancedSettingsPresenter @Inject constructor(
fun handleEvents(event: AdvancedSettingsEvents) {
when (event) {
- is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch {
+ is AdvancedSettingsEvents.SetDeveloperModeEnabled -> sessionCoroutineScope.launch {
appPreferencesStore.setDeveloperModeEnabled(event.enabled)
}
- is AdvancedSettingsEvents.SetSharePresenceEnabled -> localCoroutineScope.launch {
+ is AdvancedSettingsEvents.SetSharePresenceEnabled -> sessionCoroutineScope.launch {
sessionPreferencesStore.setSharePresence(event.enabled)
}
- is AdvancedSettingsEvents.SetCompressMedia -> localCoroutineScope.launch {
+ is AdvancedSettingsEvents.SetCompressMedia -> sessionCoroutineScope.launch {
sessionPreferencesStore.setCompressMedia(event.compress)
}
- is AdvancedSettingsEvents.SetTheme -> localCoroutineScope.launch {
+ is AdvancedSettingsEvents.SetTheme -> sessionCoroutineScope.launch {
when (event.theme) {
ThemeOption.System -> appPreferencesStore.setTheme(Theme.System.name)
ThemeOption.Dark -> appPreferencesStore.setTheme(Theme.Dark.name)
ThemeOption.Light -> appPreferencesStore.setTheme(Theme.Light.name)
}
}
- is AdvancedSettingsEvents.SetHideInviteAvatars -> localCoroutineScope.launch {
- appPreferencesStore.setHideInviteAvatars(event.value)
- }
- is AdvancedSettingsEvents.SetTimelineMediaPreviewValue -> localCoroutineScope.launch {
- appPreferencesStore.setTimelineMediaPreviewValue(event.value)
- }
+ is AdvancedSettingsEvents.SetHideInviteAvatars -> mediaPreviewConfigStateStore.setHideInviteAvatars(event.value)
+ is AdvancedSettingsEvents.SetTimelineMediaPreviewValue -> mediaPreviewConfigStateStore.setTimelineMediaPreviewValue(event.value)
}
}
@@ -91,9 +85,8 @@ class AdvancedSettingsPresenter @Inject constructor(
isSharePresenceEnabled = isSharePresenceEnabled,
doesCompressMedia = doesCompressMedia,
theme = themeOption,
- hideInviteAvatars = hideInviteAvatars,
- timelineMediaPreviewValue = timelineMediaPreviewValue,
- eventSink = { handleEvents(it) }
+ mediaPreviewConfigState = mediaPreviewConfigState,
+ eventSink = ::handleEvents,
)
}
}
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 58f93fc665..ef41ab26b3 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,7 +11,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.res.stringResource
import io.element.android.libraries.designsystem.components.preferences.DropdownOption
-import io.element.android.libraries.matrix.api.media.MediaPreviewValue
import io.element.android.libraries.ui.strings.CommonStrings
data class AdvancedSettingsState(
@@ -19,8 +18,7 @@ data class AdvancedSettingsState(
val isSharePresenceEnabled: Boolean,
val doesCompressMedia: Boolean,
val theme: ThemeOption,
- val hideInviteAvatars: Boolean,
- val timelineMediaPreviewValue: MediaPreviewValue,
+ val mediaPreviewConfigState: MediaPreviewConfigState,
val eventSink: (AdvancedSettingsEvents) -> Unit
)
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt
index b0b9ed34fd..42e63134d1 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt
@@ -8,6 +8,7 @@
package io.element.android.features.preferences.impl.advanced
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
open class AdvancedSettingsStateProvider : PreviewParameterProvider {
@@ -18,7 +19,9 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized,
+ setHideInviteAvatarsAction: AsyncAction = AsyncAction.Uninitialized,
eventSink: (AdvancedSettingsEvents) -> Unit = {},
) = AdvancedSettingsState(
isDeveloperModeEnabled = isDeveloperModeEnabled,
isSharePresenceEnabled = isSharePresenceEnabled,
doesCompressMedia = doesCompressMedia,
theme = theme,
- hideInviteAvatars = hideInviteAvatars,
- timelineMediaPreviewValue = timelineMediaPreviewValue,
+ mediaPreviewConfigState = MediaPreviewConfigState(
+ hideInviteAvatars = hideInviteAvatars,
+ timelineMediaPreviewValue = timelineMediaPreviewValue,
+ setTimelineMediaPreviewAction = setTimelineMediaPreviewAction,
+ setHideInviteAvatarsAction = setHideInviteAvatarsAction
+ ),
eventSink = eventSink
)
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt
index 18ba93b639..f5c1386658 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt
@@ -7,7 +7,9 @@
package io.element.android.features.preferences.impl.advanced
+import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
@@ -27,6 +29,10 @@ import io.element.android.libraries.designsystem.theme.components.ListSectionHea
import io.element.android.libraries.designsystem.theme.components.ListSupportingText
import io.element.android.libraries.designsystem.theme.components.ListSupportingTextDefaults
import io.element.android.libraries.designsystem.theme.components.Text
+import io.element.android.libraries.designsystem.utils.snackbar.LocalSnackbarDispatcher
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost
+import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState
+import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.compose.LocalAnalyticsService
@@ -40,10 +46,21 @@ fun AdvancedSettingsView(
modifier: Modifier = Modifier,
) {
val analyticsService = LocalAnalyticsService.current
+
+ val snackbarDispatcher = LocalSnackbarDispatcher.current
+ val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
+ val snackbarHostState = rememberSnackbarHostState(snackbarMessage = snackbarMessage)
+
PreferencePage(
modifier = modifier,
onBackClick = onBackClick,
- title = stringResource(id = CommonStrings.common_advanced_settings)
+ title = stringResource(id = CommonStrings.common_advanced_settings),
+ snackbarHost = {
+ SnackbarHost(
+ snackbarHostState,
+ modifier = Modifier.navigationBarsPadding()
+ )
+ }
) {
PreferenceDropdown(
title = stringResource(id = CommonStrings.common_appearance),
@@ -115,10 +132,11 @@ private fun ModerationAndSafety(
) {
PreferenceSwitch(
title = stringResource(R.string.screen_advanced_settings_hide_invite_avatars_toggle_title),
- isChecked = state.hideInviteAvatars,
+ isChecked = state.mediaPreviewConfigState.hideInviteAvatars,
onCheckedChange = {
state.eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(it))
},
+ enabled = !state.mediaPreviewConfigState.setHideInviteAvatarsAction.isLoading()
)
ListSectionHeader(
title = stringResource(R.string.screen_advanced_settings_show_media_timeline_title),
@@ -132,24 +150,36 @@ private fun ModerationAndSafety(
)
ListItem(
headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_always_hide)) },
- leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.Off, compact = true),
+ leadingContent = ListItemContent.RadioButton(
+ selected = state.mediaPreviewConfigState.timelineMediaPreviewValue == MediaPreviewValue.Off,
+ compact = true
+ ),
onClick = {
state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off))
},
+ enabled = !state.mediaPreviewConfigState.setTimelineMediaPreviewAction.isLoading()
)
ListItem(
headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_private_rooms)) },
- leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.Private, compact = true),
+ leadingContent = ListItemContent.RadioButton(
+ selected = state.mediaPreviewConfigState.timelineMediaPreviewValue == MediaPreviewValue.Private,
+ compact = true
+ ),
onClick = {
state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private))
},
+ enabled = !state.mediaPreviewConfigState.setTimelineMediaPreviewAction.isLoading()
)
ListItem(
headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_always_show)) },
- leadingContent = ListItemContent.RadioButton(selected = state.timelineMediaPreviewValue == MediaPreviewValue.On, compact = true),
+ leadingContent = ListItemContent.RadioButton(
+ selected = state.mediaPreviewConfigState.timelineMediaPreviewValue == MediaPreviewValue.On,
+ compact = true
+ ),
onClick = {
state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.On))
},
+ enabled = !state.mediaPreviewConfigState.setTimelineMediaPreviewAction.isLoading()
)
}
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt
new file mode 100644
index 0000000000..49f199ec3f
--- /dev/null
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2025 New Vector 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.preferences.impl.advanced
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import com.squareup.anvil.annotations.ContributesBinding
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.architecture.runUpdatingState
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
+import io.element.android.libraries.di.SessionScope
+import io.element.android.libraries.di.SingleIn
+import io.element.android.libraries.di.annotations.SessionCoroutineScope
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.ui.strings.CommonStrings
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.launch
+import timber.log.Timber
+import javax.inject.Inject
+
+data class MediaPreviewConfigState(
+ val hideInviteAvatars: Boolean,
+ val timelineMediaPreviewValue: MediaPreviewValue,
+ val setHideInviteAvatarsAction: AsyncAction,
+ val setTimelineMediaPreviewAction: AsyncAction,
+)
+
+interface MediaPreviewConfigStateStore {
+ @Composable
+ fun state(): MediaPreviewConfigState
+ fun setHideInviteAvatars(hide: Boolean)
+ fun setTimelineMediaPreviewValue(value: MediaPreviewValue)
+}
+
+@ContributesBinding(SessionScope::class)
+@SingleIn(SessionScope::class)
+class DefaultMediaPreviewConfigStateStore @Inject constructor(
+ @SessionCoroutineScope
+ private val sessionCoroutineScope: CoroutineScope,
+ private val mediaPreviewService: MediaPreviewService,
+ private val snackbarDispatcher: SnackbarDispatcher,
+) : MediaPreviewConfigStateStore {
+ private val hideInviteAvatars = mutableStateOf(false)
+ private val timelineMediaPreviewValue = mutableStateOf(MediaPreviewValue.On)
+ private val setHideInviteAvatarsAction = mutableStateOf>(AsyncAction.Uninitialized)
+ private val setTimelineMediaPreviewAction = mutableStateOf>(AsyncAction.Uninitialized)
+
+ init {
+ val configFlow = mediaPreviewService.mediaPreviewConfigFlow
+ val hideInviteAvatarsFlow = configFlow.map { it.hideInviteAvatar }.distinctUntilChanged()
+ val timelineMediaPreviewFlow = configFlow.map { it.mediaPreviewValue }.distinctUntilChanged()
+
+ hideInviteAvatarsFlow
+ .onEach {
+ Timber.d("Hide invite avatars changed to $it")
+ hideInviteAvatars.value = it
+ }
+ .launchIn(sessionCoroutineScope)
+
+ timelineMediaPreviewFlow
+ .onEach {
+ Timber.d("Timeline media preview value changed to $it")
+ timelineMediaPreviewValue.value = it
+ }
+ .launchIn(sessionCoroutineScope)
+ }
+
+ @Composable
+ override fun state(): MediaPreviewConfigState {
+ return MediaPreviewConfigState(
+ hideInviteAvatars = hideInviteAvatars.value,
+ timelineMediaPreviewValue = timelineMediaPreviewValue.value,
+ setHideInviteAvatarsAction = setHideInviteAvatarsAction.value,
+ setTimelineMediaPreviewAction = setTimelineMediaPreviewAction.value,
+ )
+ }
+
+ override fun setHideInviteAvatars(hide: Boolean) {
+ sessionCoroutineScope.launch {
+ val prevHideInviteAvatars = hideInviteAvatars.value
+ if (prevHideInviteAvatars == hide) return@launch
+ Timber.d("Setting hide invite avatars to $hide")
+ hideInviteAvatars.value = hide
+ runUpdatingState(setHideInviteAvatarsAction) {
+ mediaPreviewService
+ .setHideInviteAvatars(hide)
+ .onFailure {
+ hideInviteAvatars.value = prevHideInviteAvatars
+ snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_something_went_wrong_message))
+ }
+ }
+ }
+ }
+
+ override fun setTimelineMediaPreviewValue(value: MediaPreviewValue) {
+ sessionCoroutineScope.launch {
+ val prevTimelineMediaPreviewValue = timelineMediaPreviewValue.value
+ if (prevTimelineMediaPreviewValue == value) return@launch
+ Timber.d("Setting timeline media preview value to $value")
+ timelineMediaPreviewValue.value = value
+ runUpdatingState(setTimelineMediaPreviewAction) {
+ mediaPreviewService
+ .setMediaPreviewValue(value)
+ .onFailure {
+ timelineMediaPreviewValue.value = prevTimelineMediaPreviewValue
+ snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_something_went_wrong_message))
+ }
+ }
+ }
+ }
+}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersView.kt
index a892ebba44..56b5dd709e 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersView.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersView.kt
@@ -19,7 +19,6 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
-import io.element.android.compound.theme.ElementTheme
import io.element.android.features.preferences.impl.R
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.async.AsyncIndicator
@@ -29,9 +28,7 @@ import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
@@ -49,12 +46,7 @@ fun BlockedUsersView(
Scaffold(
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(CommonStrings.common_blocked_users),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(CommonStrings.common_blocked_users),
navigationIcon = {
BackButton(onClick = onBackClick)
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt
index b9a001e812..f38e59355c 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/edit/EditDefaultNotificationSettingView.kt
@@ -16,7 +16,8 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.preferences.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
-import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
+import io.element.android.libraries.designsystem.components.avatar.Avatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
@@ -97,9 +98,11 @@ fun EditDefaultNotificationSettingView(
Text(text = subtitle)
},
leadingContent = ListItemContent.Custom {
- RoomAvatar(
+ Avatar(
avatarData = summary.avatarData,
- heroes = summary.heroesAvatar,
+ avatarType = AvatarType.Room(
+ heroes = summary.heroesAvatar,
+ ),
)
},
onClick = {
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt
index 15a55f41ca..6fd2d635e1 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt
@@ -15,6 +15,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import io.element.android.features.logout.api.direct.DirectLogoutState
import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider
@@ -49,6 +50,7 @@ class PreferencesRootPresenter @Inject constructor(
) : Presenter {
@Composable
override fun present(): PreferencesRootState {
+ val coroutineScope = rememberCoroutineScope()
val matrixUser = matrixClient.userProfile.collectAsState()
LaunchedEffect(Unit) {
// Force a refresh of the profile
@@ -103,7 +105,7 @@ class PreferencesRootPresenter @Inject constructor(
fun handleEvent(event: PreferencesRootEvents) {
when (event) {
is PreferencesRootEvents.OnVersionInfoClick -> {
- showDeveloperSettingsProvider.unlockDeveloperSettings()
+ showDeveloperSettingsProvider.unlockDeveloperSettings(coroutineScope)
}
}
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt
index b63919cd26..337544ed7f 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt
@@ -25,7 +25,6 @@ import io.element.android.features.preferences.impl.user.UserPreferences
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
-import io.element.android.libraries.designsystem.icons.CompoundDrawables
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight
@@ -272,7 +271,7 @@ private fun ColumnScope.Footer(
private fun DeveloperPreferencesView(onOpenDeveloperSettings: () -> Unit) {
ListItem(
headlineContent = { Text(stringResource(id = CommonStrings.common_developer_options)) },
- leadingContent = ListItemContent.Icon(IconSource.Resource(CompoundDrawables.ic_compound_code)),
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Code())),
onClick = onOpenDeveloperSettings
)
}
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt
index 298fd8cb17..0e4c1b4f2d 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileStateProvider.kt
@@ -7,7 +7,9 @@
package io.element.android.features.preferences.impl.user.editprofile
+import android.net.Uri
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import androidx.core.net.toUri
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.permissions.api.aPermissionsState
@@ -17,14 +19,17 @@ open class EditUserProfileStateProvider : PreviewParameterProvider
get() = sequenceOf(
aEditUserProfileState(),
+ aEditUserProfileState(userAvatarUrl = "example://uri".toUri()),
// Add other states here
)
}
-fun aEditUserProfileState() = EditUserProfileState(
+fun aEditUserProfileState(
+ userAvatarUrl: Uri? = null,
+) = EditUserProfileState(
userId = UserId("@john.doe:matrix.org"),
displayName = "John Doe",
- userAvatarUrl = null,
+ userAvatarUrl = userAvatarUrl,
avatarActions = persistentListOf(),
saveAction = AsyncAction.Uninitialized,
saveButtonEnabled = true,
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt
index 5b52f83b66..00581745ce 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt
@@ -32,11 +32,11 @@ import io.element.android.features.preferences.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.async.AsyncActionViewDefaults
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.modifiers.clearFocusOnTap
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
@@ -67,12 +67,7 @@ fun EditUserProfileView(
modifier = modifier.clearFocusOnTap(focusManager),
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_edit_profile_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_edit_profile_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
@@ -101,6 +96,7 @@ fun EditUserProfileView(
displayName = state.displayName,
avatarUrl = state.userAvatarUrl,
avatarSize = AvatarSize.EditProfileDetails,
+ avatarType = AvatarType.User,
onAvatarClick = { onAvatarClick() },
modifier = Modifier.align(Alignment.CenterHorizontally),
)
diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt
index 6589fd1c66..2ed16d6582 100644
--- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt
+++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/utils/ShowDeveloperSettingsProvider.kt
@@ -9,6 +9,8 @@ package io.element.android.features.preferences.impl.utils
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.core.meta.BuildType
+import io.element.android.libraries.ui.utils.MultipleTapToUnlock
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject
@@ -19,18 +21,15 @@ class ShowDeveloperSettingsProvider @Inject constructor(
companion object {
const val DEVELOPER_SETTINGS_COUNTER = 7
}
- private var counter = DEVELOPER_SETTINGS_COUNTER
+
+ private val multipleTapToUnlock = MultipleTapToUnlock(DEVELOPER_SETTINGS_COUNTER)
private val isDeveloperBuild = buildMeta.buildType != BuildType.RELEASE
private val _showDeveloperSettings = MutableStateFlow(isDeveloperBuild)
val showDeveloperSettings: StateFlow = _showDeveloperSettings
- fun unlockDeveloperSettings() {
- if (counter == 0) {
- return
- }
- counter--
- if (counter == 0) {
+ fun unlockDeveloperSettings(scope: CoroutineScope) {
+ if (multipleTapToUnlock.unlock(scope)) {
_showDeveloperSettings.value = true
}
}
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 9b017f6807..289c59d360 100644
--- a/features/preferences/impl/src/main/res/values-bg/translations.xml
+++ b/features/preferences/impl/src/main/res/values-bg/translations.xml
@@ -1,7 +1,14 @@
+ "Изберете как да получавате известия"
+ "Скриване на профилните снимки в заявките за покана за стая"
+ "Оптимизиране на качеството на медията"
+ "Модерация и безопасност"
"Потвърждения за прочитане"
"Споделяне на присъствието"
+ "Скриване винаги"
+ "Показване винаги"
+ "В частни стаи"
"Отблокиране"
"Отблокиране на потребителя"
"Име"
@@ -20,6 +27,7 @@
"Включване на известията на това устройство"
"Групови чатове"
"Покани"
+ "Вашият сървър не поддържа тази опция в шифровани стаи, може да не получавате известия в някои стаи."
"Споменавания"
"Споменавания"
"Да бъда известяван за"
diff --git a/features/preferences/impl/src/main/res/values-da/translations.xml b/features/preferences/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..c2edfc3d44
--- /dev/null
+++ b/features/preferences/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,69 @@
+
+
+ "For at sikre, at du aldrig går glip af et vigtigt opkald, skal du ændre dine indstillinger til at tillade underretninger i fuld skærm, når din telefon er låst."
+ "Gør din opkaldsoplevelse bedre"
+ "Vælg, hvordan du vil modtage notifikationer"
+ "Udviklertilstand"
+ "Aktivér for at få adgang til funktioner og funktionalitet for udviklere."
+ "Brugerdefineret URL til opkaldsbase for Element"
+ "Angiv en brugerdefineret basis-URL til Element Call."
+ "Ugyldig URL, sørg for at inkludere protokollen (http/https) og den korrekte adresse."
+ "Skjul avatarer i ruminvitationsanmodninger"
+ "Skjul forhåndsvisning af medier i tidslinjen"
+ "Upload fotos og videoer hurtigere, og reducér dataforbrug"
+ "Optimér mediekvaliteten"
+ "Moderation og sikkerhed"
+ "Udbyder af push-notifikationer"
+ "Deaktiver rich text-editoren for at skrive Markdown manuelt."
+ "Kvitteringer•for•læsning"
+ "Hvis deaktiveret, sendes dine læsekvitteringer ikke til nogen. Du vil stadig modtage læsekvitteringer fra andre brugere."
+ "Del tilstedeværelse"
+ "Hvis deaktiveret, kan du ikke sende eller modtage læsekvitteringer eller indtastningsmeddelelser."
+ "Skjul altid"
+ "Vis altid"
+ "I private rum"
+ "Et skjult medie kan altid vises ved at trykke på det"
+ "Vis medier i tidslinjen"
+ "Aktivér mulighed for at se meddelelseskilden i tidslinjen."
+ "Du har ingen blokerede brugere"
+ "Fjern blokering"
+ "Du vil være i stand til at se alle beskeder fra dem igen."
+ "Fjern blokering af bruger"
+ "Fjerner blokering…"
+ "Vist navn"
+ "Dit viste navn"
+ "Der opstod en ukendt fejl, og oplysningerne kunne ikke ændres."
+ "Kan ikke opdatere profilen"
+ "Redigér profil"
+ "Opdaterer profil…"
+ "Yderligere indstillinger"
+ "Lyd- og videoopkald"
+ "Uoverensstemmelse i konfigurationen"
+ "Vi har forenklet indstillingerne for notifikationer for at gøre det nemmere at finde dem. Nogle af de brugerdefinerede indstillinger, du tidligere har valgt, vises ikke her, men de er stadig aktive.
+
+Hvis du fortsætter, kan nogle af dine indstillinger blive ændret."
+ "Direkte samtaler"
+ "Brugerdefineret indstilling pr. samtale"
+ "Der opstod en fejl under opdatering af notifikationsindstillingen."
+ "Alle beskeder"
+ "Kun omtaler og nøgleord"
+ "I direkte samtaler, giv mig besked om"
+ "I gruppesamtaler, giv mig besked ved"
+ "Aktivér notifikationer på denne enhed"
+ "Konfigurationen er ikke blevet rettet, prøv igen."
+ "Gruppesamtaler"
+ "Invitationer"
+ "Din hjemmeserver understøtter ikke denne mulighed i krypterede rum, og derfor er det muligt at du ikke får besked i alle rum."
+ "Omtaler"
+ "Alle"
+ "Omtaler"
+ "Giv mig besked om"
+ "Giv mig besked på @room"
+ "For at modtage notifikationer, skal du ændre din %1$s ."
+ "systemindstillinger"
+ "Systemmeddelelser slået fra"
+ "Notifikationer"
+ "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 e12e6cd83b..eb25ba482d 100644
--- a/features/preferences/impl/src/main/res/values-de/translations.xml
+++ b/features/preferences/impl/src/main/res/values-de/translations.xml
@@ -5,7 +5,7 @@
"Wählen Sie, wie Sie Benachrichtigungen erhalten möchten"
"Entwicklermodus"
"Aktivieren, um Zugriff auf Features und Funktionen für Entwickler zu aktivieren."
- "Benutzerdefinierte Element-Aufruf-Basis-URL"
+ "Benutzerdefinierte Element Call Basis-URL"
"Lege eine eigene Basis-URL für Element Call fest."
"Ungültige URL, bitte geben Sie das Protokoll (http/https) und die richtige Adresse an."
"Avatare in Chateinladungen ausblenden"
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 7c6c7982a1..49d2f6df47 100644
--- a/features/preferences/impl/src/main/res/values-el/translations.xml
+++ b/features/preferences/impl/src/main/res/values-el/translations.xml
@@ -1,6 +1,6 @@
- "Για να διασφαλίσεις ότι δεν θα χάσεις ποτέ μια σημαντική κλήση, άλλαξε τις ρυθμίσεις σου για να επιτρέψεις τις ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σου είναι κλειδωμένο."
+ "Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο."
"Βελτίωσε την εμπειρία κλήσεων"
"Επέλεξε τον τρόπο λήψης ειδοποιήσεων"
"Λειτουργία προγραμματιστή"
@@ -8,7 +8,7 @@
"Προσαρμοσμένο URL βάσης κλήσεων Element"
"Όρισε μια προσαρμοσμένη διεύθυνση βάσης URL για κλήση Element."
"Μη έγκυρη διεύθυνση URL, βεβαιώσου ότι έχεις συμπεριλάβει το πρωτόκολλο (http/https) και τη σωστή διεύθυνση."
- "Απόκρυψη εικόνων προφίλ σε αιτήματα πρόσκλησης δωματίου"
+ "Απόκρυψη εικόνων προφίλ σε αιτήματα πρόσκλησης αίθουσας"
"Απόκρυψη προεπισκοπήσεων πολυμέσων στο timeline"
"Ανέβασε φωτογραφίες και βίντεο γρηγορότερα και μείωσε τη χρήση δεδομένων"
"Βελτιστοποίηση ποιότητας των μέσων"
@@ -21,7 +21,7 @@
"Εάν απενεργοποιηθεί, δεν θα μπορείς να στέλνεις ή να λαμβάνεις αποδεικτικά ανάγνωσης ή ειδοποιήσεις πληκτρολόγησης."
"Πάντα απόκρυψη"
"Πάντα εμφάνιση"
- "Σε ιδιωτικά δωμάτια"
+ "Σε ιδιωτικές αίθουσες"
"Ένα κρυφό πολυμέσο μπορεί πάντα να εμφανιστεί πατώντας το"
"Εμφάνιση πολυμέσων στο timeline"
"Ενεργοποίησε την επιλογή για προβολή πηγής μηνυμάτων στη ροή."
@@ -53,7 +53,7 @@
"Η διαμόρφωση δεν έχει διορθωθεί, δοκίμασε ξανά."
"Ομαδικές συνομιλίες"
"Προσκλήσεις"
- "Ο οικιακός διακομιστής σου δεν υποστηρίζει αυτήν την επιλογή σε κρυπτογραφημένα δωμάτια, ενδέχεται να μην λάβεις ειδοποίηση σε ορισμένα δωμάτια."
+ "Ο αρχικός διακομιστής σας δεν υποστηρίζει αυτή την επιλογή σε κρυπτογραφημένες αίθουσες, ενδέχεται να μην λαμβάνετε ειδοποιήσεις σε ορισμένες αίθουσες."
"Αναφορές"
"Όλα"
"Αναφορές"
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 3e12cdd0cb..bf02b8a0f1 100644
--- a/features/preferences/impl/src/main/res/values-fa/translations.xml
+++ b/features/preferences/impl/src/main/res/values-fa/translations.xml
@@ -3,8 +3,10 @@
"بهبود تجریهٔ تماستان"
"گزینش چگونگی دریافت آگاهی"
"حالت توسعهدهنده"
+ "دسترسی به ویژگی ها و عملکردها را برای توسعه دهندگان فعال کنید."
"نشانی پایهٔ تماس المنتی سفارشی"
"تنظمی نشانی پایهای سفارشی برای تماس المنتی."
+ "URL نامعتبر، لطفا مطمئن شوید که پروتکل (http/https) و آدرس صحیح را درج کرده اید."
"نهفتن رسانه در خط زمانی"
"بهینه سازی کیفیت رسانه"
"نظارت و امنیت"
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 7b9bc51a82..ffc00d38ed 100644
--- a/features/preferences/impl/src/main/res/values-in/translations.xml
+++ b/features/preferences/impl/src/main/res/values-in/translations.xml
@@ -8,14 +8,22 @@
"URL dasar Element Call khusus"
"Tetapkan URL dasar khusus untuk Element Call."
"URL tidak valid, pastikan Anda menyertakan protokol (http/https) dan alamat yang benar."
+ "Sembunyikan avatar dalam permintaan undangan ruangan"
+ "Sembunyikan pratinjau media pada lini masa"
"Unggah foto dan video lebih cepat dan kurangi penggunaan data"
"Optimalkan kualitas media"
+ "Moderasi dan Keamanan"
"Penyedia notifikasi dorongan"
"Nonaktifkan penyunting teks kaya untuk mengetik Markdown secara manual."
"Laporan dibaca"
"Jika dimatikan, laporan dibaca Anda tidak akan dikirim kepada siapa pun. Anda masih akan menerima laporan dibaca dari pengguna lain."
"Bagikan presensi"
"Jika dimatikan, Anda tidak akan dapat mengirim atau menerima laporan dibaca atau notifikasi pengetikan"
+ "Selalu sembunyikan"
+ "Selalu tampilkan"
+ "Dalam ruangan privat"
+ "Media tersembunyi selalu dapat ditampilkan dengan mengetuknya"
+ "Tampilkan media pada lini masa"
"Aktifkan opsi untuk melihat sumber pesan dalam lini masa."
"Anda tidak memiliki pengguna yang diblokir"
"Buka blokir"
@@ -57,6 +65,7 @@ Jika Anda melanjutkan, beberapa pengaturan Anda dapat berubah."
"pengaturan sistem"
"Pemberitahuan sistem dimatikan"
"Notifikasi"
+ "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 348c54771e..677a4f01c3 100644
--- a/features/preferences/impl/src/main/res/values-it/translations.xml
+++ b/features/preferences/impl/src/main/res/values-it/translations.xml
@@ -19,6 +19,11 @@
"Se disattivato, le tue ricevute di visualizzazione non verranno inviate a nessuno. Riceverai comunque ricevute di visualizzazione da altri utenti."
"Condividi presenza online"
"Se disattivato, non potrai inviare o ricevere ricevute di lettura o notifiche di scrittura."
+ "Nascondi sempre"
+ "Mostra sempre"
+ "Nelle stanze private"
+ "Un file multimediale nascosto può sempre essere visualizzato toccandolo"
+ "Mostra i media nella conversazione"
"Attiva l\'opzione per visualizzare il codice sorgente del messaggio nella conversazione."
"Non hai utenti bloccati"
"Sblocca"
@@ -58,6 +63,7 @@ Se procedi, alcune delle tue impostazioni potrebbero cambiare."
"impostazioni di sistema"
"Notifiche di sistema disattivate"
"Notifiche"
+ "Cronologia push"
"Risoluzione dei problemi"
"Risoluzione di problemi delle notifiche"
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 317cd5b06c..de84e887d6 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
@@ -11,10 +11,12 @@ import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore
import io.element.android.tests.testutils.WarmUpRule
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
@@ -34,6 +36,10 @@ class AdvancedSettingsPresenterTest {
assertThat(isSharePresenceEnabled).isTrue()
assertThat(doesCompressMedia).isTrue()
assertThat(theme).isEqualTo(ThemeOption.System)
+ assertThat(mediaPreviewConfigState.hideInviteAvatars).isFalse()
+ assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ assertThat(mediaPreviewConfigState.setHideInviteAvatarsAction).isEqualTo(AsyncAction.Uninitialized)
+ assertThat(mediaPreviewConfigState.setTimelineMediaPreviewAction).isEqualTo(AsyncAction.Uninitialized)
}
}
}
@@ -124,49 +130,92 @@ class AdvancedSettingsPresenterTest {
@Test
fun `present - hide invite avatars`() = runTest {
- val presenter = createAdvancedSettingsPresenter()
+ val mediaPreviewStore = FakeMediaPreviewConfigStateStore()
+ val presenter = createAdvancedSettingsPresenter(mediaPreviewConfigStateStore = mediaPreviewStore)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
with(awaitItem()) {
- assertThat(hideInviteAvatars).isFalse()
+ assertThat(mediaPreviewConfigState.hideInviteAvatars).isFalse()
eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(true))
}
with(awaitItem()) {
- assertThat(hideInviteAvatars).isTrue()
+ assertThat(mediaPreviewConfigState.hideInviteAvatars).isTrue()
eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(false))
}
with(awaitItem()) {
- assertThat(hideInviteAvatars).isFalse()
+ assertThat(mediaPreviewConfigState.hideInviteAvatars).isFalse()
+ }
+ }
+ assertThat(mediaPreviewStore.getSetHideInviteAvatarsEvents()).isEqualTo(listOf(true, false))
+ }
+
+ @Test
+ fun `present - timeline media preview value`() = runTest {
+ val mediaPreviewStore = FakeMediaPreviewConfigStateStore()
+ val presenter = createAdvancedSettingsPresenter(mediaPreviewConfigStateStore = mediaPreviewStore)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ with(awaitItem()) {
+ assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off))
+ }
+ with(awaitItem()) {
+ assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private))
+ }
+ with(awaitItem()) {
+ assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Private)
+ }
+ }
+ assertThat(mediaPreviewStore.getSetTimelineMediaPreviewValueEvents()).isEqualTo(
+ listOf(MediaPreviewValue.Off, MediaPreviewValue.Private)
+ )
+ }
+
+ @Test
+ fun `present - media preview state with custom initial values`() = runTest {
+ val mediaPreviewStore = FakeMediaPreviewConfigStateStore(
+ hideInviteAvatarsValue = true,
+ timelineMediaPreviewValue = MediaPreviewValue.Private
+ )
+ val presenter = createAdvancedSettingsPresenter(mediaPreviewConfigStateStore = mediaPreviewStore)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ with(awaitItem()) {
+ assertThat(mediaPreviewConfigState.hideInviteAvatars).isTrue()
+ assertThat(mediaPreviewConfigState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Private)
}
}
}
@Test
- fun `present - timeline media preview value`() = runTest {
- val presenter = createAdvancedSettingsPresenter()
+ fun `present - async actions state`() = runTest {
+ val mediaPreviewStore = FakeMediaPreviewConfigStateStore(
+ setHideInviteAvatarsActionValue = AsyncAction.Loading,
+ setTimelineMediaPreviewActionValue = AsyncAction.Success(Unit)
+ )
+ val presenter = createAdvancedSettingsPresenter(mediaPreviewConfigStateStore = mediaPreviewStore)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
with(awaitItem()) {
- assertThat(timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
- eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off))
- }
- with(awaitItem()) {
- assertThat(timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
- eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private))
- }
- with(awaitItem()) {
- assertThat(timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Private)
+ assertThat(mediaPreviewConfigState.setHideInviteAvatarsAction).isEqualTo(AsyncAction.Loading)
+ assertThat(mediaPreviewConfigState.setTimelineMediaPreviewAction).isEqualTo(AsyncAction.Success(Unit))
}
}
}
- private fun createAdvancedSettingsPresenter(
+ private fun CoroutineScope.createAdvancedSettingsPresenter(
appPreferencesStore: InMemoryAppPreferencesStore = InMemoryAppPreferencesStore(),
sessionPreferencesStore: InMemorySessionPreferencesStore = InMemorySessionPreferencesStore(),
+ mediaPreviewConfigStateStore: MediaPreviewConfigStateStore = FakeMediaPreviewConfigStateStore(),
) = AdvancedSettingsPresenter(
appPreferencesStore = appPreferencesStore,
sessionPreferencesStore = sessionPreferencesStore,
+ mediaPreviewConfigStateStore = mediaPreviewConfigStateStore,
+ sessionCoroutineScope = this,
)
}
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 baf55d2999..d5e90047c7 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
@@ -15,6 +15,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import im.vector.app.features.analytics.plan.Interaction
import io.element.android.features.preferences.impl.R
+import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
@@ -131,7 +132,7 @@ class AdvancedSettingsViewTest {
}
@Test
- @Config(qualifiers = "h640dp")
+ @Config(qualifiers = "h1080dp")
fun `clicking on hide invite avatars emits the expected event`() {
val eventsRecorder = EventsRecorder()
rule.setAdvancedSettingsView(
@@ -145,8 +146,8 @@ class AdvancedSettingsViewTest {
}
@Test
- @Config(qualifiers = "h640dp")
- fun `clicking on timeline media preview emits the expected event`() {
+ @Config(qualifiers = "h1080dp")
+ fun `clicking on timeline media preview always hide emits the expected event`() {
val eventsRecorder = EventsRecorder()
rule.setAdvancedSettingsView(
state = aAdvancedSettingsState(
@@ -157,6 +158,65 @@ class AdvancedSettingsViewTest {
rule.clickOn(R.string.screen_advanced_settings_show_media_timeline_always_hide)
eventsRecorder.assertSingle(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off))
}
+
+ @Test
+ @Config(qualifiers = "h1080dp")
+ fun `clicking on timeline media preview private rooms emits the expected event`() {
+ val eventsRecorder = EventsRecorder()
+ rule.setAdvancedSettingsView(
+ state = aAdvancedSettingsState(
+ eventSink = eventsRecorder,
+ timelineMediaPreviewValue = MediaPreviewValue.On
+ ),
+ )
+ rule.clickOn(R.string.screen_advanced_settings_show_media_timeline_private_rooms)
+ eventsRecorder.assertSingle(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private))
+ }
+
+ @Test
+ @Config(qualifiers = "h1080dp")
+ fun `clicking on timeline media preview always show emits the expected event`() {
+ val eventsRecorder = EventsRecorder()
+ rule.setAdvancedSettingsView(
+ state = aAdvancedSettingsState(
+ eventSink = eventsRecorder,
+ timelineMediaPreviewValue = MediaPreviewValue.Off
+ ),
+ )
+ rule.clickOn(R.string.screen_advanced_settings_show_media_timeline_always_show)
+ eventsRecorder.assertSingle(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.On))
+ }
+
+ @Test
+ @Config(qualifiers = "h1080dp")
+ fun `hide invite avatars toggle is disabled when action is loading`() {
+ val eventsRecorder = EventsRecorder(expectEvents = false)
+ rule.setAdvancedSettingsView(
+ state = aAdvancedSettingsState(
+ eventSink = eventsRecorder,
+ hideInviteAvatars = false,
+ setHideInviteAvatarsAction = AsyncAction.Loading
+ ),
+ )
+ // The toggle should be disabled, so clicking should not emit any events
+ rule.clickOn(R.string.screen_advanced_settings_hide_invite_avatars_toggle_title)
+ }
+
+ @Test
+ @Config(qualifiers = "h1080dp")
+ fun `timeline media preview options are disabled when action is loading`() {
+ val eventsRecorder = EventsRecorder(expectEvents = false)
+ rule.setAdvancedSettingsView(
+ state = aAdvancedSettingsState(
+ eventSink = eventsRecorder,
+ timelineMediaPreviewValue = MediaPreviewValue.On,
+ setTimelineMediaPreviewAction = AsyncAction.Loading
+ ),
+ )
+ // The options should be disabled, so clicking should not emit any events
+ rule.clickOn(R.string.screen_advanced_settings_show_media_timeline_always_hide)
+ rule.clickOn(R.string.screen_advanced_settings_show_media_timeline_private_rooms)
+ }
}
private fun AndroidComposeTestRule.setAdvancedSettingsView(
diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/FakeMediaPreviewConfigStateStore.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/FakeMediaPreviewConfigStateStore.kt
new file mode 100644
index 0000000000..18c6283965
--- /dev/null
+++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/FakeMediaPreviewConfigStateStore.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2025 New Vector 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.preferences.impl.advanced
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+
+class FakeMediaPreviewConfigStateStore(
+ hideInviteAvatarsValue: Boolean = false,
+ timelineMediaPreviewValue: MediaPreviewValue = MediaPreviewValue.On,
+ setHideInviteAvatarsActionValue: AsyncAction = AsyncAction.Uninitialized,
+ setTimelineMediaPreviewActionValue: AsyncAction = AsyncAction.Uninitialized,
+) : MediaPreviewConfigStateStore {
+ private val hideInviteAvatars = mutableStateOf(hideInviteAvatarsValue)
+ private val timelineMediaPreviewValue = mutableStateOf(timelineMediaPreviewValue)
+ private val setHideInviteAvatarsAction = mutableStateOf(setHideInviteAvatarsActionValue)
+ private val setTimelineMediaPreviewAction = mutableStateOf(setTimelineMediaPreviewActionValue)
+
+ private val setHideInviteAvatarsEvents = mutableListOf()
+ private val setTimelineMediaPreviewValueEvents = mutableListOf()
+
+ @Composable
+ override fun state(): MediaPreviewConfigState {
+ return MediaPreviewConfigState(
+ hideInviteAvatars = hideInviteAvatars.value,
+ timelineMediaPreviewValue = timelineMediaPreviewValue.value,
+ setHideInviteAvatarsAction = setHideInviteAvatarsAction.value,
+ setTimelineMediaPreviewAction = setTimelineMediaPreviewAction.value,
+ )
+ }
+
+ override fun setHideInviteAvatars(hide: Boolean) {
+ setHideInviteAvatarsEvents.add(hide)
+ hideInviteAvatars.value = hide
+ }
+
+ override fun setTimelineMediaPreviewValue(value: MediaPreviewValue) {
+ setTimelineMediaPreviewValueEvents.add(value)
+ timelineMediaPreviewValue.value = value
+ }
+
+ fun getSetHideInviteAvatarsEvents(): List = setHideInviteAvatarsEvents.toList()
+ fun getSetTimelineMediaPreviewValueEvents(): List = setTimelineMediaPreviewValueEvents.toList()
+}
diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStoreTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStoreTest.kt
new file mode 100644
index 0000000000..01ede60e92
--- /dev/null
+++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStoreTest.kt
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2025 New Vector 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.preferences.impl.advanced
+
+import app.cash.molecule.RecompositionMode
+import app.cash.molecule.moleculeFlow
+import app.cash.turbine.test
+import com.google.common.truth.Truth.assertThat
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
+import io.element.android.libraries.matrix.api.media.MediaPreviewConfig
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.matrix.test.media.FakeMediaPreviewService
+import io.element.android.tests.testutils.WarmUpRule
+import io.element.android.tests.testutils.lambda.assert
+import io.element.android.tests.testutils.lambda.lambdaRecorder
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Rule
+import org.junit.Test
+
+class MediaPreviewConfigStateStoreTest {
+ @get:Rule
+ val warmUpRule = WarmUpRule()
+
+ @Test
+ fun `initial state is correct with default values`() = runTest {
+ val store = createMediaPreviewConfigStateStore()
+
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ val initialState = awaitItem()
+ assertThat(initialState.hideInviteAvatars).isFalse()
+ assertThat(initialState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ assertThat(initialState.setHideInviteAvatarsAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
+ assertThat(initialState.setTimelineMediaPreviewAction).isInstanceOf(AsyncAction.Uninitialized::class.java)
+ }
+ }
+
+ @Test
+ fun `state updates when config flow emits new values`() = runTest {
+ val configFlow = MutableStateFlow(MediaPreviewConfig.DEFAULT)
+ val mediaPreviewService = FakeMediaPreviewService(configFlow)
+ val store = createMediaPreviewConfigStateStore(mediaPreviewService = mediaPreviewService)
+
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ // Initial state
+ val initialState = awaitItem()
+ assertThat(initialState.hideInviteAvatars).isFalse()
+ assertThat(initialState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+
+ // Update config
+ configFlow.value = MediaPreviewConfig(hideInviteAvatar = true, mediaPreviewValue = MediaPreviewValue.Private)
+
+ skipItems(1)
+ // Updated state
+ val updatedState = awaitItem()
+ assertThat(updatedState.hideInviteAvatars).isTrue()
+ assertThat(updatedState.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Private)
+ }
+ }
+
+ @Test
+ fun `setHideInviteAvatars updates state and calls service on success`() = runTest {
+ val setHideInviteAvatarsValueLambda = lambdaRecorder> { Result.success(Unit) }
+ val mediaPreviewService = FakeMediaPreviewService(
+ setHideInviteAvatarsResult = setHideInviteAvatarsValueLambda
+ )
+ val store = createMediaPreviewConfigStateStore(mediaPreviewService = mediaPreviewService)
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isFalse()
+ }
+ store.setHideInviteAvatars(true)
+
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isTrue()
+ }
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isTrue()
+ assertThat(state.setHideInviteAvatarsAction).isInstanceOf(AsyncAction.Loading::class.java)
+ }
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isTrue()
+ assertThat(state.setHideInviteAvatarsAction).isInstanceOf(AsyncAction.Success::class.java)
+ }
+ assert(setHideInviteAvatarsValueLambda).isCalledOnce()
+ }
+ }
+
+ @Test
+ fun `setHideInviteAvatars reverts state on failure`() = runTest {
+ val setHideInviteAvatarsValueLambda = lambdaRecorder> {
+ Result.failure(Exception())
+ }
+ val mediaPreviewService = FakeMediaPreviewService(
+ setHideInviteAvatarsResult = setHideInviteAvatarsValueLambda
+ )
+ val store = createMediaPreviewConfigStateStore(mediaPreviewService = mediaPreviewService)
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isFalse()
+ }
+ store.setHideInviteAvatars(true)
+
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isTrue()
+ }
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isTrue()
+ assertThat(state.setHideInviteAvatarsAction).isInstanceOf(AsyncAction.Loading::class.java)
+ }
+ skipItems(1)
+ awaitItem().also { state ->
+ assertThat(state.hideInviteAvatars).isFalse()
+ assertThat(state.setHideInviteAvatarsAction).isInstanceOf(AsyncAction.Failure::class.java)
+ }
+ assert(setHideInviteAvatarsValueLambda).isCalledOnce()
+ }
+ }
+
+ @Test
+ fun `setTimelineMediaPreviewValue updates state and calls service on success`() = runTest {
+ val setMediaPreviewValueLambda = lambdaRecorder> { Result.success(Unit) }
+ val mediaPreviewService = FakeMediaPreviewService(
+ setMediaPreviewValueResult = setMediaPreviewValueLambda
+ )
+ val store = createMediaPreviewConfigStateStore(mediaPreviewService = mediaPreviewService)
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ }
+ store.setTimelineMediaPreviewValue(MediaPreviewValue.Off)
+
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ }
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ assertThat(state.setTimelineMediaPreviewAction).isInstanceOf(AsyncAction.Loading::class.java)
+ }
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ assertThat(state.setTimelineMediaPreviewAction).isInstanceOf(AsyncAction.Success::class.java)
+ }
+ assert(setMediaPreviewValueLambda).isCalledOnce()
+ }
+ }
+
+ @Test
+ fun `setTimelineMediaPreviewValue reverts state on failure`() = runTest {
+ val setMediaPreviewValueLambda = lambdaRecorder> {
+ Result.failure(Exception())
+ }
+ val mediaPreviewService = FakeMediaPreviewService(
+ setMediaPreviewValueResult = setMediaPreviewValueLambda
+ )
+ val store = createMediaPreviewConfigStateStore(mediaPreviewService = mediaPreviewService)
+ moleculeFlow(RecompositionMode.Immediate) {
+ store.state()
+ }.test {
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ }
+ store.setTimelineMediaPreviewValue(MediaPreviewValue.Off)
+
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ }
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.Off)
+ assertThat(state.setTimelineMediaPreviewAction).isInstanceOf(AsyncAction.Loading::class.java)
+ }
+ skipItems(1)
+ awaitItem().also { state ->
+ assertThat(state.timelineMediaPreviewValue).isEqualTo(MediaPreviewValue.On)
+ assertThat(state.setTimelineMediaPreviewAction).isInstanceOf(AsyncAction.Failure::class.java)
+ }
+ assert(setMediaPreviewValueLambda).isCalledOnce()
+ }
+ }
+
+ private fun TestScope.createMediaPreviewConfigStateStore(
+ mediaPreviewService: FakeMediaPreviewService = FakeMediaPreviewService(),
+ snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher()
+ ): MediaPreviewConfigStateStore = DefaultMediaPreviewConfigStateStore(
+ sessionCoroutineScope = backgroundScope,
+ mediaPreviewService = mediaPreviewService,
+ snackbarDispatcher = snackbarDispatcher
+ )
+}
diff --git a/features/rageshake/api/src/main/res/values-da/translations.xml b/features/rageshake/api/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..45486f41da
--- /dev/null
+++ b/features/rageshake/api/src/main/res/values-da/translations.xml
@@ -0,0 +1,7 @@
+
+
+ "%1$s crashede sidste gang den blev brugt. Vil du dele en ulykkesrapport med os?"
+ "Det ser ud til, at du ryster telefonen i frustration. Vil du åbne fejlrapporteringsskærmen?"
+ "Ryst enheden i frustration"
+ "Tærskel for registrering"
+
diff --git a/features/rageshake/api/src/main/res/values-fa/translations.xml b/features/rageshake/api/src/main/res/values-fa/translations.xml
index 2c9e513ff8..5641d22e69 100644
--- a/features/rageshake/api/src/main/res/values-fa/translations.xml
+++ b/features/rageshake/api/src/main/res/values-fa/translations.xml
@@ -1,5 +1,6 @@
+ "%1$sآخرین باری که استفاده شد، از کار افتاد. آیا مایلید گزارش خرابی را با ما به اشتراک بگذارید؟"
"به نظر میرسد دارید گوشی خود را به دلیل کار نکردن تکان میدهید! آیا میخواهید یک اشکال در برنامه گزارش نمایید؟"
"تکان دادن"
"آستانهٔ تشخیص"
diff --git a/features/rageshake/impl/src/main/res/values-cy/translations.xml b/features/rageshake/impl/src/main/res/values-cy/translations.xml
index 414733f4a9..123c23ef7f 100644
--- a/features/rageshake/impl/src/main/res/values-cy/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-cy/translations.xml
@@ -10,6 +10,7 @@
"Mae\'r disgrifiad yn rhy fyr, rhowch fwy o fanylion am yr hyn ddigwyddodd. Diolch!"
"Anfonwch logiau chwalu"
"Caniatáu logiau"
+ "Mae eich logiau\'n rhy fawr felly nid oes modd eu cynnwys yn yr adroddiad hwn, anfonwch nhw atom mewn ffordd arall."
"Anfon luniau sgrin"
"Bydd cofnodion yn cael eu cynnwys gyda\'ch neges i wneud yn siŵr bod popeth yn gweithio\'n iawn. I anfon eich neges heb logiau, diffoddwch y gosodiad hwn."
"Chwalodd %1$s y tro diwethaf iddo gael ei ddefnyddio. Hoffech chi rannu adroddiad gwall gyda ni?"
diff --git a/features/rageshake/impl/src/main/res/values-da/translations.xml b/features/rageshake/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..47ee436e8b
--- /dev/null
+++ b/features/rageshake/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,18 @@
+
+
+ "Vedhæft skærmbillede"
+ "Du kan kontakte mig, hvis du har opfølgende spørgsmål."
+ "Kontakt mig"
+ "Rediger skærmbillede"
+ "Beskriv venligst problemet: Hvad gjorde du? Hvad forventede du, at der skulle ske? Hvad skete der faktisk? - Beskriv det med så mange detaljer som du kan."
+ "Beskriv problemet…"
+ "Hvis det er muligt, må du meget gerne lave beskrivelsen på engelsk."
+ "Beskrivelsen er for kort, giv venligst flere detaljer om, hvad der skete. Tak!"
+ "Send nedbrudslogfiler"
+ "Tillad logfiler"
+ "Dine logfiler er for store, så de kan ikke medtages i denne rapport, send dem venligst til os på en anden måde."
+ "Send skærmbillede"
+ "Logfiler vil blive inkluderet i din besked for at sikre, at alt fungerer korrekt. Hvis du vil sende din besked uden logfiler, skal du deaktivere denne indstilling."
+ "%1$s crashede sidste gang den blev brugt. Vil du dele en ulykkesrapport med os?"
+ "Se logfiler"
+
diff --git a/features/rageshake/impl/src/main/res/values-de/translations.xml b/features/rageshake/impl/src/main/res/values-de/translations.xml
index 5ad40c37d0..ac26cd075c 100644
--- a/features/rageshake/impl/src/main/res/values-de/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-de/translations.xml
@@ -10,6 +10,7 @@
"Die Beschreibung ist zu kurz. Bitte geben Sie weitere Informationen darüber an, was passiert ist."
"Absturzprotokolle senden"
"Logdateien mitsenden"
+ "Deine Logs sind zu groß und können daher nicht in diesen Bericht aufgenommen werden. Bitte sende sie uns auf einem anderen Weg."
"Bildschirmfoto senden"
"Die Protokolle werden deiner Nachricht beigefügt, um sicherzustellen, dass alles ordnungsgemäß funktioniert. Um deine Nachricht ohne Protokolle zu senden, deaktiviere diese Einstellung."
"%1$s ist bei der letzten Nutzung abgestürzt. Möchten Sie einen Absturzbericht mit uns teilen?"
diff --git a/features/rageshake/impl/src/main/res/values-et/translations.xml b/features/rageshake/impl/src/main/res/values-et/translations.xml
index 77144c6c43..64e0f9b307 100644
--- a/features/rageshake/impl/src/main/res/values-et/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-et/translations.xml
@@ -10,6 +10,7 @@
"Kirjeldus on liiga lühike. Palun jaga täpsemat teavet selle kohta, mis juhtus. Tänud juba ette!"
"Saada krahhilogid"
"Luba logide saatmine"
+ "Sinu logid on väga mahukad ja neid ei saa siia lisada. Palun saada logid meile mõnel muul viisil."
"Saada ekraanitõmmis"
"Tõhusama veaotsingu nimel lisame sinu veateatele logid. Kui sa seda ei soovi, siis lülita antud valik välja."
"%1$s jooksis kokku viimati, kui seda kasutasid. Kas tahaksid selle kohta meile veateate saata?"
diff --git a/features/rageshake/impl/src/main/res/values-fa/translations.xml b/features/rageshake/impl/src/main/res/values-fa/translations.xml
index c037a38792..020ca83ecb 100644
--- a/features/rageshake/impl/src/main/res/values-fa/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-fa/translations.xml
@@ -4,10 +4,13 @@
"اگر پرسش دیگری دارید، میتوانید با من در تماس باشید."
"تماس با من"
"ویرایش نماگرفت"
+ "لطفا مشکل را توصیف کنید. چيکار کردي؟ انتظار داشتید چه اتفاقی بیفتد؟ واقعا چه اتفاقی افتاد لطفا تا جایی که می توانید جزئیات را وارد کنید."
"شرح مشکل…"
"ترجیحاً توضیحات را به زبان انگلیسی بنویسید."
"ارسال رخدادنگارهای خطا"
"اجازه به گزارشها"
"ارسال تصویر صفحه"
+ "گزارش ها در پیام شما گنجانده می شوند تا مطمئن شوید همه چیز به درستی کار می کند. برای ارسال پیام بدون گزارش، این تنظیم را خاموش کنید."
+ "%1$sآخرین باری که استفاده شد، از کار افتاد. آیا مایلید گزارش خرابی را با ما به اشتراک بگذارید؟"
"دیدن گزارشها"
diff --git a/features/rageshake/impl/src/main/res/values-fr/translations.xml b/features/rageshake/impl/src/main/res/values-fr/translations.xml
index ed576f74be..0d67e42db0 100644
--- a/features/rageshake/impl/src/main/res/values-fr/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-fr/translations.xml
@@ -10,6 +10,7 @@
"La description est trop courte, veuillez fournir plus de détails sur ce qui s’est passé. Merci !"
"Envoyer des journaux d’incident"
"Autoriser à inclure les journaux techniques"
+ "Vos fichiers de log sont trop volumineux et ne peuvent donc pas être inclus dans ce rapport, veuillez nous les envoyer par un autre moyen."
"Envoyer une capture d’écran"
"Pour vérifier que les choses fonctionnent comme prévu, des journaux techniques seront envoyés avec votre message. Pour ne pas envoyer ces journaux, désactivez ce paramètre."
"%1$s s’est arrêté la dernière fois qu’il a été utilisé. Souhaitez-vous partager un rapport d’incident avec nous ?"
diff --git a/features/rageshake/impl/src/main/res/values-hu/translations.xml b/features/rageshake/impl/src/main/res/values-hu/translations.xml
index 1ac8c4c285..f6fcbaa1c9 100644
--- a/features/rageshake/impl/src/main/res/values-hu/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-hu/translations.xml
@@ -10,6 +10,7 @@
"A leírás túl rövid, adjon meg további részleteket a történtekről. Köszönjük!"
"Összeomlásnaplók küldése"
"Naplók engedélyezése"
+ "A naplófájlok túl nagyok, ezért nem szerepelhetnek ebben a jelentésben. Más módon küldje el őket."
"Képernyőkép küldése"
"A naplók szerepelni fognak az üzenetben, hogy megbizonyosodhassunk arról, hogy minden megfelelően működik-e. Ha naplók nélkül szeretné elküldeni az üzenetet, akkor kapcsolja ki ezt a beállítást."
"Az %1$s összeomlott a legutóbbi használata óta. Megosztja velünk az összeomlás-jelentést?"
diff --git a/features/rageshake/impl/src/main/res/values-in/translations.xml b/features/rageshake/impl/src/main/res/values-in/translations.xml
index 75efeb28f6..dd80d0aa01 100644
--- a/features/rageshake/impl/src/main/res/values-in/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-in/translations.xml
@@ -10,6 +10,7 @@
"Deskripsinya terlalu pendek, silakan menyediakan detail tambahan tentang apa yang terjadi. Terima kasih!"
"Kirim log kerusakan"
"Izinkan log"
+ "Log Anda terlalu besar sehingga tidak dapat dimasukkan dalam laporan ini, kirimkan kepada kami dengan cara lain."
"Kirim tangkapan layar"
"Log akan disertakan dengan pesan Anda untuk memastikan bahwa semuanya berfungsi dengan baik. Untuk mengirimkan pesan Anda tanpa log, matikan pengaturan ini."
"%1$s mengalami kemogokan saat terakhir kali digunakan. Apakah Anda ingin berbagi laporan kerusakan dengan kami?"
diff --git a/features/rageshake/impl/src/main/res/values-it/translations.xml b/features/rageshake/impl/src/main/res/values-it/translations.xml
index bbc5da3ce9..8709881709 100644
--- a/features/rageshake/impl/src/main/res/values-it/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-it/translations.xml
@@ -10,6 +10,7 @@
"La descrizione è troppo breve, ti preghiamo di fornire maggiori dettagli sull\'accaduto. Grazie!"
"Invia i log degli arresti anomali"
"Consenti i log"
+ "I tuoi log sono troppo grandi, quindi non possono essere inclusi in questo rapporto, inviaceli in un altro modo."
"Invia istantanea schermo"
"Per verificare che le cose funzionino come previsto, i log verranno inviati con il tuo messaggio. Per inviare solo il tuo messaggio, disattiva questa impostazione."
"%1$s si è chiuso inaspettatamente l\'ultima volta che è stato usato. Vuoi condividere con noi un rapporto sull\'arresto anomalo?"
diff --git a/features/rageshake/impl/src/main/res/values-nb/translations.xml b/features/rageshake/impl/src/main/res/values-nb/translations.xml
index 34a6ade303..277effef92 100644
--- a/features/rageshake/impl/src/main/res/values-nb/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-nb/translations.xml
@@ -10,6 +10,7 @@
"Beskrivelsen er for kort, vennligst gi flere detaljer om hva som skjedde. Takk skal du ha!"
"Send krasjlogger"
"Tillat logger"
+ "Loggene dine er for store og kan derfor ikke inkluderes i denne rapporten. Vennligst send dem til oss på en annen måte."
"Send skjermbilde"
"Logger vil bli inkludert i meldingen din, for å sikre at alt fungerer som det skal. For å sende meldingen uten logger, slå av denne innstillingen."
"%1$s krasjet sist gang den ble brukt. Vil du dele en krasjrapport med oss?"
diff --git a/features/rageshake/impl/src/main/res/values-pt-rBR/translations.xml b/features/rageshake/impl/src/main/res/values-pt-rBR/translations.xml
index 6e2e2b677f..c679bbd1c7 100644
--- a/features/rageshake/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-pt-rBR/translations.xml
@@ -10,6 +10,7 @@
"A descrição é muito curta, por favor, forneça mais detalhes sobre o que aconteceu. Obrigado!"
"Enviar registros de falhas"
"Permitir registros"
+ "Seus registros são grandes demais portanto não podem serem inclusos no relatório, por favor envie-os para a gente de outra maneira."
"Enviar captura de tela"
"Os registros serão incluídos com sua mensagem para garantir que tudo esteja funcionando corretamente. Para enviar sua mensagem sem registros, desative essa configuração."
"%1$s fechou inesperadamente na última vez que foi usado. Gostaria de compartilhar um relatório de falhas conosco?"
diff --git a/features/rageshake/impl/src/main/res/values-pt/translations.xml b/features/rageshake/impl/src/main/res/values-pt/translations.xml
index 59a066a16e..d2e637db56 100644
--- a/features/rageshake/impl/src/main/res/values-pt/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-pt/translations.xml
@@ -10,6 +10,7 @@
"A descrição é demasiado curta. Por favor dá mais detalhes sobre o que aconteceu. Obrigado!"
"Enviar registos de falha"
"Permitir registos"
+ "Os teus registos são excessivamente grandes e não podem ser incluídos neste relatório, por favor envia-no-los de outra forma."
"Enviar captura de ecrã"
"Os registos serão incluídos na tua mensagem para garantir que tudo está a funcionar corretamente. Para enviares a tua mensagem sem registos, desativa esta definição."
"A %1$s teve uma falha da última vez que foi utilizada. Gostarias de partilhar um relatório de acidente connosco?"
diff --git a/features/rageshake/impl/src/main/res/values-sk/translations.xml b/features/rageshake/impl/src/main/res/values-sk/translations.xml
index f9152d844c..c46181ad29 100644
--- a/features/rageshake/impl/src/main/res/values-sk/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-sk/translations.xml
@@ -10,6 +10,7 @@
"Popis je príliš krátky, uveďte viac podrobností o tom, čo sa stalo. Ďakujeme!"
"Odoslať záznamy o zlyhaní"
"Povoliť záznamy"
+ "Vaše záznamy sú príliš veľké, takže ich nemožno zahrnúť do tejto správy, pošlite nám ich prosím iným spôsobom."
"Odoslať snímku obrazovky"
"K vašej správe budú priložené záznamy o chybe, aby sme sa uistili, že všetko funguje správne. Ak chcete odoslať správu bez záznamov o chybe, vypnite toto nastavenie."
"%1$s zlyhal pri poslednom použití. Chcete zdieľať správu o páde s našim tímom?"
diff --git a/features/rageshake/impl/src/main/res/values-uk/translations.xml b/features/rageshake/impl/src/main/res/values-uk/translations.xml
index 30465c4ca4..3999133537 100644
--- a/features/rageshake/impl/src/main/res/values-uk/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-uk/translations.xml
@@ -10,6 +10,7 @@
"Опис закороткий, будь ласка, надайте докладнішу інформацію про те, що сталося. Дякуємо!"
"Надіслати журнали збоїв"
"Дозволити журнали"
+ "Ваші журнали надмірно великі, тому їх не можна включити в цей звіт, будь ласка, надішліть їх нам іншим способом."
"Надіслати знімок екрана"
"Журнали будуть додані до вашого повідомлення, щоб переконатися, що все працює належним чином. Щоб надіслати повідомлення без журналів, вимкніть це налаштування."
"Стався збій %1$s під час останнього користування. Хочете поділитися з нами звітом про збій?"
diff --git a/features/rageshake/impl/src/main/res/values/localazy.xml b/features/rageshake/impl/src/main/res/values/localazy.xml
index 1c7d5edbb6..9c18d37a3b 100644
--- a/features/rageshake/impl/src/main/res/values/localazy.xml
+++ b/features/rageshake/impl/src/main/res/values/localazy.xml
@@ -10,6 +10,7 @@
"The description is too short, please provide more details about what happened. Thanks!"
"Send crash logs"
"Allow logs"
+ "Your logs are excessively large so cannot be included in this report, please send them to us another way."
"Send screenshot"
"Logs will be included with your message to make sure that everything is working properly. To send your message without logs, turn off this setting."
"%1$s crashed the last time it was used. Would you like to share a crash report with us?"
diff --git a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomView.kt b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomView.kt
index 6421b7d576..5af0beefcd 100644
--- a/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomView.kt
+++ b/features/reportroom/impl/src/main/kotlin/io/element/android/features/reportroom/impl/ReportRoomView.kt
@@ -25,14 +25,12 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -75,12 +73,7 @@ fun ReportRoomView(
Scaffold(
topBar = {
TopAppBar(
- title = {
- Text(
- stringResource(R.string.screen_report_room_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_report_room_title),
navigationIcon = {
BackButton(onClick = onBackClick)
}
@@ -90,12 +83,12 @@ fun ReportRoomView(
) { padding ->
Column(
modifier = Modifier
- .padding(padding)
- .consumeWindowInsets(padding)
- .imePadding()
- .fillMaxSize()
- .verticalScroll(rememberScrollState())
- .padding(vertical = 16.dp)
+ .padding(padding)
+ .consumeWindowInsets(padding)
+ .imePadding()
+ .fillMaxSize()
+ .verticalScroll(rememberScrollState())
+ .padding(vertical = 16.dp)
) {
TextField(
value = state.reason,
@@ -104,9 +97,9 @@ fun ReportRoomView(
minLines = 3,
enabled = !isReporting,
modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 16.dp)
- .heightIn(min = 90.dp),
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp)
+ .heightIn(min = 90.dp),
supportingText = stringResource(R.string.screen_report_room_reason_footer),
)
@@ -135,8 +128,8 @@ fun ReportRoomView(
state.eventSink(ReportRoomEvents.Report)
},
modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 16.dp)
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp)
)
}
}
diff --git a/features/reportroom/impl/src/main/res/values-da/translations.xml b/features/reportroom/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..0f2a9b274c
--- /dev/null
+++ b/features/reportroom/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,8 @@
+
+
+ "Din anmeldelse blev indsendt med succes, men vi stødte på et problem, da vi forsøgte at forlade rummet. Prøv venligst igen."
+ "Ude af stand til at forlade rummet"
+ "Anmeld dette rum til din administrator. Hvis meddelelserne er krypteret, kan din administrator ikke læse dem."
+ "Beskriv årsagen til anmeldelsen…"
+ "Anmeld rummet"
+
diff --git a/features/reportroom/impl/src/main/res/values-el/translations.xml b/features/reportroom/impl/src/main/res/values-el/translations.xml
index d8789dcd31..274c6bc4c7 100644
--- a/features/reportroom/impl/src/main/res/values-el/translations.xml
+++ b/features/reportroom/impl/src/main/res/values-el/translations.xml
@@ -1,8 +1,8 @@
- "Η αναφορά σας υποβλήθηκε με επιτυχία, αλλά αντιμετωπίσαμε πρόβλημα κατά την προσπάθεια αποχώρησης από το δωμάτιο. Παρακαλώ προσπαθήστε ξανά."
- "Δεν είναι δυνατή η αποχώρηση από το δωμάτιο"
- "Αναφέρετε αυτό το δωμάτιο στον διαχειριστή σας. Εάν τα μηνύματα είναι κρυπτογραφημένα, ο διαχειριστής σας δε θα μπορεί να τα διαβάσει."
+ "Η αναφορά σας υποβλήθηκε με επιτυχία, αλλά αντιμετωπίσαμε ένα πρόβλημα κατά την προσπάθεια εξόδου από την αίθουσα. Παρακαλώ προσπαθήστε ξανά."
+ "Δεν είναι δυνατή η έξοδος από την αίθουσα"
+ "Αναφέρετε αυτήν την αίθουσα στον διαχειριστή σας. Εάν τα μηνύματα είναι κρυπτογραφημένα, ο διαχειριστής σας δεν θα μπορεί να τα διαβάσει."
"Περιγράψτε τον λόγο αναφοράς…"
- "Αναφορά δωματίου"
+ "Αναφορά αίθουσας"
diff --git a/features/reportroom/impl/src/main/res/values-in/translations.xml b/features/reportroom/impl/src/main/res/values-in/translations.xml
new file mode 100644
index 0000000000..c276158707
--- /dev/null
+++ b/features/reportroom/impl/src/main/res/values-in/translations.xml
@@ -0,0 +1,8 @@
+
+
+ "Laporan Anda berhasil dikirimkan, tetapi kami mengalami masalah saat mencoba meninggalkan ruangan. Silakan coba lagi."
+ "Tidak Dapat Meninggalkan Ruangan"
+ "Laporkan ruangan ini ke admin Anda. Jika pesan dienkripsi, admin Anda tidak akan dapat membacanya."
+ "Jelaskan alasan untuk melaporkan…"
+ "Laporkan ruangan"
+
diff --git a/features/reportroom/impl/src/main/res/values-it/translations.xml b/features/reportroom/impl/src/main/res/values-it/translations.xml
new file mode 100644
index 0000000000..bdb74b9ef1
--- /dev/null
+++ b/features/reportroom/impl/src/main/res/values-it/translations.xml
@@ -0,0 +1,8 @@
+
+
+ "La tua segnalazione è stata inviata con successo, ma abbiamo riscontrato un problema durante il tentativo di lasciare la stanza. Per favore riprova."
+ "Impossibile lasciare la stanza"
+ "Segnala questa stanza al tuo amministratore. Se i messaggi sono cifrati, l\'amministratore non sarà in grado di leggerli."
+ "Descrivi il motivo della segnalazione…"
+ "Segnala stanza"
+
diff --git a/features/roomaliasresolver/impl/src/main/res/values-da/translations.xml b/features/roomaliasresolver/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..68cde2d29b
--- /dev/null
+++ b/features/roomaliasresolver/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,5 @@
+
+
+ "Vi kunne ikke forhåndsvise rummet"
+ "Kunne ikke løse rummets alias."
+
diff --git a/features/roomaliasresolver/impl/src/main/res/values-el/translations.xml b/features/roomaliasresolver/impl/src/main/res/values-el/translations.xml
index b5e577d89e..266cb5080b 100644
--- a/features/roomaliasresolver/impl/src/main/res/values-el/translations.xml
+++ b/features/roomaliasresolver/impl/src/main/res/values-el/translations.xml
@@ -1,5 +1,5 @@
- "Δεν μπορέσαμε να εμφανίσουμε αυτήν την προεπισκόπηση δωματίου"
- "Αποτυχία επίλυσης ψευδωνύμου δωματίου."
+ "Δεν μπορέσαμε να εμφανίσουμε αυτή την προεπισκόπηση αίθουσας"
+ "Αποτυχία επίλυσης του ψευδώνυμου αίθουσας."
diff --git a/features/roomaliasresolver/impl/src/main/res/values-in/translations.xml b/features/roomaliasresolver/impl/src/main/res/values-in/translations.xml
index b5745b8827..2e84cbfe00 100644
--- a/features/roomaliasresolver/impl/src/main/res/values-in/translations.xml
+++ b/features/roomaliasresolver/impl/src/main/res/values-in/translations.xml
@@ -1,4 +1,5 @@
+ "Kami tidak dapat menampilkan pratinjau ruangan ini"
"Gagal menyelesaikan alias ruangan."
diff --git a/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt b/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt
index dc0faf26f1..47af2c24fc 100644
--- a/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt
+++ b/features/roomcall/impl/src/main/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenter.kt
@@ -15,7 +15,7 @@ import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import io.element.android.features.call.api.CurrentCall
import io.element.android.features.call.api.CurrentCallService
-import io.element.android.features.enterprise.api.EnterpriseService
+import io.element.android.features.enterprise.api.SessionEnterpriseService
import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.room.JoinedRoom
@@ -25,12 +25,12 @@ import javax.inject.Inject
class RoomCallStatePresenter @Inject constructor(
private val room: JoinedRoom,
private val currentCallService: CurrentCallService,
- private val enterpriseService: EnterpriseService,
+ private val sessionEnterpriseService: SessionEnterpriseService,
) : Presenter {
@Composable
override fun present(): RoomCallState {
val isAvailable by produceState(false) {
- value = enterpriseService.isElementCallAvailable()
+ value = sessionEnterpriseService.isElementCallAvailable()
}
val roomInfo by room.roomInfoFlow.collectAsState()
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
diff --git a/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt b/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt
index 437a495934..9647fddc1d 100644
--- a/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt
+++ b/features/roomcall/impl/src/test/kotlin/io/element/android/features/roomcall/impl/RoomCallStatePresenterTest.kt
@@ -11,7 +11,7 @@ import com.google.common.truth.Truth.assertThat
import io.element.android.features.call.api.CurrentCall
import io.element.android.features.call.api.CurrentCallService
import io.element.android.features.call.test.FakeCurrentCallService
-import io.element.android.features.enterprise.test.FakeEnterpriseService
+import io.element.android.features.enterprise.test.FakeSessionEnterpriseService
import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
@@ -230,7 +230,7 @@ class RoomCallStatePresenterTest {
return RoomCallStatePresenter(
room = joinedRoom,
currentCallService = currentCallService,
- enterpriseService = FakeEnterpriseService(
+ sessionEnterpriseService = FakeSessionEnterpriseService(
isElementCallAvailableResult = { isElementCallAvailable },
),
)
diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts
index a23997b43d..4e87946ba4 100644
--- a/features/roomdetails/impl/build.gradle.kts
+++ b/features/roomdetails/impl/build.gradle.kts
@@ -67,6 +67,7 @@ dependencies {
testImplementation(projects.libraries.mediaupload.test)
testImplementation(projects.libraries.mediapickers.test)
testImplementation(projects.libraries.permissions.test)
+ testImplementation(projects.libraries.preferences.test)
testImplementation(projects.libraries.usersearch.test)
testImplementation(projects.libraries.featureflag.test)
testImplementation(projects.tests.testutils)
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 3e34f8d62b..d35d1a313b 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
@@ -48,6 +48,7 @@ import io.element.android.libraries.matrix.ui.room.getDirectRoomMember
import io.element.android.libraries.matrix.ui.room.isDmAsState
import io.element.android.libraries.matrix.ui.room.isOwnUserAdmin
import io.element.android.libraries.matrix.ui.room.roomMemberIdentityStateChange
+import io.element.android.libraries.preferences.api.store.AppPreferencesStore
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
@@ -70,6 +71,7 @@ class RoomDetailsPresenter @Inject constructor(
private val analyticsService: AnalyticsService,
private val isPinnedMessagesFeatureEnabled: IsPinnedMessagesFeatureEnabled,
private val clipboardHelper: ClipboardHelper,
+ private val appPreferencesStore: AppPreferencesStore,
) : Presenter {
@Composable
override fun present(): RoomDetailsState {
@@ -136,6 +138,9 @@ class RoomDetailsPresenter @Inject constructor(
val canShowKnockRequests by remember {
derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests && joinRule == JoinRule.Knock }
}
+ val isDeveloperModeEnabled by remember {
+ appPreferencesStore.isDeveloperModeEnabledFlow()
+ }.collectAsState(initial = false)
val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState()
@@ -211,6 +216,7 @@ class RoomDetailsPresenter @Inject constructor(
hasMemberVerificationViolations = hasMemberVerificationViolations,
canReportRoom = canReportRoom,
isTombstoned = roomInfo.successorRoom != null,
+ showDebugInfo = isDeveloperModeEnabled,
eventSink = ::handleEvents,
)
}
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 e589eaaed9..331329a034 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
@@ -50,6 +50,7 @@ data class RoomDetailsState(
val hasMemberVerificationViolations: Boolean,
val canReportRoom: Boolean,
val isTombstoned: Boolean,
+ val showDebugInfo: 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 64f9976841..a5e81040e8 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
@@ -33,7 +33,7 @@ open class RoomDetailsStateProvider : PreviewParameterProvider
override val values: Sequence
get() = sequenceOf(
aRoomDetailsState(displayAdminSettings = true),
- aRoomDetailsState(roomTopic = RoomTopicState.Hidden),
+ aRoomDetailsState(roomTopic = RoomTopicState.Hidden, showDebugInfo = true),
aRoomDetailsState(roomTopic = RoomTopicState.CanAddTopic),
aRoomDetailsState(isEncrypted = false),
aRoomDetailsState(roomAlias = null),
@@ -120,6 +120,7 @@ fun aRoomDetailsState(
hasMemberVerificationViolations: Boolean = false,
canReportRoom: Boolean = true,
isTombstoned: Boolean = false,
+ showDebugInfo: Boolean = false,
eventSink: (RoomDetailsEvent) -> Unit = {},
) = RoomDetailsState(
roomId = roomId,
@@ -151,6 +152,7 @@ fun aRoomDetailsState(
hasMemberVerificationViolations = hasMemberVerificationViolations,
canReportRoom = canReportRoom,
isTombstoned = isTombstoned,
+ showDebugInfo = showDebugInfo,
eventSink = eventSink,
)
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 254c31023d..4ffe29a8bf 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
@@ -30,6 +30,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
@@ -42,14 +43,16 @@ import io.element.android.features.roomcall.api.hasPermissionToJoin
import io.element.android.features.userprofile.api.UserProfileVerificationState
import io.element.android.features.userprofile.shared.blockuser.BlockUserDialogs
import io.element.android.features.userprofile.shared.blockuser.BlockUserSection
+import io.element.android.libraries.androidutils.system.copyToClipboard
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.atomic.atoms.MatrixBadgeAtom
import io.element.android.libraries.designsystem.atomic.molecules.MatrixBadgeRowMolecule
import io.element.android.libraries.designsystem.components.ClickableLinkText
+import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatar.DmAvatars
-import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.button.MainActionButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
@@ -261,6 +264,12 @@ fun RoomDetailsView(
onReportRoomClick = onReportRoomClick,
onLeaveRoomClick = { state.eventSink(RoomDetailsEvent.LeaveRoom) }
)
+
+ if (state.showDebugInfo) {
+ DebugInfoSection(
+ roomId = state.roomId,
+ )
+ }
}
}
}
@@ -391,14 +400,22 @@ private fun RoomHeaderSection(
.padding(horizontal = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
- RoomAvatar(
+ Avatar(
avatarData = AvatarData(roomId.value, roomName, avatarUrl, AvatarSize.RoomHeader),
- heroes = heroes.map { user ->
- user.getAvatarData(size = AvatarSize.RoomHeader)
- }.toPersistentList(),
- isTombstoned = isTombstoned,
+ avatarType = AvatarType.Room(
+ heroes = heroes.map { user ->
+ user.getAvatarData(size = AvatarSize.RoomHeader)
+ }.toPersistentList(),
+ isTombstoned = isTombstoned,
+ ),
+ contentDescription = avatarUrl?.let { stringResource(CommonStrings.a11y_room_avatar) },
modifier = Modifier
- .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) }
+ .clickable(
+ enabled = avatarUrl != null,
+ onClickLabel = stringResource(CommonStrings.action_view),
+ ) {
+ openAvatarPreview(avatarUrl!!)
+ }
.testTag(TestTags.roomDetailAvatar)
)
TitleAndSubtitle(
@@ -701,6 +718,33 @@ private fun OtherActionsSection(
}
}
+@Composable
+private fun DebugInfoSection(roomId: RoomId) {
+ val context = LocalContext.current
+ PreferenceCategory(showTopDivider = true) {
+ ListItem(
+ headlineContent = {
+ Text("Internal room ID")
+ },
+ supportingContent = {
+ Text(
+ text = roomId.value,
+ style = ElementTheme.typography.fontBodySmRegular,
+ color = ElementTheme.colors.textSecondary,
+ )
+ },
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Code())),
+ trailingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Copy())),
+ onClick = {
+ context.copyToClipboard(
+ roomId.value,
+ context.getString(CommonStrings.common_copied_to_clipboard)
+ )
+ },
+ )
+ }
+}
+
@PreviewWithLargeHeight
@Composable
internal fun RoomDetailsPreview(@PreviewParameter(RoomDetailsStateProvider::class) state: RoomDetailsState) =
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/analytics/AnalyticUtils.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/analytics/AnalyticUtils.kt
index 48c13b80a6..7e4ae1d7c2 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/analytics/AnalyticUtils.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/analytics/AnalyticUtils.kt
@@ -9,7 +9,7 @@ package io.element.android.features.roomdetails.impl.analytics
import im.vector.app.features.analytics.plan.RoomModeration
import io.element.android.libraries.matrix.api.room.RoomMember
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.services.analytics.api.AnalyticsService
internal fun RoomMember.Role.toAnalyticsMemberRole(): RoomModeration.Role = when (this) {
@@ -22,7 +22,7 @@ internal fun analyticsMemberRoleForPowerLevel(powerLevel: Long): RoomModeration.
return RoomMember.Role.forPowerLevel(powerLevel).toAnalyticsMemberRole()
}
-internal fun AnalyticsService.trackPermissionChangeAnalytics(initial: RoomPowerLevels?, updated: RoomPowerLevels) {
+internal fun AnalyticsService.trackPermissionChangeAnalytics(initial: RoomPowerLevelsValues?, updated: RoomPowerLevelsValues) {
if (updated.ban != initial?.ban) {
capture(RoomModeration(RoomModeration.Action.ChangePermissionsBanMembers, analyticsMemberRoleForPowerLevel(updated.ban)))
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt
index 5031d94d80..60082b23f1 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt
@@ -29,18 +29,16 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.async.AsyncActionViewDefaults
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.modifiers.clearFocusOnTap
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TextField
import io.element.android.libraries.designsystem.theme.components.TopAppBar
@@ -68,12 +66,7 @@ fun RoomDetailsEditView(
modifier = modifier.clearFocusOnTap(focusManager),
topBar = {
TopAppBar(
- title = {
- Text(
- text = stringResource(id = R.string.screen_room_details_edit_room_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(id = R.string.screen_room_details_edit_room_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
@@ -103,6 +96,7 @@ fun RoomDetailsEditView(
displayName = state.roomRawName,
avatarUrl = state.roomAvatarUrl,
avatarSize = AvatarSize.EditRoomDetails,
+ avatarType = AvatarType.Room(),
onAvatarClick = ::onAvatarClick,
modifier = Modifier.fillMaxWidth(),
)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt
index 5f38e7e451..caae6ff16d 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt
@@ -28,7 +28,6 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.SearchBar
@@ -108,12 +107,7 @@ private fun RoomInviteMembersTopBar(
onSubmitClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_room_details_invite_people_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_room_details_invite_people_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt
index 88da5b6ebc..443a40c6a2 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt
@@ -49,7 +49,6 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.LinearProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -352,12 +351,7 @@ private fun RoomMemberListTopBar(
onInviteClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(CommonStrings.common_people),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(CommonStrings.common_people),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
if (canInvite) {
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsView.kt
index a94f605059..bcd2e59d3b 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsView.kt
@@ -30,9 +30,7 @@ import io.element.android.libraries.designsystem.components.preferences.Preferen
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.buildAnnotatedStringWithStyledPart
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.ui.strings.CommonStrings
@@ -168,12 +166,7 @@ private fun RoomNotificationSettingsTopBar(
onBackClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = stringResource(R.string.screen_room_details_notification_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_room_details_notification_title),
navigationIcon = { BackButton(onClick = onBackClick) },
)
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsView.kt
index 95a233b0e7..00c545b853 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/UserDefinedRoomNotificationSettingsView.kt
@@ -96,11 +96,7 @@ private fun UserDefinedRoomNotificationSettingsTopBar(
onBackClick: () -> Unit,
) {
TopAppBar(
- title = {
- Text(
- text = roomName,
- )
- },
+ titleStr = roomName,
navigationIcon = { BackButton(onClick = onBackClick) },
)
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
index f0fa5e5c8d..8b96bcda27 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
@@ -59,7 +59,7 @@ class RolesAndPermissionsNode @AssistedInject constructor(
lifecycleScope.launch {
room.roomInfoFlow
.filter { info ->
- info.userPowerLevels[room.sessionId] != RoomMember.Role.ADMIN.powerLevel
+ info.roomPowerLevels?.users?.get(room.sessionId) != RoomMember.Role.ADMIN.powerLevel
}
.take(1)
.onEach { navigateUp() }
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
index 2f2f14a157..f2de1d2817 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
@@ -105,13 +105,13 @@ class RolesAndPermissionsPresenter @Inject constructor(
) = launch(dispatchers.io) {
runUpdatingState(resetPermissionsAction) {
analyticsService.capture(RoomModeration(RoomModeration.Action.ResetPermissions))
- room.resetPowerLevels().map {}
+ room.resetPowerLevels()
}
}
private fun RoomInfo.userCountWithRole(userIds: List, role: RoomMember.Role): Int {
- return this.userPowerLevels.count { (userId, level) ->
+ return this.roomPowerLevels?.users?.count { (userId, level) ->
RoomMember.Role.forPowerLevel(level) == role && userId in userIds
- }
+ } ?: 0
}
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt
index 36fc5a336a..e3a173f2f2 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenter.kt
@@ -109,7 +109,7 @@ class ChangeRolesPresenter @AssistedInject constructor(
val roomInfo by room.roomInfoFlow.collectAsState()
fun canChangeMemberRole(userId: UserId): Boolean {
// An admin can't remove or demote another admin
- val powerLevel = roomInfo.userPowerLevels[userId] ?: 0L
+ val powerLevel = roomInfo.roomPowerLevels?.users?.get(userId) ?: 0L
return RoomMember.Role.forPowerLevel(powerLevel) != RoomMember.Role.ADMIN
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesView.kt
index b1a7a7df21..a9e321a11f 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesView.kt
@@ -50,12 +50,12 @@ import io.element.android.libraries.designsystem.components.async.rememberAsyncI
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
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.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Checkbox
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.SearchBar
@@ -95,16 +95,10 @@ fun ChangeRolesView(
topBar = {
AnimatedVisibility(visible = !state.isSearchActive) {
TopAppBar(
- title = {
- val title = when (state.role) {
- RoomMember.Role.ADMIN -> stringResource(R.string.screen_room_change_role_administrators_title)
- RoomMember.Role.MODERATOR -> stringResource(R.string.screen_room_change_role_moderators_title)
- RoomMember.Role.USER -> error("This should never be reached")
- }
- Text(
- text = title,
- style = ElementTheme.typography.aliasScreenTitle,
- )
+ titleStr = when (state.role) {
+ RoomMember.Role.ADMIN -> stringResource(R.string.screen_room_change_role_administrators_title)
+ RoomMember.Role.MODERATOR -> stringResource(R.string.screen_room_change_role_moderators_title)
+ RoomMember.Role.USER -> error("This should never be reached")
},
navigationIcon = {
BackButton(onClick = { state.eventSink(ChangeRolesEvent.Exit) })
@@ -341,7 +335,10 @@ private fun MemberRow(
.padding(start = 16.dp, top = 4.dp, end = 16.dp, bottom = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
- Avatar(avatarData)
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Column(
modifier = Modifier
.padding(start = 12.dp)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt
index 905a71a623..8b6f7efc96 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt
@@ -22,7 +22,7 @@ import io.element.android.features.roomdetails.impl.analytics.trackPermissionCha
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.room.JoinedRoom
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@@ -59,8 +59,8 @@ class ChangeRoomPermissionsPresenter @AssistedInject constructor(
private val items: ImmutableList = itemsForSection(section)
- private var initialPermissions by mutableStateOf(null)
- private var currentPermissions by mutableStateOf(null)
+ private var initialPermissions by mutableStateOf(null)
+ private var currentPermissions by mutableStateOf(null)
private var saveAction by mutableStateOf>(AsyncAction.Uninitialized)
private var confirmExitAction by mutableStateOf>(AsyncAction.Uninitialized)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt
index 6248df0885..5e7b77560a 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt
@@ -8,12 +8,12 @@
package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
import io.element.android.libraries.architecture.AsyncAction
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import kotlinx.collections.immutable.ImmutableList
data class ChangeRoomPermissionsState(
val section: ChangeRoomPermissionsSection,
- val currentPermissions: RoomPowerLevels?,
+ val currentPermissions: RoomPowerLevelsValues?,
val items: ImmutableList,
val hasChanges: Boolean,
val saveAction: AsyncAction,
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStateProvider.kt
index c068b69716..4210d117c7 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStateProvider.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStateProvider.kt
@@ -10,7 +10,7 @@ package io.element.android.features.roomdetails.impl.rolesandpermissions.permiss
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import kotlinx.collections.immutable.toPersistentList
class ChangeRoomPermissionsStateProvider : PreviewParameterProvider {
@@ -36,7 +36,7 @@ class ChangeRoomPermissionsStateProvider : PreviewParameterProvider = ChangeRoomPermissionsPresenter.itemsForSection(section),
hasChanges: Boolean = false,
saveAction: AsyncAction = AsyncAction.Uninitialized,
@@ -52,8 +52,8 @@ internal fun aChangeRoomPermissionsState(
eventSink = eventSink,
)
-private fun previewPermissions(): RoomPowerLevels {
- return RoomPowerLevels(
+private fun previewPermissions(): RoomPowerLevelsValues {
+ return RoomPowerLevelsValues(
// MembershipModeration section
invite = RoomMember.Role.ADMIN.powerLevel,
kick = RoomMember.Role.MODERATOR.powerLevel,
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt
index 527eca483f..ba8cc7f978 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt
@@ -16,7 +16,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.core.bool.orFalse
@@ -26,7 +25,6 @@ import io.element.android.libraries.designsystem.components.dialogs.Confirmation
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.IconSource
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.ListItemStyle
@@ -36,7 +34,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.room.RoomMember
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.ui.strings.CommonStrings
@OptIn(ExperimentalMaterial3Api::class)
@@ -58,7 +56,7 @@ fun ChangeRoomPermissionsView(
ChangeRoomPermissionsSection.MembershipModeration -> stringResource(R.string.screen_room_change_permissions_member_moderation)
}
TopAppBar(
- title = { Text(text = title, style = ElementTheme.typography.aliasScreenTitle) },
+ titleStr = title,
navigationIcon = {
BackButton(onClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) })
},
@@ -133,7 +131,7 @@ fun ChangeRoomPermissionsView(
private fun SelectRoleItem(
permissionsItem: RoomPermissionType,
role: RoomMember.Role,
- currentPermissions: RoomPowerLevels?,
+ currentPermissions: RoomPowerLevelsValues?,
onClick: (RoomPermissionType, RoomMember.Role) -> Unit
) {
val title = when (role) {
@@ -153,7 +151,7 @@ private fun SelectRoleItem(
)
}
-private fun RoomPowerLevels.isSelected(item: RoomPermissionType, role: RoomMember.Role): Boolean {
+private fun RoomPowerLevelsValues.isSelected(item: RoomPermissionType, role: RoomMember.Role): Boolean {
return when (item) {
RoomPermissionType.BAN -> RoomMember.Role.forPowerLevel(ban) == role
RoomPermissionType.INVITE -> RoomMember.Role.forPowerLevel(invite) == role
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt
index 9caff45ada..c46f8a7a6f 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt
@@ -40,7 +40,6 @@ import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.IconSource
import io.element.android.libraries.designsystem.theme.components.ListItem
@@ -142,12 +141,7 @@ private fun SecurityAndPrivacyToolbar(
) {
TopAppBar(
modifier = modifier,
- title = {
- Text(
- text = stringResource(R.string.screen_room_details_security_and_privacy_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_room_details_security_and_privacy_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressView.kt
index d39208ee95..93c2523f65 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/editroomaddress/EditRoomAddressView.kt
@@ -20,16 +20,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
-import io.element.android.compound.theme.ElementTheme
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.async.AsyncActionViewDefaults
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.ui.room.address.RoomAddressField
@@ -99,12 +96,7 @@ private fun EditRoomAddressTopBar(
) {
TopAppBar(
modifier = modifier,
- title = {
- Text(
- text = stringResource(R.string.screen_edit_room_address_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = stringResource(R.string.screen_edit_room_address_title),
navigationIcon = { BackButton(onClick = onBackClick) },
actions = {
TextButton(
diff --git a/features/roomdetails/impl/src/main/res/values-bg/translations.xml b/features/roomdetails/impl/src/main/res/values-bg/translations.xml
index e764baee3c..6f9c256742 100644
--- a/features/roomdetails/impl/src/main/res/values-bg/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-bg/translations.xml
@@ -1,10 +1,32 @@
+ "Вашият сървър не поддържа тази опция в шифровани стаи, може да не получавате известия в някои стаи."
"Анкети"
+ "Само администратори"
+ "Премахване на съобщения"
+ "Всеки"
+ "Поканване на хора и приемане на заявки за присъединяване"
+ "Модериране на членове"
+ "Съобщения и съдържание"
+ "Администратори и модератори"
+ "Премахване на хора и отхвърляне на заявки за присъединяване"
+ "Подробности за стаята"
+ "Промяна на името на стаята"
+ "Промяна на темата на стаята"
+ "Изпращане на съобщения"
+ "Редактиране на администраторите"
+ "Добавяне на администратор?"
+ "Администраторите автоматично имат модераторски права"
+ "Редактиране на модераторите"
+ "Администратори"
+ "Модератори"
"Членове"
"Добавяне на тема"
"Вече е член"
"Вече е бил поканен"
+ "С шифроване"
+ "Без шифроване"
+ "Общодостъпна стая"
"Редактиране на стаята"
"Не може да се обнови стаята"
"Съобщенията са защитени с ключове. Само вие и получателите имате уникалните ключове, за да ги отключите."
@@ -12,12 +34,17 @@
"Поканване на хора"
"Напускане на разговора"
"Напускане на стаята"
+ "Медия и файлове"
"Персонализирани"
"По подразбиране"
"Известия"
+ "Закачени съобщения"
+ "Профил"
+ "Роли и разрешения"
"Име на стаята"
"Защита"
"Споделяне на стаята"
+ "Информация за стаята"
"Тема"
"Обновяване на стаята…"
@@ -32,4 +59,19 @@
"Всички съобщения"
"Само споменавания и ключови думи"
"В тази стая, да бъда известяван за"
+ "Администратори"
+ "Промяна на моята роля"
+ "Модериране на членове"
+ "Съобщения и съдържание"
+ "Модератори"
+ "Разрешения"
+ "Нулиране на разрешенията"
+ "Роли"
+ "Подробности за стаята"
+ "Роли и разрешения"
+ "Шифроване"
+ "Всеки"
+ "Видима в директорията на обществените стаи"
+ "Всеки"
+ "Видимост на стаята"
diff --git a/features/roomdetails/impl/src/main/res/values-da/translations.xml b/features/roomdetails/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..4ee3a8439a
--- /dev/null
+++ b/features/roomdetails/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,147 @@
+
+
+ "Du skal bruge en rum-adresse for at gøre den synlig i kataloget."
+ "Rummets adresse"
+ "Der opstod en fejl under opdatering af notifikationsindstillingen."
+ "Din hjemmeserver understøtter ikke denne mulighed i krypterede rum, og derfor er det muligt at du ikke får besked i alle rum."
+ "Afstemninger"
+ "Kun admins"
+ "Spær personer"
+ "Fjern beskeder"
+ "Alle"
+ "Invitér personer og acceptér anmodninger om at deltage"
+ "Moderation af medlemmer"
+ "Beskeder og indhold"
+ "Admins og moderatorer"
+ "Fjern personer og afvis anmodninger om at deltage"
+ "Skift rummets avatar"
+ "Detaljer om rummet"
+ "Skift rummets navn"
+ "Skift emne for rummet"
+ "Send beskeder"
+ "Redigér admins"
+ "Du kan ikke fortryde denne handling. Du forfremmer brugeren til at have samme magtniveau som dig."
+ "Tilføj Admin?"
+ "Nedgradering"
+ "Du vil ikke være i stand til at fortryde denne ændring, da du degraderer dig selv. Hvis du er den sidste privilegerede bruger i rummet, vil det være umuligt at genvinde privilegier."
+ "Nedgrader dig selv?"
+ "%1$s (Afventer)"
+ "(Afventer)"
+ "Administratorer har automatisk moderatorrettigheder"
+ "Redigér moderatorer"
+ "Administratorer"
+ "Moderatorer"
+ "Medlemmer"
+ "Du har ændringer, der ikke er gemt."
+ "Gem ændringer?"
+ "Tilføj emne"
+ "Allerede medlem"
+ "Allerede inviteret"
+ "Krypteret"
+ "Ikke krypteret"
+ "Offentligt rum"
+ "Rediger rum"
+ "Der opstod en ukendt fejl, og oplysningerne kunne ikke ændres."
+ "Rummet kunne ikke opdateres"
+ "Beskeder er sikret med låse. Kun du og modtagerne har de unikke nøgler til at låse dem op."
+ "Beskedkryptering aktiveret"
+ "Der opstod en fejl under indlæsning af notifikationsindstillinger."
+ "Det lykkedes ikke at slå lyden fra for dette rum. Prøv igen."
+ "Det lykkedes ikke at slå lyden til igen i dette rum. Prøv igen."
+ "Invitér folk"
+ "Forlad samtalen"
+ "Forlad rum"
+ "Medier og filer"
+ "Brugerdefineret"
+ "Standard"
+ "Notifikationer"
+ "Fastgjorte beskeder"
+ "Profil"
+ "Anmodninger om at deltage"
+ "Roller og tilladelser"
+ "Navn på rum"
+ "Sikkerhed og privatliv"
+ "Sikkerhed"
+ "Del rum"
+ "Informationer om rummet"
+ "Emne"
+ "Opdaterer rum…"
+ "Der er ingen spærrede brugere i dette rum."
+
+ - "%1$d person"
+ - "%1$d personer"
+
+ "Spær fra rum"
+ "Fjern kun medlem"
+ "Fjern spærring af"
+ "De vil være i stand til at deltage i dette rum igen, hvis de inviteres."
+ "Ophæv blokering af bruger fra rum"
+ "Spærret"
+ "Medlemmer"
+ "Afventer"
+ "Admin"
+ "Moderator"
+ "Medlemmer af rummet"
+ "Ophæver spærring af %1$s"
+ "Tillad brugerdefineret indstilling"
+ "Hvis du aktiverer dette, tilsidesættes din standardindstilling"
+ "Giv mig besked i denne samtale for"
+ "Du kan ændre det i din %1$s."
+ "globale indstillinger"
+ "Standardindstilling"
+ "Fjern brugerdefineret indstilling"
+ "Der opstod en fejl under indlæsning af meddelelsesindstillinger."
+ "Gendannelse af standardtilstanden mislykkedes. Prøv igen."
+ "Kunne ikke indstille tilstanden. Prøv igen."
+ "Din hjemmeserver understøtter ikke denne indstilling i krypterede rum, du får ikke besked i dette rum."
+ "Alle beskeder"
+ "Kun omtaler og nøgleord"
+ "Giv mig besked i dette rum for"
+ "Administratorer"
+ "Skift min rolle"
+ "Nedgrader til medlem"
+ "Nedgradering til moderator"
+ "Moderation af medlemmer"
+ "Beskeder og indhold"
+ "Moderatorer"
+ "Tilladelser"
+ "Nulstil tilladelser"
+ "Når du nulstiller tilladelserne, mister du de nuværende indstillinger."
+ "Nulstil tilladelser?"
+ "Roller"
+ "Detaljer om rummet"
+ "Roller og tilladelser"
+ "Tilføj adresse på rum"
+ "Alle kan bede om at deltage i lokalet, men en administrator eller moderator skal acceptere anmodningen."
+ "Spørg om at deltage"
+ "Ja, aktivér kryptering"
+ "Når det først er aktiveret, kan kryptering for et rum ikke deaktiveres igen. Beskedhistorik vil kun være synlig for rummedlemmer, siden de blev inviteret, eller siden de blev medlem af rummet.
+Ingen udover medlemmer af rummet vil være i stand til at læse beskeder. Dette kan forhindre bots og broer i at fungere korrekt.
+Vi anbefaler ikke at aktivere kryptering for rum, som alle kan finde og deltage i."
+ "Aktivér kryptering?"
+ "Når kryptering først er aktiveret, kan den ikke deaktiveres igen."
+ "Kryptering"
+ "Aktivér end-to-end-kryptering"
+ "Alle kan finde og deltage"
+ "Enhver"
+ "Folk kan kun deltage, hvis de bliver inviteret"
+ "Kun med invitation"
+ "Adgang til rummet"
+ "Klynger understøttes ikke i øjeblikket"
+ "Medlemmer af klyngen"
+ "Du skal bruge en adresse til rummet, for at gøre den synlig i rum-registeret."
+ "Rummets adresse"
+ "Tillad, at dette rum kan findes ved at søge i %1$s fortegnelse over offentlige rum"
+ "Synlig i det offentlige register over rum"
+ "Enhver"
+ "Hvem kan læse historikken?"
+ "Kun medlemmer, efter de blev inviteret"
+ "Kun medlemmer siden valg af denne mulighed"
+ "Rum-adresser er en måde at finde og få adgang til værelser på. Dette sikrer også, at du nemt kan dele dit rum med andre.
+Du kan vælge at offentliggøre dit rum i din hjemmeservers offentlige katalog over rum."
+ "Udgivelse af rum"
+ "Rum-adresser er måder at finde og få adgang til rum på. Dette sikrer også, at du nemt kan dele dit rum med andre.
+Adressen er også påkrævet for at gøre rummet synligt i det %1$s offentlige register."
+ "Rummets synlighed"
+ "Sikkerhed og privatliv"
+
diff --git a/features/roomdetails/impl/src/main/res/values-el/translations.xml b/features/roomdetails/impl/src/main/res/values-el/translations.xml
index 3c5b8c7a76..aed10ce24f 100644
--- a/features/roomdetails/impl/src/main/res/values-el/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-el/translations.xml
@@ -1,9 +1,9 @@
- "Θα χρειαστείτε μια διεύθυνση δωματίου για να γίνει ορατό στον κατάλογο."
- "Διεύθυνση δωματίου"
+ "Θα χρειαστείτε μια διεύθυνση αίθουσας για να την κάνετε ορατή στον κατάλογο."
+ "Διεύθυνση αίθουσας"
"Παρουσιάστηκε σφάλμα κατά την ενημέρωση της ρύθμισης ειδοποίησης."
- "Ο οικιακός διακομιστής σου δεν υποστηρίζει αυτήν την επιλογή σε κρυπτογραφημένα δωμάτια, ενδέχεται να μην λάβεις ειδοποίηση σε ορισμένα δωμάτια."
+ "Ο αρχικός διακομιστής σας δεν υποστηρίζει αυτή την επιλογή σε κρυπτογραφημένες αίθουσες, ενδέχεται να μην λαμβάνετε ειδοποιήσεις σε ορισμένες αίθουσες."
"Δημοσκοπήσεις"
"Μόνο διαχειριστές"
"Αποκλεισμός ατόμων"
@@ -14,16 +14,16 @@
"Μηνύματα και περιεχόμενο"
"Διαχειριστές και συντονιστές"
"Αφαίρεση ατόμων και απόρριψη αιτημάτων συμμετοχής"
- "Αλλαγή avatar δωματίου"
- "Λεπτομέρειες δωματίου"
- "Αλλαγή ονόματος δωματίου"
- "Αλλαγή θέματος δωματίου"
+ "Αλλαγή εικόνας προφίλ αίθουσας"
+ "Λεπτομέρειες αίθουσας"
+ "Αλλαγή ονόματος αίθουσας"
+ "Αλλαγή θέματος αίθουσας"
"Αποστολή μηνυμάτων"
"Επεξεργασία Διαχειριστών"
"Δεν θα μπορείς να αναιρέσεις αυτήν την ενέργεια. Προβιβάζεις τον χρήστη να έχει το ίδιο επίπεδο ισχύος με σένα."
"Προσθήκη Διαχειριστή;"
"Υποβιβασμός"
- "Δεν θα μπορείς να αναιρέσεις αυτήν την αλλαγή αφού, υποβιβάζεσαι. Εάν είσαι ο τελευταίος προνομιούχος χρήστης στο δωμάτιο θα είναι αδύνατο να ανακτηθούν προνόμια."
+ "Δεν θα μπορέσετε να αναιρέσετε αυτή την αλλαγή καθώς υποβιβάζετε τον εαυτό σας, αν είστε ο τελευταίος χρήστης με δικαιώματα στην αίθουσα θα είναι αδύνατο να ανακτήσετε δικαιώματα."
"Υποβιβασμός του εαυτού σου;"
"%1$s (Σε αναμονή)"
"(Σε αναμονή)"
@@ -39,18 +39,18 @@
"Ήδη προσκεκλημένος"
"Κρυπτογραφημένο"
"Μη κρυπτογραφημένο"
- "Δημόσιο δωμάτιο"
- "Επεξεργασία Δωματίου"
+ "Δημόσια αίθουσα"
+ "Επεξεργασία Αίθουσας"
"Υπήρξε ένα άγνωστο σφάλμα και οι πληροφορίες δεν μπορούσαν να αλλάξουν."
- "Δεν είναι δυνατή η ενημέρωση του δωματίου"
+ "Αδυναμία ενημέρωσης αίθουσας"
"Τα μηνύματα ασφαλίζονται με κλειδαριές. Μόνο εσύ και οι παραλήπτες έχετε τα μοναδικά κλειδιά για να τα ξεκλειδώσετε."
"Ενεργοποιημένη κρυπτογράφηση μηνυμάτων"
"Παρουσιάστηκε σφάλμα κατά τη φόρτωση των ρυθμίσεων ειδοποίησης."
- "Αποτυχία σίγασης αυτού του δωματίου, δοκίμασε ξανά."
- "Αποτυχία κατάργησης σίγασης αυτού του δωματίου, δοκίμασε ξανά."
+ "Η σίγαση αυτής της αίθουσας απέτυχε, δοκιμάστε ξανά."
+ "Η κατάργηση σίγασης αυτής της αίθουσας απέτυχε, δοκιμάστε ξανά."
"Πρόσκληση ατόμων"
"Αποχώρηση από τη συζήτηση"
- "Αποχώρηση από το δωμάτιο"
+ "Αποχώρηση από την αίθουσα"
"Πολυμέσα και αρχεία"
"Προσαρμοσμένο"
"Προεπιλογή"
@@ -59,14 +59,14 @@
"Προφίλ"
"Αιτήματα συμμετοχής"
"Ρόλοι και δικαιώματα"
- "Όνομα δωματίου"
+ "Όνομα αίθουσας"
"Ασφάλεια & απόρρητο"
"Ασφάλεια"
- "Κοινή χρήση δωματίου"
- "Πληροφορίες δωματίου"
+ "Κοινή χρήση αίθουσας"
+ "Πληροφορίες αίθουσας"
"Θέμα"
- "Ενημέρωση δωματίου…"
- "Δεν υπάρχουν αποκλεισμένοι χρήστες σε αυτό το δωμάτιο."
+ "Ενημέρωση αίθουσας…"
+ "Δεν υπάρχουν αποκλεισμένοι χρήστες σε αυτή την αίθουσα."
- "%1$d άτομο"
- "%1$d άτομα"
@@ -74,14 +74,14 @@
"Αφαίρεση και αποκλεισμός μέλους"
"Μόνο αφαίρεση μέλους"
"Αναίρεση αποκλεισμού"
- "Θα μπορεί να συμμετάσχει ξανά στο δωμάτιο εάν προσκληθεί."
+ "Θα μπορούν να συμμετάσχουν ξανά σε αυτή την αίθουσα, εάν προσκληθούν."
"Άρση αποκλεισμού χρήστη"
"Αποκλεισμένοι"
"Μέλη"
"Σε αναμονή"
"Διαχειριστής"
"Συντονιστής"
- "Μέλη δωματίου"
+ "Μέλη της αίθουσας"
"Άρση αποκλεισμού %1$s"
"Να επιτρέπεται η προσαρμοσμένη ρύθμιση"
"Η ενεργοποίηση αυτής της ρύθμισης θα παρακάμψει την προεπιλεγμένη ρύθμιση"
@@ -93,10 +93,10 @@
"Παρουσιάστηκε σφάλμα κατά τη φόρτωση των ρυθμίσεων ειδοποίησης."
"Αποτυχία επαναφοράς της προεπιλεγμένης λειτουργίας, δοκίμασε ξανά."
"Αποτυχία ρύθμισης της λειτουργίας, δοκίμασε ξανά."
- "Ο οικιακός σου διακομιστής δεν υποστηρίζει αυτήν την επιλογή σε κρυπτογραφημένα δωμάτια, δεν θα λαμβάνεις ειδοποίηση σε αυτό το δωμάτιο."
+ "Ο αρχικός διακομιστής σας δεν υποστηρίζει αυτή την επιλογή σε κρυπτογραφημένες αίθουσες, δεν θα λάβετε ειδοποιήσεις σε αυτή την αίθουσα."
"Όλα τα μηνύματα"
"Μόνο αναφορές και λέξεις-κλειδιά"
- "Σε αυτό το δωμάτιο, ειδοποίησέ με για"
+ "Σε αυτήν την αίθουσα, ειδοποιήστε με για"
"Διαχειριστές"
"Άλλαξε τον ρόλο μου"
"Υποβιβασμός σε μέλος"
@@ -109,15 +109,15 @@
"Μόλις επαναφέρεις τα δικαιώματα, θα χάσεις τις τρέχουσες ρυθμίσεις."
"Επαναφορά δικαιωμάτων;"
"Ρόλοι"
- "Λεπτομέρειες δωματίου"
+ "Λεπτομέρειες αίθουσας"
"Ρόλοι και δικαιώματα"
- "Προσθήκη διεύθυνσης δωματίου"
- "Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στο δωμάτιο, αλλά κάποιος διαχειριστής ή συντονιστής θα πρέπει να αποδεχθεί το αίτημα."
+ "Προσθήκη διεύθυνσης αίθουσας"
+ "Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή συντονιστής θα πρέπει να αποδεχτεί το αίτημα."
"Αίτημα συμμετοχής"
"Ναι, ενεργοποιήστε την κρυπτογράφηση"
- "Μόλις ενεργοποιηθεί, η κρυπτογράφηση για ένα δωμάτιο δεν μπορεί να απενεργοποιηθεί. Το ιστορικό μηνυμάτων θα είναι ορατό μόνο για τα μέλη του δωματίου από τότε που προσκλήθηκαν ή από τότε που εντάχθηκαν στην αίθουσα.
-Κανείς εκτός από τα μέλη του δωματίου δεν θα μπορεί να διαβάσει μηνύματα. Αυτό μπορεί να αποτρέψει τη σωστή λειτουργία των bots και των γεφυρών.
-Δεν συνιστούμε να ενεργοποιήσεις την κρυπτογράφηση για δωμάτια στα οποία μπορεί κανείς να βρει και να συμμετάσχει."
+ "Μόλις ενεργοποιηθεί, η κρυπτογράφηση για μια αίθουσα δεν μπορεί να απενεργοποιηθεί, το ιστορικό μηνυμάτων θα είναι ορατό μόνο για τα μέλη της αίθουσας από τότε που προσκλήθηκαν ή από τότε που συμμετείχαν στην αίθουσα.
+Κανείς άλλος εκτός από τα μέλη της αίθουσας δεν θα μπορεί να διαβάσει τα μηνύματα. Αυτό μπορεί να εμποδίσει τη σωστή λειτουργία των bots και των γεφυρών.
+Δεν συνιστούμε την ενεργοποίηση της κρυπτογράφησης για αίθουσες που μπορεί να βρει και να συμμετάσχει ο καθένας."
"Ενεργοποίηση κρυπτογράφησης;"
"Μόλις ενεργοποιηθεί, η κρυπτογράφηση δεν μπορεί να απενεργοποιηθεί."
"Κρυπτογράφηση"
@@ -126,22 +126,22 @@
"Οποιοσδήποτε"
"Τα άτομα μπορούν να συμμετάσχουν μόνο εάν έχουν προσκληθεί"
"Μόνο πρόσκληση"
- "Πρόσβαση δωματίου"
+ "Πρόσβαση στην αίθουσα"
"Οι χώροι δεν υποστηρίζονται προς το παρόν"
"Μέλη χώρου"
- "Θα χρειαστείτε μια διεύθυνση δωματίου για να το κάνετε ορατό στον κατάλογο δωματίων."
- "Διεύθυνση δωματίου"
- "Επιτρέψτε την εύρεση αυτού του δωματίου αναζητώντας %1$s τον κατάλογο δημόσιων δωματίων"
- "Ορατό στον κατάλογο δημόσιων δωματίων"
+ "Θα χρειαστείτε μια διεύθυνση αίθουσας για να την κάνετε ορατή στον κατάλογο αιθουσών."
+ "Διεύθυνση αίθουσας"
+ "Επιστρέψτε την εύρεση αυτής της αίθουσας με αναζήτηση στον κατάλογο %1$s δημοσίων αιθουσών"
+ "Ορατή στον κατάλογο δημόσιων αιθουσών"
"Οποιοσδήποτε"
"Ποιος μπορεί να διαβάσει το ιστορικό"
"Μόνο μέλη από τη στιγμή που προσκλήθηκαν"
"Μόνο για μέλη μετά από αυτήν την επιλογή"
- "Οι διευθύνσεις δωματίων είναι τρόποι εύρεσης και πρόσβασης σε δωμάτια. Αυτό διασφαλίζει επίσης ότι μπορείτε εύκολα να μοιραστείτε το δωμάτιό σας με άλλους.
-Μπορείτε να επιλέξετε να δημοσιεύσετε το δωμάτιό σας στον κατάλογο δημόσιων δωματίων του διακομιστή σας."
- "Δημοσίευση δωματίου"
- "Οι διευθύνσεις δωματίων είναι τρόποι εύρεσης και πρόσβασης σε δωμάτια. Αυτό διασφαλίζει επίσης ότι μπορείτε εύκολα να μοιραστείτε το δωμάτιό σας με άλλους.
-Η διεύθυνση απαιτείται επίσης για να γίνει ορατό το δωμάτιο στον κατάλογο %1$s δημόσιων δωματίων."
- "Ορατότητα δωματίου"
+ "Οι διευθύνσεις αιθουσών είναι τρόποι εύρεσης και πρόσβασης σε αίθουσες. Αυτό διασφαλίζει επίσης ότι μπορείτε εύκολα να μοιραστείτε την αίθουσα με άλλους.
+Μπορείτε να επιλέξετε να δημοσιεύσετε την αίθουσά σας στον δημόσιο κατάλογο αιθουσών του αρχικού διακομιστή σας."
+ "Δημοσίευση αίθουσας"
+ "Οι διευθύνσεις αιθουσών είναι τρόποι εύρεσης και πρόσβασης σε αίθουσες. Αυτό εξασφαλίζει επίσης ότι μπορείτε εύκολα να μοιραστείτε την αίθουσα με άλλους.
+Η διεύθυνση απαιτείται επίσης για να γίνει η αίθουσα ορατή στον δημόσιο κατάλογο αιθουσών %1$s."
+ "Ορατότητα αίθουσας"
"Ασφάλεια & απόρρητο"
diff --git a/features/roomdetails/impl/src/main/res/values-fa/translations.xml b/features/roomdetails/impl/src/main/res/values-fa/translations.xml
index 9a2227d3cf..279e636c5b 100644
--- a/features/roomdetails/impl/src/main/res/values-fa/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-fa/translations.xml
@@ -42,7 +42,11 @@
"ویرایش اتاق"
"خطایی ناشناخته رخ داد و اطّلاعات قابل تغییر نبودند."
"ناتوان در بهروز رسانی اتاق"
+ "پیامها با قفل محافظت میشوند. فقط شما و گیرندگان، کلیدهای منحصر به فرد برای باز کردن قفل آنها را دارید."
"رمزنگاری پیام به کار افتاد"
+ "هنگام بارگیری تنظیمات اعلان خطایی رخ داد."
+ "بی صدا کردن این اتاق ناموفق بود، لطفا دوباره امتحان کنید."
+ "بی صدا کردن این اتاق ناموفق بود، لطفا دوباره امتحان کنید."
"دعوت افراد"
"ترک گفتوگو"
"ترک اتاق"
@@ -60,6 +64,10 @@
"اطّلاعات اتاق"
"موضوع"
"بهروز کردن اتاق…"
+
+ - "%1$d نفر"
+ - "%1$d نفر"
+
"برداشت و تحریم عضو"
"تنها برداشتن عضو"
"رفع انسداد"
@@ -73,11 +81,15 @@
"اعضای اتاق"
"رفع تحریم %1$s"
"اجازه به تنظیمت شخصی"
+ "روشن کردن این گزینه تنظیمات پیش فرض شما را لغو می کند"
"آگاهی من در این گپ برای"
"میتوانید در %1$sتان تغییرش دهید."
"تنظیمات جهانی"
"تنظیمات پیشگزیده"
"برداشتن تنظیمات سفارشی"
+ "هنگام بارگیری تنظیمات اعلان خطایی رخ داد."
+ "بازیابی حالت پیش فرض ناموفق بود، لطفا دوباره امتحان کنید."
+ "تنظیم حالت ناموفق است، لطفا دوباره امتحان کنید."
"همهٔ پیامها"
"فقط اشارهها و کلیدواژگان"
"آگاهی من در این اتاق برای"
diff --git a/features/roomdetails/impl/src/main/res/values-in/translations.xml b/features/roomdetails/impl/src/main/res/values-in/translations.xml
index 072efc2127..2143418fb0 100644
--- a/features/roomdetails/impl/src/main/res/values-in/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-in/translations.xml
@@ -1,5 +1,7 @@
+ "Anda akan memerlukan alamat ruangan untuk membuatnya terlihat dalam direktori."
+ "Alamat ruangan"
"Terjadi kesalahan saat memperbarui pengaturan pemberitahuan."
"Homeserver Anda tidak mendukung opsi ini dalam ruangan terenkripsi, Anda mungkin tidak diberi tahu dalam beberapa ruangan."
"Pemungutan suara"
@@ -54,6 +56,7 @@
"Bawaan"
"Notifikasi"
"Pesan yang disematkan"
+ "Profil"
"Permintaan untuk bergabung"
"Peran dan perizinan"
"Nama ruangan"
@@ -126,6 +129,7 @@ Kami tidak menyarankan untuk mengaktifkan enkripsi untuk ruangan yang dapat dite
"Space saat ini tidak didukung"
"Anggota space"
"Anda memerlukan alamat ruangan agar dapat membuatnya terlihat di direktori ruangan."
+ "Alamat ruangan"
"Izinkan ruangan ini ditemukan dengan mencari direktori ruangan %1$s publik"
"Terlihat di direktori ruangan publik"
"Siapa pun"
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 ee85c61944..6c8f29d873 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
@@ -41,6 +41,8 @@ import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
import io.element.android.libraries.matrix.test.room.aRoomInfo
+import io.element.android.libraries.preferences.api.store.AppPreferencesStore
+import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.EventsRecorder
@@ -60,6 +62,7 @@ import org.junit.Rule
import org.junit.Test
import kotlin.time.Duration.Companion.milliseconds
+@Suppress("LargeClass")
@ExperimentalCoroutinesApi
class RoomDetailsPresenterTest {
@get:Rule
@@ -84,6 +87,7 @@ class RoomDetailsPresenterTest {
isPinnedMessagesFeatureEnabled: Boolean = true,
encryptionService: FakeEncryptionService = FakeEncryptionService(),
clipboardHelper: ClipboardHelper = FakeClipboardHelper(),
+ appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore()
): RoomDetailsPresenter {
val matrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService)
val roomMemberDetailsPresenterFactory = object : RoomMemberDetailsPresenter.Factory {
@@ -111,6 +115,7 @@ class RoomDetailsPresenterTest {
isPinnedMessagesFeatureEnabled = { isPinnedMessagesFeatureEnabled },
analyticsService = analyticsService,
clipboardHelper = clipboardHelper,
+ appPreferencesStore = appPreferencesStore,
)
}
@@ -132,6 +137,7 @@ class RoomDetailsPresenterTest {
assertThat(initialState.canShowPinnedMessages).isTrue()
assertThat(initialState.pinnedMessagesCount).isEqualTo(0)
assertThat(initialState.canShowSecurityAndPrivacy).isFalse()
+ assertThat(initialState.showDebugInfo).isFalse()
cancelAndIgnoreRemainingEvents()
}
@@ -727,4 +733,23 @@ class RoomDetailsPresenterTest {
}
}
}
+
+ @Test
+ fun `present - show debug info`() = runTest {
+ val room = aJoinedRoom(
+ canInviteResult = { Result.success(true) },
+ canUserJoinCallResult = { Result.success(true) },
+ canSendStateResult = { _, _ -> Result.success(true) },
+ )
+ val inMemoryAppPreferencesStore = InMemoryAppPreferencesStore(
+ isDeveloperModeEnabled = true,
+ )
+ val presenter = createRoomDetailsPresenter(room = room, appPreferencesStore = inMemoryAppPreferencesStore)
+ presenter.testWithLifecycleOwner(lifecycleOwner = fakeLifecycleOwner) {
+ skipItems(1)
+ with(awaitItem()) {
+ assertThat(showDebugInfo).isTrue()
+ }
+ }
+ }
}
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionPresenterTest.kt
index 9ecbbe69c5..718c618484 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionPresenterTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionPresenterTest.kt
@@ -16,7 +16,6 @@ import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
-import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevels
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -121,7 +120,7 @@ class RolesAndPermissionPresenterTest {
val presenter = createRolesAndPermissionsPresenter(
analyticsService = analyticsService,
room = FakeJoinedRoom(
- resetPowerLevelsResult = { Result.success(defaultRoomPowerLevels()) }
+ resetPowerLevelsResult = { Result.success(Unit) }
)
)
moleculeFlow(RecompositionMode.Immediate) {
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt
index 4c56ae3cee..18ddf2ae04 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesPresenterTest.kt
@@ -16,14 +16,17 @@ import io.element.android.features.roomdetails.impl.members.aRoomMemberList
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
+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.RoomMembersState
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_ID_2
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
import io.element.android.libraries.matrix.test.room.aRoomInfo
+import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.collections.immutable.persistentMapOf
@@ -142,7 +145,7 @@ class ChangeRolesPresenterTest {
fun `present - UserSelectionToggle adds and removes users from the selected user list`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -164,7 +167,7 @@ class ChangeRolesPresenterTest {
fun `present - hasPendingChanges is true when the initial selected users don't match the new ones`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -193,7 +196,7 @@ class ChangeRolesPresenterTest {
fun `present - Exit will display success if no pending changes`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -213,7 +216,7 @@ class ChangeRolesPresenterTest {
fun `present - CancelExit will remove exit confirmation`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -239,7 +242,7 @@ class ChangeRolesPresenterTest {
fun `present - Exit will display a confirmation dialog if there are pending changes, calling it again will actually exit`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -270,7 +273,7 @@ class ChangeRolesPresenterTest {
baseRoom = FakeBaseRoom(updateMembersResult = { Result.success(Unit) }),
).apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(role = RoomMember.Role.ADMIN, room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -299,7 +302,7 @@ class ChangeRolesPresenterTest {
fun `present - CancelSave will remove the confirmation dialog`() = runTest {
val room = FakeJoinedRoom().apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 100)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.ADMIN)))
}
val presenter = createChangeRolesPresenter(role = RoomMember.Role.ADMIN, room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -328,7 +331,7 @@ class ChangeRolesPresenterTest {
baseRoom = FakeBaseRoom(updateMembersResult = { Result.success(Unit) }),
).apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 50)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.MODERATOR)))
}
val presenter = createChangeRolesPresenter(
role = RoomMember.Role.MODERATOR,
@@ -361,7 +364,7 @@ class ChangeRolesPresenterTest {
updateUserRoleResult = { Result.failure(IllegalStateException("Failed")) }
).apply {
givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList()))
- givenRoomInfo(aRoomInfo(userPowerLevels = persistentMapOf(A_USER_ID to 50)))
+ givenRoomInfo(aRoomInfo(roomPowerLevels = roomPowerLevelsWithRole(RoomMember.Role.MODERATOR)))
}
val presenter = createChangeRolesPresenter(role = RoomMember.Role.MODERATOR, room = room)
moleculeFlow(RecompositionMode.Immediate) {
@@ -385,6 +388,16 @@ class ChangeRolesPresenterTest {
}
}
+ private fun roomPowerLevelsWithRole(
+ role: RoomMember.Role,
+ userId: UserId = A_USER_ID,
+ ): RoomPowerLevels {
+ return RoomPowerLevels(
+ values = defaultRoomPowerLevelValues(),
+ users = persistentMapOf(userId to role.powerLevel)
+ )
+ }
+
private fun TestScope.createChangeRolesPresenter(
role: RoomMember.Role = RoomMember.Role.ADMIN,
room: FakeJoinedRoom = FakeJoinedRoom(),
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt
index 8021d09c8d..70770a6c5c 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt
@@ -18,10 +18,10 @@ import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember.Role.ADMIN
import io.element.android.libraries.matrix.api.room.RoomMember.Role.MODERATOR
import io.element.android.libraries.matrix.api.room.RoomMember.Role.USER
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.test.room.FakeBaseRoom
import io.element.android.libraries.matrix.test.room.FakeJoinedRoom
-import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevels
+import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues
import io.element.android.services.analytics.test.FakeAnalyticsService
import kotlinx.coroutines.test.runTest
import org.junit.Test
@@ -133,7 +133,7 @@ class ChangeBaseRoomPermissionsPresenterTest {
(items.last() as? Event.Item)?.value?.run {
assertThat(currentPermissions).isEqualTo(
- RoomPowerLevels(
+ RoomPowerLevelsValues(
invite = MODERATOR.powerLevel,
kick = MODERATOR.powerLevel,
ban = MODERATOR.powerLevel,
@@ -296,18 +296,7 @@ class ChangeBaseRoomPermissionsPresenterTest {
analyticsService = analyticsService,
)
- private fun defaultPermissions() = defaultRoomPowerLevels().run {
- RoomPowerLevels(
- invite = invite,
- kick = kick,
- ban = ban,
- redactEvents = redactEvents,
- sendEvents = sendEvents,
- roomName = roomName,
- roomAvatar = roomAvatar,
- roomTopic = roomTopic,
- )
- }
+ private fun defaultPermissions() = defaultRoomPowerLevelValues()
private suspend fun TurbineTestContext.awaitUpdatedItem(): ChangeRoomPermissionsState {
skipItems(1)
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyViewTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyViewTest.kt
index a7f7c15940..9bbd770334 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyViewTest.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyViewTest.kt
@@ -93,7 +93,7 @@ class SecurityAndPrivacyViewTest {
}
@Test
- @Config(qualifiers = "h640dp")
+ @Config(qualifiers = "h1024dp")
fun `click on room visibility item emits the expected event`() {
val recorder = EventsRecorder()
val state = aSecurityAndPrivacyState(
diff --git a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryView.kt b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryView.kt
index fc7f68d506..8b2944f745 100644
--- a/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryView.kt
+++ b/features/roomdirectory/impl/src/main/kotlin/io/element/android/features/roomdirectory/impl/root/RoomDirectoryView.kt
@@ -40,10 +40,10 @@ import io.element.android.features.roomdirectory.api.RoomDescription
import io.element.android.features.roomdirectory.impl.R
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.FilledTextField
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -90,12 +90,7 @@ private fun RoomDirectoryTopBar(
navigationIcon = {
BackButton(onClick = onBackClick)
},
- title = {
- Text(
- text = stringResource(id = R.string.screen_room_directory_search_title),
- style = ElementTheme.typography.aliasScreenTitle,
- )
- }
+ titleStr = stringResource(id = R.string.screen_room_directory_search_title),
)
}
@@ -248,7 +243,8 @@ private fun RoomDirectoryRoomRow(
) {
Avatar(
avatarData = roomDescription.avatarData(AvatarSize.RoomDirectoryItem),
- modifier = Modifier.align(Alignment.CenterVertically)
+ avatarType = AvatarType.Room(),
+ modifier = Modifier.align(Alignment.CenterVertically),
)
Column(
modifier = Modifier
diff --git a/features/roomdirectory/impl/src/main/res/values-da/translations.xml b/features/roomdirectory/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..3471723528
--- /dev/null
+++ b/features/roomdirectory/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,5 @@
+
+
+ "Indlæsning mislykkedes"
+ "Register over rum"
+
diff --git a/features/roomdirectory/impl/src/main/res/values-el/translations.xml b/features/roomdirectory/impl/src/main/res/values-el/translations.xml
index 9b3f8bb12d..c2dad69979 100644
--- a/features/roomdirectory/impl/src/main/res/values-el/translations.xml
+++ b/features/roomdirectory/impl/src/main/res/values-el/translations.xml
@@ -1,5 +1,5 @@
"Αποτυχία φόρτωσης"
- "Κατάλογος δωματίων"
+ "Κατάλογος αιθουσών"
diff --git a/features/roomlist/impl/src/main/res/values-bg/translations.xml b/features/roomlist/impl/src/main/res/values-bg/translations.xml
deleted file mode 100644
index 4afa8044f3..0000000000
--- a/features/roomlist/impl/src/main/res/values-bg/translations.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
- "Резервното копие на чатовете ви в момента не е синхронизирано. Въведете ключа си за възстановяване, за да потвърдите достъпа до резервното копие на чатовете си."
- "Потвърдете ключа си за възстановяване"
- "Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?"
- "Отказване на покана"
- "Няма покани"
- "%1$s (%2$s) ви покани"
- "Създаване на нов разговор или стая"
- "Започнете, като изпратите съобщение на някого."
- "Все още няма чатове."
- "Покани"
- "Нисък приоритет"
- "Хора"
- "Стаи"
- "Всички чатове"
- "Отбелязване като прочетено"
- "Отбелязване като непрочетено"
- "Изглежда, че използвате ново устройство. Потвърдете с друго устройство за достъп до вашите шифровани съобщения."
- "Потвърдете, че сте вие"
-
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 c5a394338a..d4b7a7b69e 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
@@ -38,6 +38,7 @@ import io.element.android.libraries.designsystem.components.async.AsyncIndicator
import io.element.android.libraries.designsystem.components.async.rememberAsyncIndicatorState
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.TextFieldDialog
import io.element.android.libraries.designsystem.components.list.ListItemContent
@@ -223,6 +224,7 @@ private fun RoomMemberActionsBottomSheet(
) {
Avatar(
avatarData = user.getAvatarData(size = AvatarSize.RoomListManageUser),
+ avatarType = AvatarType.User,
modifier = Modifier
.padding(bottom = 28.dp)
.align(Alignment.CenterHorizontally)
diff --git a/features/roommembermoderation/impl/src/main/res/values-bg/translations.xml b/features/roommembermoderation/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..53955d5a03
--- /dev/null
+++ b/features/roommembermoderation/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "Преглед на профила"
+
diff --git a/features/roommembermoderation/impl/src/main/res/values-da/translations.xml b/features/roommembermoderation/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..00defeeec6
--- /dev/null
+++ b/features/roommembermoderation/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,20 @@
+
+
+ "Spær fra rum"
+ "Spær"
+ "De vil ikke være i stand til at deltage i dette rum igen, selv om de inviteres."
+ "Er du stikker på, at du ønsker at spærre dette medlem?"
+ "Spærrer %1$s"
+ "Fjern"
+ "De vil være i stand til at deltage i dette rum igen, hvis de inviteres."
+ "Er du sikker på, at du vil fjerne dette medlem?"
+ "Se profil"
+ "Fjern fra rummet"
+ "Fjern medlem og udeluk dem fra at deltage i fremtiden?"
+ "Fjerner %1$s…"
+ "Fjern brugerens spærring fra rummet"
+ "Fjern spærring af"
+ "De ville være i stand til at deltage i rummet igen, hvis de blev inviteret"
+ "Er du sikker på, at du vil fjerne spærringen af dette medlem?"
+ "Ophæver spærring af %1$s"
+
diff --git a/features/roommembermoderation/impl/src/main/res/values-el/translations.xml b/features/roommembermoderation/impl/src/main/res/values-el/translations.xml
index 5c81a56396..2ed8f03bc4 100644
--- a/features/roommembermoderation/impl/src/main/res/values-el/translations.xml
+++ b/features/roommembermoderation/impl/src/main/res/values-el/translations.xml
@@ -2,14 +2,19 @@
"Αφαίρεση και αποκλεισμός μέλους"
"Αποκλεισμός"
- "Δεν θα μπορεί να συμμετέχει ξανά σε αυτό το δωμάτιο εάν προσκληθεί."
+ "Δεν θα μπορούν να ενταχθούν ξανά σε αυτή την αίθουσα, αν προσκληθούν."
"Θες σίγουρα να αποκλείσεις αυτό το μέλος;"
"Αποκλεισμός %1$s"
"Αφαίρεση"
- "Θα μπορούν να συμμετάσχουν ξανά σε αυτό το δωμάτιο εάν προσκληθούν."
+ "Θα μπορούν να συμμετάσχουν ξανά σε αυτή την αίθουσα, εάν προσκληθούν."
"Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το μέλος;"
"Προβολή προφίλ"
- "Αφαίρεση από το δωμάτιο"
+ "Αφαίρεση από την αίθουσα"
"Αφαίρεση μέλους και απαγόρευση συμμετοχής στο μέλλον;"
"Αφαίρεση %1$s…"
+ "Άρση αποκλεισμού από την αίθουσα"
+ "Άρση αποκλεισμού"
+ "Θα μπορούν να συμμετάσχουν και πάλι στην αίθουσα αν προσκληθούν"
+ "Σίγουρα θες να καταργήσεις τον αποκλεισμό αυτού του μέλους;"
+ "Άρση αποκλεισμού %1$s"
diff --git a/features/roommembermoderation/impl/src/main/res/values-in/translations.xml b/features/roommembermoderation/impl/src/main/res/values-in/translations.xml
index c40e811d9c..778f68402c 100644
--- a/features/roommembermoderation/impl/src/main/res/values-in/translations.xml
+++ b/features/roommembermoderation/impl/src/main/res/values-in/translations.xml
@@ -5,8 +5,16 @@
"Mereka tidak akan dapat bergabung ke ruangan ini lagi jika diundang."
"Apakah Anda yakin ingin mencekal anggota ini?"
"Mencekal %1$s"
+ "Hapus"
+ "Pengguna dapat bergabung dalam ruangan ini lagi jika diundang."
+ "Apakah Anda yakin ingin menghapus anggota ini?"
"Tampilkan profil"
"Keluarkan dari ruangan"
"Keluarkan pengguna dan cekal pengguna bergabung lagi di masa mendatang?"
"Mengeluarkan %1$s…"
+ "Batalkan cekalan dari ruangan"
+ "Batalkan pencekalan"
+ "Mereka akan dapat bergabung dengan ruangan lagi jika diundang"
+ "Apakah Anda yakin ingin membatalkan pencekalan anggota ini?"
+ "Membatalkan cekalan %1$s"
diff --git a/features/roommembermoderation/impl/src/main/res/values-it/translations.xml b/features/roommembermoderation/impl/src/main/res/values-it/translations.xml
index e4f2508747..41b8baa473 100644
--- a/features/roommembermoderation/impl/src/main/res/values-it/translations.xml
+++ b/features/roommembermoderation/impl/src/main/res/values-it/translations.xml
@@ -5,8 +5,16 @@
"Non potrà entrare nuovamente in questa stanza se invitato."
"Vuoi davvero escludere questo membro?"
"Esclusione di %1$s"
+ "Rimuovi"
+ "Potrà entrare nuovamente in questa stanza se invitato."
+ "Sei sicuro di voler rimuovere questo membro?"
"Visualizza profilo"
"Rimuovi dalla stanza"
"Rimuovere e vietare l\'accesso in futuro?"
"Rimozione di %1$s…"
+ "Riammetti nella stanza"
+ "Togli ban"
+ "Potranno unirsi di nuovo alla stanza se invitati"
+ "Sei sicuro di voler sbloccare questo membro?"
+ "Rimuovendo il ban di %1$s"
diff --git a/features/roommembermoderation/impl/src/main/res/values-pt-rBR/translations.xml b/features/roommembermoderation/impl/src/main/res/values-pt-rBR/translations.xml
index 036c87f2b7..6d6f24ef8d 100644
--- a/features/roommembermoderation/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/features/roommembermoderation/impl/src/main/res/values-pt-rBR/translations.xml
@@ -12,4 +12,9 @@
"Remover da sala"
"Remover membro e banir de entrar novamente no futuro?"
"Removendo %1$s…"
+ "Desbanir da sala"
+ "Desbanir"
+ "Essa pessoa poderia entrar na sala novamente se for convidada"
+ "Tem certeza que quer desbanir esse membro?"
+ "Desbanindo %1$s"
diff --git a/features/roommembermoderation/impl/src/main/res/values-pt/translations.xml b/features/roommembermoderation/impl/src/main/res/values-pt/translations.xml
index 5d063c8ad2..89a0992c98 100644
--- a/features/roommembermoderation/impl/src/main/res/values-pt/translations.xml
+++ b/features/roommembermoderation/impl/src/main/res/values-pt/translations.xml
@@ -7,7 +7,7 @@
"A banir %1$s"
"Remover"
"Poderão entrar na sala novamente se convidados."
- "Tens a certeza que queres remover este membro?"
+ "Tens certeza que queres remover este membro?"
"Ver perfil"
"Remover da sala"
"Remover participante e proibir que entre no futuro?"
diff --git a/features/securebackup/impl/src/main/res/values-bg/translations.xml b/features/securebackup/impl/src/main/res/values-bg/translations.xml
index 7dfb012c34..fe84ddc4a5 100644
--- a/features/securebackup/impl/src/main/res/values-bg/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-bg/translations.xml
@@ -1,21 +1,32 @@
- "Изключване на резервните копия"
+ "Изтриване на хранилището за ключове"
"Включване на резервните копия"
- "Резервното копие гарантира, че няма да загубите хронологията на съобщенията си. %1$s."
- "Резервно копие"
+ "Съхранявайте сигурно криптографската си самоличност и ключовете за съобщения на сървъра. Това ще ви позволи да преглеждате историята на съобщенията си на всички нови устройства.%1$s ."
+ "Съхранение на ключове"
+ "За да настроите възстановяването, трябва да включите съхранението на ключове."
+ "Разрешаване на съхранението на ключове"
"Промяна на ключа за възстановяване"
+ "Възстановете криптографската си самоличност и историята на съобщенията с ключ за възстановяване, ако сте загубили всичките си съществуващи устройства."
"Въвеждане на ключ за възстановяване"
- "Резервното копие на чатовете ви в момента не е синхронизирано."
+ "Хранилището ви за ключове в момента не е синхронизирано."
"Изключване"
+ "Изтриването на хранилището за ключове ще премахне вашата криптографска самоличност и ключове за съобщения от сървъра и ще изключи следните функции за сигурност:"
+ "Сигурни ли сте, че искате да изключите хранилището на ключове и да го изтриете?"
+ "Вземете нов ключ за възстановяване, ако сте загубили съществуващия си. След като промените ключа си за възстановяване, старият ви вече няма да работи."
"Генериране на нов ключ за възстановяване"
+ "Не споделяйте това с никого!"
"Промяна на ключа за възстановяване?"
"Уверете се, че никой не може да види този екран!"
+ "Моля, опитайте отново, за да потвърдите достъпа до хранилището за ключове."
"Неправилен ключ за възстановяване"
- "Въведете 48-символния код."
+ "Ако имате ключ за сигурност или фраза за сигурност, това също ще работи."
"Въведете…"
"Ключът за възстановяване е потвърден"
+ "Въведете ключа си за възстановяване"
"Копиран ключ за възстановяване"
"Запазване на ключа за възстановяване"
+ "Вашето хранилище за ключове е защитено с ключ за възстановяване. Ако имате нужда от нов ключ за възстановяване след настройката, можете да го създадете отново, като изберете „Промяна на ключа за възстановяване“."
+ "Не споделяйте това с никого!"
"Въведете…"
diff --git a/features/securebackup/impl/src/main/res/values-da/translations.xml b/features/securebackup/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..b4a385eea2
--- /dev/null
+++ b/features/securebackup/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,70 @@
+
+
+ "Slet nøglelager"
+ "Aktivér sikkerhedskopiering"
+ "Gem din kryptografiske identitet og meddelelsesnøgler sikkert på serveren. Dette giver dig mulighed for at se din meddelelseshistorik på alle nye enheder. %1$s."
+ "Nøgleopbevaring"
+ "Nøglelagring skal være slået til for at konfigurere gendannelse."
+ "Upload nøgler fra denne enhed"
+ "Tillad lagring af nøgler"
+ "Skift gendannelsesnøgle"
+ "Gendan din kryptografiske identitet og beskedhistorik med en gendannelsesnøgle, hvis du har mistet alle dine eksisterende enheder."
+ "Indtast gendannelsesnøgle"
+ "Din nøglelagring er i øjeblikket ikke synkroniseret."
+ "Opsæt gendannelse"
+ "Få adgang til dine krypterede meddelelser, hvis du mister alle dine enheder eller er logget ud af %1$s overalt."
+ "Åbn %1$s på en stationær enhed"
+ "Log ind på din konto igen"
+ "Når du bliver bedt om at bekræfte din enhed, skal du vælge %1$s"
+ "\"Nulstil alle\""
+ "Følg instruktionerne for at oprette en ny gendannelsesnøgle"
+ "Gem din nye gendannelsesnøgle i en adgangskodeadministrator eller i en krypteret note"
+ "Nulstil krypteringen for din konto ved hjælp af en anden enhed"
+ "Fortsæt nulstilling"
+ "Dine kontodetaljer, kontakter, personlige indstilliger og samtaler vil blive gemt"
+ "Du mister al beskedhistorik, der kun er gemt på serveren."
+ "Du bliver nødt til at verificere alle dine eksisterende enheder og kontakter påny"
+ "Nulstil kun din identitet, hvis du ikke har adgang til en anden enhed, der er logget ind, og du har mistet din gendannelsesnøgle."
+ "Kan du ikke bekræfte? Du skal nulstille din identitet."
+ "Slå fra"
+ "Du mister dine krypterede meddelelser, hvis du er logget ud af alle enheder."
+ "Er du sikker på, at du vil slå sikkerhedskopiering fra?"
+ "Hvis du sletter nøglelageret, fjernes din kryptografiske identitet og meddelelsesnøgler fra serveren og følgende sikkerhedsfunktioner deaktiveres:"
+ "Du vil ikke kunne se historikken for krypterede beskeder på nye enheder"
+ "Du mister adgangen til dine krypterede meddelelser, hvis du er logget ud %1$s overalt"
+ "Er du sikker på, at du vil deaktivere nøglelagring og slette lageret?"
+ "Få en ny gendannelsesnøgle, hvis du har mistet din eksisterende. Når du har ændret din gendannelsesnøgle, fungerer din gamle ikke længere."
+ "Generer en ny gendannelsesnøgle"
+ "Del ikke dette med nogen!"
+ "Gendannelsesnøgle ændret"
+ "Skift gendannelsesnøgle?"
+ "Opret ny gendannelsesnøgle"
+ "Sørg for, at ingen kan se denne skærm!"
+ "Prøv igen for at bekræfte adgangen til dit nøglelager."
+ "Forkert gendannelsesnøgle"
+ "Hvis du har en sikkerhedsnøgle eller sikkerhedssætning, kan en af dem også bruges."
+ "Indtast…"
+ "Mistet din gendannelsesnøgle?"
+ "Gendannelsesnøgle bekræftet"
+ "Indtast din gendannelsesnøgle"
+ "Kopieret gendannelsesnøgle"
+ "Genererer…"
+ "Gem gendannelsesnøgle"
+ "Skriv denne gendannelsesnøgle et sikkert sted, som en adgangskodeadministrator, en krypteret note eller på papir, som du lægger i et fysisk pengeskab."
+ "Tryk for at kopiere gendannelsesnøglen"
+ "Gem din gendannelsesnøgle et sikkert sted"
+ "Du vil ikke kunne få adgang til din nye gendannelsesnøgle efter dette trin."
+ "Har du gemt din gendannelsesnøgle?"
+ "Din nøglelager er beskyttet af en gendannelsesnøgle. Hvis du har brug for en ny gendannelsesnøgle efter installationen, kan du oprette den ved at vælge \'Skift gendannelsesnøgle\'."
+ "Generer din gendannelsesnøgle"
+ "Del ikke dette med nogen!"
+ "Opsætning af gendannelse lykkedes"
+ "Opsæt gendannelse"
+ "Ja, nulstil nu"
+ "Denne proces er irreversibel."
+ "Er du sikker på, at du ønsker at nulstille din identitet?"
+ "Der opstod en ukendt fejl. Kontroller, at adgangskoden til din konto er korrekt, og prøv igen."
+ "Indtast…"
+ "Bekræft, at du ønsker at nulstille din identitet."
+ "Indtast adgangskoden til din konto for at fortsætte"
+
diff --git a/features/securebackup/impl/src/main/res/values-fa/translations.xml b/features/securebackup/impl/src/main/res/values-fa/translations.xml
index 85b7aa883f..095dcbc139 100644
--- a/features/securebackup/impl/src/main/res/values-fa/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-fa/translations.xml
@@ -9,6 +9,7 @@
"ورود کلید بازیابی"
"ذخیرهساز کلیدتان از همگام بودن در آمده."
"برپایی بازیابی"
+ "اگر همه دستگاههایتان را گم کردید یا از سیستم خارج شدید، به پیامهای رمزگذاریشدهتان دسترسی پیدا کنید%1$s همه جا."
"گشودن %1$s در افزارهٔ میزکار"
"ورود دوباره به حسابتان"
"گزینش %1$s هنگام درخواست تأیید افزارهتان"
@@ -23,6 +24,12 @@
"فقط اگر به افزارهای وارد شده از پیش دسترسی ندارید و کلید بازیابیتان را گم کردهاید بازنشانی کنید."
"نمیتوانید تأیید کنید؟ لازم است هویتتان را بازنشانی کنید."
"خاموش کردن"
+ "اگر از سیستم همه دستگاه ها خارج شده باشید، پیام های رمزگذاری شده خود را از دست خواهید داد."
+ "آیا مطمئن هستید که می خواهید پشتیبان گیری را خاموش کنید؟"
+ "حذف فضای ذخیره سازی کلید، هویت رمزنگاری و کلیدهای پیام شما را از سرور حذف می کند و ویژگی های امنیتی زیر را خاموش می کند:"
+ "سابقه پیام رمزگذاری شده در دستگاه های جدید نخواهید داشت"
+ "اگر از %1$s در همه جا خارج شده باشید، دسترسی به پیام های رمزگذاری شده خود را از دست خواهید داد"
+ "آیا مطمئن هستید که می خواهید فضای ذخیره سازی کلید را خاموش کرده و آن را حذف کنید؟"
"گرفتن کلید بازیابی جدید در صورت فراموشی کلید کنونی. پس از تغییر دادن کلید بازیابیتان، کلید پیشین دیگر کار نخواهد کرد."
"تولید کلید بازیابی جدید"
"با کسی همرسانیش نکنید!"
diff --git a/features/signedout/impl/src/main/res/values-da/translations.xml b/features/signedout/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..3bfc9f4996
--- /dev/null
+++ b/features/signedout/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,8 @@
+
+
+ "Du har ændret din adgangskode på en anden session"
+ "Du har slettet sessionen fra en anden session"
+ "Din serveradministrator har lukket for din adgang"
+ "Du er muligvis blevet logget ud på grund af en af nedenstående årsager. Log ind igen for at fortsætte med at bruge%s."
+ "Du er logget ud"
+
diff --git a/features/signedout/impl/src/main/res/values-fa/translations.xml b/features/signedout/impl/src/main/res/values-fa/translations.xml
index bd5680df00..a2336114f0 100644
--- a/features/signedout/impl/src/main/res/values-fa/translations.xml
+++ b/features/signedout/impl/src/main/res/values-fa/translations.xml
@@ -2,5 +2,7 @@
"گذرواژهتان را در نشستی دیگر تغییر دادهاید"
"این نشست را از نشستی دیگر حذف کردهاید"
+ "مدیر سرور شما دسترسی شما را لغو کرده است."
+ "ممکن است به یکی از دلایل ذکر شده در زیر از سیستم خارج شده باشید. لطفا برای ادامه استفاده از %s دوباره وارد شوید."
"خارج شدهاید"
diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt
index c743ebfd40..4de79b8375 100644
--- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt
+++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt
@@ -21,7 +21,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import io.element.android.features.createroom.api.StartDMAction
-import io.element.android.features.enterprise.api.EnterpriseService
+import io.element.android.features.enterprise.api.SessionEnterpriseService
import io.element.android.features.userprofile.api.UserProfileEvents
import io.element.android.features.userprofile.api.UserProfileState
import io.element.android.features.userprofile.api.UserProfileState.ConfirmationDialog
@@ -45,7 +45,7 @@ class UserProfilePresenter @AssistedInject constructor(
@Assisted private val userId: UserId,
private val client: MatrixClient,
private val startDMAction: StartDMAction,
- private val enterpriseService: EnterpriseService,
+ private val sessionEnterpriseService: SessionEnterpriseService,
) : Presenter {
@AssistedFactory
interface Factory {
@@ -62,7 +62,7 @@ class UserProfilePresenter @AssistedInject constructor(
@Composable
private fun getCanCall(roomId: RoomId?): State {
val isElementCallAvailable by produceState(initialValue = false, roomId) {
- value = enterpriseService.isElementCallAvailable()
+ value = sessionEnterpriseService.isElementCallAvailable()
}
return produceState(initialValue = false, isElementCallAvailable, roomId) {
diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt
index c88872374d..2ce7f99c2c 100644
--- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt
+++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt
@@ -16,7 +16,7 @@ import com.google.common.truth.Truth.assertThat
import io.element.android.features.createroom.api.ConfirmingStartDmWithMatrixUser
import io.element.android.features.createroom.api.StartDMAction
import io.element.android.features.createroom.test.FakeStartDMAction
-import io.element.android.features.enterprise.test.FakeEnterpriseService
+import io.element.android.features.enterprise.test.FakeSessionEnterpriseService
import io.element.android.features.userprofile.api.UserProfileEvents
import io.element.android.features.userprofile.api.UserProfileState
import io.element.android.features.userprofile.api.UserProfileVerificationState
@@ -410,7 +410,7 @@ class UserProfilePresenterTest {
userId = userId,
client = client,
startDMAction = startDMAction,
- enterpriseService = FakeEnterpriseService(
+ sessionEnterpriseService = FakeSessionEnterpriseService(
isElementCallAvailableResult = { isElementCallAvailable },
),
)
diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileHeaderSection.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileHeaderSection.kt
index da88c0f508..415a6e3282 100644
--- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileHeaderSection.kt
+++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileHeaderSection.kt
@@ -20,6 +20,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -30,6 +32,7 @@ import io.element.android.libraries.designsystem.atomic.molecules.MatrixBadgeRow
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.modifiers.niceClickable
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -61,15 +64,26 @@ fun UserProfileHeaderSection(
) {
Avatar(
avatarData = AvatarData(userId.value, userName, avatarUrl, AvatarSize.UserHeader),
+ avatarType = AvatarType.User,
+ contentDescription = avatarUrl?.let { stringResource(CommonStrings.a11y_user_avatar) },
modifier = Modifier
.clip(CircleShape)
- .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) }
+ .clickable(
+ enabled = avatarUrl != null,
+ onClickLabel = stringResource(CommonStrings.action_view),
+ ) {
+ openAvatarPreview(avatarUrl!!)
+ }
.testTag(TestTags.memberDetailAvatar)
)
Spacer(modifier = Modifier.height(24.dp))
if (userName != null) {
Text(
- modifier = Modifier.clipToBounds(),
+ modifier = Modifier
+ .clipToBounds()
+ .semantics {
+ heading()
+ },
text = userName,
style = ElementTheme.typography.fontHeadingLgBold,
textAlign = TextAlign.Center,
diff --git a/features/userprofile/shared/src/main/res/values-bg/translations.xml b/features/userprofile/shared/src/main/res/values-bg/translations.xml
index 67c73e3ea8..677034496c 100644
--- a/features/userprofile/shared/src/main/res/values-bg/translations.xml
+++ b/features/userprofile/shared/src/main/res/values-bg/translations.xml
@@ -6,6 +6,8 @@
"Отблокиране на потребителя"
"Блокиране"
"Блокиране на потребителя"
+ "Профил"
"Отблокиране"
"Отблокиране на потребителя"
+ "Потвърждаване на %1$s"
diff --git a/features/userprofile/shared/src/main/res/values-da/translations.xml b/features/userprofile/shared/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..7af21ebea9
--- /dev/null
+++ b/features/userprofile/shared/src/main/res/values-da/translations.xml
@@ -0,0 +1,19 @@
+
+
+ "Bloker"
+ "Blokerede brugere vil ikke være i stand til at sende dig beskeder, og alle deres beskeder vil blive skjult. Du kan fjerne blokeringen af dem når som helst."
+ "Bloker bruger"
+ "Fjern blokering"
+ "Du vil være i stand til at se alle beskeder fra dem igen."
+ "Fjern blokering af bruger"
+ "Bloker"
+ "Blokerede brugere vil ikke være i stand til at sende dig beskeder, og alle deres beskeder vil blive skjult. Du kan fjerne blokeringen af dem når som helst."
+ "Bloker bruger"
+ "Profil"
+ "Fjern blokering"
+ "Du vil være i stand til at se alle beskeder fra dem igen."
+ "Fjern blokering af bruger"
+ "Brug webappen til at verificere denne bruger."
+ "Verificér %1$s"
+ "Der opstod en fejl under forsøget på at starte en samtale"
+
diff --git a/features/userprofile/shared/src/main/res/values-fa/translations.xml b/features/userprofile/shared/src/main/res/values-fa/translations.xml
index 8ce64548de..65664a007a 100644
--- a/features/userprofile/shared/src/main/res/values-fa/translations.xml
+++ b/features/userprofile/shared/src/main/res/values-fa/translations.xml
@@ -1,14 +1,17 @@
"بلوک"
+ "کاربران مسدود شده نمیتوانند برای شما پیام ارسال کنند و تمام پیامهای آنها پنهان خواهد شد. میتوانید هر زمان که بخواهید آنها را از حالت مسدود خارج کنید."
"انسداد کاربر"
"رفع انسداد"
"قادر خواهید بود دوباره همهٔ پیامهایش را ببینید."
"رفع انسداد کاربر"
"بلوک"
+ "کاربران مسدود شده نمیتوانند برای شما پیام ارسال کنند و تمام پیامهای آنها پنهان خواهد شد. میتوانید هر زمان که بخواهید آنها را از حالت مسدود خارج کنید."
"انسداد کاربر"
"نمایه"
"رفع انسداد"
"قادر خواهید بود دوباره همهٔ پیامهایش را ببینید."
"رفع انسداد کاربر"
+ "هنگام تلاش برای شروع چت خطایی روی داد"
diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationUserProfileContent.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationUserProfileContent.kt
index 4210e3559c..4f6cfcf456 100644
--- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationUserProfileContent.kt
+++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/ui/VerificationUserProfileContent.kt
@@ -25,6 +25,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Text
@@ -50,10 +51,11 @@ fun VerificationUserProfileContent(
.padding(12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
- Avatar(avatarData)
-
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Spacer(modifier = Modifier.padding(12.dp))
-
Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
Text(text = displayName ?: userId.value, style = ElementTheme.typography.fontBodyLgMedium, color = ElementTheme.colors.textPrimary)
diff --git a/features/verifysession/impl/src/main/res/values-bg/translations.xml b/features/verifysession/impl/src/main/res/values-bg/translations.xml
index bd4c7071ef..ab0a15f4ed 100644
--- a/features/verifysession/impl/src/main/res/values-bg/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-bg/translations.xml
@@ -1,5 +1,12 @@
+ "Не можете да потвърдите?"
+ "Потвърдете това устройство, за да настроите защитени съобщения."
+ "Потвърдете самоличността си"
+ "Използване на друго устройство"
+ "Използване на ключ за възстановяване"
+ "Устройството е потвърдено"
+ "Използване на друго устройство"
"Нещо не изглежда наред. Или времето за изчакване на заявката е изтекло, или заявката е отхвърлена."
"Потвърдете, че емоджитата по-долу съвпадат с показаните в другата ви сесия."
"Сравнете емоджита"
@@ -10,8 +17,16 @@
"Готов съм"
"В очакване на съвпадение"
"Сравнете уникален набор от емоджита."
+ "Неуспешно потвърждаване"
+ "Сега можете да четете или изпращате съобщения сигурно на другото си устройство."
+ "Устройството е потвърдено"
"Те не съвпадат"
"Те съвпадат"
+ "Уверете се, че приложението е отворено на другото устройство, преди да започнете потвърждението оттук."
+ "Отворете приложението на друго потвърдено устройство"
+ "Чака се другото устройство"
+ "Чака се другият потребител"
+ "След като бъдете приети, ще можете да продължите потвърждението."
"Приемете заявката, за да започнете процеса на потвърждаване в другата си сесия, за да продължите."
"В очакване на приемане на заявка"
"Излизане…"
diff --git a/features/verifysession/impl/src/main/res/values-da/translations.xml b/features/verifysession/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..a1586feff7
--- /dev/null
+++ b/features/verifysession/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,53 @@
+
+
+ "Kan ikke bekræfte?"
+ "Opret en ny gendannelsesnøgle"
+ "Verificér denne enhed for at konfigurere sikre meddelelser."
+ "Bekræft din identitet"
+ "Brug en anden enhed"
+ "Brug gendannelsesnøgle"
+ "Nu kan du læse eller sende beskeder sikkert, og enhver du samtaler med kan også stole på denne enhed."
+ "Enhed verificeret"
+ "Brug en anden enhed"
+ "Venter på en anden enhed…"
+ "Et ellervandet virker ikke rigtigt. Enten udløb anmodningen, eller anmodningen blev afvist."
+ "Bekræft, at emojierne nedenfor matcher dem, der vises på din anden session."
+ "Sammenlign emojier"
+ "Bekræft, at emojierne nedenfor matcher dem, der vises på den anden brugers enhed."
+ "Bekræft, at numrene nedenfor stemmer overens med dem, der vises på din anden session."
+ "Sammenlign tal"
+ "Din nye session er nu bekræftet. Det har adgang til dine krypterede meddelelser, og andre brugere vil se den som betroet."
+ "Nu kan du stole på identiteten af denne bruger, når I sender og modtager beskeder fra hinanden."
+ "Indtast gendannelsesnøgle"
+ "Enten udløb anmodningen, den blev afvist, eller der var en fejl i verifikationen."
+ "Bevis, at det er dig, for at få adgang til din krypterede beskedhistorik."
+ "Åbn en eksisterende session"
+ "Prøv bekræftelsen igen"
+ "Jeg er klar"
+ "Venter på at matche…"
+ "Sammenlign et unikt sæt af emojis."
+ "Sammenlign de unikke emoji, og vær opmærksom på, at de vises i den samme rækkefølge."
+ "Logget ind"
+ "Enten udløb anmodningen, den blev afvist, eller der var en fejl i verifikationen."
+ "Verifikation mislykkedes"
+ "Fortsæt kun, hvis du selv har startet denne verifikation."
+ "Verificér den anden enhed for at holde din meddelelseshistorik sikker."
+ "Nu kan du læse eller sende beskeder sikkert på din anden enhed."
+ "Enhed verificeret"
+ "Anmodet om verifikation"
+ "De matcher ikke"
+ "De matcher"
+ "Sørg for, at du har appen åben på den anden enhed, før du starter verifikationen herfra."
+ "Åbn appen på en anden bekræftet enhed"
+ "For ekstra sikkerhed, verificér denne bruger ved at sammenligne et sæt emojier på jeres enheder. Gør dette ved at bruge en kommunikationsmetode i stoler på."
+ "Verificér denne bruger?"
+ "For ekstra sikkerhed ønsker en anden bruger at bekræfte din identitet. Du får vist et sæt emojier til sammenligning."
+ "Du burde se en popup på den anden enhed. Start verifikationen derfra nu."
+ "Start verifikation på den anden enhed"
+ "Venter på den anden enhed"
+ "Venter på den anden bruger"
+ "Når du er blevet accepteret, kan du fortsætte med verifikationen."
+ "Accepter anmodningen om at starte bekræftelsesprocessen i din anden session for at fortsætte."
+ "Venter på at acceptere anmodningen"
+ "Logger ud…"
+
diff --git a/features/verifysession/impl/src/main/res/values-fa/translations.xml b/features/verifysession/impl/src/main/res/values-fa/translations.xml
index 1df9148763..949f4ab27c 100644
--- a/features/verifysession/impl/src/main/res/values-fa/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-fa/translations.xml
@@ -10,10 +10,13 @@
"افزاره تأیید شده"
"استفاده از افزارهای دیگر"
"منتظر افزارهٔ دیگر…"
+ "يه چيزي درست به نظر نمياد یا زمان درخواست به پایان رسید یا درخواست رد شد."
+ "تأیید کنید که ایموجی های زیر با ایموجی های نشان داده شده در جلسه دیگر شما مطابقت دارند."
"مقایسهٔ شکلکها"
"مقایسهٔ اعداد"
"نشست جدید شما اکنون تأیید شدهاست. این نشست به پیامهای رمزگذاری شدهی شما دسترسی داشته و سایر کاربران نیز این نشست را قابل اعتماد می دانند."
"ورود کلید بازیابی"
+ "برای دسترسی به تاریخچه پیامهای رمزگذاریشدهتان، ثابت کنید که خودتان هستید."
"گشودن نشستی موجود"
"تلاش برای تأیید دوباره"
"آمادهام"
@@ -24,6 +27,7 @@
"افزاره تأیید شده"
"مطابق نیستند"
"مطابقند"
+ "برای ادامه، درخواست شروع فرآیند تأیید را در جلسه دیگر خود بپذیرید."
"منظر پذیرش درخواست"
"خارج شدن…"
diff --git a/features/verifysession/impl/src/main/res/values-in/translations.xml b/features/verifysession/impl/src/main/res/values-in/translations.xml
index b1dbf1f6a0..655520e51f 100644
--- a/features/verifysession/impl/src/main/res/values-in/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-in/translations.xml
@@ -13,9 +13,11 @@
"Sepertinya ada yang tidak beres. Entah permintaan sudah habis masa berlakunya atau permintaan ditolak."
"Konfirmasikan bahwa emoji di bawah ini sesuai dengan yang ditampilkan pada sesi Anda yang lain."
"Bandingkan emoji"
+ "Konfirmasikan bahwa emoji di bawah ini cocok dengan yang ditampilkan di perangkat pengguna lain."
"Konfirmasikan bahwa angka-angka di bawah ini sesuai dengan yang ditampilkan pada sesi Anda yang lain."
"Bandingkan angka"
"Sesi baru Anda sekarang diverifikasi. Ini memiliki akses ke pesan terenkripsi Anda, dan pengguna lain akan melihatnya sebagai tepercaya."
+ "Sekarang Anda dapat mempercayai identitas pengguna ini saat mengirim atau menerima pesan."
"Masukkan kunci pemulihan"
"Entah permintaan habis waktu, permintaan ditolak, atau ada ketidakcocokan verifikasi."
"Buktikan bahwa ini memang Anda untuk mengakses riwayat pesan terenkripsi Anda."
@@ -37,8 +39,14 @@
"Mereka cocok"
"Pastikan Anda membuka aplikasi di perangkat lain sebelum memulai verifikasi dari sini."
"Buka aplikasi di perangkat terverifikasi lain"
+ "Untuk keamanan tambahan, verifikasi pengguna ini dengan membandingkan satu set emoji di perangkat Anda. Lakukan ini dengan menggunakan cara tepercaya untuk berkomunikasi."
+ "Verifikasi pengguna ini?"
+ "Untuk keamanan tambahan, pengguna lain ingin memverifikasi identitas Anda. Anda akan ditampilkan satu set emoji untuk dibandingkan."
"Anda akan melihat popup di perangkat lain. Mulai verifikasi dari sana sekarang."
"Mulai verifikasi di perangkat lain"
+ "Menunggu perangkat lain"
+ "Menunggu pengguna lain"
+ "Setelah diterima, Anda akan dapat melanjutkan verifikasi."
"Terima permintaan untuk memulai proses verifikasi di sesi Anda yang lain untuk melanjutkan."
"Menunggu untuk menerima permintaan"
"Mengeluarkan dari akun…"
diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileView.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileView.kt
index 3851a4a554..4f3b84734f 100644
--- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileView.kt
+++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/file/ViewFileView.kt
@@ -15,7 +15,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
-import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.async.AsyncFailure
@@ -23,11 +22,9 @@ import io.element.android.libraries.designsystem.components.async.AsyncLoading
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.IconButton
import io.element.android.libraries.designsystem.theme.components.Scaffold
-import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toImmutableList
@@ -46,12 +43,7 @@ fun ViewFileView(
navigationIcon = {
BackButton(onClick = onBackClick)
},
- title = {
- Text(
- text = state.name,
- style = ElementTheme.typography.aliasScreenTitle,
- )
- },
+ titleStr = state.name,
actions = {
IconButton(
onClick = {
diff --git a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderView.kt b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderView.kt
index 7ccdf78539..99de3badb8 100644
--- a/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderView.kt
+++ b/features/viewfolder/impl/src/main/kotlin/io/element/android/features/viewfolder/impl/folder/ViewFolderView.kt
@@ -32,7 +32,6 @@ import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
-import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.IconSource
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Scaffold
@@ -54,12 +53,7 @@ fun ViewFolderView(
navigationIcon = {
BackButton(onClick = onBackClick)
},
- title = {
- Text(
- text = state.path,
- style = ElementTheme.typography.aliasScreenTitle,
- )
- }
+ titleStr = state.path,
)
},
content = { padding ->
diff --git a/gradle.properties b/gradle.properties
index c9789f9dff..513fcac955 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -40,7 +40,7 @@ signing.element.nightly.keyPassword=Secret
# Customise the Lint version to use a more recent version than the one bundled with AGP
# https://googlesamples.github.io/android-custom-lint-rules/usage/newer-lint.md.html
-android.experimental.lint.version=8.11.0-alpha09
+android.experimental.lint.version=8.12.0-alpha07
# Enable test fixture for all modules by default
android.experimental.enableTestFixtures=true
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 296f70d939..fa90db9e3f 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -3,10 +3,10 @@
[versions]
# Project
-android_gradle_plugin = "8.10.1"
-kotlin = "2.1.21"
+android_gradle_plugin = "8.11.0"
+kotlin = "2.2.0"
kotlinpoet = "2.2.0"
-ksp = "2.1.21-2.0.2"
+ksp = "2.2.0-2.0.2"
firebaseAppDistribution = "5.1.1"
# AndroidX
@@ -20,7 +20,7 @@ media3 = "1.7.1"
camera = "1.4.2"
# Compose
-compose_bom = "2025.05.01"
+compose_bom = "2025.06.01"
composecompiler = "1.5.15"
# Coroutines
@@ -33,8 +33,8 @@ accompanist = "0.37.3"
test_core = "1.6.1"
# Jetbrain
-datetime = "0.6.2"
-serialization_json = "1.8.1"
+datetime = "0.7.0"
+serialization_json = "1.9.0"
#other
detekt = "1.23.8"
@@ -42,11 +42,12 @@ coil = "3.2.0"
showkase = "1.0.4"
appyx = "1.7.1"
sqldelight = "2.1.0"
-wysiwyg = "2.38.3"
+wysiwyg = "2.38.4"
telephoto = "0.16.0"
+haze = "1.6.6"
# Dependency analysis
-dependencyAnalysis = "2.18.0"
+dependencyAnalysis = "2.19.0"
# DI
dagger = "2.56.2"
@@ -71,13 +72,13 @@ kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" }
kotlinpoet-ksp = { module = "com.squareup:kotlinpoet-ksp", version.ref = "kotlinpoet" }
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" }
-gms_google_services = "com.google.gms:google-services:4.4.2"
+gms_google_services = "com.google.gms:google-services:4.4.3"
# https://firebase.google.com/docs/android/setup#available-libraries
-google_firebase_bom = "com.google.firebase:firebase-bom:33.15.0"
+google_firebase_bom = "com.google.firebase:firebase-bom:33.16.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" }
-google_tink = "com.google.crypto.tink:tink-android:1.17.0"
+google_tink = "com.google.crypto.tink:tink-android:1.18.0"
# AndroidX
androidx_core = { module = "androidx.core:core", version.ref = "core" }
@@ -145,12 +146,12 @@ test_corektx = { module = "androidx.test:core-ktx", version.ref = "test_core" }
test_arch_core = "androidx.arch.core:core-testing:2.2.0"
test_junit = "junit:junit:4.13.2"
test_runner = "androidx.test:runner:1.6.2"
-test_mockk = "io.mockk:mockk:1.14.2"
+test_mockk = "io.mockk:mockk:1.14.4"
test_konsist = "com.lemonappdev:konsist:0.17.3"
test_turbine = "app.cash.turbine:turbine:1.2.1"
test_truth = "com.google.truth:truth:1.4.4"
test_parameter_injector = "com.google.testparameterinjector:test-parameter-injector:1.18"
-test_robolectric = "org.robolectric:robolectric:4.14.1"
+test_robolectric = "org.robolectric:robolectric:4.15.1"
test_appyx_junit = { module = "com.bumble.appyx:testing-junit4", version.ref = "appyx" }
test_composable_preview_scanner = "io.github.sergio-sastre.ComposablePreviewScanner:android:0.6.1"
test_detekt_api = { module = "io.gitlab.arturbosch.detekt:detekt-api", version.ref = "detekt" }
@@ -168,33 +169,35 @@ serialization_json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-jso
kotlinx_collections_immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0"
showkase = { module = "com.airbnb.android:showkase", version.ref = "showkase" }
showkase_processor = { module = "com.airbnb.android:showkase-processor", version.ref = "showkase" }
-jsoup = "org.jsoup:jsoup:1.20.1"
+jsoup = "org.jsoup:jsoup:1.21.1"
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0"
timber = "com.jakewharton.timber:timber:5.0.1"
-matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.6.18"
+matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.7.3"
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
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:android-database-sqlcipher:4.5.4"
-sqlite = "androidx.sqlite:sqlite-ktx:2.5.1"
-unifiedpush = "org.unifiedpush.android:connector:3.0.9"
+sqlcipher = "net.zetetic:sqlcipher-android:4.9.0"
+sqlite = "androidx.sqlite:sqlite-ktx:2.5.2"
+unifiedpush = "org.unifiedpush.android:connector:3.0.10"
otaliastudios_transcoder = "com.otaliastudios:transcoder:0.11.2"
vanniktech_blurhash = "com.vanniktech:blurhash:0.3.0"
telephoto_zoomableimage = { module = "me.saket.telephoto:zoomable-image-coil", version.ref = "telephoto" }
telephoto_flick = { module = "me.saket.telephoto:flick-android", version.ref = "telephoto" }
statemachine = "com.freeletics.flowredux:compose:1.2.2"
-maplibre = "org.maplibre.gl:android-sdk:11.10.3"
+maplibre = "org.maplibre.gl:android-sdk:11.11.0"
maplibre_ktx = "org.maplibre.gl:android-sdk-ktx-v7:3.0.2"
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:2.3.0"
+haze = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" }
+haze_materials = { module = "dev.chrisbanes.haze:haze-materials", version.ref = "haze" }
# Analytics
posthog = "com.posthog:posthog-android:3.19.0"
-sentry = "io.sentry:sentry-android:8.13.3"
+sentry = "io.sentry:sentry-android:8.16.0"
# main branch can be tested replacing the version with main-SNAPSHOT
matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.28.0"
@@ -210,7 +213,7 @@ anvil_compiler_api = { module = "dev.zacsweers.anvil:compiler-api", version.ref
anvil_compiler_utils = { module = "dev.zacsweers.anvil:compiler-utils", version.ref = "anvil" }
# Element Call
-element_call_embedded = "io.element.android:element-call-embedded:0.12.2"
+element_call_embedded = "io.element.android:element-call-embedded:0.13.1"
# Auto services
google_autoservice = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" }
diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/ui/View.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/ui/View.kt
index cead1384c9..e2dacf58e7 100644
--- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/ui/View.kt
+++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/ui/View.kt
@@ -7,8 +7,10 @@
package io.element.android.libraries.androidutils.ui
+import android.os.Build
import android.view.View
import android.view.ViewTreeObserver
+import android.view.WindowInsets
import android.view.inputmethod.InputMethodManager
import androidx.core.content.getSystemService
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -23,8 +25,13 @@ fun View.showKeyboard(andRequestFocus: Boolean = false) {
if (andRequestFocus) {
requestFocus()
}
- val imm = context?.getSystemService()
- imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ windowInsetsController?.show(WindowInsets.Type.ime())
+ } else {
+ val imm = context?.getSystemService()
+ imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
+ }
}
fun View.isKeyboardVisible(): Boolean {
diff --git a/libraries/androidutils/src/main/res/values-da/translations.xml b/libraries/androidutils/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..73a3ca6b01
--- /dev/null
+++ b/libraries/androidutils/src/main/res/values-da/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "Der blev ikke fundet nogen kompatibel app til at håndtere denne handling."
+
diff --git a/libraries/androidutils/src/main/res/values-fa/translations.xml b/libraries/androidutils/src/main/res/values-fa/translations.xml
new file mode 100644
index 0000000000..b6212e73f3
--- /dev/null
+++ b/libraries/androidutils/src/main/res/values-fa/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "هیچ برنامه سازگاری برای انجام این عمل یافت نشد."
+
diff --git a/libraries/dateformatter/impl/build.gradle.kts b/libraries/dateformatter/impl/build.gradle.kts
index 4a619af5b7..ed8c7731bd 100644
--- a/libraries/dateformatter/impl/build.gradle.kts
+++ b/libraries/dateformatter/impl/build.gradle.kts
@@ -22,6 +22,14 @@ android {
}
}
+ kotlin {
+ compilerOptions {
+ optIn = listOf(
+ "kotlin.time.ExperimentalTime"
+ )
+ }
+ }
+
dependencies {
implementation(libs.dagger)
implementation(projects.libraries.core)
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterDay.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterDay.kt
index ecf5399302..bc8d8aedc0 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterDay.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatterDay.kt
@@ -33,8 +33,8 @@ class DefaultDateFormatterDay @Inject constructor(
return if (useRelative) {
val dayDiff = today.date.toEpochDays() - dateToFormat.date.toEpochDays()
when (dayDiff) {
- 0 -> dateFormatters.getRelativeDay(timestamp, "Today")
- 1 -> dateFormatters.getRelativeDay(timestamp, "Yesterday")
+ 0L -> dateFormatters.getRelativeDay(timestamp, "Today")
+ 1L -> dateFormatters.getRelativeDay(timestamp, "Yesterday")
else -> if (dayDiff < 7) {
dateFormatters.formatDateWithDay(dateToFormat)
} else {
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt
index d44c6d5c35..9e5ffd6afe 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt
@@ -10,7 +10,6 @@ package io.element.android.libraries.dateformatter.impl
import android.text.format.DateUtils
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn
-import kotlinx.datetime.Clock
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.toInstant
import kotlinx.datetime.toJavaLocalDate
@@ -20,6 +19,7 @@ import java.time.Period
import java.util.Locale
import javax.inject.Inject
import kotlin.math.absoluteValue
+import kotlin.time.Clock
@SingleIn(AppScope::class)
class DateFormatters @Inject constructor(
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt
index c2cd062082..20862fd68a 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt
@@ -7,11 +7,11 @@
package io.element.android.libraries.dateformatter.impl
-import kotlinx.datetime.Clock
-import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.toLocalDateTime
import javax.inject.Inject
+import kotlin.time.Clock
+import kotlin.time.Instant
class LocalDateTimeProvider @Inject constructor(
private val clock: Clock,
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt
index 1fe22483a4..a7da8ea6ce 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt
@@ -12,9 +12,9 @@ import dagger.Module
import dagger.Provides
import io.element.android.libraries.dateformatter.impl.TimezoneProvider
import io.element.android.libraries.di.AppScope
-import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
import java.util.Locale
+import kotlin.time.Clock
@Module
@ContributesTo(AppScope::class)
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeViewPreview.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeViewPreview.kt
index b88badcc98..79b1022c14 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeViewPreview.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/DateFormatterModeViewPreview.kt
@@ -28,7 +28,7 @@ import io.element.android.libraries.dateformatter.impl.DefaultDateFormatter
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.utils.allBooleans
-import kotlinx.datetime.Instant
+import kotlin.time.Instant
@Preview
@Composable
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/Factory.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/Factory.kt
index 88afcb554f..d0c25f8b60 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/Factory.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/Factory.kt
@@ -16,9 +16,9 @@ import io.element.android.libraries.dateformatter.impl.DateFormatters
import io.element.android.libraries.dateformatter.impl.DefaultDateFormatter
import io.element.android.libraries.dateformatter.impl.DefaultDateFormatterDay
import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider
-import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import java.util.Locale
+import kotlin.time.Instant
/**
* Create DefaultDateFormatter and set current time to the provided date.
diff --git a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewClock.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewClock.kt
index a86fb04455..8151e07262 100644
--- a/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewClock.kt
+++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/previews/PreviewClock.kt
@@ -7,8 +7,8 @@
package io.element.android.libraries.dateformatter.impl.previews
-import kotlinx.datetime.Clock
-import kotlinx.datetime.Instant
+import kotlin.time.Clock
+import kotlin.time.Instant
class PreviewClock : Clock {
private var instant: Instant = Instant.fromEpochMilliseconds(0)
diff --git a/libraries/dateformatter/impl/src/main/res/values-bg/translations.xml b/libraries/dateformatter/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..b03020fec2
--- /dev/null
+++ b/libraries/dateformatter/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,4 @@
+
+
+ "Този месец"
+
diff --git a/libraries/dateformatter/impl/src/main/res/values-da/translations.xml b/libraries/dateformatter/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..b74fc5a8a0
--- /dev/null
+++ b/libraries/dateformatter/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,5 @@
+
+
+ "%1$s kl. %2$s"
+ "Denne måned"
+
diff --git a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt
index 355ab6815c..0e52e1de37 100644
--- a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt
+++ b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt
@@ -7,16 +7,17 @@
package io.element.android.libraries.dateformatter.impl
+import android.os.Build
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.dateformatter.api.DateFormatterMode
-import kotlinx.datetime.Instant
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
+import kotlin.time.Instant
@RunWith(AndroidJUnit4::class)
-@Config(qualifiers = "fr")
+@Config(qualifiers = "fr", sdk = [Build.VERSION_CODES.TIRAMISU])
class DefaultDateFormatterFrTest {
@Test
fun `test null`() {
@@ -34,7 +35,7 @@ class DefaultDateFormatterFrTest {
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("1 janvier 1970 à 00:00")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("Janvier 1970")
assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("1 janvier 1970")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("01.01.1970")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("01/01/1970")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("00:00")
}
@@ -46,7 +47,7 @@ class DefaultDateFormatterFrTest {
assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("1 janvier 1970 à 00:00")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("Janvier 1970")
assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("1 janvier 1970")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("01.01.1970")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("01/01/1970")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("00:00")
}
@@ -241,7 +242,7 @@ class DefaultDateFormatterFrTest {
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("6 avril 1979 à 18:35")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("Avril 1979")
assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("6 avril 1979")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("06.04.1979")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("06/04/1979")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("18:35")
}
@@ -254,7 +255,7 @@ class DefaultDateFormatterFrTest {
assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("6 avril 1979 à 18:35")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("Avril 1979")
assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("6 avril 1979")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("06.04.1979")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("06/04/1979")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("18:35")
}
}
diff --git a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterTest.kt b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterTest.kt
index 27ae9c3238..136bbc1293 100644
--- a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterTest.kt
+++ b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDateFormatterTest.kt
@@ -7,16 +7,17 @@
package io.element.android.libraries.dateformatter.impl
+import android.os.Build
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.dateformatter.api.DateFormatterMode
-import kotlinx.datetime.Instant
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
+import kotlin.time.Instant
@RunWith(AndroidJUnit4::class)
-@Config(qualifiers = "en")
+@Config(qualifiers = "en", sdk = [Build.VERSION_CODES.TIRAMISU])
class DefaultDateFormatterTest {
@Test
fun `test null`() {
@@ -34,7 +35,7 @@ class DefaultDateFormatterTest {
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("January 1, 1970 at 12:00 AM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("January 1970")
assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("January 1, 1970")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("01.01.1970")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("01/01/1970")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("12:00 AM")
}
@@ -46,7 +47,7 @@ class DefaultDateFormatterTest {
assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("January 1, 1970 at 12:00 AM")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("January 1970")
assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("January 1, 1970")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("01.01.1970")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("01/01/1970")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("12:00 AM")
}
@@ -58,7 +59,7 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 6, 1980 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday 6 April")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday, April 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -84,7 +85,7 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 6, 1980 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday 6 April")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday, April 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -110,7 +111,7 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 6, 1980 at 6:34 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday 6 April")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday, April 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("6:34 PM")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:34 PM")
}
@@ -136,7 +137,7 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 6, 1980 at 5:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday 6 April")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Sunday, April 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("5:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("5:35 PM")
}
@@ -162,8 +163,8 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 5, 1980 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Saturday 5 April")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("5 Apr")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Saturday, April 5")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("Apr 5")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -188,8 +189,8 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 4, 1980 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Friday 4 April")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("4 Apr")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Friday, April 4")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("Apr 4")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -202,7 +203,7 @@ class DefaultDateFormatterTest {
assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("Friday at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("This month")
assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("Friday")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("4 Apr")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("Apr 4")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("6:35 PM")
}
@@ -214,8 +215,8 @@ class DefaultDateFormatterTest {
val formatter = createFormatter(now)
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("March 6, 1980 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("March 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Thursday 6 March")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("6 Mar")
+ assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("Thursday, March 6")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("Mar 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -225,10 +226,10 @@ class DefaultDateFormatterTest {
val dat = "1980-03-06T18:35:24.00Z"
val ts = Instant.parse(dat).toEpochMilliseconds()
val formatter = createFormatter(now)
- assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("Thursday 6 March at 6:35 PM")
+ assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("Thursday, March 6 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("March 1980")
- assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("Thursday 6 March")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("6 Mar")
+ assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("Thursday, March 6")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("Mar 6")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("6:35 PM")
}
@@ -241,7 +242,7 @@ class DefaultDateFormatterTest {
assertThat(formatter.format(ts, DateFormatterMode.Full)).isEqualTo("April 6, 1979 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month)).isEqualTo("April 1979")
assertThat(formatter.format(ts, DateFormatterMode.Day)).isEqualTo("April 6, 1979")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("06.04.1979")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate)).isEqualTo("04/06/1979")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly)).isEqualTo("6:35 PM")
}
@@ -254,7 +255,7 @@ class DefaultDateFormatterTest {
assertThat(formatter.format(ts, DateFormatterMode.Full, true)).isEqualTo("April 6, 1979 at 6:35 PM")
assertThat(formatter.format(ts, DateFormatterMode.Month, true)).isEqualTo("April 1979")
assertThat(formatter.format(ts, DateFormatterMode.Day, true)).isEqualTo("April 6, 1979")
- assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("06.04.1979")
+ assertThat(formatter.format(ts, DateFormatterMode.TimeOrDate, true)).isEqualTo("04/06/1979")
assertThat(formatter.format(ts, DateFormatterMode.TimeOnly, true)).isEqualTo("6:35 PM")
}
}
diff --git a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/Factory.kt b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/Factory.kt
index 6ab588022d..20f36a0dd6 100644
--- a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/Factory.kt
+++ b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/Factory.kt
@@ -8,9 +8,9 @@
package io.element.android.libraries.dateformatter.impl
import io.element.android.tests.testutils.InstrumentationStringProvider
-import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import java.util.Locale
+import kotlin.time.Instant
/**
* Create DefaultDateFormatter and set current time to the provided date.
diff --git a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt
index 047e87e62a..c3d1f01d4f 100644
--- a/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt
+++ b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt
@@ -7,8 +7,8 @@
package io.element.android.libraries.dateformatter.impl
-import kotlinx.datetime.Clock
-import kotlinx.datetime.Instant
+import kotlin.time.Clock
+import kotlin.time.Instant
class FakeClock : Clock {
private var instant: Instant = Instant.fromEpochMilliseconds(0)
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/CounterAtom.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/CounterAtom.kt
index 32b96b6260..483c9aa346 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/CounterAtom.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/CounterAtom.kt
@@ -17,7 +17,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -36,18 +36,21 @@ private const val MAX_COUNT_STRING = "+$MAX_COUNT"
* @param count The number to display. If the number is greater than [MAX_COUNT], the counter will display [MAX_COUNT_STRING].
* If the number is less than 1, the counter will not be displayed.
* @param modifier The modifier to apply to this layout.
+ * @param textStyle The style to apply to the text inside the counter.
+ * @param isCritical If true, the counter will use a critical color scheme, otherwise it will use an accent color scheme.
*/
@Composable
fun CounterAtom(
count: Int,
modifier: Modifier = Modifier,
+ textStyle: TextStyle = CounterAtomDefaults.textStyle,
+ isCritical: Boolean = false,
) {
if (count < 1) return
val countAsText = when (count) {
in 0..MAX_COUNT -> count.toString()
else -> MAX_COUNT_STRING
}
- val textStyle = ElementTheme.typography.fontBodyMdMedium
val textMeasurer = rememberTextMeasurer()
// Measure the maximum count string size
val textLayoutResult = textMeasurer.measure(
@@ -58,19 +61,30 @@ fun CounterAtom(
val squareSize = maxOf(textSize.width, textSize.height)
Box(
modifier = modifier
- .size(squareSize.toDp() + 1.dp)
- .clip(CircleShape)
- .background(ElementTheme.colors.iconSuccessPrimary)
+ .size(squareSize.toDp() + 1.dp)
+ .clip(CircleShape)
+ .background(
+ if (isCritical) {
+ ElementTheme.colors.iconCriticalPrimary
+ } else {
+ ElementTheme.colors.iconAccentPrimary
+ }
+ )
) {
Text(
modifier = Modifier.align(Alignment.Center),
text = countAsText,
style = textStyle,
- color = Color.White,
+ color = ElementTheme.colors.textOnSolidPrimary,
)
}
}
+object CounterAtomDefaults {
+ val textStyle: TextStyle
+ @Composable get() = ElementTheme.typography.fontBodyMdMedium
+}
+
@PreviewsDayNight
@Composable
internal fun CounterAtomPreview() = ElementPreview {
@@ -79,5 +93,6 @@ internal fun CounterAtomPreview() = ElementPreview {
CounterAtom(count = 4)
CounterAtom(count = 99)
CounterAtom(count = 100)
+ CounterAtom(count = 4, isCritical = true)
}
}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMolecule.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMolecule.kt
index 0108779913..07e2454dbc 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMolecule.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/ComposerAlertMolecule.kt
@@ -27,6 +27,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.avatar.anAvatarData
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -72,7 +73,10 @@ fun ComposerAlertMolecule(
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
if (avatar != null) {
- Avatar(avatarData = avatar)
+ Avatar(
+ avatarData = avatar,
+ avatarType = AvatarType.User,
+ )
}
Text(
text = content,
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitleSubtitleMolecule.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitleSubtitleMolecule.kt
index 9496f53993..a89a21adbd 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitleSubtitleMolecule.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/IconTitleSubtitleMolecule.kt
@@ -14,6 +14,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -47,7 +49,10 @@ fun IconTitleSubtitleMolecule(
Text(
text = title,
modifier = Modifier
- .fillMaxWidth(),
+ .fillMaxWidth()
+ .semantics {
+ heading()
+ },
textAlign = TextAlign.Center,
style = ElementTheme.typography.fontHeadingMdBold,
color = ElementTheme.colors.textPrimary,
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Bloom.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Bloom.kt
index 764a208a82..fd4b380fdc 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Bloom.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Bloom.kt
@@ -94,6 +94,7 @@ import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -498,6 +499,7 @@ internal fun BloomPreview() {
url = "aURL",
size = AvatarSize.CurrentUserTopBar,
),
+ avatarType = AvatarType.User,
)
},
actions = {
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayout.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayout.kt
new file mode 100644
index 0000000000..66b404f554
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayout.kt
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.view.MotionEvent
+import android.view.ViewGroup
+import android.widget.EditText
+import androidx.appcompat.app.ActionBar.LayoutParams
+import androidx.compose.animation.core.Animatable
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectVerticalDragGestures
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.ime
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.statusBars
+import androidx.compose.foundation.layout.windowInsetsPadding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import kotlinx.coroutines.launch
+import timber.log.Timber
+import kotlin.math.max
+import kotlin.math.min
+import kotlin.math.roundToInt
+
+@Composable
+fun ExpandableBottomSheetLayout(
+ sheetDragHandle: @Composable BoxScope.() -> Unit,
+ bottomSheetContent: @Composable ColumnScope.() -> Unit,
+ state: ExpandableBottomSheetLayoutState,
+ maxBottomSheetContentHeight: Dp,
+ isSwipeGestureEnabled: Boolean,
+ modifier: Modifier = Modifier,
+ sheetShape: Shape = RectangleShape,
+ backgroundColor: Color = Color.Transparent,
+ content: @Composable () -> Unit,
+) {
+ var minBottomContentHeightPx by remember { mutableIntStateOf(0) }
+ var currentBottomContentHeightPx by remember { mutableIntStateOf(minBottomContentHeightPx) }
+ val maxBottomContentHeightPx = with(LocalDensity.current) { maxBottomSheetContentHeight.roundToPx() }
+ var calculatedMaxBottomContentHeightPx by remember(maxBottomContentHeightPx) { mutableIntStateOf(maxBottomContentHeightPx) }
+ val animatable = remember { Animatable(0f) }
+
+ fun calculatePercentage(currentPos: Int, minPos: Int, maxPos: Int): Float {
+ val currentProgress = currentPos - minPos
+ if (currentProgress < 0) {
+ Timber.e("Invalid current progress: $currentProgress, minPos: $minPos, maxPos: $maxPos")
+ return 0f
+ }
+ val total = (maxPos - minPos).toFloat()
+ if (total <= 0) {
+ Timber.e("Invalid total space: $total, minPos: $minPos, maxPos: $maxPos")
+ return 0f
+ }
+ return currentProgress / total
+ }
+
+ LaunchedEffect(animatable.value) {
+ if (animatable.isRunning && animatable.value != animatable.targetValue) {
+ currentBottomContentHeightPx = animatable.value.roundToInt()
+ state.internalDraggingPercentage = calculatePercentage(
+ currentPos = currentBottomContentHeightPx,
+ minPos = minBottomContentHeightPx,
+ maxPos = calculatedMaxBottomContentHeightPx,
+ )
+ }
+ }
+
+ val coroutineScope = rememberCoroutineScope()
+
+ val composables = @Composable {
+ content()
+ Column(
+ modifier = Modifier
+ .clip(sheetShape)
+ .background(backgroundColor)
+ .run {
+ if (isSwipeGestureEnabled) {
+ pointerInput(maxBottomSheetContentHeight) {
+ detectVerticalDragGestures(
+ onVerticalDrag = { _, dragAmount ->
+ val calculatedHeight = max(minBottomContentHeightPx, currentBottomContentHeightPx - dragAmount.roundToInt())
+ val newHeight = min(calculatedMaxBottomContentHeightPx, calculatedHeight)
+ state.internalPosition = when (newHeight) {
+ calculatedMaxBottomContentHeightPx -> ExpandableBottomSheetLayoutState.Position.EXPANDED
+ minBottomContentHeightPx -> ExpandableBottomSheetLayoutState.Position.COLLAPSED
+ else -> ExpandableBottomSheetLayoutState.Position.DRAGGING
+ }
+ state.internalDraggingPercentage = calculatePercentage(
+ currentPos = newHeight,
+ minPos = minBottomContentHeightPx,
+ maxPos = calculatedMaxBottomContentHeightPx,
+ )
+ currentBottomContentHeightPx = newHeight
+ },
+ onDragEnd = {
+ coroutineScope.launch {
+ val middle = (calculatedMaxBottomContentHeightPx + minBottomContentHeightPx) / 2
+ animatable.snapTo(currentBottomContentHeightPx.toFloat())
+
+ val destination = if (currentBottomContentHeightPx > middle) {
+ state.internalPosition = ExpandableBottomSheetLayoutState.Position.EXPANDED
+ calculatedMaxBottomContentHeightPx
+ } else {
+ state.internalPosition = ExpandableBottomSheetLayoutState.Position.COLLAPSED
+ minBottomContentHeightPx
+ }.toFloat()
+
+ animatable.animateTo(destination)
+ }
+ }
+ )
+ }
+ } else {
+ this
+ }
+ }
+ ) {
+ Box(Modifier.fillMaxWidth()) {
+ sheetDragHandle()
+ }
+ bottomSheetContent()
+ }
+ }
+ Layout(
+ content = composables,
+ modifier = modifier,
+ measurePolicy = { measurables, constraints ->
+ calculatedMaxBottomContentHeightPx = min(constraints.maxHeight, maxBottomContentHeightPx)
+
+ val contentMeasurables = measurables[0]
+ val bottomContentMeasurables = measurables[1]
+
+ val minIntrinsicHeight = bottomContentMeasurables.minIntrinsicHeight(constraints.maxWidth)
+ val lastMinBottomContentHeightPx = minBottomContentHeightPx
+ minBottomContentHeightPx = min(minIntrinsicHeight, calculatedMaxBottomContentHeightPx)
+
+ val isExpanded = state.position == ExpandableBottomSheetLayoutState.Position.EXPANDED
+ if (lastMinBottomContentHeightPx != minBottomContentHeightPx && !isExpanded) {
+ currentBottomContentHeightPx = minBottomContentHeightPx
+ }
+
+ val measuredBottomContent = bottomContentMeasurables.measure(
+ Constraints.fixed(
+ constraints.maxWidth,
+ max(minBottomContentHeightPx, currentBottomContentHeightPx)
+ )
+ )
+
+ var remainingHeight = constraints.maxHeight - currentBottomContentHeightPx
+ if (remainingHeight < 0) {
+ Timber.e("Remaining height is negative: $remainingHeight, resetting to 0")
+ remainingHeight = 0
+ }
+
+ val contentPlaceable = contentMeasurables.measure(
+ Constraints.fixed(constraints.maxWidth, remainingHeight)
+ )
+
+ layout(constraints.maxWidth, constraints.maxHeight) {
+ contentPlaceable.place(0, 0)
+ measuredBottomContent.place(IntOffset(0, constraints.maxHeight - currentBottomContentHeightPx), zIndex = 10f)
+ }
+ }
+ )
+}
+
+@Preview(showBackground = true)
+@Composable
+@Suppress("UnusedPrivateMember")
+internal fun ExpandableBottomSheetLayoutPreview() {
+ ExpandableBottomSheetLayout(
+ sheetDragHandle = {
+ Box(
+ modifier =
+ Modifier
+ .padding(vertical = 6.dp)
+ .clip(RoundedCornerShape(6.dp))
+ .align(Alignment.Center)
+ .size(100.dp, 8.dp)
+ .background(Color.Gray)
+ )
+ },
+ content = {
+ Box(Modifier.fillMaxWidth()) {
+ Text("This is the main content", modifier = Modifier.padding(16.dp).align(Alignment.Center))
+ }
+ },
+ bottomSheetContent = {
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(1f, fill = true)
+ .padding(horizontal = 10.dp)
+ .clip(RoundedCornerShape(10.dp))
+ .background(Color.Blue)
+ ) {
+ AndroidView(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(Color.LightGray),
+ factory = { context ->
+ PreviewEditText(context).apply {
+ val initialText = "1111\n2222\n3333\n4444\n5555\n6666"
+ setText(initialText)
+ layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
+ }
+ }
+ )
+ }
+ Text("A footer", modifier = Modifier.padding(vertical = 6.dp, horizontal = 16.dp))
+ },
+ maxBottomSheetContentHeight = 1800.dp,
+ isSwipeGestureEnabled = true,
+ backgroundColor = Color.White,
+ state = rememberExpandableBottomSheetLayoutState(),
+ sheetShape = RoundedCornerShape(20.dp, 20.dp, 0.dp, 0.dp),
+ modifier = Modifier
+ .windowInsetsPadding(WindowInsets.statusBars)
+ .windowInsetsPadding(WindowInsets.ime)
+ .fillMaxSize()
+ .background(Color.Red.copy(alpha = 0.2f)),
+ )
+}
+
+// This is just for preview purposes
+@SuppressLint("AppCompatCustomView")
+private class PreviewEditText(context: Context) : EditText(context) {
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+
+ parent?.requestDisallowInterceptTouchEvent(true)
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ override fun onTouchEvent(event: MotionEvent?): Boolean {
+ super.onTouchEvent(event)
+ parent?.requestDisallowInterceptTouchEvent(true)
+ return true
+ }
+
+ override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
+ return super.dispatchTouchEvent(event)
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayoutState.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayoutState.kt
new file mode 100644
index 0000000000..eda4cd73b2
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayoutState.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+
+/**
+ * Creates and remembers an [ExpandableBottomSheetLayoutState].
+ */
+@Composable
+fun rememberExpandableBottomSheetLayoutState(): ExpandableBottomSheetLayoutState {
+ return remember { ExpandableBottomSheetLayoutState() }
+}
+
+/**
+ * State for the [ExpandableBottomSheetLayout].
+ *
+ * This state holds the current position of the bottom sheet layout and the percentage of the layout that is being dragged.
+ */
+@Stable
+class ExpandableBottomSheetLayoutState {
+ internal var internalPosition: Position by mutableStateOf(Position.COLLAPSED)
+ internal var internalDraggingPercentage: Float by mutableFloatStateOf(
+ if (internalPosition == Position.EXPANDED) 1f else 0f
+ )
+
+ /**
+ * The current position of the bottom sheet layout.
+ */
+ val position = internalPosition
+
+ /**
+ * The percentage of the bottom sheet layout that is currently being dragged.
+ * This value ranges from `0f` for [Position.COLLAPSED] to `1f` for [Position.EXPANDED].
+ */
+ val draggingPercentage = internalDraggingPercentage
+
+ /**
+ * The position of the bottom sheet layout.
+ */
+ enum class Position {
+ /** The bottom sheet is collapsed to its minimum visible height. */
+ COLLAPSED,
+
+ /** The bottom sheet is being dragged by user input. */
+ DRAGGING,
+
+ /** The bottom sheet is expanded to its maximum visible height. */
+ EXPANDED
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt
index 106e52d350..db7ef62483 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt
@@ -9,33 +9,25 @@ package io.element.android.libraries.designsystem.components.avatar
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.SideEffect
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
-import coil3.compose.AsyncImagePainter
-import coil3.compose.SubcomposeAsyncImage
-import coil3.compose.SubcomposeAsyncImageContent
-import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
+import io.element.android.libraries.designsystem.components.avatar.internal.RoomAvatar
+import io.element.android.libraries.designsystem.components.avatar.internal.SpaceAvatar
+import io.element.android.libraries.designsystem.components.avatar.internal.UserAvatar
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.utils.CommonDrawables
-import timber.log.Timber
@Composable
fun Avatar(
avatarData: AvatarData,
+ avatarType: AvatarType,
modifier: Modifier = Modifier,
contentDescription: String? = null,
// If not null, will be used instead of the size from avatarData
@@ -43,78 +35,33 @@ fun Avatar(
// If true, will show initials even if avatarData.url is not null
hideImage: Boolean = false,
) {
- if (avatarData.url.isNullOrBlank() || hideImage) {
- InitialLetterAvatar(
+ when (avatarType) {
+ is AvatarType.Room -> RoomAvatar(
avatarData = avatarData,
- forcedAvatarSize = forcedAvatarSize,
+ avatarType = avatarType,
modifier = modifier,
+ hideAvatarImage = hideImage,
+ forcedAvatarSize = forcedAvatarSize,
contentDescription = contentDescription,
)
- } else {
- ImageAvatar(
+ AvatarType.User -> UserAvatar(
avatarData = avatarData,
- forcedAvatarSize = forcedAvatarSize,
modifier = modifier,
contentDescription = contentDescription,
+ forcedAvatarSize = forcedAvatarSize,
+ hideImage = hideImage,
+ )
+ is AvatarType.Space -> SpaceAvatar(
+ avatarData = avatarData,
+ avatarType = avatarType,
+ modifier = modifier,
+ hideAvatarImage = hideImage,
+ forcedAvatarSize = forcedAvatarSize,
+ contentDescription = contentDescription,
)
}
}
-@Composable
-private fun ImageAvatar(
- avatarData: AvatarData,
- forcedAvatarSize: Dp?,
- modifier: Modifier = Modifier,
- contentDescription: String? = null,
-) {
- val size = forcedAvatarSize ?: avatarData.size.dp
- SubcomposeAsyncImage(
- model = avatarData,
- contentDescription = contentDescription,
- contentScale = ContentScale.Crop,
- modifier = modifier
- .size(size)
- .clip(CircleShape)
- ) {
- val collectedState by painter.state.collectAsState()
- when (val state = collectedState) {
- is AsyncImagePainter.State.Success -> SubcomposeAsyncImageContent()
- is AsyncImagePainter.State.Error -> {
- SideEffect {
- Timber.e(state.result.throwable, "Error loading avatar $state\n${state.result}")
- }
- InitialLetterAvatar(
- avatarData = avatarData,
- forcedAvatarSize = forcedAvatarSize,
- contentDescription = contentDescription,
- )
- }
- else -> InitialLetterAvatar(
- avatarData = avatarData,
- forcedAvatarSize = forcedAvatarSize,
- contentDescription = contentDescription,
- )
- }
- }
-}
-
-@Composable
-private fun InitialLetterAvatar(
- avatarData: AvatarData,
- forcedAvatarSize: Dp?,
- contentDescription: String?,
- modifier: Modifier = Modifier,
-) {
- val avatarColors = AvatarColorsProvider.provide(avatarData.id)
- TextAvatar(
- text = avatarData.initialLetter,
- size = forcedAvatarSize ?: avatarData.size.dp,
- colors = avatarColors,
- contentDescription = contentDescription,
- modifier = modifier
- )
-}
-
@Preview(group = PreviewGroup.Avatars)
@Composable
internal fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) =
@@ -125,7 +72,10 @@ internal fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarDa
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
- Avatar(avatarData)
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Text(text = avatarData.size.name + " " + avatarData.size.dp)
}
}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt
index ea9e749baf..3c209df2cf 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarDataProvider.kt
@@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
open class AvatarDataProvider : PreviewParameterProvider {
override val values: Sequence
- get() = AvatarSize.values()
+ get() = AvatarSize.entries
.asSequence()
.map {
sequenceOf(
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.kt
new file mode 100644
index 0000000000..c4c2c77766
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar
+
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+
+@Composable
+fun AvatarType.User.avatarShape() = CircleShape
+
+@Composable
+fun AvatarType.Room.avatarShape() = CircleShape
+
+@Composable
+fun AvatarType.Space.avatarShape(avatarSize: Dp) = RoundedCornerShape(avatarSize * 0.25f)
+
+@Composable
+fun AvatarType.avatarShape(avatarSize: Dp): Shape {
+ return when (this) {
+ is AvatarType.Space -> avatarShape(avatarSize)
+ is AvatarType.Room -> avatarShape()
+ is AvatarType.User -> avatarShape()
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt
new file mode 100644
index 0000000000..6d99574a55
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2023, 2024 New Vector 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.designsystem.components.avatar
+
+import androidx.compose.runtime.Immutable
+import kotlinx.collections.immutable.ImmutableList
+import kotlinx.collections.immutable.persistentListOf
+
+@Immutable
+sealed interface AvatarType {
+ data object User : AvatarType
+
+ data class Room(
+ val isTombstoned: Boolean = false,
+ val heroes: ImmutableList = persistentListOf(),
+ ) : AvatarType
+
+ data class Space(
+ val isTombstoned: Boolean = false,
+ ) : AvatarType
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt
index 7b4e6dee86..f4d05d3fcd 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.CompositingStrategy
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.LayoutDirection
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
@@ -30,6 +31,7 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.text.toPx
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
+import io.element.android.libraries.ui.strings.CommonStrings
/** Ratio between the box size (120 on Figma) and the avatar size (75 on Figma). */
private const val SIZE_RATIO = 1.6f
@@ -55,6 +57,8 @@ fun DmAvatars(
// Draw user avatar and cut top end corner
Avatar(
avatarData = userAvatarData,
+ avatarType = AvatarType.User,
+ contentDescription = userAvatarData.url?.let { stringResource(CommonStrings.a11y_your_avatar) },
modifier = Modifier
.align(Alignment.BottomStart)
.graphicsLayer {
@@ -78,17 +82,25 @@ fun DmAvatars(
)
}
.clip(CircleShape)
- .clickable(enabled = userAvatarData.url != null) {
+ .clickable(
+ enabled = userAvatarData.url != null,
+ onClickLabel = stringResource(CommonStrings.action_view),
+ ) {
userAvatarData.url?.let { openAvatarPreview(it) }
}
)
// Draw other user avatar
Avatar(
avatarData = otherUserAvatarData,
+ avatarType = AvatarType.User,
+ contentDescription = otherUserAvatarData.url?.let { stringResource(CommonStrings.a11y_other_user_avatar) },
modifier = Modifier
.align(Alignment.TopEnd)
.clip(CircleShape)
- .clickable(enabled = otherUserAvatarData.url != null) {
+ .clickable(
+ enabled = otherUserAvatarData.url != null,
+ onClickLabel = stringResource(CommonStrings.action_view),
+ ) {
otherUserAvatarData.url?.let { openOtherAvatarPreview(it) }
}
.testTag(TestTags.memberDetailAvatar)
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarCluster.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt
similarity index 66%
rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarCluster.kt
rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt
index 9c7efa864d..c100988053 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarCluster.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt
@@ -5,10 +5,11 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.libraries.designsystem.components.avatar
+package io.element.android.libraries.designsystem.components.avatar.internal
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.size
@@ -19,6 +20,10 @@ import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.anAvatarData
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
import kotlinx.collections.immutable.ImmutableList
@@ -31,8 +36,9 @@ import kotlin.math.sin
private const val MAX_AVATAR_COUNT = 4
@Composable
-fun AvatarCluster(
+internal fun AvatarCluster(
avatars: ImmutableList,
+ avatarType: AvatarType,
modifier: Modifier = Modifier,
hideAvatarImages: Boolean = false,
contentDescription: String? = null,
@@ -48,11 +54,13 @@ fun AvatarCluster(
error("Unsupported number of avatars: 0")
}
1 -> {
- Avatar(
+ InitialOrImageAvatar(
avatarData = limitedAvatars[0],
+ hideAvatarImage = hideAvatarImages,
+ avatarShape = avatarType.avatarShape(limitedAvatars[0].size.dp),
+ forcedAvatarSize = null,
modifier = modifier,
contentDescription = contentDescription,
- hideImage = hideAvatarImages
)
}
else -> {
@@ -78,10 +86,10 @@ fun AvatarCluster(
}
Box(
modifier = modifier
- .size(size.dp)
- .semantics {
- this.contentDescription = contentDescription.orEmpty()
- },
+ .size(size.dp)
+ .semantics {
+ this.contentDescription = contentDescription.orEmpty()
+ },
contentAlignment = Alignment.Center,
) {
limitedAvatars.forEachIndexed { index, heroAvatar ->
@@ -89,16 +97,19 @@ fun AvatarCluster(
val yOffset = (offsetRadius * sin(angle * index.toDouble() + angleOffset)).dp
Box(
modifier = Modifier
- .size(heroAvatarSize)
- .offset(
- x = xOffset,
- y = yOffset,
- )
+ .size(heroAvatarSize)
+ .offset(
+ x = xOffset,
+ y = yOffset,
+ )
) {
- Avatar(
+ InitialOrImageAvatar(
avatarData = heroAvatar,
+ hideAvatarImage = hideAvatarImages,
+ avatarShape = avatarType.avatarShape(heroAvatarSize),
forcedAvatarSize = heroAvatarSize,
- hideImage = hideAvatarImages,
+ modifier = Modifier,
+ contentDescription = contentDescription,
)
}
}
@@ -110,13 +121,24 @@ fun AvatarCluster(
@Preview(group = PreviewGroup.Avatars)
@Composable
internal fun AvatarClusterPreview() = ElementThemedPreview {
- Row(
- horizontalArrangement = Arrangement.spacedBy(8.dp)
+ Column(
+ verticalArrangement = Arrangement.spacedBy(8.dp),
) {
- for (ngOfAvatars in 1..5) {
- AvatarCluster(
- avatars = List(ngOfAvatars) { anAvatarData(it) }.toPersistentList(),
- )
+ listOf(
+ AvatarType.User,
+ AvatarType.Room(),
+ AvatarType.Space(),
+ ).forEach { avatarType ->
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ for (ngOfAvatars in 1..5) {
+ AvatarCluster(
+ avatars = List(ngOfAvatars) { anAvatarData(it) }.toPersistentList(),
+ avatarType = avatarType,
+ )
+ }
+ }
}
}
}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt
new file mode 100644
index 0000000000..db30a94830
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar.internal
+
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.unit.Dp
+import coil3.compose.AsyncImagePainter
+import coil3.compose.SubcomposeAsyncImage
+import coil3.compose.SubcomposeAsyncImageContent
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import timber.log.Timber
+
+@Composable
+internal fun ImageAvatar(
+ avatarData: AvatarData,
+ avatarShape: Shape,
+ forcedAvatarSize: Dp?,
+ modifier: Modifier = Modifier,
+ contentDescription: String? = null,
+) {
+ val size = forcedAvatarSize ?: avatarData.size.dp
+ SubcomposeAsyncImage(
+ model = avatarData,
+ contentDescription = contentDescription,
+ contentScale = ContentScale.Companion.Crop,
+ modifier = modifier
+ .size(size)
+ .clip(avatarShape)
+ ) {
+ val collectedState by painter.state.collectAsState()
+ when (val state = collectedState) {
+ is AsyncImagePainter.State.Success -> SubcomposeAsyncImageContent()
+ is AsyncImagePainter.State.Error -> {
+ SideEffect {
+ Timber.Forest.e(
+ state.result.throwable,
+ "Error loading avatar $state\n${state.result}"
+ )
+ }
+ InitialLetterAvatar(
+ avatarData = avatarData,
+ avatarShape = avatarShape,
+ forcedAvatarSize = forcedAvatarSize,
+ contentDescription = contentDescription,
+ )
+ }
+ else -> InitialLetterAvatar(
+ avatarData = avatarData,
+ avatarShape = avatarShape,
+ forcedAvatarSize = forcedAvatarSize,
+ contentDescription = contentDescription,
+ )
+ }
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt
new file mode 100644
index 0000000000..6503917b23
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar.internal
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+
+@Composable
+internal fun InitialLetterAvatar(
+ avatarData: AvatarData,
+ avatarShape: Shape,
+ forcedAvatarSize: Dp?,
+ contentDescription: String?,
+ modifier: Modifier = Modifier,
+) {
+ val avatarColors = AvatarColorsProvider.provide(avatarData.id)
+ TextAvatar(
+ text = avatarData.initialLetter,
+ size = forcedAvatarSize ?: avatarData.size.dp,
+ avatarShape = avatarShape,
+ colors = avatarColors,
+ contentDescription = contentDescription,
+ modifier = modifier
+ )
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt
new file mode 100644
index 0000000000..3111048d3b
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar.internal
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+
+@Composable
+internal fun InitialOrImageAvatar(
+ avatarData: AvatarData,
+ hideAvatarImage: Boolean,
+ forcedAvatarSize: Dp?,
+ avatarShape: Shape,
+ contentDescription: String?,
+ modifier: Modifier = Modifier,
+) {
+ when {
+ avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar(
+ avatarData = avatarData,
+ avatarShape = avatarShape,
+ forcedAvatarSize = forcedAvatarSize,
+ modifier = modifier,
+ contentDescription = contentDescription,
+ )
+ else -> ImageAvatar(
+ avatarData = avatarData,
+ avatarShape = avatarShape,
+ forcedAvatarSize = forcedAvatarSize,
+ modifier = modifier,
+ contentDescription = contentDescription,
+ )
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/RoomAvatar.kt
similarity index 51%
rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt
rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/RoomAvatar.kt
index 44d1c9b491..9fd2ff8cca 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/RoomAvatar.kt
@@ -5,40 +5,48 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.libraries.designsystem.components.avatar
+package io.element.android.libraries.designsystem.components.avatar.internal
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-import kotlinx.collections.immutable.ImmutableList
+import androidx.compose.ui.unit.Dp
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
@Composable
-fun RoomAvatar(
+internal fun RoomAvatar(
avatarData: AvatarData,
- heroes: ImmutableList,
+ avatarType: AvatarType.Room,
modifier: Modifier = Modifier,
- isTombstoned: Boolean = false,
hideAvatarImage: Boolean = false,
+ forcedAvatarSize: Dp? = null,
contentDescription: String? = null,
) {
when {
- isTombstoned -> {
+ avatarType.isTombstoned -> {
TombstonedRoomAvatar(
- size = avatarData.size,
+ size = forcedAvatarSize ?: avatarData.size.dp,
modifier = modifier,
+ avatarShape = avatarType.avatarShape(),
contentDescription = contentDescription
)
}
- avatarData.url != null || heroes.isEmpty() -> {
- Avatar(
+ avatarData.url != null || avatarType.heroes.isEmpty() -> {
+ InitialOrImageAvatar(
avatarData = avatarData,
+ hideAvatarImage = hideAvatarImage,
+ avatarShape = avatarType.avatarShape(),
+ forcedAvatarSize = forcedAvatarSize,
modifier = modifier,
contentDescription = contentDescription,
- hideImage = hideAvatarImage
)
}
else -> {
AvatarCluster(
- avatars = heroes,
+ avatars = avatarType.heroes,
+ // Note: even for a room avatar, we use UserAvatarType here to display the avatar of heroes
+ avatarType = AvatarType.User,
modifier = modifier,
hideAvatarImages = hideAvatarImage,
contentDescription = contentDescription
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt
new file mode 100644
index 0000000000..b8880744c9
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar.internal
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.anAvatarData
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
+import io.element.android.libraries.designsystem.preview.ElementThemedPreview
+import io.element.android.libraries.designsystem.preview.PreviewGroup
+import io.element.android.libraries.designsystem.utils.CommonDrawables
+
+@Composable
+internal fun SpaceAvatar(
+ avatarData: AvatarData,
+ avatarType: AvatarType.Space,
+ modifier: Modifier = Modifier,
+ forcedAvatarSize: Dp? = null,
+ hideAvatarImage: Boolean = false,
+ contentDescription: String? = null,
+) {
+ val size = forcedAvatarSize ?: avatarData.size.dp
+ when {
+ avatarType.isTombstoned -> TombstonedRoomAvatar(
+ size = size,
+ avatarShape = avatarType.avatarShape(size),
+ modifier = modifier,
+ contentDescription = contentDescription,
+ )
+ else -> InitialOrImageAvatar(
+ avatarData = avatarData,
+ hideAvatarImage = hideAvatarImage,
+ avatarShape = avatarType.avatarShape(size),
+ forcedAvatarSize = forcedAvatarSize,
+ modifier = modifier,
+ contentDescription = contentDescription,
+ )
+ }
+}
+
+@Preview(group = PreviewGroup.Avatars)
+@Composable
+internal fun SpaceAvatarPreview() =
+ ElementThemedPreview(
+ drawableFallbackForImages = CommonDrawables.sample_avatar,
+ ) {
+ Row(
+ modifier = Modifier.padding(8.dp),
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ ) {
+ SpaceAvatar(
+ avatarData = anAvatarData(),
+ avatarType = AvatarType.Space(),
+ )
+ SpaceAvatar(
+ avatarData = anAvatarData(),
+ avatarType = AvatarType.Space(
+ isTombstoned = true,
+ ),
+ )
+ }
+ }
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TextAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt
similarity index 67%
rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TextAvatar.kt
rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt
index 65ebba3366..f44319fece 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TextAvatar.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt
@@ -5,16 +5,19 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.libraries.designsystem.components.avatar
+package io.element.android.libraries.designsystem.components.avatar.internal
import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.tooling.preview.Preview
@@ -23,6 +26,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.element.android.compound.theme.AvatarColors
import io.element.android.compound.theme.ElementTheme
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.text.toSp
@@ -34,12 +39,13 @@ internal fun TextAvatar(
size: Dp,
colors: AvatarColors,
contentDescription: String?,
+ avatarShape: Shape,
modifier: Modifier = Modifier,
) {
Box(
modifier
.size(size)
- .clip(CircleShape)
+ .clip(avatarShape)
.background(color = colors.background)
) {
val fontSize = size.toSp() / 2
@@ -64,13 +70,25 @@ internal fun TextAvatar(
@Preview(group = PreviewGroup.Avatars)
@Composable
internal fun TextAvatarPreview() = ElementPreview {
- TextAvatar(
- text = "AB",
- size = 40.dp,
- colors = AvatarColors(
- background = ElementTheme.colors.bgSubtlePrimary,
- foreground = ElementTheme.colors.iconPrimary,
- ),
- contentDescription = null,
- )
+ Row(
+ modifier = Modifier.padding(8.dp),
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ ) {
+ listOf(
+ AvatarType.User,
+ AvatarType.Room(),
+ AvatarType.Space(),
+ ).forEach { avatarType ->
+ TextAvatar(
+ text = "AB",
+ size = 40.dp,
+ colors = AvatarColors(
+ background = ElementTheme.colors.bgSubtlePrimary,
+ foreground = ElementTheme.colors.iconPrimary,
+ ),
+ avatarShape = avatarType.avatarShape(40.dp),
+ contentDescription = null,
+ )
+ }
}
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TombstonedRoomAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TombstonedRoomAvatar.kt
similarity index 73%
rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TombstonedRoomAvatar.kt
rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TombstonedRoomAvatar.kt
index fe09be909d..b712ff9fb1 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/TombstonedRoomAvatar.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TombstonedRoomAvatar.kt
@@ -5,31 +5,37 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.libraries.designsystem.components.avatar
+package io.element.android.libraries.designsystem.components.avatar.internal
+import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.AvatarColors
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
@Composable
-fun TombstonedRoomAvatar(
- size: AvatarSize,
+internal fun TombstonedRoomAvatar(
+ size: Dp,
+ avatarShape: Shape,
modifier: Modifier = Modifier,
contentDescription: String? = null,
) {
TextAvatar(
text = "!",
- size = size.dp,
+ size = size,
colors = AvatarColors(
background = ElementTheme.colors.bgSubtlePrimary,
foreground = ElementTheme.colors.iconTertiary
),
modifier = modifier,
- contentDescription = contentDescription
+ avatarShape = avatarShape,
+ contentDescription = contentDescription,
)
}
@@ -37,7 +43,8 @@ fun TombstonedRoomAvatar(
@Composable
internal fun TombstonedRoomAvatarPreview() = ElementPreview {
TombstonedRoomAvatar(
- size = AvatarSize.RoomListItem,
+ size = 52.dp,
+ avatarShape = CircleShape,
contentDescription = null,
)
}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt
new file mode 100644
index 0000000000..ad0275593d
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.components.avatar.internal
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
+
+@Composable
+internal fun UserAvatar(
+ avatarData: AvatarData,
+ modifier: Modifier = Modifier,
+ contentDescription: String? = null,
+ forcedAvatarSize: Dp? = null,
+ hideImage: Boolean = false,
+) {
+ InitialOrImageAvatar(
+ avatarData = avatarData,
+ hideAvatarImage = hideImage,
+ avatarShape = AvatarType.User.avatarShape(),
+ modifier = modifier,
+ contentDescription = contentDescription,
+ forcedAvatarSize = forcedAvatarSize,
+ )
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatarPreview.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatarPreview.kt
similarity index 78%
rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatarPreview.kt
rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatarPreview.kt
index 8797c2750a..d4a629a052 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatarPreview.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatarPreview.kt
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-package io.element.android.libraries.designsystem.components.avatar
+package io.element.android.libraries.designsystem.components.avatar.internal
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -16,6 +16,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.avatarColors
+import io.element.android.libraries.designsystem.components.avatar.Avatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.anAvatarData
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Text
@@ -33,7 +36,10 @@ internal fun UserAvatarColorsPreview() = ElementPreview {
verticalAlignment = Alignment.CenterVertically,
) {
// Note: it's OK, since the hash of "0" is 0, the hash of "1" is 1, etc.
- Avatar(anAvatarData(id = "$it"))
+ Avatar(
+ avatarData = anAvatarData(id = "$it"),
+ avatarType = AvatarType.User,
+ )
Text(text = "Color index $it")
}
}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferencePage.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferencePage.kt
index 40bcfc949b..b81c3e6b86 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferencePage.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferencePage.kt
@@ -21,6 +21,8 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -78,6 +80,9 @@ private fun PreferenceTopAppBar(
},
title = {
Text(
+ modifier = Modifier.semantics {
+ heading()
+ },
text = title,
style = ElementTheme.typography.aliasScreenTitle,
maxLines = 1,
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt
index e0d9c749ec..51a6cd9ee1 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/ModalBottomSheet.kt
@@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
@@ -34,7 +33,6 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewGroup
import io.element.android.libraries.designsystem.preview.sheetStateForPreview
-import io.element.android.libraries.designsystem.utils.LocalUiTestMode
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -54,14 +52,11 @@ fun ModalBottomSheet(
content: @Composable ColumnScope.() -> Unit,
) {
val safeSheetState = if (LocalInspectionMode.current) sheetStateForPreview() else sheetState
- // If we're running in UI test mode, we want to use a different shape to avoid
- // this issue: https://issuetracker.google.com/issues/366255137
- val safeShape = if (LocalUiTestMode.current) RoundedCornerShape(12.dp) else shape
androidx.compose.material3.ModalBottomSheet(
onDismissRequest = onDismissRequest,
modifier = modifier,
sheetState = safeSheetState,
- shape = safeShape,
+ shape = shape,
containerColor = containerColor,
contentColor = contentColor,
tonalElevation = tonalElevation,
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt
new file mode 100644
index 0000000000..9d67f4ec05
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.theme.components
+
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.NavigationBarDefaults
+import androidx.compose.material3.contentColorFor
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
+import io.element.android.compound.theme.ElementTheme
+import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.libraries.designsystem.preview.ElementThemedPreview
+import io.element.android.libraries.designsystem.preview.PreviewGroup
+
+@Composable
+fun NavigationBar(
+ modifier: Modifier = Modifier,
+ containerColor: Color = ElementNavigationBarDefaults.containerColor,
+ contentColor: Color = MaterialTheme.colorScheme.contentColorFor(containerColor),
+ tonalElevation: Dp = ElementNavigationBarDefaults.tonalElevation,
+ windowInsets: WindowInsets = ElementNavigationBarDefaults.windowInsets,
+ content: @Composable RowScope.() -> Unit
+) {
+ androidx.compose.material3.NavigationBar(
+ modifier = modifier,
+ containerColor = containerColor,
+ contentColor = contentColor,
+ tonalElevation = tonalElevation,
+ windowInsets = windowInsets,
+ content = content
+ )
+}
+
+object ElementNavigationBarDefaults {
+ val containerColor: Color
+ @Composable get() = if (ElementTheme.isLightTheme) {
+ ElementTheme.colors.bgSubtlePrimary
+ } else {
+ ElementTheme.colors.textOnSolidPrimary
+ }
+
+ val tonalElevation: Dp = NavigationBarDefaults.Elevation
+
+ val windowInsets: WindowInsets
+ @Composable get() = NavigationBarDefaults.windowInsets
+}
+
+@Preview(group = PreviewGroup.AppBars)
+@Composable
+internal fun NavigationBarPreview() = ElementThemedPreview {
+ NavigationBar {
+ NavigationBarItem(
+ icon = {
+ NavigationBarIcon(
+ imageVector = CompoundIcons.ChatSolid(),
+ count = 5,
+ isCritical = false,
+ )
+ },
+ label = {
+ NavigationBarText(
+ text = "Chats"
+ )
+ },
+ selected = true,
+ onClick = {},
+ )
+ NavigationBarItem(
+ icon = {
+ NavigationBarIcon(
+ imageVector = CompoundIcons.ChatSolid(),
+ count = 5,
+ isCritical = true,
+ )
+ },
+ label = {
+ NavigationBarText(
+ text = "Teams"
+ )
+ },
+ selected = false,
+ onClick = {},
+ )
+ NavigationBarItem(
+ icon = {
+ NavigationBarIcon(
+ imageVector = CompoundIcons.ChatSolid(),
+ count = 0,
+ isCritical = false,
+ )
+ },
+ label = {
+ NavigationBarText(
+ text = "Other"
+ )
+ },
+ selected = false,
+ onClick = {},
+ )
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt
new file mode 100644
index 0000000000..2c2890f854
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.theme.components
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.offset
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
+import io.element.android.compound.theme.ElementTheme
+import io.element.android.libraries.designsystem.atomic.atoms.CounterAtom
+
+@Composable
+fun NavigationBarIcon(
+ imageVector: ImageVector,
+ modifier: Modifier = Modifier,
+ count: Int = 0,
+ isCritical: Boolean = false,
+) {
+ Box(modifier) {
+ Icon(
+ imageVector = imageVector,
+ contentDescription = null,
+ )
+ CounterAtom(
+ modifier = Modifier.offset(11.dp, (-11).dp),
+ textStyle = ElementTheme.typography.fontBodyXsMedium,
+ count = count,
+ isCritical = isCritical,
+ )
+ }
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarItem.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarItem.kt
new file mode 100644
index 0000000000..8c42b932dd
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarItem.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.theme.components
+
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.material3.NavigationBarItem
+import androidx.compose.material3.NavigationBarItemColors
+import androidx.compose.material3.NavigationBarItemDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import io.element.android.compound.theme.ElementTheme
+
+@Composable
+fun RowScope.NavigationBarItem(
+ selected: Boolean,
+ onClick: () -> Unit,
+ icon: @Composable () -> Unit,
+ modifier: Modifier = Modifier,
+ enabled: Boolean = true,
+ label: @Composable (() -> Unit)? = null,
+ alwaysShowLabel: Boolean = true,
+ colors: NavigationBarItemColors = ElementNavigationBarItemDefaults.colors(),
+ interactionSource: MutableInteractionSource? = null
+) {
+ NavigationBarItem(
+ selected = selected,
+ onClick = onClick,
+ icon = icon,
+ modifier = modifier,
+ enabled = enabled,
+ label = label,
+ alwaysShowLabel = alwaysShowLabel,
+ colors = colors,
+ interactionSource = interactionSource,
+ )
+}
+
+object ElementNavigationBarItemDefaults {
+ @Composable
+ fun colors() = NavigationBarItemDefaults.colors().copy(
+ selectedIconColor = ElementTheme.colors.iconPrimary,
+ selectedTextColor = ElementTheme.colors.textPrimary,
+ unselectedIconColor = ElementTheme.colors.iconTertiary,
+ unselectedTextColor = ElementTheme.colors.textDisabled,
+ selectedIndicatorColor = Color.Companion.Transparent,
+ )
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt
new file mode 100644
index 0000000000..826c99f743
--- /dev/null
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2025 New Vector 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.designsystem.theme.components
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import io.element.android.compound.theme.ElementTheme
+
+@Composable
+fun NavigationBarText(
+ text: String,
+ modifier: Modifier = Modifier,
+) {
+ Text(
+ modifier = modifier,
+ text = text,
+ style = ElementTheme.typography.fontBodySmMedium,
+ )
+}
diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TopAppBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TopAppBar.kt
index e5daeb123b..3087f8f5f0 100644
--- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TopAppBar.kt
+++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/TopAppBar.kt
@@ -17,13 +17,66 @@ import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.preview.PreviewGroup
+import io.element.android.libraries.designsystem.theme.aliasScreenTitle
+/**
+ * A top app bar that displays a title string, navigation icon, and actions.
+ * @param titleStr The title string to display in the top app bar.
+ * @param modifier The [Modifier] to be applied to this top app bar.
+ * @param navigationIcon The content to display as the navigation icon.
+ * @param actions The content to display in the action area of the top app bar.
+ * @param windowInsets The window insets to apply to this top app bar.
+ * @param colors The colors used for this top app bar.
+ * @param scrollBehavior Optional scroll behavior for this top app bar.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun TopAppBar(
+ titleStr: String,
+ modifier: Modifier = Modifier,
+ navigationIcon: @Composable () -> Unit = {},
+ actions: @Composable RowScope.() -> Unit = {},
+ windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
+ colors: TopAppBarColors = TopAppBarDefaults.topAppBarColors(),
+ scrollBehavior: TopAppBarScrollBehavior? = null
+) {
+ TopAppBar(
+ title = {
+ Text(
+ text = titleStr,
+ modifier = Modifier.semantics { heading() },
+ style = ElementTheme.typography.aliasScreenTitle,
+ )
+ },
+ modifier = modifier,
+ navigationIcon = navigationIcon,
+ actions = actions,
+ windowInsets = windowInsets,
+ colors = colors,
+ scrollBehavior = scrollBehavior,
+ )
+}
+
+/**
+ * A top app bar that displays a title, navigation icon, and actions.
+ *
+ * @param title The content to display as the title of the top app bar. Do not forget to apply `heading()` to
+ * the semantics of the title to ensure it is announced correctly by accessibility services.
+ * @param modifier The [Modifier] to be applied to this top app bar.
+ * @param navigationIcon The content to display as the navigation icon.
+ * @param actions The content to display in the action area of the top app bar.
+ * @param windowInsets The window insets to apply to this top app bar.
+ * @param colors The colors used for this top app bar.
+ * @param scrollBehavior Optional scroll behavior for this top app bar.
+ */
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopAppBar(
@@ -68,3 +121,22 @@ internal fun TopAppBarPreview() = ElementThemedPreview {
}
)
}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Preview(group = PreviewGroup.AppBars)
+@Composable
+internal fun TopAppBarStrPreview() = ElementThemedPreview {
+ TopAppBar(
+ titleStr = "Title string",
+ navigationIcon = { BackButton(onClick = {}) },
+ actions = {
+ TextButton(text = "Action", onClick = {})
+ IconButton(onClick = {}) {
+ Icon(
+ imageVector = CompoundIcons.ShareAndroid(),
+ contentDescription = null,
+ )
+ }
+ }
+ )
+}
diff --git a/libraries/encrypted-db/consumer-proguard-rules.pro b/libraries/encrypted-db/consumer-proguard-rules.pro
index 5d01f21e9b..f1b424510d 100644
--- a/libraries/encrypted-db/consumer-proguard-rules.pro
+++ b/libraries/encrypted-db/consumer-proguard-rules.pro
@@ -19,7 +19,3 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-
-# Prevent ProGuard from renaming internal SQLCipher classes, which breaks the library.
-# From https://github.com/sqlcipher/android-database-sqlcipher#proguard
--keep class net.sqlcipher.** { *; }
diff --git a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt
index c1c2c6eb2a..172e4b5285 100644
--- a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt
+++ b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt
@@ -13,10 +13,10 @@ import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import io.element.encrypteddb.passphrase.PassphraseProvider
-import net.sqlcipher.database.SupportFactory
+import net.zetetic.database.sqlcipher.SupportOpenHelperFactory
/**
- * Creates an encrypted version of the [SqlDriver] using SQLCipher's [SupportFactory].
+ * Creates an encrypted version of the [SqlDriver] using SQLCipher's [SupportOpenHelperFactory].
* @param passphraseProvider Provides the passphrase needed to use the SQLite database with SQLCipher.
*/
class SqlCipherDriverFactory(
@@ -29,8 +29,9 @@ class SqlCipherDriverFactory(
* @param context Android [Context], used to instantiate the driver.
*/
fun create(schema: SqlSchema>, name: String, context: Context): SqlDriver {
+ System.loadLibrary("sqlcipher")
val passphrase = passphraseProvider.getPassphrase()
- val factory = SupportFactory(passphrase)
+ val factory = SupportOpenHelperFactory(passphrase)
return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory)
}
}
diff --git a/libraries/eventformatter/impl/src/main/res/values-bg/translations.xml b/libraries/eventformatter/impl/src/main/res/values-bg/translations.xml
index 3a5a3d1830..b1f3fe1f11 100644
--- a/libraries/eventformatter/impl/src/main/res/values-bg/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-bg/translations.xml
@@ -22,9 +22,9 @@
"%1$s ви покани"
"%1$s се присъедини към стаята"
"Вие се присъединихте към стаята"
- "%1$s поиска да се присъедини"
- "%1$s позволи на %2$s да се присъедини"
- "%1$s ви позволи да се присъедините"
+ "%1$s иска да се присъедини"
+ "%1$s получи достъп до %2$s"
+ "Вие позволихте на %1$s да се присъедини"
"Вие поискахте да се присъедините"
"%1$s вече не се интересува от присъединяване"
"%1$s напусна стаята"
@@ -35,6 +35,10 @@
"Вие премахнахте името на стаята"
"%1$s не направи промени"
"Не направихте промени"
+ "%1$s промени закачените съобщения"
+ "Вие променихте закачените съобщения"
+ "%1$s закачи съобщение"
+ "Вие закачихте съобщение"
"%1$s отхвърли поканата"
"Вие отхвърлихте поканата"
"%1$s премахна %2$s"
diff --git a/libraries/eventformatter/impl/src/main/res/values-da/translations.xml b/libraries/eventformatter/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..db3be216f7
--- /dev/null
+++ b/libraries/eventformatter/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,73 @@
+
+
+ "(avataren blev også ændret)"
+ "%1$s ændrede sin avatar"
+ "Du har ændret din avatar"
+ "%1$s blev nedgraderet til medlem"
+ "%1$s blev nedgraderet til moderator"
+ "%1$s ændrede sit viste navn fra %2$s til %3$s"
+ "Du har ændret dit viste navn fra %1$s til %2$s"
+ "%1$s fjernede sit viste navn (det var %2$s )"
+ "Du fjernede dit viste navn (det var%1$s)"
+ "%1$s har sat deres visningsnavn til %2$s"
+ "Du har indstillet dit viste navn til %1$s"
+ "%1$s blev forfremmet til admin"
+ "%1$s blev forfremmet til moderator"
+ "%1$s ændrede rummets avatar"
+ "Du ændrede rummets avatar"
+ "%1$s fjernede rummets avatar"
+ "Du fjernede rummets avatar"
+ "%1$s bortviste %2$s"
+ "Du bortviste %1$s"
+ "Du spærrede %1$s: %2$s"
+ "%1$s spærrede %2$s: %3$s"
+ "%1$s skabte rummet"
+ "Du skabte rummet"
+ "%1$sinviterede %2$s"
+ "%1$s accepterede invitationen"
+ "Du har accepteret invitationen"
+ "Du inviterede %1$s"
+ "%1$s inviterede dig"
+ "%1$s sluttede sig til rummet"
+ "Du sluttede dig til rummet"
+ "%1$s anmoder om at deltage"
+ "%1$s har givet adgang til %2$s"
+ "Du tillod %1$s at være med"
+ "Du har anmodet om at deltage"
+ "%1$s har afvist %2$ss anmodning om at deltage"
+ "Du har afvist %1$ss anmodning om at deltage"
+ "%1$s afviste din anmodning om at deltage"
+ "%1$s er ikke længere interesseret i at deltage"
+ "Du har annulleret din anmodning om at deltage"
+ "%1$s forlod rummet"
+ "Du forlod rummet"
+ "%1$s ændrede rummets navn til: %2$s"
+ "Du ændrede rummets navn til: %1$s"
+ "%1$s fjernede rummets navn"
+ "Du fjernede rummets navn"
+ "%1$s foretog ingen ændringer"
+ "Du har ikke foretaget nogen ændringer"
+ "%1$s ændrede de fastgjorte beskeder"
+ "Du har ændret de fastgjorte beskeder"
+ "%1$s fastgjorde en besked"
+ "Du har fastgjort en besked"
+ "%1$s frigjorde en besked"
+ "Du frigjorde en besked"
+ "%1$s afviste invitationen"
+ "Du afviste invitationen"
+ "%1$s fjernede %2$s"
+ "Du fjernede %1$s"
+ "Du fjernede %1$s :%2$s"
+ "%1$s fjernede %2$s: %3$s"
+ "%1$s har sendt en invitation til %2$s om at deltage i rummet"
+ "Du har sendt en invitation til %1$s om at deltage i rummet"
+ "%1$s tilbagekaldte invitationen til %2$s om at være med i rummet"
+ "Du tilbagekaldte invitationen til %1$s om at være med i rummet"
+ "%1$s ændrede emnet til: %2$s"
+ "Du har ændret emnet til: %1$s"
+ "%1$s fjernede rummets emne"
+ "Du har fjernet rummets emne"
+ "%1$s ophævede bortvisningen af %2$s"
+ "Du har fjernet bortvisningen af %1$s"
+ "%1$s har foretaget en ukendt ændring af deres medlemskab"
+
diff --git a/libraries/eventformatter/impl/src/main/res/values-el/translations.xml b/libraries/eventformatter/impl/src/main/res/values-el/translations.xml
index 8c89d65ea5..f34016cd67 100644
--- a/libraries/eventformatter/impl/src/main/res/values-el/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-el/translations.xml
@@ -13,21 +13,23 @@
"Όρισες το εμφανιζόμενο όνομά σου σε %1$s"
"Ο χρήστης %1$s προήχθη σε διαχειριστής"
"Ο χρήστης %1$s προήχθη σε συντονιστής"
- "Ο χρήστης %1$s άλλαξε το άβαταρ του δωματίου"
- "Άλλαξες το άβαταρ του δωματίου"
- "Ο χρήστης %1$s αφαίρεσε το άβαταρ του δωματίου"
- "Αφαίρεσες το άβαταρ του δωματίου"
+ "%1$s άλλαξε την εικόνα προφίλ της αίθουσας"
+ "Αλλάξατε την εικόνα προφίλ της αίθουσας"
+ "%1$s αφαίρεσε την εικόνα προφίλ της αίθουσας"
+ "Αφαιρέσατε την εικόνα προφίλ της αίθουσας"
"Ο χρήστης %1$s απέκλεισε τον χρήστη %2$s"
"Απέκλεισες τον χρήστη %1$s"
- "Ο χρήστης %1$s δημιούργησε το δωμάτιο"
- "Εσύ δημιούργησες το δωμάτιο"
+ "Απέκλεισες %1$s: %2$s"
+ "%1$s απέκλεισε %2$s: %3$s"
+ "%1$s δημιούργησε την αίθουσα"
+ "Δημιουργήσατε την αίθουσα"
"Ο χρήστης %1$s προσκάλεσε τον χρήστη %2$s"
"Ο χρήστης %1$s αποδέχτηκε την πρόσκληση"
"Αποδέχτηκες την πρόσκληση"
"Προσκάλεσες τον χρήστη %1$s"
"Ο χρήστης %1$s σέ προσκάλεσε"
- "Ο χρήστης %1$s συμμετέχει στο δωμάτιο"
- "Μπήκες στο δωμάτιο"
+ "%1$s εντάχθηκε στην αίθουσα"
+ "Ενταχθήκατε στην αίθουσα"
"Ο χρήστης %1$s ζητάει να συμμετάσχει"
"Ο χρήστης %1$s επέτρεψε τον χρήστη %2$s"
"Επέστρεψες στον χρήστη%1$s να συμμετάσχει"
@@ -37,12 +39,12 @@
"Ο χρήστης %1$s απέρριψε το αίτημά σου για συμμετοχή"
"Ο χρήστης %1$s δεν ενδιαφέρεται πλέον να συμμετάσχει"
"Ακύρωσες το αίτημά σου για συμμετοχή"
- "Ο χρήστης %1$s αποχώρησε από το δωμάτιο"
- "Έφυγες από το δωμάτιο"
- "Ο χρήστης %1$s άλλαξε το όνομα του δωματίου σε: %2$s"
- "Άλλαξες το όνομα του δωματίου σε: %1$s"
- "Ο χρήστης %1$s αφαίρεσε το όνομα του δωματίου"
- "Αφαίρεσες το όνομα του δωματίου"
+ "%1$s αποχώρησε από την αίθουσα"
+ "Αποχωρήσατε από την αίθουσα"
+ "%1$s άλλαξε το όνομα της αίθουσας σε: %2$s"
+ "Αλλάξατε το όνομα της αίθουσας σε: %1$s"
+ "%1$s αφαίρεσε το όνομα της αίθουσας"
+ "Αφαιρέσατε το όνομα της αίθουσας"
"Ο χρήστης %1$s δεν έκανε καμία αλλαγή"
"Δεν έκανες καμία αλλαγή"
"Ο χρήστης %1$s άλλαξε τα καρφιτσωμένα μηνύματα"
@@ -55,14 +57,16 @@
"Απέρριψες την πρόσκληση"
"Ο χρήστης %1$s αφαίρεσε τον χρήστη %2$s"
"Αφαίρεσες τον χρήστη %1$s"
- "Ο χρήστης %1$s έστειλε πρόσκληση στον χρήστη %2$s για συμμετοχή στο δωμάτιο"
- "Στείλατε μια πρόσκληση στον χρήστη %1$s για να γίνει μέλος στο δωμάτιο"
- "Ο χρήστης %1$s ανακάλεσε την πρόσκληση συμμετοχής του χρήστη %2$s στο δωμάτιο"
- "Ανακάλεσες την πρόσκληση για συμμετοχή του χρήστη %1$s στο δωμάτιο"
+ "Αφαίρεσες %1$s: %2$s"
+ "%1$s αφαιρέθηκε %2$s: %3$s"
+ "%1$s έστειλε πρόσκληση στον χρήστη %2$s για ένταξη στην αίθουσα"
+ "Στείλατε πρόσκληση στον χρήστη %1$s για να ενταχθεί στην αίθουσα"
+ "%1$s ανακάλεσε την πρόσκληση στον χρήστη %2$s για να ενταχθεί στην αίθουσα"
+ "Ανακαλέσατε την πρόσκληση για ένταξη του χρήστη %1$s στην αίθουσα"
"Ο χρήστης %1$s άλλαξε το θέμα σε: %2$s"
"Άλλαξες το θέμα σε: %1$s"
- "Ο χρήστης %1$s αφαίρεσε το θέμα του δωματίου"
- "Αφαίρεσες το θέμα του δωματίου"
+ "%1$s αφαίρεσε το θέμα της αίθουσας"
+ "Αφαιρέσατε το θέμα της αίθουσας"
"Ο χρήστης %1$s έκανε άρση αποκλεισμού στον χρήστη %2$s"
"Έκανες άρση αποκλεισμού στον χρήστη %1$s"
"Ο χρήστης %1$s έκανε μια άγνωστη αλλαγή στην ιδιότητα μέλους του."
diff --git a/libraries/eventformatter/impl/src/main/res/values-in/translations.xml b/libraries/eventformatter/impl/src/main/res/values-in/translations.xml
index 3430b05813..89da513f91 100644
--- a/libraries/eventformatter/impl/src/main/res/values-in/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-in/translations.xml
@@ -19,6 +19,8 @@
"Anda menghapus avatar ruangan"
"%1$s memblokir %2$s"
"Anda memblokir %1$s"
+ "Anda mencekal %1$s: %2$s"
+ "%1$s mencekal %2$s: %3$s"
"%1$s membuat ruangan"
"Anda membuat ruangan"
"%1$s mengundang %2$s"
@@ -55,6 +57,8 @@
"Anda menolak undangan"
"%1$s mengeluarkan %2$s"
"Anda mengeluarkan %1$s"
+ "Anda menghapus %1$s: %2$s"
+ "%1$s menghapus %2$s: %3$s"
"%1$s mengirimkan undangan kepada %2$s untuk bergabung ke ruangan"
"Anda mengirimkan undangan kepada %1$s untuk bergabung ke ruangan"
"%1$s menghapus undangan kepada %2$s untuk bergabung ke ruangan"
diff --git a/libraries/eventformatter/impl/src/main/res/values-it/translations.xml b/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
index 1b7709dcb4..d4b96e5c0e 100644
--- a/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
@@ -19,6 +19,8 @@
"Hai rimosso l\'avatar della stanza"
"%1$s ha escluso %2$s"
"Hai escluso %1$s"
+ "Hai bannato %1$s: %2$s"
+ "%1$s ha bannato %2$s: %3$s"
"%1$s ha creato la stanza"
"Hai creato la stanza"
"%1$s ha invitato %2$s"
@@ -55,6 +57,8 @@
"Hai rifiutato l\'invito"
"%1$s ha rimosso %2$s"
"Hai rimosso %1$s"
+ "Hai rimosso%1$s: %2$s"
+ "%1$s ha rimosso %2$s: %3$s"
"%1$s ha inviato un invito a %2$s per unirsi alla stanza"
"Hai inviato un invito a %1$s per unirsi alla stanza"
"%1$s ha revocato l\'invito di %2$s ad unirsi alla stanza."
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 00ab0fb57c..81c33318c1 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
@@ -130,6 +130,13 @@ enum class FeatureFlags(
defaultValue = { false },
isFinished = false,
),
+ Space(
+ key = "feature.space",
+ title = "Spaces",
+ description = "Spaces are under active development, only developers should enable this flog for now.",
+ defaultValue = { false },
+ isFinished = false,
+ ),
MediaUploadOnSendQueue(
key = "feature.media_upload_through_send_queue",
title = "Media upload through send queue",
diff --git a/libraries/maplibre-compose/build.gradle.kts b/libraries/maplibre-compose/build.gradle.kts
index a2c1b5de1c..756a09c32c 100644
--- a/libraries/maplibre-compose/build.gradle.kts
+++ b/libraries/maplibre-compose/build.gradle.kts
@@ -13,8 +13,10 @@ plugins {
android {
namespace = "io.element.android.libraries.maplibre.compose"
- kotlinOptions {
- freeCompilerArgs += "-Xexplicit-api=strict"
+ kotlin {
+ compilerOptions {
+ explicitApi()
+ }
}
}
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt
index c0005b7cfa..d968ae63de 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt
@@ -19,6 +19,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
@@ -72,6 +73,7 @@ interface MatrixClient {
fun notificationSettingsService(): NotificationSettingsService
fun encryptionService(): EncryptionService
fun roomDirectoryService(): RoomDirectoryService
+ fun mediaPreviewService(): MediaPreviewService
suspend fun getCacheSize(): Long
/**
@@ -164,6 +166,11 @@ interface MatrixClient {
* Check if the user can report a room.
*/
suspend fun canReportRoom(): Boolean
+
+ /**
+ * Return true if Livekit Rtc is supported, i.e. if Element Call is available.
+ */
+ suspend fun isLivekitRtcSupported(): Boolean
}
/**
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt
index 3ea1bddf40..ec5a3d8431 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/analytics/ViewRoomExt.kt
@@ -27,5 +27,5 @@ fun BaseRoom.toAnalyticsViewRoom(
}
private fun BaseRoom.toActiveSpace(): ViewRoom.ActiveSpace {
- return if (info().isPublic) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private
+ return if (info().isPublic == true) ViewRoom.ActiveSpace.Public else ViewRoom.ActiveSpace.Private
}
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt
new file mode 100644
index 0000000000..66a53b3ad3
--- /dev/null
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2025 New Vector 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.matrix.api.media
+
+/**
+ * Configuration for media preview ie. invite avatars and timeline media.
+ */
+data class MediaPreviewConfig(
+ val mediaPreviewValue: MediaPreviewValue,
+ val hideInviteAvatar: Boolean,
+) {
+ companion object {
+ /**
+ * The default config if unknown (no local nor server config).
+ */
+ val DEFAULT = MediaPreviewConfig(
+ mediaPreviewValue = MediaPreviewValue.On,
+ hideInviteAvatar = false
+ )
+ }
+}
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.kt
new file mode 100644
index 0000000000..dffa2d25e4
--- /dev/null
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2025 New Vector 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.matrix.api.media
+
+import kotlinx.coroutines.flow.StateFlow
+
+interface MediaPreviewService {
+ /**
+ * Will fetch the media preview config from the server.
+ */
+ suspend fun fetchMediaPreviewConfig(): Result
+
+ /**
+ * Will emit the media preview config known by the client.
+ * This will emit a new value when received from sync.
+ */
+ val mediaPreviewConfigFlow: StateFlow
+
+ /**
+ * Set the media preview display policy. This will update the value on the server and update the local value when successful.
+ */
+ suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result
+
+ /**
+ * Set the invite avatars display policy. This will update the value on the server and update the local value when successful.
+ */
+ suspend fun setHideInviteAvatars(hide: Boolean): Result
+}
+
+fun MediaPreviewService.getMediaPreviewValue() = mediaPreviewConfigFlow.value.mediaPreviewValue
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt
index 83d6d464d5..25d489a48c 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewValue.kt
@@ -29,6 +29,7 @@ fun MediaPreviewValue.isPreviewEnabled(joinRule: JoinRule?): Boolean {
On -> true
Off -> false
Private -> when (joinRule) {
+ is JoinRule.Private,
is JoinRule.Knock,
is JoinRule.Invite,
is JoinRule.Restricted,
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/BaseRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/BaseRoom.kt
index f6152cf0c6..7e902a66fa 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/BaseRoom.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/BaseRoom.kt
@@ -13,7 +13,7 @@ import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -89,7 +89,7 @@ interface BaseRoom : Closeable {
/**
* Gets the power levels of the room.
*/
- suspend fun powerLevels(): Result
+ suspend fun powerLevels(): Result
/**
* Gets the role of the user with the provided [userId] in the room.
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/JoinedRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/JoinedRoom.kt
index 4528c75b1d..e6d17e27a5 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/JoinedRoom.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/JoinedRoom.kt
@@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
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.knock.KnockRequest
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.timeline.Timeline
@@ -118,9 +118,9 @@ interface JoinedRoom : BaseRoom {
suspend fun updateUsersRoles(changes: List): Result
- suspend fun updatePowerLevels(roomPowerLevels: RoomPowerLevels): Result
+ suspend fun updatePowerLevels(roomPowerLevelsValues: RoomPowerLevelsValues): Result
- suspend fun resetPowerLevels(): Result
+ suspend fun resetPowerLevels(): Result
suspend fun setName(name: String): Result
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 13e2ed44da..261a484fd6 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
@@ -14,10 +14,10 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
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.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.ImmutableList
-import kotlinx.collections.immutable.ImmutableMap
@Immutable
data class RoomInfo(
@@ -28,7 +28,7 @@ data class RoomInfo(
val rawName: String?,
val topic: String?,
val avatarUrl: String?,
- val isPublic: Boolean,
+ val isPublic: Boolean?,
val isDirect: Boolean,
val isEncrypted: Boolean?,
val joinRule: JoinRule?,
@@ -48,7 +48,7 @@ data class RoomInfo(
val activeMembersCount: Long,
val invitedMembersCount: Long,
val joinedMembersCount: Long,
- val userPowerLevels: ImmutableMap,
+ val roomPowerLevels: RoomPowerLevels?,
val highlightCount: Long,
val notificationCount: Long,
val userDefinedNotificationMode: RoomNotificationMode?,
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRoom.kt
index cfa29cee6c..731512b2e9 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRoom.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/join/JoinRoom.kt
@@ -16,4 +16,8 @@ interface JoinRoom {
serverNames: List,
trigger: JoinedRoom.Trigger,
): Result
+
+ sealed class Failures : Exception() {
+ data object UnauthorizedJoin : Failures()
+ }
}
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt
index 49bc4afcd6..eb3afaf994 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt
@@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.map
*/
fun BaseRoom.usersWithRole(role: RoomMember.Role): Flow> {
return roomInfoFlow
- .map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
+ .map { it.roomPowerLevels?.users.orEmpty().filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
.combine(membersStateFlow) { powerLevels, membersState ->
membersState.activeRoomMembers()
.filter { powerLevels.containsKey(it.userId) }
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt
index 8f548cc601..08f2166494 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2023, 2024 New Vector Ltd.
+ * Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
@@ -7,65 +7,10 @@
package io.element.android.libraries.matrix.api.room.powerlevels
-import io.element.android.libraries.core.extensions.runCatchingExceptions
-import io.element.android.libraries.matrix.api.room.BaseRoom
-import io.element.android.libraries.matrix.api.room.MessageEventType
-import io.element.android.libraries.matrix.api.room.StateEventType
+import io.element.android.libraries.matrix.api.core.UserId
+import kotlinx.collections.immutable.ImmutableMap
data class RoomPowerLevels(
- val ban: Long,
- val invite: Long,
- val kick: Long,
- val sendEvents: Long,
- val redactEvents: Long,
- val roomName: Long,
- val roomAvatar: Long,
- val roomTopic: Long,
+ val values: RoomPowerLevelsValues,
+ val users: ImmutableMap,
)
-
-/**
- * Shortcut for calling [BaseRoom.canUserInvite] with our own user.
- */
-suspend fun BaseRoom.canInvite(): Result = canUserInvite(sessionId)
-
-/**
- * Shortcut for calling [BaseRoom.canUserKick] with our own user.
- */
-suspend fun BaseRoom.canKick(): Result = canUserKick(sessionId)
-
-/**
- * Shortcut for calling [BaseRoom.canUserBan] with our own user.
- */
-suspend fun BaseRoom.canBan(): Result = canUserBan(sessionId)
-
-/**
- * Shortcut for calling [BaseRoom.canUserSendState] with our own user.
- */
-suspend fun BaseRoom.canSendState(type: StateEventType): Result = canUserSendState(sessionId, type)
-
-/**
- * Shortcut for calling [BaseRoom.canUserSendMessage] with our own user.
- */
-suspend fun BaseRoom.canSendMessage(type: MessageEventType): Result = canUserSendMessage(sessionId, type)
-
-/**
- * Shortcut for calling [BaseRoom.canUserRedactOwn] with our own user.
- */
-suspend fun BaseRoom.canRedactOwn(): Result = canUserRedactOwn(sessionId)
-
-/**
- * Shortcut for calling [BaseRoom.canRedactOther] with our own user.
- */
-suspend fun BaseRoom.canRedactOther(): Result = canUserRedactOther(sessionId)
-
-/**
- * Shortcut for checking if current user can handle knock requests.
- */
-suspend fun BaseRoom.canHandleKnockRequests(): Result = runCatchingExceptions {
- canInvite().getOrThrow() || canBan().getOrThrow() || canKick().getOrThrow()
-}
-
-/**
- * Shortcut for calling [BaseRoom.canUserPinUnpin] with our own user.
- */
-suspend fun BaseRoom.canPinUnpin(): Result = canUserPinUnpin(sessionId)
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt
new file mode 100644
index 0000000000..0acafc2a43
--- /dev/null
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2023, 2024 New Vector 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.matrix.api.room.powerlevels
+
+import io.element.android.libraries.core.extensions.runCatchingExceptions
+import io.element.android.libraries.matrix.api.room.BaseRoom
+import io.element.android.libraries.matrix.api.room.MessageEventType
+import io.element.android.libraries.matrix.api.room.StateEventType
+
+data class RoomPowerLevelsValues(
+ val ban: Long,
+ val invite: Long,
+ val kick: Long,
+ val sendEvents: Long,
+ val redactEvents: Long,
+ val roomName: Long,
+ val roomAvatar: Long,
+ val roomTopic: Long,
+)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserInvite] with our own user.
+ */
+suspend fun BaseRoom.canInvite(): Result = canUserInvite(sessionId)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserKick] with our own user.
+ */
+suspend fun BaseRoom.canKick(): Result = canUserKick(sessionId)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserBan] with our own user.
+ */
+suspend fun BaseRoom.canBan(): Result = canUserBan(sessionId)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserSendState] with our own user.
+ */
+suspend fun BaseRoom.canSendState(type: StateEventType): Result = canUserSendState(sessionId, type)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserSendMessage] with our own user.
+ */
+suspend fun BaseRoom.canSendMessage(type: MessageEventType): Result = canUserSendMessage(sessionId, type)
+
+/**
+ * Shortcut for calling [BaseRoom.canUserRedactOwn] with our own user.
+ */
+suspend fun BaseRoom.canRedactOwn(): Result = canUserRedactOwn(sessionId)
+
+/**
+ * Shortcut for calling [BaseRoom.canRedactOther] with our own user.
+ */
+suspend fun BaseRoom.canRedactOther(): Result = canUserRedactOther(sessionId)
+
+/**
+ * Shortcut for checking if current user can handle knock requests.
+ */
+suspend fun BaseRoom.canHandleKnockRequests(): Result = runCatchingExceptions {
+ canInvite().getOrThrow() || canBan().getOrThrow() || canKick().getOrThrow()
+}
+
+/**
+ * Shortcut for calling [BaseRoom.canUserPinUnpin] with our own user.
+ */
+suspend fun BaseRoom.canPinUnpin(): Result = canUserPinUnpin(sessionId)
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt
index b00d59a3f6..61de6f7d15 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/preview/RoomPreviewInfo.kt
@@ -33,5 +33,5 @@ data class RoomPreviewInfo(
/** the membership of the current user. */
val membership: CurrentUserMembership?,
/** The room's join rule. */
- val joinRule: JoinRule,
+ val joinRule: JoinRule?,
)
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt
index b0a67a9e92..cdb9c07996 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt
@@ -16,6 +16,9 @@ enum class TraceLogPack(val key: String) {
},
TIMELINE("timeline") {
override val title: String = "Timeline"
+ },
+ NOTIFICATION_CLIENT("notification_client") {
+ override val title: String = "Notification Client"
};
abstract val title: String
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt
index 007628b8e1..fca6439c05 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt
@@ -26,6 +26,7 @@ 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.EncryptionService
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
@@ -52,6 +53,7 @@ import io.element.android.libraries.matrix.impl.core.toProgressWatcher
import io.element.android.libraries.matrix.impl.encryption.RustEncryptionService
import io.element.android.libraries.matrix.impl.exception.mapClientException
import io.element.android.libraries.matrix.impl.media.RustMediaLoader
+import io.element.android.libraries.matrix.impl.media.RustMediaPreviewService
import io.element.android.libraries.matrix.impl.notification.RustNotificationService
import io.element.android.libraries.matrix.impl.notificationsettings.RustNotificationSettingsService
import io.element.android.libraries.matrix.impl.oidc.toRustAction
@@ -129,7 +131,7 @@ class RustMatrixClient(
private val sessionStore: SessionStore,
private val appCoroutineScope: CoroutineScope,
private val sessionDelegate: RustClientSessionDelegate,
- innerSyncService: ClientSyncService,
+ private val innerSyncService: ClientSyncService,
dispatchers: CoroutineDispatchers,
baseCacheDirectory: File,
clock: SystemClock,
@@ -214,6 +216,12 @@ class RustMatrixClient(
innerClient = innerClient,
)
+ private val mediaPreviewService = RustMediaPreviewService(
+ sessionCoroutineScope = sessionCoroutineScope,
+ innerClient = innerClient,
+ sessionDispatcher = sessionDispatcher,
+ )
+
private var clientDelegateTaskHandle: TaskHandle? = innerClient.setDelegate(sessionDelegate)
private val _userProfile: MutableStateFlow = MutableStateFlow(
@@ -507,6 +515,8 @@ class RustMatrixClient(
override fun roomDirectoryService(): RoomDirectoryService = roomDirectoryService
+ override fun mediaPreviewService(): MediaPreviewService = mediaPreviewService
+
internal suspend fun destroy() {
innerNotificationClient.close()
@@ -531,7 +541,7 @@ class RustMatrixClient(
}
override suspend fun clearCache() {
- innerClient.clearCaches()
+ innerClient.clearCaches(innerSyncService)
destroy()
}
@@ -678,6 +688,10 @@ class RustMatrixClient(
}.getOrDefault(false)
}
+ override suspend fun isLivekitRtcSupported(): Boolean = withContext(sessionDispatcher) {
+ innerClient.isLivekitRtcSupported()
+ }
+
private suspend fun File.getCacheSize(
includeCryptoDb: Boolean = false,
): Long = withContext(sessionDispatcher) {
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt
index 8261969918..c1dab6f404 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt
@@ -34,6 +34,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber
import uniffi.matrix_sdk_crypto.CollectStrategy
+import uniffi.matrix_sdk_crypto.DecryptionSettings
import uniffi.matrix_sdk_crypto.TrustRequirement
import java.io.File
import javax.inject.Inject
@@ -120,12 +121,14 @@ class RustMatrixClientFactory @Inject constructor(
CollectStrategy.ERROR_ON_VERIFIED_USER_PROBLEM
}
)
- .roomDecryptionTrustRequirement(
- trustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) {
- TrustRequirement.CROSS_SIGNED_OR_LEGACY
- } else {
- TrustRequirement.UNTRUSTED
- }
+ .decryptionSettings(
+ DecryptionSettings(
+ senderDeviceTrustRequirement = if (featureFlagService.isFeatureEnabled(FeatureFlags.OnlySignedDeviceIsolationMode)) {
+ TrustRequirement.CROSS_SIGNED_OR_LEGACY
+ } else {
+ TrustRequirement.UNTRUSTED
+ }
+ )
)
.enableShareHistoryOnInvite(featureFlagService.isFeatureEnabled(FeatureFlags.EnableKeyShareOnInvite))
.run {
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/call/ElementWellKnownParser.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/call/ElementWellKnownParser.kt
deleted file mode 100644
index 710e18f5ac..0000000000
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/call/ElementWellKnownParser.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2024 New Vector 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.matrix.impl.call
-
-import com.squareup.anvil.annotations.ContributesBinding
-import io.element.android.libraries.core.extensions.runCatchingExceptions
-import io.element.android.libraries.di.AppScope
-import org.matrix.rustcomponents.sdk.ElementWellKnown
-import org.matrix.rustcomponents.sdk.makeElementWellKnown
-import javax.inject.Inject
-
-interface ElementWellKnownParser {
- fun parse(str: String): Result
-}
-
-@ContributesBinding(AppScope::class)
-class RustElementWellKnownParser @Inject constructor() : ElementWellKnownParser {
- override fun parse(str: String): Result {
- return runCatchingExceptions {
- makeElementWellKnown(str)
- }
- }
-}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/SessionMatrixModule.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/SessionMatrixModule.kt
index 361d1efd97..6a04079a7e 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/SessionMatrixModule.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/di/SessionMatrixModule.kt
@@ -15,6 +15,7 @@ import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
@@ -71,4 +72,9 @@ object SessionMatrixModule {
fun providesRoomDirectoryService(matrixClient: MatrixClient): RoomDirectoryService {
return matrixClient.roomDirectoryService()
}
+
+ @Provides
+ fun providesMediaPreviewService(matrixClient: MatrixClient): MediaPreviewService {
+ return matrixClient.mediaPreviewService()
+ }
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt
new file mode 100644
index 0000000000..e4e9bc07bd
--- /dev/null
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2025 New Vector 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.matrix.impl.media
+
+import io.element.android.libraries.core.extensions.runCatchingExceptions
+import io.element.android.libraries.matrix.api.media.MediaPreviewConfig
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.matrix.impl.util.mxCallbackFlow
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.withContext
+import org.matrix.rustcomponents.sdk.Client
+import org.matrix.rustcomponents.sdk.InviteAvatars
+import org.matrix.rustcomponents.sdk.MediaPreviewConfigListener
+import org.matrix.rustcomponents.sdk.MediaPreviews
+import org.matrix.rustcomponents.sdk.MediaPreviewConfig as RustMediaPreviewConfig
+
+class RustMediaPreviewService(
+ sessionCoroutineScope: CoroutineScope,
+ private val sessionDispatcher: CoroutineDispatcher,
+ private val innerClient: Client,
+) : MediaPreviewService {
+ override val mediaPreviewConfigFlow: StateFlow =
+ innerClient
+ .getMediaPreviewConfigFlow()
+ .stateIn(sessionCoroutineScope, started = SharingStarted.Lazily, initialValue = MediaPreviewConfig.DEFAULT)
+
+ override suspend fun fetchMediaPreviewConfig(): Result = withContext(sessionDispatcher) {
+ runCatchingExceptions {
+ innerClient.fetchMediaPreviewConfig()?.into()
+ }
+ }
+
+ override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = withContext(sessionDispatcher) {
+ runCatchingExceptions {
+ innerClient.setMediaPreviewDisplayPolicy(mediaPreviewValue.into())
+ }
+ }
+
+ override suspend fun setHideInviteAvatars(hide: Boolean): Result = withContext(sessionDispatcher) {
+ runCatchingExceptions {
+ val inviteAvatars = if (hide) InviteAvatars.OFF else InviteAvatars.ON
+ innerClient.setInviteAvatarsDisplayPolicy(inviteAvatars)
+ }
+ }
+}
+
+private fun RustMediaPreviewConfig.into(): MediaPreviewConfig {
+ return MediaPreviewConfig(
+ mediaPreviewValue = mediaPreviews.into(),
+ hideInviteAvatar = inviteAvatars == InviteAvatars.OFF
+ )
+}
+
+private fun Client.getMediaPreviewConfigFlow() = mxCallbackFlow {
+ subscribeToMediaPreviewConfig(object : MediaPreviewConfigListener {
+ override fun onChange(mediaPreviewConfig: RustMediaPreviewConfig?) {
+ if (mediaPreviewConfig != null) {
+ trySend(mediaPreviewConfig.into())
+ }
+ }
+ })
+}
+
+private fun MediaPreviewValue.into(): MediaPreviews {
+ return when (this) {
+ MediaPreviewValue.On -> MediaPreviews.ON
+ MediaPreviewValue.Off -> MediaPreviews.OFF
+ MediaPreviewValue.Private -> MediaPreviews.PRIVATE
+ }
+}
+
+private fun MediaPreviews.into(): MediaPreviewValue {
+ return when (this) {
+ MediaPreviews.ON -> MediaPreviewValue.On
+ MediaPreviews.OFF -> MediaPreviewValue.Off
+ MediaPreviews.PRIVATE -> MediaPreviewValue.Private
+ }
+}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt
index 34ff4042cc..a7dc2523ad 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt
@@ -27,7 +27,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationSettingsStat
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.knock.KnockRequest
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
@@ -40,7 +40,6 @@ import io.element.android.libraries.matrix.impl.room.history.map
import io.element.android.libraries.matrix.impl.room.join.map
import io.element.android.libraries.matrix.impl.room.knock.RustKnockRequest
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
-import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsMapper
import io.element.android.libraries.matrix.impl.roomdirectory.map
import io.element.android.libraries.matrix.impl.timeline.RustTimeline
import io.element.android.libraries.matrix.impl.util.MessageEventContent
@@ -140,7 +139,7 @@ class JoinedRustRoom(
}
init {
- val powerLevelChanges = roomInfoFlow.map { it.userPowerLevels }.distinctUntilChanged()
+ val powerLevelChanges = roomInfoFlow.map { it.roomPowerLevels }.distinctUntilChanged()
val membershipChanges = liveTimeline.membershipChangeEventReceived.onStart { emit(Unit) }
combine(membershipChanges, powerLevelChanges) { _, _ -> }
// Skip initial one
@@ -364,25 +363,25 @@ class JoinedRustRoom(
}
}
- override suspend fun updatePowerLevels(roomPowerLevels: RoomPowerLevels): Result = withContext(roomDispatcher) {
+ override suspend fun updatePowerLevels(roomPowerLevelsValues: RoomPowerLevelsValues): Result = withContext(roomDispatcher) {
runCatchingExceptions {
val changes = RoomPowerLevelChanges(
- ban = roomPowerLevels.ban,
- invite = roomPowerLevels.invite,
- kick = roomPowerLevels.kick,
- redact = roomPowerLevels.redactEvents,
- eventsDefault = roomPowerLevels.sendEvents,
- roomName = roomPowerLevels.roomName,
- roomAvatar = roomPowerLevels.roomAvatar,
- roomTopic = roomPowerLevels.roomTopic,
+ ban = roomPowerLevelsValues.ban,
+ invite = roomPowerLevelsValues.invite,
+ kick = roomPowerLevelsValues.kick,
+ redact = roomPowerLevelsValues.redactEvents,
+ eventsDefault = roomPowerLevelsValues.sendEvents,
+ roomName = roomPowerLevelsValues.roomName,
+ roomAvatar = roomPowerLevelsValues.roomAvatar,
+ roomTopic = roomPowerLevelsValues.roomTopic,
)
innerRoom.applyPowerLevelChanges(changes)
}
}
- override suspend fun resetPowerLevels(): Result = withContext(roomDispatcher) {
+ override suspend fun resetPowerLevels(): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- RoomPowerLevelsMapper.map(innerRoom.resetPowerLevels())
+ innerRoom.resetPowerLevels().let {}
}
}
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 e0dec91899..5b5d1f69f0 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
@@ -14,12 +14,13 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.impl.room.history.map
import io.element.android.libraries.matrix.impl.room.join.map
import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper
+import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsValuesMapper
import io.element.android.libraries.matrix.impl.room.tombstone.map
-import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentMap
import org.matrix.rustcomponents.sdk.Membership
@@ -28,6 +29,7 @@ import uniffi.matrix_sdk_base.EncryptionState
import org.matrix.rustcomponents.sdk.Membership as RustMembership
import org.matrix.rustcomponents.sdk.RoomInfo as RustRoomInfo
import org.matrix.rustcomponents.sdk.RoomNotificationMode as RustRoomNotificationMode
+import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels
class RoomInfoMapper {
fun map(rustRoomInfo: RustRoomInfo): RoomInfo = rustRoomInfo.let {
@@ -55,7 +57,7 @@ class RoomInfoMapper {
activeMembersCount = it.activeMembersCount.toLong(),
invitedMembersCount = it.invitedMembersCount.toLong(),
joinedMembersCount = it.joinedMembersCount.toLong(),
- userPowerLevels = mapPowerLevels(it.userPowerLevels),
+ roomPowerLevels = it.powerLevels?.let(::mapPowerLevels),
highlightCount = it.highlightCount.toLong(),
notificationCount = it.notificationCount.toLong(),
userDefinedNotificationMode = it.cachedUserDefinedNotificationMode?.map(),
@@ -96,6 +98,9 @@ fun RoomHero.map(): MatrixUser = MatrixUser(
avatarUrl = avatarUrl
)
-fun mapPowerLevels(powerLevels: Map): ImmutableMap {
- return powerLevels.mapKeys { (key, _) -> UserId(key) }.toPersistentMap()
+fun mapPowerLevels(roomPowerLevels: RustRoomPowerLevels): RoomPowerLevels {
+ return RoomPowerLevels(
+ values = RoomPowerLevelsValuesMapper.map(roomPowerLevels.values()),
+ users = roomPowerLevels.userPowerLevels().mapKeys { (key, _) -> UserId(key) }.toPersistentMap()
+ )
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoom.kt
index b6ff98baed..734531a7cc 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoom.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustBaseRoom.kt
@@ -24,14 +24,14 @@ import io.element.android.libraries.matrix.api.room.RoomMembersState
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.timeline.ReceiptType
import io.element.android.libraries.matrix.impl.room.draft.into
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper
-import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsMapper
+import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsValuesMapper
import io.element.android.libraries.matrix.impl.room.tombstone.map
import io.element.android.libraries.matrix.impl.roomdirectory.map
import io.element.android.libraries.matrix.impl.timeline.toRustReceiptType
@@ -132,9 +132,11 @@ class RustBaseRoom(
}
}
- override suspend fun powerLevels(): Result = withContext(roomDispatcher) {
+ override suspend fun powerLevels(): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- RoomPowerLevelsMapper.map(innerRoom.getPowerLevels())
+ innerRoom.getPowerLevels().use {
+ RoomPowerLevelsValuesMapper.map(it.values())
+ }
}
}
@@ -167,55 +169,55 @@ class RustBaseRoom(
override suspend fun canUserInvite(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserInvite(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserInvite(userId.value) }
}
}
override suspend fun canUserKick(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserKick(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserKick(userId.value) }
}
}
override suspend fun canUserBan(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserBan(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserBan(userId.value) }
}
}
override suspend fun canUserRedactOwn(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserRedactOwn(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserRedactOwn(userId.value) }
}
}
override suspend fun canUserRedactOther(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserRedactOther(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserRedactOther(userId.value) }
}
}
override suspend fun canUserSendState(userId: UserId, type: StateEventType): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserSendState(userId.value, type.map())
+ innerRoom.getPowerLevels().use { it.canUserSendState(userId.value, type.map()) }
}
}
override suspend fun canUserSendMessage(userId: UserId, type: MessageEventType): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserSendMessage(userId.value, type.map())
+ innerRoom.getPowerLevels().use { it.canUserSendMessage(userId.value, type.map()) }
}
}
override suspend fun canUserTriggerRoomNotification(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserTriggerRoomNotification(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserTriggerRoomNotification(userId.value) }
}
}
override suspend fun canUserPinUnpin(userId: UserId): Result = withContext(roomDispatcher) {
runCatchingExceptions {
- innerRoom.canUserPinUnpin(userId.value)
+ innerRoom.getPowerLevels().use { it.canUserPinUnpin(userId.value) }
}
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoom.kt
index 0abe45c0fa..98a2175df9 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoom.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/join/DefaultJoinRoom.kt
@@ -9,9 +9,12 @@ package io.element.android.libraries.matrix.impl.room.join
import com.squareup.anvil.annotations.ContributesBinding
import im.vector.app.features.analytics.plan.JoinedRoom
+import io.element.android.libraries.core.extensions.mapFailure
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
+import io.element.android.libraries.matrix.api.exception.ClientException
+import io.element.android.libraries.matrix.api.exception.ErrorKind
import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.impl.analytics.toAnalyticsJoinedRoom
import io.element.android.services.analytics.api.AnalyticsService
@@ -42,6 +45,15 @@ class DefaultJoinRoom @Inject constructor(
if (roomInfo != null) {
analyticsService.capture(roomInfo.toAnalyticsJoinedRoom(trigger))
}
+ }.mapFailure {
+ if (it is ClientException.MatrixApi) {
+ when (it.kind) {
+ ErrorKind.Forbidden -> JoinRoom.Failures.UnauthorizedJoin
+ else -> it
+ }
+ } else {
+ it
+ }
}.map { }
}
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt
deleted file mode 100644
index 55a09030b3..0000000000
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2024 New Vector 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.matrix.impl.room.powerlevels
-
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
-import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels
-
-object RoomPowerLevelsMapper {
- fun map(roomPowerLevels: RustRoomPowerLevels): RoomPowerLevels {
- return RoomPowerLevels(
- ban = roomPowerLevels.ban,
- invite = roomPowerLevels.invite,
- kick = roomPowerLevels.kick,
- sendEvents = roomPowerLevels.eventsDefault,
- redactEvents = roomPowerLevels.redact,
- roomName = roomPowerLevels.roomName,
- roomAvatar = roomPowerLevels.roomAvatar,
- roomTopic = roomPowerLevels.roomTopic
- )
- }
-}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapper.kt
new file mode 100644
index 0000000000..840a5da428
--- /dev/null
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapper.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2024 New Vector 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.matrix.impl.room.powerlevels
+
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
+import org.matrix.rustcomponents.sdk.RoomPowerLevelsValues as RustRoomPowerLevelsValues
+
+object RoomPowerLevelsValuesMapper {
+ fun map(values: RustRoomPowerLevelsValues): RoomPowerLevelsValues {
+ return RoomPowerLevelsValues(
+ ban = values.ban,
+ invite = values.invite,
+ kick = values.kick,
+ sendEvents = values.eventsDefault,
+ redactEvents = values.redact,
+ roomName = values.roomName,
+ roomAvatar = values.roomAvatar,
+ roomTopic = values.roomTopic,
+ )
+ }
+}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt
index fd21548224..cb1867ec8e 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/preview/RoomPreviewInfoMapper.kt
@@ -27,7 +27,7 @@ object RoomPreviewInfoMapper {
roomType = info.roomType.map(),
isHistoryWorldReadable = info.isHistoryWorldReadable.orFalse(),
membership = info.membership?.map(),
- joinRule = info.joinRule.map(),
+ joinRule = info.joinRule?.map(),
)
}
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt
index 2ad364c1e1..2088b6bc1d 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/MatrixTimelineDiffProcessor.kt
@@ -28,14 +28,6 @@ internal class MatrixTimelineDiffProcessor(
private val _membershipChangeEventReceived = MutableSharedFlow(extraBufferCapacity = 1)
val membershipChangeEventReceived: Flow = _membershipChangeEventReceived
- suspend fun postItems(items: List) {
- updateTimelineItems {
- Timber.v("Update timeline items from postItems (with ${items.size} items) on ${Thread.currentThread()}")
- val mappedItems = items.map { it.asMatrixTimelineItem() }
- addAll(0, mappedItems)
- }
- }
-
suspend fun postDiffs(diffs: List) {
updateTimelineItems {
Timber.v("Update timeline items from postDiffs (with ${diffs.size} items) on ${Thread.currentThread()}")
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt
index 2f0154c208..404de3a248 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt
@@ -48,7 +48,6 @@ import io.element.android.libraries.matrix.impl.timeline.postprocessor.TypingNot
import io.element.android.libraries.matrix.impl.timeline.reply.InReplyToMapper
import io.element.android.libraries.matrix.impl.util.MessageEventContent
import io.element.android.services.toolbox.api.systemclock.SystemClock
-import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -95,9 +94,6 @@ class RustTimeline(
private val featureFlagsService: FeatureFlagService,
onNewSyncedEvent: () -> Unit,
) : Timeline {
- private val initLatch = CompletableDeferred()
- private val isTimelineInitialized = MutableStateFlow(false)
-
private val _timelineItems: MutableSharedFlow> =
MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE)
@@ -119,8 +115,6 @@ class RustTimeline(
timeline = inner,
timelineCoroutineScope = coroutineScope,
timelineDiffProcessor = timelineDiffProcessor,
- initLatch = initLatch,
- isTimelineInitialized = isTimelineInitialized,
dispatcher = dispatcher,
onNewSyncedEvent = onNewSyncedEvent,
)
@@ -181,7 +175,6 @@ class RustTimeline(
// Use NonCancellable to avoid breaking the timeline when the coroutine is cancelled.
override suspend fun paginate(direction: Timeline.PaginationDirection): Result = withContext(NonCancellable) {
withContext(dispatcher) {
- initLatch.await()
runCatchingExceptions {
if (!canPaginate(direction)) throw TimelineException.CannotPaginate
updatePaginationStatus(direction) { it.copy(isPaginating = true) }
@@ -203,7 +196,6 @@ class RustTimeline(
}
private fun canPaginate(direction: Timeline.PaginationDirection): Boolean {
- if (!isTimelineInitialized.value) return false
return when (direction) {
Timeline.PaginationDirection.BACKWARDS -> backwardPaginationStatus.value.canPaginate
Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus.value.canPaginate
@@ -215,12 +207,10 @@ class RustTimeline(
backwardPaginationStatus,
forwardPaginationStatus,
joinedRoom.roomInfoFlow.map { it.creator to it.isDm }.distinctUntilChanged(),
- isTimelineInitialized,
) { timelineItems,
backwardPaginationStatus,
forwardPaginationStatus,
- (roomCreator, isDm),
- isTimelineInitialized ->
+ (roomCreator, isDm) ->
withContext(dispatcher) {
timelineItems
.let { items ->
@@ -234,7 +224,6 @@ class RustTimeline(
.let { items ->
loadingIndicatorsPostProcessor.process(
items = items,
- isTimelineInitialized = isTimelineInitialized,
hasMoreToLoadBackward = backwardPaginationStatus.hasMoreToLoad,
hasMoreToLoadForward = forwardPaginationStatus.hasMoreToLoad,
)
@@ -244,10 +233,7 @@ class RustTimeline(
}
// Keep lastForwardIndicatorsPostProcessor last
.let { items ->
- lastForwardIndicatorsPostProcessor.process(
- items = items,
- isTimelineInitialized = isTimelineInitialized,
- )
+ lastForwardIndicatorsPostProcessor.process(items = items)
}
}
}.onStart {
@@ -262,7 +248,6 @@ class RustTimeline(
}
private fun CoroutineScope.fetchMembers() = launch(dispatcher) {
- initLatch.await()
try {
inner.fetchMembers()
} catch (exception: Exception) {
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriber.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriber.kt
index c286a5fec3..3d95d660ff 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriber.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriber.kt
@@ -8,37 +8,26 @@
package io.element.android.libraries.matrix.impl.timeline
import io.element.android.libraries.core.coroutine.childScope
-import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.ensureActive
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.matrix.rustcomponents.sdk.Timeline
-import org.matrix.rustcomponents.sdk.TimelineChange
-import org.matrix.rustcomponents.sdk.TimelineDiff
-import org.matrix.rustcomponents.sdk.TimelineItem
import uniffi.matrix_sdk_ui.EventItemOrigin
-private const val INITIAL_MAX_SIZE = 50
-
/**
* This class is responsible for subscribing to a timeline and post the items/diffs to the timelineDiffProcessor.
* It will also trigger a callback when a new synced event is received.
- * It will also handle the initial items and make sure they are posted before any diff.
*/
internal class TimelineItemsSubscriber(
timelineCoroutineScope: CoroutineScope,
dispatcher: CoroutineDispatcher,
private val timeline: Timeline,
private val timelineDiffProcessor: MatrixTimelineDiffProcessor,
- private val initLatch: CompletableDeferred,
- private val isTimelineInitialized: MutableStateFlow,
private val onNewSyncedEvent: () -> Unit,
) {
private var subscriptionCount = 0
@@ -57,7 +46,7 @@ internal class TimelineItemsSubscriber(
if (diffs.any { diff -> diff.eventOrigin() == EventItemOrigin.SYNC }) {
onNewSyncedEvent()
}
- postDiffs(diffs)
+ timelineDiffProcessor.postDiffs(diffs)
}
.launchIn(coroutineScope)
}
@@ -78,35 +67,4 @@ internal class TimelineItemsSubscriber(
}
subscriptionCount--
}
-
- private suspend fun postItems(items: List) = coroutineScope {
- if (items.isEmpty()) {
- // Makes sure to post empty list if there is no item, so you can handle empty state.
- timelineDiffProcessor.postItems(emptyList())
- } else {
- // Split the initial items in multiple list as there is no pagination in the cached data, so we can post timelineItems asap.
- items.chunked(INITIAL_MAX_SIZE).reversed().forEach {
- ensureActive()
- timelineDiffProcessor.postItems(it)
- }
- }
- isTimelineInitialized.value = true
- initLatch.complete(Unit)
- }
-
- private suspend fun postDiffs(diffs: List) {
- val diffsToProcess = diffs.toMutableList()
- if (!isTimelineInitialized.value) {
- val resetDiff = diffsToProcess.firstOrNull { it.change() == TimelineChange.RESET }
- if (resetDiff != null) {
- // Keep using the postItems logic so we can post the timelineItems asap.
- postItems(resetDiff.reset() ?: emptyList())
- diffsToProcess.remove(resetDiff)
- }
- }
- initLatch.await()
- if (diffsToProcess.isNotEmpty()) {
- timelineDiffProcessor.postDiffs(diffsToProcess)
- }
- }
}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt
index 8e55b0aa76..9be7dddddb 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessor.kt
@@ -22,9 +22,7 @@ class LastForwardIndicatorsPostProcessor(
fun process(
items: List,
- isTimelineInitialized: Boolean,
): List {
- if (!isTimelineInitialized) return items
// We don't need to add the last forward indicator if we are not in the FOCUSED_ON_EVENT mode
if (mode != Timeline.Mode.FOCUSED_ON_EVENT) {
return items
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt
index 4261b78c93..6d42af54b5 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessor.kt
@@ -16,11 +16,9 @@ import io.element.android.services.toolbox.api.systemclock.SystemClock
class LoadingIndicatorsPostProcessor(private val systemClock: SystemClock) {
fun process(
items: List,
- isTimelineInitialized: Boolean,
hasMoreToLoadBackward: Boolean,
hasMoreToLoadForward: Boolean,
): List {
- if (!isTimelineInitialized) return items
val shouldAddForwardLoadingIndicator = hasMoreToLoadForward && items.isNotEmpty()
val currentTimestamp = systemClock.epochMillis()
return buildList {
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt
index 11187a90a3..53876e9600 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt
@@ -14,6 +14,7 @@ fun TraceLogPack.map(): RustTraceLogPack = when (this) {
TraceLogPack.SEND_QUEUE -> RustTraceLogPack.SEND_QUEUE
TraceLogPack.EVENT_CACHE -> RustTraceLogPack.EVENT_CACHE
TraceLogPack.TIMELINE -> RustTraceLogPack.TIMELINE
+ TraceLogPack.NOTIFICATION_CLIENT -> RustTraceLogPack.NOTIFICATION_CLIENT
}
fun Collection.map(): List {
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt
index eed81c2dcb..90b3c16906 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt
@@ -16,11 +16,12 @@ import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.coroutines.flow.first
-import org.matrix.rustcomponents.sdk.EncryptionSystem
-import org.matrix.rustcomponents.sdk.VirtualElementCallWidgetOptions
import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget
+import uniffi.matrix_sdk.EncryptionSystem
+import uniffi.matrix_sdk.HeaderStyle
+import uniffi.matrix_sdk.VirtualElementCallWidgetOptions
import javax.inject.Inject
-import org.matrix.rustcomponents.sdk.Intent as CallIntent
+import uniffi.matrix_sdk.Intent as CallIntent
@ContributesBinding(AppScope::class)
class DefaultCallWidgetSettingsProvider @Inject constructor(
@@ -48,8 +49,10 @@ class DefaultCallWidgetSettingsProvider @Inject constructor(
sentryDsn = callAnalyticsCredentialsProvider.sentryDsn.takeIf { isAnalyticsEnabled },
sentryEnvironment = if (buildMeta.buildType == BuildType.RELEASE) "RELEASE" else "DEBUG",
parentUrl = null,
+ // For backwards compatibility, it'll be ignored in recent versions of Element Call
hideHeader = true,
controlledMediaDevices = true,
+ header = HeaderStyle.APP_BAR,
)
val rustWidgetSettings = newVirtualElementCallWidget(options)
return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings)
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/call/FakeElementWellKnownParser.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/call/FakeElementWellKnownParser.kt
deleted file mode 100644
index 5c37ca6a68..0000000000
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/call/FakeElementWellKnownParser.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2024 New Vector 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.matrix.impl.call
-
-import org.matrix.rustcomponents.sdk.ElementWellKnown
-
-class FakeElementWellKnownParser(
- private val result: Result
-) : ElementWellKnownParser {
- override fun parse(str: String): Result {
- return result
- }
-}
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt
index 1c966cc047..b13e48e669 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/NotificationItem.kt
@@ -48,20 +48,20 @@ fun aRustNotificationRoomInfo(
displayName: String = A_ROOM_NAME,
avatarUrl: String? = null,
canonicalAlias: String? = null,
+ topic: String? = null,
joinedMembersCount: ULong = 2u,
isEncrypted: Boolean? = true,
isDirect: Boolean = false,
joinRule: JoinRule? = null,
- isPublic: Boolean = true,
) = NotificationRoomInfo(
displayName = displayName,
avatarUrl = avatarUrl,
canonicalAlias = canonicalAlias,
+ topic = topic,
joinedMembersCount = joinedMembersCount,
isEncrypted = isEncrypted,
isDirect = isDirect,
joinRule = joinRule,
- isPublic = isPublic,
)
fun aRustNotificationEventTimeline(
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 45b67cc38a..9ba3c100a7 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
@@ -8,6 +8,7 @@
package io.element.android.libraries.matrix.impl.fixtures.factories
import io.element.android.libraries.matrix.api.core.UserId
+import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
import org.matrix.rustcomponents.sdk.JoinRule
@@ -17,6 +18,7 @@ import org.matrix.rustcomponents.sdk.RoomHistoryVisibility
import org.matrix.rustcomponents.sdk.RoomInfo
import org.matrix.rustcomponents.sdk.RoomMember
import org.matrix.rustcomponents.sdk.RoomNotificationMode
+import org.matrix.rustcomponents.sdk.RoomPowerLevels
import org.matrix.rustcomponents.sdk.SuccessorRoom
import uniffi.matrix_sdk_base.EncryptionState
@@ -39,7 +41,7 @@ fun aRustRoomInfo(
activeMembersCount: ULong = 0uL,
invitedMembersCount: ULong = 0uL,
joinedMembersCount: ULong = 0uL,
- userPowerLevels: Map = mapOf(),
+ roomPowerLevels: RoomPowerLevels = FakeFfiRoomPowerLevels(),
highlightCount: ULong = 0uL,
notificationCount: ULong = 0uL,
userDefinedNotificationMode: RoomNotificationMode? = null,
@@ -73,7 +75,7 @@ fun aRustRoomInfo(
activeMembersCount = activeMembersCount,
invitedMembersCount = invitedMembersCount,
joinedMembersCount = joinedMembersCount,
- userPowerLevels = userPowerLevels,
+ powerLevels = roomPowerLevels,
highlightCount = highlightCount,
notificationCount = notificationCount,
cachedUserDefinedNotificationMode = userDefinedNotificationMode,
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPowerLevels.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPowerLevels.kt
index e7967a49d8..79d1606957 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPowerLevels.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/factories/RoomPowerLevels.kt
@@ -7,9 +7,9 @@
package io.element.android.libraries.matrix.impl.fixtures.factories
-import org.matrix.rustcomponents.sdk.RoomPowerLevels
+import org.matrix.rustcomponents.sdk.RoomPowerLevelsValues
-internal fun aRustRoomPowerLevels(
+internal fun aRustRoomPowerLevelsValues(
ban: Long,
invite: Long,
kick: Long,
@@ -20,7 +20,7 @@ internal fun aRustRoomPowerLevels(
roomName: Long,
roomAvatar: Long,
roomTopic: Long,
-) = RoomPowerLevels(
+) = RoomPowerLevelsValues(
ban = ban,
invite = invite,
kick = kick,
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt
index 5c299f1adf..8e88fa78fe 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClient.kt
@@ -25,6 +25,7 @@ import org.matrix.rustcomponents.sdk.PusherKind
import org.matrix.rustcomponents.sdk.RoomDirectorySearch
import org.matrix.rustcomponents.sdk.Session
import org.matrix.rustcomponents.sdk.SessionVerificationController
+import org.matrix.rustcomponents.sdk.SyncService
import org.matrix.rustcomponents.sdk.SyncServiceBuilder
import org.matrix.rustcomponents.sdk.TaskHandle
import org.matrix.rustcomponents.sdk.UnableToDecryptDelegate
@@ -62,7 +63,7 @@ class FakeFfiClient(
) = Unit
override suspend fun deletePusher(identifiers: PusherIdentifiers) = Unit
- override suspend fun clearCaches() = simulateLongTask { clearCachesResult() }
+ override suspend fun clearCaches(syncService: SyncService?) = simulateLongTask { clearCachesResult() }
override suspend fun setUtdDelegate(utdDelegate: UnableToDecryptDelegate) = withUtdHook(utdDelegate)
override suspend fun getSessionVerificationController(): SessionVerificationController = FakeFfiSessionVerificationController()
override suspend fun ignoredUsers(): List {
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt
index 68e9946cb4..3ddb8c2cee 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiClientBuilder.kt
@@ -18,7 +18,7 @@ import org.matrix.rustcomponents.sdk.RequestConfig
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
import uniffi.matrix_sdk.BackupDownloadStrategy
import uniffi.matrix_sdk_crypto.CollectStrategy
-import uniffi.matrix_sdk_crypto.TrustRequirement
+import uniffi.matrix_sdk_crypto.DecryptionSettings
class FakeFfiClientBuilder : ClientBuilder(NoPointer) {
override fun addRootCertificates(certificates: List) = this
@@ -27,7 +27,7 @@ class FakeFfiClientBuilder : ClientBuilder(NoPointer) {
override fun backupDownloadStrategy(backupDownloadStrategy: BackupDownloadStrategy) = this
override fun disableAutomaticTokenRefresh() = this
override fun disableBuiltInRootCertificates() = this
- override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this
+ override fun decryptionSettings(decryptionSettings: DecryptionSettings): ClientBuilder = this
override fun disableSslVerification() = this
override fun homeserverUrl(url: String) = this
override fun sessionPassphrase(passphrase: String?) = this
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt
new file mode 100644
index 0000000000..32e7dc891d
--- /dev/null
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2025 New Vector 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.matrix.impl.fixtures.fakes
+
+import org.matrix.rustcomponents.sdk.NoPointer
+import org.matrix.rustcomponents.sdk.RoomPowerLevels
+import org.matrix.rustcomponents.sdk.RoomPowerLevelsValues
+
+class FakeFfiRoomPowerLevels(
+ private val values: RoomPowerLevelsValues = defaultFfiRoomPowerLevelValues(),
+ private val users: Map = emptyMap(),
+) : RoomPowerLevels(NoPointer) {
+ override fun values(): RoomPowerLevelsValues = values
+ override fun userPowerLevels(): Map = users
+}
+
+fun defaultFfiRoomPowerLevelValues() = RoomPowerLevelsValues(
+ ban = 50,
+ invite = 0,
+ kick = 50,
+ eventsDefault = 0,
+ redact = 50,
+ roomName = 100,
+ roomAvatar = 100,
+ roomTopic = 100,
+ stateDefault = 0,
+ usersDefault = 0,
+)
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 c7e2ced273..7140a90dc4 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
@@ -16,10 +16,12 @@ import io.element.android.libraries.matrix.api.room.RoomInfo
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
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.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomHero
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomInfo
import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomMember
+import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiRoomPowerLevels
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_ALIAS
@@ -28,8 +30,9 @@ import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_ID_3
import io.element.android.libraries.matrix.test.A_USER_ID_6
import io.element.android.libraries.matrix.test.room.aRoomMember
+import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevelValues
+import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList
-import kotlinx.collections.immutable.toImmutableMap
import kotlinx.collections.immutable.toPersistentList
import org.junit.Test
import org.matrix.rustcomponents.sdk.Membership
@@ -64,7 +67,7 @@ class RoomInfoMapperTest {
activeMembersCount = 2uL,
invitedMembersCount = 3uL,
joinedMembersCount = 4uL,
- userPowerLevels = mapOf(A_USER_ID_6.value to 50L),
+ roomPowerLevels = FakeFfiRoomPowerLevels(users = mapOf(A_USER_ID_6.value to 50L)),
highlightCount = 10uL,
notificationCount = 11uL,
userDefinedNotificationMode = RustRoomNotificationMode.MUTE,
@@ -99,7 +102,10 @@ class RoomInfoMapperTest {
activeMembersCount = 2L,
invitedMembersCount = 3L,
joinedMembersCount = 4L,
- userPowerLevels = mapOf(A_USER_ID_6 to 50L).toImmutableMap(),
+ roomPowerLevels = RoomPowerLevels(
+ values = defaultRoomPowerLevelValues(),
+ users = persistentMapOf(A_USER_ID_6 to 50L)
+ ),
highlightCount = 10L,
notificationCount = 11L,
userDefinedNotificationMode = RoomNotificationMode.MUTE,
@@ -149,7 +155,7 @@ class RoomInfoMapperTest {
activeMembersCount = 2uL,
invitedMembersCount = 3uL,
joinedMembersCount = 4uL,
- userPowerLevels = emptyMap(),
+ roomPowerLevels = FakeFfiRoomPowerLevels(),
highlightCount = 10uL,
notificationCount = 11uL,
userDefinedNotificationMode = null,
@@ -184,7 +190,10 @@ class RoomInfoMapperTest {
activeMembersCount = 2L,
invitedMembersCount = 3L,
joinedMembersCount = 4L,
- userPowerLevels = emptyMap().toImmutableMap(),
+ roomPowerLevels = RoomPowerLevels(
+ values = defaultRoomPowerLevelValues(),
+ users = persistentMapOf(),
+ ),
highlightCount = 10L,
notificationCount = 11L,
userDefinedNotificationMode = null,
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapperTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapperTest.kt
similarity index 80%
rename from libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapperTest.kt
rename to libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapperTest.kt
index aac02350e1..a2c6fca7a1 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapperTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapperTest.kt
@@ -8,16 +8,16 @@
package io.element.android.libraries.matrix.impl.room.powerlevels
import com.google.common.truth.Truth.assertThat
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
-import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
+import io.element.android.libraries.matrix.impl.fixtures.factories.aRustRoomPowerLevelsValues
import org.junit.Test
-class RoomPowerLevelsMapperTest {
+class RoomPowerLevelsValuesMapperTest {
@Test
- fun `test that mapping of RoomPowerLevels is correct`() {
+ fun `test that mapping of RoomPowerLevelsValues is correct`() {
assertThat(
- RoomPowerLevelsMapper.map(
- aRustRoomPowerLevels(
+ RoomPowerLevelsValuesMapper.map(
+ aRustRoomPowerLevelsValues(
ban = 1,
invite = 2,
kick = 3,
@@ -31,7 +31,7 @@ class RoomPowerLevelsMapperTest {
)
)
).isEqualTo(
- RoomPowerLevels(
+ RoomPowerLevelsValues(
ban = 1,
invite = 2,
kick = 3,
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt
index 56d1309b2a..8fcb352075 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimelineTest.kt
@@ -57,11 +57,6 @@ class RustTimelineTest {
)
)
)
- with(awaitItem()) {
- assertThat(size).isEqualTo(1)
- // Typing notification
- assertThat((get(0) as MatrixTimelineItem.Virtual).virtual).isEqualTo(VirtualTimelineItem.TypingNotification)
- }
with(awaitItem()) {
assertThat(size).isEqualTo(2)
// The loading
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt
index 0aacf6ae9b..03c1567c95 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineItemsSubscriberTest.kt
@@ -16,10 +16,8 @@ import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineDi
import io.element.android.libraries.matrix.impl.fixtures.fakes.FakeFfiTimelineItem
import io.element.android.tests.testutils.lambda.lambdaError
import io.element.android.tests.testutils.lambda.lambdaRecorder
-import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
@@ -116,8 +114,6 @@ class TimelineItemsSubscriberTest {
private fun TestScope.createTimelineItemsSubscriber(
timeline: Timeline = FakeFfiTimeline(),
timelineItems: MutableSharedFlow> = MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE),
- initLatch: CompletableDeferred = CompletableDeferred(),
- isTimelineInitialized: MutableStateFlow = MutableStateFlow(false),
onNewSyncedEvent: () -> Unit = { lambdaError() },
): TimelineItemsSubscriber {
return TimelineItemsSubscriber(
@@ -125,8 +121,6 @@ private fun TestScope.createTimelineItemsSubscriber(
dispatcher = StandardTestDispatcher(testScheduler),
timeline = timeline,
timelineDiffProcessor = createMatrixTimelineDiffProcessor(timelineItems),
- initLatch = initLatch,
- isTimelineInitialized = isTimelineInitialized,
onNewSyncedEvent = onNewSyncedEvent,
)
}
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt
index aaadf74aea..c5b1c3edb7 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LastForwardIndicatorsPostProcessorTest.kt
@@ -18,21 +18,14 @@ class LastForwardIndicatorsPostProcessorTest {
@Test
fun `LastForwardIndicatorsPostProcessor does not alter the items with mode not FOCUSED_ON_EVENT`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.LIVE)
- val result = sut.process(listOf(messageEvent), true)
- assertThat(result).containsExactly(messageEvent)
- }
-
- @Test
- fun `LastForwardIndicatorsPostProcessor does not alter the items with mode FOCUSED_ON_EVENT but timeline not initialized`() {
- val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
- val result = sut.process(listOf(messageEvent), false)
+ val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(messageEvent)
}
@Test
fun `LastForwardIndicatorsPostProcessor add virtual items`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
- val result = sut.process(listOf(messageEvent), true)
+ val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(
messageEvent,
MatrixTimelineItem.Virtual(
@@ -45,7 +38,7 @@ class LastForwardIndicatorsPostProcessorTest {
@Test
fun `LastForwardIndicatorsPostProcessor add virtual items on empty list`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
- val result = sut.process(listOf(), true)
+ val result = sut.process(listOf())
assertThat(result).containsExactly(
MatrixTimelineItem.Virtual(
uniqueId = UniqueId("last_forward_indicator_fake_id"),
@@ -58,9 +51,9 @@ class LastForwardIndicatorsPostProcessorTest {
fun `LastForwardIndicatorsPostProcessor add virtual items but does not alter the list if called a second time`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
// Process a first time
- sut.process(listOf(messageEvent), true)
+ sut.process(listOf(messageEvent))
// Process a second time with the same Event
- val result = sut.process(listOf(messageEvent), true)
+ val result = sut.process(listOf(messageEvent))
assertThat(result).containsExactly(
messageEvent,
MatrixTimelineItem.Virtual(
@@ -74,9 +67,9 @@ class LastForwardIndicatorsPostProcessorTest {
fun `LastForwardIndicatorsPostProcessor add virtual items each time it is called with new Events`() {
val sut = LastForwardIndicatorsPostProcessor(Timeline.Mode.FOCUSED_ON_EVENT)
// Process a first time
- sut.process(listOf(dayEvent, messageEvent), true)
+ sut.process(listOf(dayEvent, messageEvent))
// Process a second time with the same Event
- val result = sut.process(listOf(dayEvent, messageEvent, messageEvent2), true)
+ val result = sut.process(listOf(dayEvent, messageEvent, messageEvent2))
assertThat(result).containsExactly(
dayEvent,
messageEvent,
diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt
index b7e174e4a8..881d718392 100644
--- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt
+++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/LoadingIndicatorsPostProcessorTest.kt
@@ -16,25 +16,12 @@ import io.element.android.services.toolbox.test.systemclock.FakeSystemClock
import org.junit.Test
class LoadingIndicatorsPostProcessorTest {
- @Test
- fun `LoadingIndicatorsPostProcessor does not alter the items is the timeline is not initialized`() {
- val sut = LoadingIndicatorsPostProcessor(FakeSystemClock())
- val result = sut.process(
- items = listOf(messageEvent, messageEvent2),
- isTimelineInitialized = false,
- hasMoreToLoadBackward = true,
- hasMoreToLoadForward = true,
- )
- assertThat(result).containsExactly(messageEvent, messageEvent2)
- }
-
@Test
fun `LoadingIndicatorsPostProcessor adds Loading indicator at the top of the list if hasMoreToLoadBackward is true`() {
val clock = FakeSystemClock()
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
- isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = false,
)
@@ -57,7 +44,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
- isTimelineInitialized = true,
hasMoreToLoadBackward = false,
hasMoreToLoadForward = true,
)
@@ -80,7 +66,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(messageEvent, messageEvent2),
- isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = true,
)
@@ -110,7 +95,6 @@ class LoadingIndicatorsPostProcessorTest {
val sut = LoadingIndicatorsPostProcessor(clock)
val result = sut.process(
items = listOf(),
- isTimelineInitialized = true,
hasMoreToLoadBackward = true,
hasMoreToLoadForward = true,
)
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt
index 7d3ee5e994..9b609b39c7 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt
@@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
import io.element.android.libraries.matrix.api.notification.NotificationService
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
@@ -36,6 +37,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
import io.element.android.libraries.matrix.test.media.FakeMatrixMediaLoader
+import io.element.android.libraries.matrix.test.media.FakeMediaPreviewService
import io.element.android.libraries.matrix.test.notification.FakeNotificationService
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
import io.element.android.libraries.matrix.test.pushers.FakePushersService
@@ -72,6 +74,7 @@ class FakeMatrixClient(
private val syncService: FakeSyncService = FakeSyncService(),
private val encryptionService: FakeEncryptionService = FakeEncryptionService(),
private val roomDirectoryService: RoomDirectoryService = FakeRoomDirectoryService(),
+ private val mediaPreviewService: MediaPreviewService = FakeMediaPreviewService(),
private val accountManagementUrlResult: (AccountManagementAction?) -> Result = { lambdaError() },
private val resolveRoomAliasResult: (RoomAlias) -> Result> = {
Result.success(
@@ -89,6 +92,7 @@ class FakeMatrixClient(
private val ignoreUserResult: (UserId) -> Result = { lambdaError() },
private var unIgnoreUserResult: (UserId) -> Result = { Result.success(Unit) },
private val canReportRoomLambda: () -> Boolean = { false },
+ private val isLivekitRtcSupportedLambda: () -> Boolean = { false },
override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()),
) : MatrixClient {
var setDisplayNameCalled: Boolean = false
@@ -233,6 +237,7 @@ class FakeMatrixClient(
override fun notificationService(): NotificationService = notificationService
override fun notificationSettingsService(): NotificationSettingsService = notificationSettingsService
override fun encryptionService(): EncryptionService = encryptionService
+ override fun mediaPreviewService(): MediaPreviewService = mediaPreviewService
override fun roomMembershipObserver(): RoomMembershipObserver {
return RoomMembershipObserver()
@@ -334,4 +339,8 @@ class FakeMatrixClient(
override suspend fun canReportRoom(): Boolean {
return canReportRoomLambda()
}
+
+ override suspend fun isLivekitRtcSupported(): Boolean {
+ return isLivekitRtcSupportedLambda()
+ }
}
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.kt
new file mode 100644
index 0000000000..d8e9114817
--- /dev/null
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2025 New Vector 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.matrix.test.media
+
+import io.element.android.libraries.matrix.api.media.MediaPreviewConfig
+import io.element.android.libraries.matrix.api.media.MediaPreviewService
+import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.tests.testutils.lambda.lambdaError
+import io.element.android.tests.testutils.simulateLongTask
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class FakeMediaPreviewService(
+ override val mediaPreviewConfigFlow: StateFlow = MutableStateFlow(MediaPreviewConfig.DEFAULT),
+ private val fetchMediaPreviewConfigResult: () -> Result = { lambdaError() },
+ private val setMediaPreviewValueResult: (MediaPreviewValue) -> Result = { lambdaError() },
+ private val setHideInviteAvatarsResult: (Boolean) -> Result = { lambdaError() },
+) : MediaPreviewService {
+ override suspend fun fetchMediaPreviewConfig(): Result = simulateLongTask {
+ fetchMediaPreviewConfigResult()
+ }
+
+ override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = simulateLongTask {
+ setMediaPreviewValueResult(mediaPreviewValue)
+ }
+
+ override suspend fun setHideInviteAvatars(hide: Boolean): Result = simulateLongTask {
+ setHideInviteAvatarsResult(hide)
+ }
+}
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt
index c620f5c886..872481a860 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeBaseRoom.kt
@@ -20,7 +20,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomMembersState
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.tombstone.PredecessorRoom
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -57,7 +57,7 @@ class FakeBaseRoom(
private val canUserPinUnpinResult: (UserId) -> Result = { lambdaError() },
private val setIsFavoriteResult: (Boolean) -> Result = { lambdaError() },
private val markAsReadResult: (ReceiptType) -> Result = { Result.success(Unit) },
- private val powerLevelsResult: () -> Result = { lambdaError() },
+ private val powerLevelsResult: () -> Result = { lambdaError() },
private val leaveRoomLambda: () -> Result = { lambdaError() },
private val updateMembersResult: () -> Unit = { lambdaError() },
private val getMembersResult: (Int) -> Result> = { lambdaError() },
@@ -93,7 +93,7 @@ class FakeBaseRoom(
subscribeToSyncLambda()
}
- override suspend fun powerLevels(): Result {
+ override suspend fun powerLevels(): Result {
return powerLevelsResult()
}
@@ -225,7 +225,7 @@ class FakeBaseRoom(
override fun predecessorRoom(): PredecessorRoom? = predecessorRoomResult()
}
-fun defaultRoomPowerLevels() = RoomPowerLevels(
+fun defaultRoomPowerLevelValues() = RoomPowerLevelsValues(
ban = 50,
invite = 0,
kick = 50,
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeJoinedRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeJoinedRoom.kt
index ff7a1ddc26..c98c886129 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeJoinedRoom.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeJoinedRoom.kt
@@ -25,7 +25,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationSettingsStat
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.knock.KnockRequest
-import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
import io.element.android.libraries.matrix.api.timeline.Timeline
@@ -66,8 +66,8 @@ class FakeJoinedRoom(
private val updateAvatarResult: (String, ByteArray) -> Result = { _, _ -> lambdaError() },
private val removeAvatarResult: () -> Result = { lambdaError() },
private val updateUserRoleResult: (List) -> Result = { lambdaError() },
- private val updatePowerLevelsResult: (RoomPowerLevels) -> Result = { lambdaError() },
- private val resetPowerLevelsResult: () -> Result = { lambdaError() },
+ private val updatePowerLevelsResult: (RoomPowerLevelsValues) -> Result = { lambdaError() },
+ private val resetPowerLevelsResult: () -> Result = { lambdaError() },
private val reportContentResult: (EventId, String, UserId?) -> Result = { _, _, _ -> lambdaError() },
private val kickUserResult: (UserId, String?) -> Result = { _, _ -> lambdaError() },
private val banUserResult: (UserId, String?) -> Result = { _, _ -> lambdaError() },
@@ -162,11 +162,11 @@ class FakeJoinedRoom(
updateUserRoleResult(changes)
}
- override suspend fun updatePowerLevels(roomPowerLevels: RoomPowerLevels): Result = simulateLongTask {
- updatePowerLevelsResult(roomPowerLevels)
+ override suspend fun updatePowerLevels(roomPowerLevelsValues: RoomPowerLevelsValues): Result = simulateLongTask {
+ updatePowerLevelsResult(roomPowerLevelsValues)
}
- override suspend fun resetPowerLevels(): Result = simulateLongTask {
+ override suspend fun resetPowerLevels(): Result = simulateLongTask {
resetPowerLevelsResult()
}
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 0fc88d1d81..d7f9ccd6be 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
@@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
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.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
@@ -24,7 +25,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME
import io.element.android.libraries.matrix.test.A_ROOM_TOPIC
-import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList
@@ -52,7 +52,10 @@ fun aRoomInfo(
notificationCount: Long = 0,
userDefinedNotificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,
- userPowerLevels: ImmutableMap = persistentMapOf(),
+ roomPowerLevels: RoomPowerLevels = RoomPowerLevels(
+ values = defaultRoomPowerLevelValues(),
+ users = persistentMapOf(),
+ ),
activeRoomCallParticipants: List = emptyList(),
heroes: List = emptyList(),
pinnedEventIds: List = emptyList(),
@@ -86,7 +89,7 @@ fun aRoomInfo(
notificationCount = notificationCount,
userDefinedNotificationMode = userDefinedNotificationMode,
hasRoomCall = hasRoomCall,
- userPowerLevels = userPowerLevels,
+ roomPowerLevels = roomPowerLevels,
activeRoomCallParticipants = activeRoomCallParticipants.toImmutableList(),
heroes = heroes.toImmutableList(),
pinnedEventIds = pinnedEventIds.toImmutableList(),
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 27302a2d87..aab27e8a11 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
@@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
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.message.RoomMessage
+import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevels
import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem
@@ -29,7 +30,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_RAW_NAME
import io.element.android.libraries.matrix.test.A_ROOM_TOPIC
import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem
-import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentList
@@ -65,7 +65,10 @@ fun aRoomSummary(
notificationCount: Long = 0,
userDefinedNotificationMode: RoomNotificationMode? = null,
hasRoomCall: Boolean = false,
- userPowerLevels: ImmutableMap = persistentMapOf(),
+ roomPowerLevels: RoomPowerLevels = RoomPowerLevels(
+ values = defaultRoomPowerLevelValues(),
+ users = persistentMapOf(),
+ ),
activeRoomCallParticipants: List = emptyList(),
heroes: List = emptyList(),
pinnedEventIds: List = emptyList(),
@@ -97,7 +100,7 @@ fun aRoomSummary(
activeMembersCount = activeMembersCount,
invitedMembersCount = invitedMembersCount,
joinedMembersCount = joinedMembersCount,
- userPowerLevels = userPowerLevels,
+ roomPowerLevels = roomPowerLevels,
highlightCount = highlightCount,
notificationCount = notificationCount,
userDefinedNotificationMode = userDefinedNotificationMode,
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt
index 75b8e5a5f3..b0a19924b3 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CreateDmConfirmationBottomSheet.kt
@@ -25,6 +25,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button
@@ -62,6 +63,7 @@ fun CreateDmConfirmationBottomSheet(
Spacer(modifier = Modifier.height(24.dp))
Avatar(
avatarData = matrixUser.getAvatarData(AvatarSize.DmCreationConfirmation),
+ avatarType = AvatarType.User,
)
Spacer(modifier = Modifier.height(16.dp))
Text(
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt
index eecacda543..3b8b6831ca 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/EditableAvatarView.kt
@@ -13,7 +13,6 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
@@ -35,6 +34,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -49,6 +49,7 @@ fun EditableAvatarView(
displayName: String?,
avatarUrl: Uri?,
avatarSize: AvatarSize,
+ avatarType: AvatarType,
onAvatarClick: () -> Unit,
modifier: Modifier = Modifier,
) {
@@ -59,7 +60,6 @@ fun EditableAvatarView(
val a11yAvatar = stringResource(CommonStrings.a11y_avatar)
Box(
modifier = Modifier
- .size(avatarSize.dp)
.clickable(
interactionSource = remember { MutableInteractionSource() },
onClick = onAvatarClick,
@@ -73,14 +73,20 @@ fun EditableAvatarView(
when (avatarUrl?.scheme) {
null, "mxc" -> {
Avatar(
- avatarData = AvatarData(matrixId, displayName, avatarUrl?.toString(), size = avatarSize),
- modifier = Modifier.fillMaxSize(),
+ avatarData = AvatarData(
+ id = matrixId,
+ name = displayName,
+ url = avatarUrl?.toString(),
+ size = avatarSize,
+ ),
+ avatarType = avatarType,
)
}
else -> {
UnsavedAvatar(
avatarUri = avatarUrl,
- modifier = Modifier.fillMaxSize(),
+ avatarSize = avatarSize,
+ avatarType = avatarType,
)
}
}
@@ -116,6 +122,7 @@ internal fun EditableAvatarViewPreview(
displayName = "A room",
avatarUrl = uri,
avatarSize = AvatarSize.EditRoomDetails,
+ avatarType = AvatarType.User,
onAvatarClick = {},
)
}
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt
index 946c0d51e9..960bdb9098 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/InviteSenderView.kt
@@ -18,6 +18,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Text
@@ -35,7 +36,11 @@ fun InviteSenderView(
modifier = modifier,
) {
Box(modifier = Modifier.padding(vertical = 2.dp)) {
- Avatar(avatarData = inviteSender.avatarData, hideImage = hideAvatarImage)
+ Avatar(
+ avatarData = inviteSender.avatarData,
+ avatarType = AvatarType.User,
+ hideImage = hideAvatarImage,
+ )
}
Text(
text = inviteSender.annotatedString(),
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt
index 55833caf59..cb97c1e9f4 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Text
@@ -65,6 +66,7 @@ private fun MatrixUserHeaderContent(
modifier = Modifier
.padding(vertical = 12.dp),
avatarData = matrixUser.getAvatarData(size = AvatarSize.UserPreference),
+ avatarType = AvatarType.User,
)
Spacer(modifier = Modifier.width(16.dp))
Column(
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt
index 06cead3526..4a672624ab 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt
@@ -28,8 +28,9 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
-import io.element.android.libraries.designsystem.components.avatar.RoomAvatar
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -53,10 +54,12 @@ fun SelectedRoom(
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
- RoomAvatar(
+ Avatar(
avatarData = roomInfo.getAvatarData(AvatarSize.SelectedRoom),
- heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize.SelectedRoom) }.toImmutableList(),
- isTombstoned = roomInfo.isTombstoned,
+ avatarType = AvatarType.Room(
+ heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize.SelectedRoom) }.toImmutableList(),
+ isTombstoned = roomInfo.isTombstoned,
+ ),
)
Text(
// If name is null, we do not have space to render "No room name", so just use `#` here.
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt
index ddb6134895..31cc724838 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt
@@ -30,6 +30,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -54,7 +55,10 @@ fun SelectedUser(
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
- Avatar(matrixUser.getAvatarData(size = AvatarSize.SelectedUser))
+ Avatar(
+ avatarData = matrixUser.getAvatarData(size = AvatarSize.SelectedUser),
+ avatarType = AvatarType.User,
+ )
Text(
modifier = Modifier.clipToBounds(),
text = matrixUser.getBestName(),
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt
index 41f58fc67a..4c1c4d5f3c 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt
@@ -27,6 +27,7 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
@@ -46,7 +47,10 @@ fun UnresolvedUserRow(
.padding(start = 16.dp, top = 8.dp, end = 16.dp, bottom = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
- Avatar(avatarData)
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Column(
modifier = Modifier
.padding(start = 12.dp),
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt
index 3a31bf916e..1e041a69fe 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt
@@ -9,10 +9,11 @@ package io.element.android.libraries.matrix.ui.components
import android.net.Uri
import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AddAPhoto
import androidx.compose.material3.MaterialTheme
@@ -27,6 +28,9 @@ import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
import coil3.request.ImageRequest
import io.element.android.compound.theme.ElementTheme
+import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
+import io.element.android.libraries.designsystem.components.avatar.avatarShape
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
@@ -40,11 +44,13 @@ import io.element.android.libraries.designsystem.theme.temporaryColorBgSpecial
@Composable
fun UnsavedAvatar(
avatarUri: Uri?,
+ avatarSize: AvatarSize,
+ avatarType: AvatarType,
modifier: Modifier = Modifier,
) {
val commonModifier = modifier
- .size(70.dp)
- .clip(CircleShape)
+ .size(avatarSize.dp)
+ .clip(avatarType.avatarShape(avatarSize.dp))
if (avatarUri != null) {
val context = LocalContext.current
@@ -65,7 +71,7 @@ fun UnsavedAvatar(
contentDescription = null,
modifier = Modifier
.align(Alignment.Center)
- .size(40.dp),
+ .size(avatarSize.dp * 4 / 7),
tint = ElementTheme.colors.iconSecondary,
)
}
@@ -75,8 +81,13 @@ fun UnsavedAvatar(
@PreviewsDayNight
@Composable
internal fun UnsavedAvatarPreview() = ElementPreview {
- Row {
- UnsavedAvatar(null)
- UnsavedAvatar(Uri.EMPTY)
+ Row(
+ modifier = Modifier.padding(8.dp),
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ ) {
+ UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.User)
+ UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.User)
+ UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.Space())
+ UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.Space())
}
}
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt
index 2f5874b664..2ee234bd43 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt
@@ -21,6 +21,7 @@ import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.theme.components.Text
@Composable
@@ -38,7 +39,10 @@ internal fun UserRow(
.padding(start = 16.dp, top = 4.dp, end = 16.dp, bottom = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
- Avatar(avatarData)
+ Avatar(
+ avatarData = avatarData,
+ avatarType = AvatarType.User,
+ )
Column(
modifier = Modifier
.padding(start = 12.dp)
diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt
index ba32d01e8a..0080eea700 100644
--- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt
+++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt
@@ -106,7 +106,7 @@ fun BaseRoom.userPowerLevelAsState(updateKey: Long): State {
@Composable
fun BaseRoom.isOwnUserAdmin(): Boolean {
val roomInfo by roomInfoFlow.collectAsState()
- val powerLevel = roomInfo.userPowerLevels[sessionId] ?: 0L
+ val powerLevel = roomInfo.roomPowerLevels?.users?.get(sessionId) ?: 0L
return RoomMember.Role.forPowerLevel(powerLevel) == RoomMember.Role.ADMIN
}
diff --git a/libraries/matrixui/src/main/res/values-da/translations.xml b/libraries/matrixui/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..5b4970f003
--- /dev/null
+++ b/libraries/matrixui/src/main/res/values-da/translations.xml
@@ -0,0 +1,7 @@
+
+
+ "Send invitation"
+ "Kunne du tænke dig at starte en samtale med %1$s?"
+ "Send invitation?"
+ "%1$s(%2$s ) inviterede dig"
+
diff --git a/libraries/matrixui/src/main/res/values-in/translations.xml b/libraries/matrixui/src/main/res/values-in/translations.xml
index 11b1de4d8a..e7706afa76 100644
--- a/libraries/matrixui/src/main/res/values-in/translations.xml
+++ b/libraries/matrixui/src/main/res/values-in/translations.xml
@@ -1,4 +1,7 @@
+ "Kirim undangan"
+ "Apakah Anda ingin memulai obrolan dengan %1$s?"
+ "Kirim undangan?"
"%1$s (%2$s) mengundang Anda"
diff --git a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt
index 7aa8c1062f..7f2f8b0ff6 100644
--- a/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt
+++ b/libraries/mediaupload/impl/src/test/kotlin/io/element/android/libraries/mediaupload/impl/AndroidMediaPreProcessorTest.kt
@@ -66,6 +66,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing png`() = runTest {
val mediaUploadInfo = process(
asset = assetImagePng,
@@ -109,6 +110,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing png no compression`() = runTest {
val mediaUploadInfo = process(
asset = assetImagePng,
@@ -130,6 +132,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing png and delete`() = runTest {
val mediaUploadInfo = process(
asset = assetImagePng,
@@ -154,6 +157,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing jpeg`() = runTest {
val mediaUploadInfo = process(
asset = assetImageJpeg,
@@ -197,6 +201,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing jpeg no compression`() = runTest {
val mediaUploadInfo = process(
asset = assetImageJpeg,
@@ -218,6 +223,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing jpeg and delete`() = runTest {
val mediaUploadInfo = process(
asset = assetImageJpeg,
@@ -242,6 +248,7 @@ class AndroidMediaPreProcessorTest {
}
@Test
+ @Ignore("Ignore now that min API for enterprise is 33")
fun `test processing gif`() = runTest {
val mediaUploadInfo = process(
asset = assetAnimatedGif,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt
index 5d4b67a411..22c29c590b 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheet.kt
@@ -29,6 +29,7 @@ import io.element.android.libraries.designsystem.colors.AvatarColorsProvider
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
+import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -139,12 +140,13 @@ private fun SenderRow(
) {
val id = mediaInfo.senderId?.value ?: "@Alice:domain"
Avatar(
- AvatarData(
+ avatarData = AvatarData(
id = id,
name = mediaInfo.senderName,
url = mediaInfo.senderAvatar,
size = AvatarSize.MediaSender,
- )
+ ),
+ avatarType = AvatarType.User,
)
Column(
modifier = Modifier
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt
index 38eed3252f..23f68c290d 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryView.kt
@@ -35,6 +35,8 @@ 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.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -95,6 +97,9 @@ fun MediaGalleryView(
TopAppBar(
title = {
Text(
+ modifier = Modifier.semantics {
+ heading()
+ },
text = state.roomName,
style = ElementTheme.typography.aliasScreenTitle,
maxLines = 1,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt
index 73786e12a4..c8d735d485 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/AudioItemView.kt
@@ -23,6 +23,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -35,6 +36,7 @@ import io.element.android.libraries.designsystem.theme.components.HorizontalDivi
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.mediaviewer.impl.model.MediaItem
+import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun AudioItemView(
@@ -77,7 +79,11 @@ private fun FilenameRow(
color = ElementTheme.colors.bgSubtleSecondary,
shape = RoundedCornerShape(12.dp),
)
- .combinedClickable(onClick = onClick, onLongClick = onLongClick)
+ .combinedClickable(
+ onClick = onClick,
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
.fillMaxWidth()
.padding(start = 12.dp, end = 36.dp, top = 8.dp, bottom = 8.dp),
verticalAlignment = Alignment.CenterVertically,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/DateItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/DateItemView.kt
index 84fe175fc9..ff59a67b49 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/DateItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/DateItemView.kt
@@ -11,6 +11,8 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -28,7 +30,10 @@ fun DateItemView(
Text(
modifier = modifier
.fillMaxWidth()
- .padding(12.dp),
+ .padding(12.dp)
+ .semantics {
+ heading()
+ },
text = item.formattedDate,
textAlign = TextAlign.Center,
style = ElementTheme.typography.fontBodyMdMedium,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt
index cd73365cca..1144fc3eaf 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/FileItemView.kt
@@ -23,6 +23,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
@@ -35,6 +36,7 @@ import io.element.android.libraries.designsystem.theme.components.HorizontalDivi
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.mediaviewer.impl.model.MediaItem
+import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun FileItemView(
@@ -77,7 +79,11 @@ private fun FilenameRow(
color = ElementTheme.colors.bgSubtleSecondary,
shape = RoundedCornerShape(12.dp),
)
- .combinedClickable(onClick = onClick, onLongClick = onLongClick)
+ .combinedClickable(
+ onClick = onClick,
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
.fillMaxWidth()
.padding(start = 12.dp, end = 36.dp, top = 8.dp, bottom = 8.dp),
verticalAlignment = Alignment.CenterVertically,
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/ImageItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/ImageItemView.kt
index 76841a9153..917c60df9e 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/ImageItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/ImageItemView.kt
@@ -21,12 +21,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.stringResource
import coil3.compose.AsyncImage
import coil3.compose.AsyncImagePainter
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.mediaviewer.impl.model.MediaItem
import io.element.android.libraries.mediaviewer.impl.model.aMediaItemImage
+import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun ImageItemView(
@@ -38,7 +40,11 @@ fun ImageItemView(
Box(
modifier = modifier
.aspectRatio(1f)
- .combinedClickable(onClick = onClick, onLongClick = onLongClick),
+ .combinedClickable(
+ onClick = onClick,
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ ),
) {
var isLoaded by remember { mutableStateOf(false) }
AsyncImage(
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VideoItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VideoItemView.kt
index 0f49028d34..cdc66c4eae 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VideoItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VideoItemView.kt
@@ -26,6 +26,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
@@ -37,6 +38,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.mediaviewer.impl.model.MediaItem
+import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun VideoItemView(
@@ -48,7 +50,11 @@ fun VideoItemView(
Box(
modifier = modifier
.aspectRatio(1f)
- .combinedClickable(onClick = onClick, onLongClick = onLongClick),
+ .combinedClickable(
+ onClick = onClick,
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ ),
) {
var isLoaded by remember { mutableStateOf(false) }
AsyncImage(
diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt
index fdb236baa2..5d84b79f8f 100644
--- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt
+++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/ui/VoiceItemView.kt
@@ -100,7 +100,11 @@ private fun VoiceInfoRow(
color = ElementTheme.colors.bgSubtleSecondary,
shape = RoundedCornerShape(12.dp),
)
- .combinedClickable(onClick = {}, onLongClick = onLongClick)
+ .combinedClickable(
+ onClick = {},
+ onLongClick = onLongClick,
+ onLongClickLabel = stringResource(CommonStrings.action_open_context_menu),
+ )
.fillMaxWidth()
.padding(start = 12.dp, end = 36.dp, top = 8.dp, bottom = 8.dp),
verticalAlignment = Alignment.CenterVertically,
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 bba3c47f43..8e619fbdc9 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
@@ -25,6 +25,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Size
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.viewinterop.AndroidView
@@ -33,6 +34,7 @@ import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.common.Player.STATE_READY
import androidx.media3.common.Timeline
+import androidx.media3.common.VideoSize
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.PlayerView
@@ -54,6 +56,8 @@ import io.element.android.libraries.mediaviewer.impl.local.player.seekToEnsurePl
import io.element.android.libraries.mediaviewer.impl.local.player.togglePlay
import io.element.android.libraries.mediaviewer.impl.local.rememberLocalMediaViewState
import kotlinx.coroutines.delay
+import me.saket.telephoto.zoomable.ZoomableContentLocation
+import me.saket.telephoto.zoomable.zoomable
import kotlin.time.Duration.Companion.seconds
@SuppressLint("UnsafeOptInUsageError")
@@ -150,6 +154,18 @@ private fun ExoPlayerMediaVideoView(
isReady = playbackState == STATE_READY,
)
}
+
+ override fun onVideoSizeChanged(videoSize: VideoSize) {
+ // Ensure that the user cannot zoom/move outside of the video bounds
+ localMediaViewState.zoomableState.setContentLocation(
+ ZoomableContentLocation.scaledInsideAndCenterAligned(
+ Size(
+ videoSize.width.toFloat(),
+ videoSize.height.toFloat(),
+ )
+ )
+ )
+ }
}
}
@@ -216,24 +232,26 @@ private fun ExoPlayerMediaVideoView(
)
} else {
AndroidView(
- modifier = Modifier.fillMaxSize(),
- factory = {
- PlayerView(context).apply {
- player = exoPlayer
- resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT
- layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)
- setOnClickListener {
+ modifier = Modifier
+ .fillMaxSize()
+ .zoomable(
+ state = localMediaViewState.zoomableState,
+ onClick = {
autoHideController++
mediaPlayerControllerState = mediaPlayerControllerState.copy(
isVisible = !mediaPlayerControllerState.isVisible,
)
}
+ ),
+ factory = {
+ PlayerView(context).apply {
+ player = exoPlayer
+ resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT
+ layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)
useController = false
}
},
onRelease = { playerView ->
- playerView.setOnClickListener(null)
- playerView.setControllerVisibilityListener(null as PlayerView.ControllerVisibilityListener?)
playerView.player = null
},
)
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 a4a7f2209f..110054eb20 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
@@ -43,6 +43,8 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.heading
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
@@ -212,6 +214,9 @@ fun MediaViewerView(
title = {
if (currentData is MediaViewerPageData.Loading) {
Text(
+ modifier = Modifier.semantics {
+ heading()
+ },
text = stringResource(id = CommonStrings.common_loading_more),
style = ElementTheme.typography.fontBodyMdMedium,
color = ElementTheme.colors.textPrimary,
@@ -454,6 +459,9 @@ private fun MediaViewerTopBar(
.fillMaxWidth()
) {
Text(
+ modifier = Modifier.semantics {
+ heading()
+ },
text = senderName,
style = ElementTheme.typography.fontBodyMdMedium,
color = ElementTheme.colors.textPrimary,
diff --git a/libraries/mediaviewer/impl/src/main/res/values-bg/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-bg/translations.xml
new file mode 100644
index 0000000000..e6874e6743
--- /dev/null
+++ b/libraries/mediaviewer/impl/src/main/res/values-bg/translations.xml
@@ -0,0 +1,6 @@
+
+
+ "Файлове"
+ "Медия"
+ "Медия и файлове"
+
diff --git a/libraries/mediaviewer/impl/src/main/res/values-da/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..5d88458495
--- /dev/null
+++ b/libraries/mediaviewer/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,21 @@
+
+
+ "Denne fil vil blive fjernet fra rummet, og medlemmer vil ikke længere have adgang til den."
+ "Vil du slette filen?"
+ "Tjek din internetforbindelse, og prøv igen."
+ "Dokumenter, lydfiler og stemmemeddelelser uploadet til dette rum vises her."
+ "Ingen filer uploadet endnu"
+ "Indlæser filer…"
+ "Indlæser medier…"
+ "Filer"
+ "Medier"
+ "Billeder og videoer uploadet til dette rum vil blive vist her."
+ "Ingen medier uploadet endnu"
+ "Medier og filer"
+ "Filformat"
+ "Filnavn"
+ "Ikke flere filer at vise"
+ "Ikke flere medier at vise"
+ "Uploadet af"
+ "Uploadet på"
+
diff --git a/libraries/mediaviewer/impl/src/main/res/values-el/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-el/translations.xml
index 93571105ca..c273012001 100644
--- a/libraries/mediaviewer/impl/src/main/res/values-el/translations.xml
+++ b/libraries/mediaviewer/impl/src/main/res/values-el/translations.xml
@@ -3,13 +3,13 @@
"Αυτό το αρχείο θα αφαιρεθεί από την αίθουσα και τα μέλη δεν θα έχουν πρόσβαση σε αυτό."
"Διαγραφή αρχείου;"
"Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και δοκιμάστε ξανά."
- "Έγγραφα, αρχεία ήχου και φωνητικά μηνύματα που έχουν μεταφορτωθεί σε αυτό το δωμάτιο θα εμφανίζονται εδώ."
+ "Τα έγγραφα, τα αρχεία ήχου και τα φωνητικά μηνύματα που μεταφορτώνονται σε αυτή την αίθουσα θα εμφανίζονται εδώ."
"Δεν έχουν μεταφορτωθεί ακόμα αρχεία"
"Φόρτωση αρχείων…"
"Φόρτωση πολυμέσων…"
"Αρχεία"
"Πολυμέσα"
- "Εικόνες και βίντεο που μεταφορτώνονται σε αυτό το δωμάτιο θα εμφανίζονται εδώ."
+ "Οι εικόνες και τα βίντεο που μεταφορτώνονται σε αυτή την αίθουσα θα εμφανίζονται εδώ."
"Δεν έχουν μεταφορτωθεί ακόμα πολυμέσα"
"Πολυμέσα και αρχεία"
"Μορφή αρχείου"
diff --git a/libraries/mediaviewer/impl/src/main/res/values-in/translations.xml b/libraries/mediaviewer/impl/src/main/res/values-in/translations.xml
index 2cdc0cf27c..b5c2bde7cb 100644
--- a/libraries/mediaviewer/impl/src/main/res/values-in/translations.xml
+++ b/libraries/mediaviewer/impl/src/main/res/values-in/translations.xml
@@ -14,6 +14,8 @@
"Media dan berkas"
"Format berkas"
"Nama berkas"
+ "Tidak ada lagi berkas untuk ditampilkan"
+ "Tidak ada lagi media untuk ditampilkan"
"Diunggah oleh"
"Diunggah pada"
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt
index 1289d73672..bd4373a420 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt
@@ -31,6 +31,7 @@ class MediaDetailsBottomSheetTest {
val rule = createAndroidComposeRule()
@Test
+ @Config(qualifiers = "h1024dp")
fun `clicking on View in timeline invokes expected callback`() {
val state = aMediaDetailsBottomSheetState()
ensureCalledOnceWithParam(state.eventId) { callback ->
@@ -43,6 +44,7 @@ class MediaDetailsBottomSheetTest {
}
@Test
+ @Config(qualifiers = "h1024dp")
fun `clicking on Share invokes expected callback`() {
val state = aMediaDetailsBottomSheetState()
ensureCalledOnceWithParam(state.eventId) { callback ->
@@ -55,6 +57,7 @@ class MediaDetailsBottomSheetTest {
}
@Test
+ @Config(qualifiers = "h1024dp")
fun `clicking on Save invokes expected callback`() {
val state = aMediaDetailsBottomSheetState()
ensureCalledOnceWithParam(state.eventId) { callback ->
diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidationTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidationTest.kt
index e5e811fb33..e2399eae34 100644
--- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidationTest.kt
+++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/util/FileExtensionExtractorWithValidationTest.kt
@@ -17,9 +17,7 @@ class FileExtensionExtractorWithValidationTest {
@Test
fun `test FileExtensionExtractor with validation OK`() {
val sut = FileExtensionExtractorWithValidation()
- // The result should be txt, but with Robolectric,
- // MimeTypeMap.getSingleton().hasExtension() always returns false
- assertThat(sut.extractFromName("test.txt")).isEqualTo("bin")
+ assertThat(sut.extractFromName("test.txt")).isEqualTo("txt")
}
@Test
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 74d83b733b..6423c3f0b7 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
@@ -32,6 +32,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class MediaViewerViewTest {
@@ -108,6 +109,7 @@ class MediaViewerViewTest {
}
@Test
+ @Config(qualifiers = "h1024dp")
fun `clicking on save emit expected Event`() {
val data = aMediaViewerPageData()
testBottomSheetAction(
@@ -118,6 +120,7 @@ class MediaViewerViewTest {
}
@Test
+ @Config(qualifiers = "h1024dp")
fun `clicking on share emit expected Event`() {
val data = aMediaViewerPageData()
testBottomSheetAction(
diff --git a/libraries/permissions/api/src/main/res/values-da/translations.xml b/libraries/permissions/api/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..8c823f75dd
--- /dev/null
+++ b/libraries/permissions/api/src/main/res/values-da/translations.xml
@@ -0,0 +1,7 @@
+
+
+ "For at lade applikationen bruge kameraet, skal du give tilladelsen i systemindstillingerne."
+ "Giv venligst tilladelsen i systemindstillingerne."
+ "For at lade applikationen bruge mikrofonen, skal du give tilladelsen i systemindstillingerne."
+ "For at lade applikationen vise notifikationer, skal du give tilladelsen i systemindstillingerne."
+
diff --git a/libraries/permissions/api/src/main/res/values-fa/translations.xml b/libraries/permissions/api/src/main/res/values-fa/translations.xml
index 54e7e245bd..1b014424ec 100644
--- a/libraries/permissions/api/src/main/res/values-fa/translations.xml
+++ b/libraries/permissions/api/src/main/res/values-fa/translations.xml
@@ -1,4 +1,7 @@
+ "برای اینکه برنامه از دوربین استفاده کند، لطفا در تنظیمات سیستم مجوز بدهید."
"لطفاً در تنظیمات سامانه اجازه بدهید."
+ "برای اینکه برنامه از میکروفون استفاده کند، لطفا اجازه دهید در تنظیمات سیستم مجوز بدهید."
+ "برای اینکه برنامه اعلان ها را نمایش دهد، لطفا مجوز را در تنظیمات سیستم اعطا کنید."
diff --git a/libraries/permissions/impl/src/main/res/values-da/translations.xml b/libraries/permissions/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..871610e35d
--- /dev/null
+++ b/libraries/permissions/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,5 @@
+
+
+ "Kontroller, at applikationen kan vise underretninger."
+ "Kontroller tilladelser"
+
diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt
index dfc0e38b89..7e47785088 100644
--- a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt
+++ b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt
@@ -22,11 +22,14 @@ interface AppPreferencesStore {
suspend fun setTheme(theme: String)
fun getThemeFlow(): Flow
- suspend fun setHideInviteAvatars(value: Boolean)
- fun getHideInviteAvatarsFlow(): Flow
-
- suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue)
- fun getTimelineMediaPreviewValueFlow(): Flow
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ suspend fun setHideInviteAvatars(hide: Boolean?)
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ fun getHideInviteAvatarsFlow(): Flow
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?)
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ fun getTimelineMediaPreviewValueFlow(): Flow
suspend fun setTracingLogLevel(logLevel: LogLevel)
fun getTracingLogLevelFlow(): Flow
diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt
index 599c73fc9d..0dff16ff98 100644
--- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt
+++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt
@@ -85,27 +85,39 @@ class DefaultAppPreferencesStore @Inject constructor(
}
}
- override suspend fun setHideInviteAvatars(value: Boolean) {
- store.edit { prefs ->
- prefs[hideInviteAvatarsKey] = value
- }
- }
-
- override fun getHideInviteAvatarsFlow(): Flow {
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override fun getHideInviteAvatarsFlow(): Flow {
return store.data.map { prefs ->
- prefs[hideInviteAvatarsKey] == true
+ prefs[hideInviteAvatarsKey]
}
}
- override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) {
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override suspend fun setHideInviteAvatars(hide: Boolean?) {
store.edit { prefs ->
- prefs[timelineMediaPreviewValueKey] = value.name
+ if (hide != null) {
+ prefs[hideInviteAvatarsKey] = hide
+ } else {
+ prefs.remove(hideInviteAvatarsKey)
+ }
}
}
- override fun getTimelineMediaPreviewValueFlow(): Flow {
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) {
+ store.edit { prefs ->
+ if (mediaPreviewValue != null) {
+ prefs[timelineMediaPreviewValueKey] = mediaPreviewValue.name
+ } else {
+ prefs.remove(timelineMediaPreviewValueKey)
+ }
+ }
+ }
+
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override fun getTimelineMediaPreviewValueFlow(): Flow {
return store.data.map { prefs ->
- prefs[timelineMediaPreviewValueKey]?.let { MediaPreviewValue.valueOf(it) } ?: MediaPreviewValue.On
+ prefs[timelineMediaPreviewValueKey]?.let { MediaPreviewValue.valueOf(it) }
}
}
diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt
index c5440a6be9..d0ee298a66 100644
--- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt
+++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt
@@ -17,8 +17,8 @@ import kotlinx.coroutines.flow.MutableStateFlow
class InMemoryAppPreferencesStore(
isDeveloperModeEnabled: Boolean = false,
customElementCallBaseUrl: String? = null,
- hideInviteAvatars: Boolean = false,
- timelineMediaPreviewValue: MediaPreviewValue = MediaPreviewValue.On,
+ hideInviteAvatars: Boolean? = null,
+ timelineMediaPreviewValue: MediaPreviewValue? = null,
theme: String? = null,
logLevel: LogLevel = LogLevel.INFO,
traceLockPacks: Set = emptySet(),
@@ -55,20 +55,24 @@ class InMemoryAppPreferencesStore(
return theme
}
- override suspend fun setHideInviteAvatars(value: Boolean) {
- hideInviteAvatars.value = value
- }
-
- override fun getHideInviteAvatarsFlow(): Flow {
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override fun getHideInviteAvatarsFlow(): Flow {
return hideInviteAvatars
}
- override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) {
- timelineMediaPreviewValue.value = value
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override fun getTimelineMediaPreviewValueFlow(): Flow {
+ return timelineMediaPreviewValue
}
- override fun getTimelineMediaPreviewValueFlow(): Flow {
- return timelineMediaPreviewValue
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override suspend fun setHideInviteAvatars(hide: Boolean?) {
+ hideInviteAvatars.value = hide
+ }
+
+ @Deprecated("Use MediaPreviewService instead. Kept only for migration.")
+ override suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) {
+ timelineMediaPreviewValue.value = mediaPreviewValue
}
override suspend fun setTracingLogLevel(logLevel: LogLevel) {
diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt
index 9a6b119a26..7e7dbe3fb4 100644
--- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt
+++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolver.kt
@@ -25,6 +25,7 @@ import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.media.MediaPreviewValue
+import io.element.android.libraries.matrix.api.media.getMediaPreviewValue
import io.element.android.libraries.matrix.api.notification.NotificationContent
import io.element.android.libraries.matrix.api.notification.NotificationData
import io.element.android.libraries.matrix.api.permalink.PermalinkParser
@@ -41,7 +42,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageTy
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.VoiceMessageType
import io.element.android.libraries.matrix.ui.messages.toPlainText
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.push.impl.R
import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
@@ -50,7 +50,6 @@ import io.element.android.libraries.push.impl.notifications.model.ResolvedPushEv
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.toolbox.api.strings.StringProvider
import io.element.android.services.toolbox.api.systemclock.SystemClock
-import kotlinx.coroutines.flow.first
import timber.log.Timber
import javax.inject.Inject
@@ -79,7 +78,6 @@ class DefaultNotifiableEventResolver @Inject constructor(
@ApplicationContext private val context: Context,
private val permalinkParser: PermalinkParser,
private val callNotificationEventResolver: CallNotificationEventResolver,
- private val appPreferencesStore: AppPreferencesStore,
) : NotifiableEventResolver {
override suspend fun resolveEvents(
sessionId: SessionId,
@@ -117,6 +115,7 @@ class DefaultNotifiableEventResolver @Inject constructor(
): Result = runCatchingExceptions {
when (val content = this.content) {
is NotificationContent.MessageLike.RoomMessage -> {
+ val showMediaPreview = client.mediaPreviewService().getMediaPreviewValue() == MediaPreviewValue.On
val senderDisambiguatedDisplayName = getDisambiguatedDisplayName(content.senderId)
val messageBody = descriptionFromMessageContent(content, senderDisambiguatedDisplayName)
val notifiableMessageEvent = buildNotifiableMessageEvent(
@@ -129,8 +128,8 @@ class DefaultNotifiableEventResolver @Inject constructor(
timestamp = this.timestamp,
senderDisambiguatedDisplayName = senderDisambiguatedDisplayName,
body = messageBody,
- imageUriString = content.fetchImageIfPresent(client)?.toString(),
- imageMimeType = content.getImageMimetype(),
+ imageUriString = if (showMediaPreview) content.fetchImageIfPresent(client)?.toString() else null,
+ imageMimeType = if (showMediaPreview) content.getImageMimetype() else null,
roomName = roomDisplayName,
roomIsDm = isDm,
roomAvatarPath = roomAvatarUrl,
@@ -323,9 +322,6 @@ class DefaultNotifiableEventResolver @Inject constructor(
}
private suspend fun NotificationContent.MessageLike.RoomMessage.fetchImageIfPresent(client: MatrixClient): Uri? {
- if (appPreferencesStore.getTimelineMediaPreviewValueFlow().first() != MediaPreviewValue.On) {
- return null
- }
val fileResult = when (val messageType = messageType) {
is ImageMessageType -> notificationMediaRepoFactory.create(client)
.getMediaFile(
@@ -349,10 +345,7 @@ class DefaultNotifiableEventResolver @Inject constructor(
.getOrNull()
}
- private suspend fun NotificationContent.MessageLike.RoomMessage.getImageMimetype(): String? {
- if (appPreferencesStore.getTimelineMediaPreviewValueFlow().first() != MediaPreviewValue.On) {
- return null
- }
+ private fun NotificationContent.MessageLike.RoomMessage.getImageMimetype(): String? {
return when (val messageType = messageType) {
is ImageMessageType -> messageType.info?.mimetype
is VideoMessageType -> null // Use the thumbnail here?
diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEvent.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEvent.kt
index 961b5ebf9d..57c004ce23 100644
--- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEvent.kt
+++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEvent.kt
@@ -8,21 +8,15 @@
package io.element.android.libraries.push.impl.push
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
-import io.element.android.libraries.core.coroutine.parallelMap
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.MatrixClientProvider
-import io.element.android.libraries.matrix.api.core.EventId
-import io.element.android.libraries.matrix.api.room.JoinedRoom
-import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.push.impl.notifications.model.NotifiableEvent
-import io.element.android.services.appnavstate.api.ActiveRoomsHolder
import io.element.android.services.appnavstate.api.AppForegroundStateService
-import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
-import kotlinx.coroutines.withTimeoutOrNull
+import timber.log.Timber
import javax.inject.Inject
-import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
class SyncOnNotifiableEvent @Inject constructor(
@@ -30,7 +24,6 @@ class SyncOnNotifiableEvent @Inject constructor(
private val featureFlagService: FeatureFlagService,
private val appForegroundStateService: AppForegroundStateService,
private val dispatchers: CoroutineDispatchers,
- private val activeRoomsHolder: ActiveRoomsHolder,
) {
suspend operator fun invoke(notifiableEvents: List) = withContext(dispatchers.io) {
if (!featureFlagService.isFeatureEnabled(FeatureFlags.SyncOnPush)) {
@@ -41,6 +34,7 @@ class SyncOnNotifiableEvent @Inject constructor(
val eventsBySession = notifiableEvents.groupBy { it.sessionId }
appForegroundStateService.updateIsSyncingNotificationEvent(true)
+ Timber.d("Starting opportunistic room list sync | In foreground: ${appForegroundStateService.isInForeground.value}")
for ((sessionId, events) in eventsBySession) {
val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: continue
@@ -49,38 +43,13 @@ class SyncOnNotifiableEvent @Inject constructor(
client.roomListService.subscribeToVisibleRooms(eventsByRoomId.keys.toList())
if (!appForegroundStateService.isInForeground.value) {
- for ((roomId, eventsInRoom) in eventsByRoomId) {
- val activeRoom = activeRoomsHolder.getActiveRoomMatching(sessionId, roomId)
- val room = activeRoom ?: client.getJoinedRoom(roomId)
-
- if (room != null) {
- eventsInRoom.parallelMap { event ->
- room.waitsUntilEventIsKnown(event.eventId, timeout = 10.seconds)
- }
- }
-
- if (room != null && activeRoom == null) {
- // Destroy the room we just instantiated to reset its live timeline
- room.destroy()
- }
- }
+ // Give the sync some time to complete in background
+ delay(10.seconds)
}
}
} finally {
+ Timber.d("Finished opportunistic room list sync")
appForegroundStateService.updateIsSyncingNotificationEvent(false)
}
}
-
- private suspend fun JoinedRoom.waitsUntilEventIsKnown(eventId: EventId, timeout: Duration) {
- withTimeoutOrNull(timeout) {
- liveTimeline.timelineItems.first { timelineItems ->
- timelineItems.any { timelineItem ->
- when (timelineItem) {
- is MatrixTimelineItem.Event -> timelineItem.eventId == eventId
- else -> false
- }
- }
- }
- }
- }
}
diff --git a/libraries/push/impl/src/main/res/values-be/translations.xml b/libraries/push/impl/src/main/res/values-be/translations.xml
index 176986d759..7a30be6f01 100644
--- a/libraries/push/impl/src/main/res/values-be/translations.xml
+++ b/libraries/push/impl/src/main/res/values-be/translations.xml
@@ -15,7 +15,6 @@
- "%d апавяшчэнні"
- "%d апавяшчэнняў"
- "Апавяшчэнне"
"📹 Уваходны выклік"
"** Не атрымалася даслаць - калі ласка, адкрыйце пакой"
"Далучыцца"
diff --git a/libraries/push/impl/src/main/res/values-bg/translations.xml b/libraries/push/impl/src/main/res/values-bg/translations.xml
index 821ca2f5d8..ca1d5c08c8 100644
--- a/libraries/push/impl/src/main/res/values-bg/translations.xml
+++ b/libraries/push/impl/src/main/res/values-bg/translations.xml
@@ -10,7 +10,6 @@
- "%d известие"
- "%d известия"
- "Известие"
"** Неуспешно изпращане - моля, отворете стаята"
"Присъединяване"
diff --git a/libraries/push/impl/src/main/res/values-cy/translations.xml b/libraries/push/impl/src/main/res/values-cy/translations.xml
index c6500f40b4..d2e6a2810e 100644
--- a/libraries/push/impl/src/main/res/values-cy/translations.xml
+++ b/libraries/push/impl/src/main/res/values-cy/translations.xml
@@ -21,7 +21,7 @@
- "%d hysbysiad"
- "%d hysbysiad"
- "Hysbysiad"
+ "Mae gennych chi negeseuon newydd."
"📹 Galwad i mewn"
"** Wedi methu anfon - agorwch yr ystafell"
"Ymuno"
diff --git a/libraries/push/impl/src/main/res/values-da/translations.xml b/libraries/push/impl/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..facfc0eb3e
--- /dev/null
+++ b/libraries/push/impl/src/main/res/values-da/translations.xml
@@ -0,0 +1,82 @@
+
+
+ "Opkald"
+ "Lytter efter begivenheder"
+ "Lyd på notifikationer"
+ "Ringende opkald"
+ "Lydløse notifikationer"
+
+ - "%1$s: %2$d besked"
+ - "%1$s: %2$d beskeder"
+
+
+ - "%d notifikation"
+ - "%d notifikationer"
+
+ "Du har nye beskeder."
+ "📹 Indgående opkald"
+ "** Kunne ikke sende - åbn venligst rummet"
+ "Deltag"
+ "Afvis"
+
+ - "%d invitation"
+ - "%d invitationer"
+
+ "Inviterede dig til at samtale"
+ "%1$s inviterede dig til at samtale"
+ "Nævnte dig: %1$s"
+ "Nye beskeder"
+
+ - "%d ny besked"
+ - "%d nye beskeder"
+
+ "Reagerede med%1$s"
+ "Marker som læst"
+ "Hurtigt svar"
+ "Inviterede dig til at deltage i rummet"
+ "%1$s inviterede dig til at deltage i rummet"
+ "Mig"
+ "%1$s nævnt eller besvaret"
+ "Du ser notifikationen! Klik på mig!"
+ "%1$s: %2$s"
+ "%1$s: %2$s %3$s"
+
+ - "%d ulæst besked"
+ - "%d ulæste beskeder"
+
+ "%1$s og %2$s"
+ "%1$s i %2$s"
+ "%1$s i %2$s og %3$s"
+
+ - "%d rum"
+ - "%d rum"
+
+ "Synkronisering i baggrunden"
+ "Google-tjenester"
+ "Der blev ikke fundet nogen gyldige Google Play-tjenester. Notifikationer fungerer muligvis ikke korrekt."
+ "Få navnet på den aktuelle udbyder."
+ "Ingen push-udbydere valgt."
+ "Nuværende push-udbyder: %1$s."
+ "Nuværende push-udbyder"
+ "Sørg for, at programmet understøtter mindst én push-udbyder."
+ "Ingen push-udbyder understøttelse fundet."
+
+ - "Fandt %1$d push-udbyder: %2$s"
+ - "Fandt %1$d push-udbydere: %2$s"
+
+ "Applikationen blev bygget med støtte til: %1$s"
+ "Understøttelse af push-udbydere"
+ "Kontrollér, at appen kan vise notifikationer."
+ "Der er ikke blevet klikket på meddelelsen."
+ "Kan ikke vise notifikationen."
+ "Der er blevet klikket på notifikationen!"
+ "Vis notifikation"
+ "Klik venligst på notifikationen for at fortsætte testen."
+ "Sørg for, at applikationen modtager push."
+ "Fejl: pusher har afvist anmodningen."
+ "Fejl: %1$s."
+ "Fejl, kan ikke teste push."
+ "Fejl, timeout venter på push."
+ "Push loop back tog %1$d ms."
+ "Afprøv Push loop back"
+
diff --git a/libraries/push/impl/src/main/res/values-de/translations.xml b/libraries/push/impl/src/main/res/values-de/translations.xml
index 9e344fb62d..e2ef9109ba 100644
--- a/libraries/push/impl/src/main/res/values-de/translations.xml
+++ b/libraries/push/impl/src/main/res/values-de/translations.xml
@@ -13,7 +13,7 @@
- "%d Mitteilung"
- "%d Mitteilungen"
- "Mitteilung"
+ "Du hast neue Nachrichten."
"Eingehender Anruf"
"** Fehler beim Senden - bitte Raum öffnen"
"Beitreten"
diff --git a/libraries/push/impl/src/main/res/values-el/translations.xml b/libraries/push/impl/src/main/res/values-el/translations.xml
index bb7241ffe3..da21ccfce7 100644
--- a/libraries/push/impl/src/main/res/values-el/translations.xml
+++ b/libraries/push/impl/src/main/res/values-el/translations.xml
@@ -13,9 +13,9 @@
- "%d ειδοποίηση"
- "%d ειδοποιήσεις"
- "Γνωστοποίηση"
+ "Έχεις νέο(α) μήνυμα(τα)."
"📹 Εισερχόμενη κλήση"
- "** Αποτυχία αποστολής - παρακαλώ άνοιξε το δωμάτιο"
+ "** Αποτυχία αποστολής - παρακαλώ ανοίξτε την αίθουσα"
"Συμμετοχή"
"Απόρριψη"
@@ -33,8 +33,8 @@
"Αντέδρασε με %1$s"
"Επισήμανση ως αναγνωσμένου"
"Γρήγορη απάντηση"
- "Σέ προσκάλεσε να συμμετάσχεις στο δωμάτιο"
- "Ο χρήστης %1$s σε προσκάλεσε να συμμετάσχεις στο δωμάτιο"
+ "Σας προσκάλεσε να ενταχθείτε στην αίθουσα"
+ "%1$s σας προσκάλεσε να συμμετάσχετε στην αίθουσα"
"Εγώ"
"Ο χρήστης %1$s αναφέρθηκε ή απάντησε"
"Βλέπεις την ειδοποίηση! Κάνε μου κλικ!"
@@ -48,8 +48,8 @@
"%1$s σε %2$s"
"%1$s σε %2$s και %3$s"
- - "%d δωμάτιο"
- - "%d δωμάτια"
+ - "%d αίθουσα"
+ - "%d αίθουσες"
"Συγχρονισμός στο παρασκήνιο"
"Υπηρεσίες Google"
diff --git a/libraries/push/impl/src/main/res/values-es/translations.xml b/libraries/push/impl/src/main/res/values-es/translations.xml
index 0fcfe9994d..4200cb9baf 100644
--- a/libraries/push/impl/src/main/res/values-es/translations.xml
+++ b/libraries/push/impl/src/main/res/values-es/translations.xml
@@ -13,7 +13,6 @@
- "%d notificación"
- "%d notificaciones"
- "Notificación"
"📹 Llamada entrante"
"** No se ha podido enviar - por favor, abre la sala"
"Unirse"
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 dba0b86774..0484f0008c 100644
--- a/libraries/push/impl/src/main/res/values-et/translations.xml
+++ b/libraries/push/impl/src/main/res/values-et/translations.xml
@@ -13,7 +13,7 @@
- "%d teavitus"
- "%d teavitust"
- "Teavitus"
+ "Sulle on uusi sõnumeid."
"📹 Sissetulev kõne"
"** Saatmine ei õnnestunud - palun ava jututoa täisvaade"
"Liitu"
diff --git a/libraries/push/impl/src/main/res/values-eu/translations.xml b/libraries/push/impl/src/main/res/values-eu/translations.xml
index ba7ef87619..f548b40c34 100644
--- a/libraries/push/impl/src/main/res/values-eu/translations.xml
+++ b/libraries/push/impl/src/main/res/values-eu/translations.xml
@@ -12,7 +12,6 @@
- "jakinarazpen %d"
- "%d jakinarazpen"
- "Jakinarazpena"
"Deia jasotzen"
"** Huts egin du bidalketak - ireki gela"
"Elkartu"
diff --git a/libraries/push/impl/src/main/res/values-fa/translations.xml b/libraries/push/impl/src/main/res/values-fa/translations.xml
index 302624861d..972ee549a2 100644
--- a/libraries/push/impl/src/main/res/values-fa/translations.xml
+++ b/libraries/push/impl/src/main/res/values-fa/translations.xml
@@ -5,11 +5,23 @@
"اعلانهای پرصدا"
"زنگ خوردن تماس"
"اعلانهای صامت"
+
+ - "%1$s:%2$d پیام"
+ - "%1$s:%2$d پیام"
+
+
+ - "%dاعلان"
+ - "%dاعلان"
+
"آگاهی"
"📹 تماس ورودی"
"**شکست در فرستادن - لطفاً اتاق را بگشایید"
"پیوستن"
"رد کردن"
+
+ - "%d دعوت"
+ - "%d دعوت"
+
"به گپ دعوتتان کرد"
"%1$s به گپ دعوتتان کرد"
"به شما اشاره کرد: %1$s"
@@ -28,9 +40,17 @@
"دارید آگاهی را مشاهده میکنید! کلیک کنید!"
"%1$s: %2$s"
"%1$s: %2$s %3$s"
+
+ - "%d پیام اعلان نشده"
+ - "%d پیام اعلان نشده"
+
"%1$s و %2$s"
"%1$s در %2$s"
"%1$s در %2$s و %3$s"
+
+ - "%d اتاق"
+ - "%d اتاق"
+
"همگام سازی پسزمینه"
"خدمات گوگل"
"خدمت پلی گوگل معتبری پیدا نشد. ممکن است آگاهیها به درستی کار نکنند."
diff --git a/libraries/push/impl/src/main/res/values-fi/translations.xml b/libraries/push/impl/src/main/res/values-fi/translations.xml
index 1b6fa8377a..95e1b340b1 100644
--- a/libraries/push/impl/src/main/res/values-fi/translations.xml
+++ b/libraries/push/impl/src/main/res/values-fi/translations.xml
@@ -13,7 +13,6 @@
- "%d ilmoitus"
- "%d ilmoitusta"
- "Ilmoitus"
"📹 Saapuva puhelu"
"** Lähetys epäonnistui - avaa huone"
"Liity"
diff --git a/libraries/push/impl/src/main/res/values-fr/translations.xml b/libraries/push/impl/src/main/res/values-fr/translations.xml
index 8b59a18fd9..0069c1e5a7 100644
--- a/libraries/push/impl/src/main/res/values-fr/translations.xml
+++ b/libraries/push/impl/src/main/res/values-fr/translations.xml
@@ -13,7 +13,7 @@
- "%d notification"
- "%d notifications"
- "Notification"
+ "Vous avez de nouveau(x) message(s)."
"📹 Appel entrant"
"** Échec de l’envoi - veuillez ouvrir le salon"
"Rejoindre"
diff --git a/libraries/push/impl/src/main/res/values-in/translations.xml b/libraries/push/impl/src/main/res/values-in/translations.xml
index 204b719abf..760d507e08 100644
--- a/libraries/push/impl/src/main/res/values-in/translations.xml
+++ b/libraries/push/impl/src/main/res/values-in/translations.xml
@@ -11,7 +11,7 @@
- "%d pemberitahuan"
- "Notifikasi"
+ "Anda memiliki pesan baru."
"📹 Panggilan masuk"
"** Gagal mengirim — silakan buka ruangan"
"Gabung"
@@ -57,6 +57,7 @@
- "Ditemukan %1$d penyedia notifikasi dorongan: %2$s"
+ "Aplikasi ini dibangun dengan dukungan untuk: %1$s"
"Deteksi penyedia notifikasi dorongan"
"Periksa apakah aplikasi dapat menampilkan notifikasi."
"Notifikasi belum diklik."
diff --git a/libraries/push/impl/src/main/res/values-it/translations.xml b/libraries/push/impl/src/main/res/values-it/translations.xml
index a5ad1a76b3..919d892440 100644
--- a/libraries/push/impl/src/main/res/values-it/translations.xml
+++ b/libraries/push/impl/src/main/res/values-it/translations.xml
@@ -13,7 +13,7 @@
- "%d notifica"
- "%d notifiche"
- "Notifica"
+ "Hai nuovi messaggi."
"📹 Chiamata in arrivo"
"** Invio fallito - si prega di aprire la stanza"
"Entra"
@@ -64,6 +64,7 @@
- "Provider %1$d push trovato: %2$s"
- "Provider %1$d push trovati: %2$s"
+ "L\'applicazione è stata creata con il supporto per: %1$s"
"Rileva i provider di servizi push"
"Verifica che l\'applicazione possa mostrare una notifica."
"La notifica non è stata cliccata."
diff --git a/libraries/push/impl/src/main/res/values-ka/translations.xml b/libraries/push/impl/src/main/res/values-ka/translations.xml
index a49f803c2a..3a0d626016 100644
--- a/libraries/push/impl/src/main/res/values-ka/translations.xml
+++ b/libraries/push/impl/src/main/res/values-ka/translations.xml
@@ -12,7 +12,6 @@
- "%d შეტყობინება"
- "%d შეტყობინება"
- "შეტყობინება"
"** გაგზავნა ვერ მოხერხდა - გთხოვთ, გახსნათ ოთახი"
"გაწევრიანება"
diff --git a/libraries/push/impl/src/main/res/values-lt/translations.xml b/libraries/push/impl/src/main/res/values-lt/translations.xml
index d3ba403c1a..b894a9cf99 100644
--- a/libraries/push/impl/src/main/res/values-lt/translations.xml
+++ b/libraries/push/impl/src/main/res/values-lt/translations.xml
@@ -14,7 +14,6 @@
- "%d pranešimai"
- "%d pranešimų"
- "Pranešimas"
"** Nepavyko išsiųsti - prašome atidaryti kambarį"
- "%d kvietimas"
diff --git a/libraries/push/impl/src/main/res/values-nb/translations.xml b/libraries/push/impl/src/main/res/values-nb/translations.xml
index 2607e4d17d..1be74244aa 100644
--- a/libraries/push/impl/src/main/res/values-nb/translations.xml
+++ b/libraries/push/impl/src/main/res/values-nb/translations.xml
@@ -13,7 +13,7 @@
- "%d varsel"
- "%d varsler"
- "Varsel"
+ "Du har nye meldinger."
"📹 Innkommende anrop"
"** Kunne ikke sende - vennligst åpne rommet"
"Bli med"
diff --git a/libraries/push/impl/src/main/res/values-nl/translations.xml b/libraries/push/impl/src/main/res/values-nl/translations.xml
index 7057bdb19b..833c6e7107 100644
--- a/libraries/push/impl/src/main/res/values-nl/translations.xml
+++ b/libraries/push/impl/src/main/res/values-nl/translations.xml
@@ -13,7 +13,6 @@
- "%d melding"
- "%d meldingen"
- "Melding"
"📹 Inkomende oproep"
"** Verzenden is mislukt - open de kamer"
"Deelnemen"
diff --git a/libraries/push/impl/src/main/res/values-pl/translations.xml b/libraries/push/impl/src/main/res/values-pl/translations.xml
index cce31b3f99..818cd3edc4 100644
--- a/libraries/push/impl/src/main/res/values-pl/translations.xml
+++ b/libraries/push/impl/src/main/res/values-pl/translations.xml
@@ -15,7 +15,6 @@
- "%d powiadomienia"
- "%d powiadomień"
- "Powiadomienie"
"📹 Połączenie przychodzące"
"** Nie udało się wysłać - proszę otworzyć pokój"
"Dołącz"
diff --git a/libraries/push/impl/src/main/res/values-pt-rBR/translations.xml b/libraries/push/impl/src/main/res/values-pt-rBR/translations.xml
index 035ab9e575..fb577b0dd4 100644
--- a/libraries/push/impl/src/main/res/values-pt-rBR/translations.xml
+++ b/libraries/push/impl/src/main/res/values-pt-rBR/translations.xml
@@ -13,7 +13,7 @@
- "%d notificação"
- "%d notificações"
- "Notificação"
+ "Você tem mensagens novas."
"📹 Chamada recebida"
"** Falha ao enviar - por favor, abra a sala"
"Entrar"
diff --git a/libraries/push/impl/src/main/res/values-pt/translations.xml b/libraries/push/impl/src/main/res/values-pt/translations.xml
index ad47d5385f..0a55a1dd7b 100644
--- a/libraries/push/impl/src/main/res/values-pt/translations.xml
+++ b/libraries/push/impl/src/main/res/values-pt/translations.xml
@@ -13,7 +13,7 @@
- "%d notificação"
- "%d notificações"
- "Notificação"
+ "Tens novas mensagens."
"📹 A receber chamada"
"** Falha no envio - por favor abre a sala"
"Entrar"
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 48b1b19dff..14240a8d59 100644
--- a/libraries/push/impl/src/main/res/values-ro/translations.xml
+++ b/libraries/push/impl/src/main/res/values-ro/translations.xml
@@ -13,7 +13,6 @@
- "%d notificare"
- "%d notificări"
- "Notificare"
"Apel primit"
"** Trimiterea eșuată - vă rugăm să deschideți camera"
"Alăturați-vă"
diff --git a/libraries/push/impl/src/main/res/values-ru/translations.xml b/libraries/push/impl/src/main/res/values-ru/translations.xml
index e2dc7c0472..7345664ce0 100644
--- a/libraries/push/impl/src/main/res/values-ru/translations.xml
+++ b/libraries/push/impl/src/main/res/values-ru/translations.xml
@@ -15,7 +15,6 @@
- "%d уведомления"
- "%d уведомлений"
- "Уведомление"
"📹 Входящий вызов"
"** Не удалось отправить - пожалуйста, откройте комнату"
"Присоединиться"
diff --git a/libraries/push/impl/src/main/res/values-sk/translations.xml b/libraries/push/impl/src/main/res/values-sk/translations.xml
index d399483dd1..74ba29d78a 100644
--- a/libraries/push/impl/src/main/res/values-sk/translations.xml
+++ b/libraries/push/impl/src/main/res/values-sk/translations.xml
@@ -15,7 +15,7 @@
- "%d oznámenia"
- "%d oznámení"
- "Oznámenie"
+ "Máte nové správy."
"📹 Prichádzajúci hovor"
"** Nepodarilo sa odoslať - prosím otvorte miestnosť"
"Pripojiť sa"
diff --git a/libraries/push/impl/src/main/res/values-sv/translations.xml b/libraries/push/impl/src/main/res/values-sv/translations.xml
index 9fe878cbc5..fd3739915f 100644
--- a/libraries/push/impl/src/main/res/values-sv/translations.xml
+++ b/libraries/push/impl/src/main/res/values-sv/translations.xml
@@ -13,7 +13,6 @@
- "%d avisering"
- "%d aviseringar"
- "notis"
"📹 Inkommande samtal"
"** Misslyckades att skicka - vänligen öppna rummet"
"Gå med"
diff --git a/libraries/push/impl/src/main/res/values-tr/translations.xml b/libraries/push/impl/src/main/res/values-tr/translations.xml
index 06f21783be..183950f3b9 100644
--- a/libraries/push/impl/src/main/res/values-tr/translations.xml
+++ b/libraries/push/impl/src/main/res/values-tr/translations.xml
@@ -13,7 +13,6 @@
- "%d bildirim"
- "%d bildirim"
- "Bildirim"
"📹 Gelen çağrı"
"** Gönderilemedi - lütfen odayı açın"
"Katıl"
diff --git a/libraries/push/impl/src/main/res/values-uk/translations.xml b/libraries/push/impl/src/main/res/values-uk/translations.xml
index 016599e783..1aa535b1e2 100644
--- a/libraries/push/impl/src/main/res/values-uk/translations.xml
+++ b/libraries/push/impl/src/main/res/values-uk/translations.xml
@@ -15,7 +15,7 @@
- "%d сповіщення"
- "%d сповіщень"
- "Сповіщення"
+ "У вас є нові повідомлення."
"📹 Вхідний виклик"
"** Не вдалося надіслати - відкрийте кімнату"
"Доєднатися"
diff --git a/libraries/push/impl/src/main/res/values-ur/translations.xml b/libraries/push/impl/src/main/res/values-ur/translations.xml
index 900ff9db41..adcf03099b 100644
--- a/libraries/push/impl/src/main/res/values-ur/translations.xml
+++ b/libraries/push/impl/src/main/res/values-ur/translations.xml
@@ -13,7 +13,6 @@
- "%d اطلاع"
- "%d اطلاعات"
- "اطلاع"
"📹 آنے والا مکالمہ"
"** بھیجنے میں ناکام - براہ کرم کمرہ کھولیں"
"شامل ہوں"
diff --git a/libraries/push/impl/src/main/res/values-uz/translations.xml b/libraries/push/impl/src/main/res/values-uz/translations.xml
index badfd6d421..486b668b3e 100644
--- a/libraries/push/impl/src/main/res/values-uz/translations.xml
+++ b/libraries/push/impl/src/main/res/values-uz/translations.xml
@@ -12,7 +12,6 @@
- "%dbildirishnoma"
- "%dbildirishnomalar"
- "Bildirishnoma"
"** Yuborilmadi - iltimos, xonani oching"
"Qo\'shilish"
diff --git a/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml b/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml
index 1b25c81d7e..61178f6112 100644
--- a/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml
+++ b/libraries/push/impl/src/main/res/values-zh-rTW/translations.xml
@@ -11,7 +11,6 @@
- "%d 個通知"
- "通知"
"📹 來電"
"** 無法傳送,請開啟聊天室"
"加入"
diff --git a/libraries/push/impl/src/main/res/values-zh/translations.xml b/libraries/push/impl/src/main/res/values-zh/translations.xml
index be2a8dbde1..94d156396a 100644
--- a/libraries/push/impl/src/main/res/values-zh/translations.xml
+++ b/libraries/push/impl/src/main/res/values-zh/translations.xml
@@ -11,7 +11,6 @@
- "%d 条通知"
- "通知"
"📹 来电"
"** 无法发送——请打开聊天室"
"加入"
diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt
index 5b93e90064..3c609f184e 100644
--- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt
+++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/DefaultNotifiableEventResolverTest.kt
@@ -43,8 +43,6 @@ import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
import io.element.android.libraries.matrix.test.notification.FakeNotificationService
import io.element.android.libraries.matrix.test.notification.aNotificationData
import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser
-import io.element.android.libraries.preferences.api.store.AppPreferencesStore
-import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore
import io.element.android.libraries.push.impl.notifications.fake.FakeNotificationMediaRepo
import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent
import io.element.android.libraries.push.impl.notifications.model.FallbackNotifiableEvent
@@ -826,7 +824,6 @@ class DefaultNotifiableEventResolverTest {
private fun createDefaultNotifiableEventResolver(
notificationService: FakeNotificationService? = FakeNotificationService(),
notificationResult: Result
"Прачытана %1$s"
"Націсніце, каб паказаць усе"
- "Выдаліць рэакцыю з %1$s"
+ "Выдаліць рэакцыю з %1$s"
"Адправіць файлы"
"Паказаць пароль"
"Пазваніць"
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 d23c6d5dbf..f6f999a1a1 100644
--- a/libraries/ui-strings/src/main/res/values-bg/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-bg/translations.xml
@@ -23,10 +23,11 @@
- "Прочетено от %1$s и %2$d други"
"Прочетено от %1$s"
- "Премахване на реакция с %1$s"
+ "Премахване на реакция с %1$s"
"Изпращане на файлове"
"Показване на паролата"
"Потребителско меню"
+ "Вижте подробности"
"Приемане"
"Назад"
"Отказ"
@@ -39,9 +40,13 @@
"Копиране"
"Копиране на връзката"
"Копиране на връзката към съобщението"
+ "Копиране на текста"
"Създаване"
"Създаване на стая"
+ "Деактивиране"
+ "Деактивиране на акаунта"
"Отхвърляне"
+ "Отхвърляне и блокиране"
"Изтриване на анкетата"
"Деактивиране"
"Готово"
@@ -52,6 +57,7 @@
"Въведете PIN"
"Забравена парола?"
"Препращане"
+ "Игнориране"
"Поканване"
"Поканване на хора"
"Поканване на хора в %1$s"
@@ -64,16 +70,19 @@
"Напускане на стаята"
"Зареждане на още"
"Управление на профила"
- "Управление на устройства"
+ "Управление на устройствата"
+ "Съобщение"
"Не"
"Не сега"
"Добре"
"Настройки"
"Отваряне с"
+ "Закачане"
"Бърз отговор"
"Цитат"
"Реакция"
"Премахване"
+ "Премахване на съобщението"
"Отговор"
"Отговор в нишка"
"Докладване на съдържанието"
@@ -85,6 +94,7 @@
"Изпращане на съобщение"
"Споделяне"
"Споделяне на връзката"
+ "Показване"
"Влизане отново"
"Изход"
"Излизане въпреки това"
@@ -97,6 +107,7 @@
"Повторен опит"
"Преглед на източника"
"Да"
+ "Да, опитай отново"
"Относно"
"Разширени настройки"
"Статистика"
@@ -109,19 +120,27 @@
"Грешка при разшифроване"
"Опции за разработчици"
"Директен чат"
+ "Не показвай това отново"
+ "Изтегля се"
"(редактирано)"
"Редактиране"
"* %1$s %2$s"
+ "Празен файл"
+ "Шифроване"
"Шифроването е включено"
"Въведете своя PIN"
"Грешка"
+ "Всеки"
"Фаворизиране"
"Файл"
+ "Файлът е изтрит"
+ "Файлът е запазен"
"Препращане на съобщението"
"GIF"
"Изображение"
"В отговор на %1$s"
"Инсталиране на APK"
+ "Стаята се напуска"
"Светъл"
"Връзката е копирана в клипборда"
"Зарежда се…"
@@ -139,12 +158,14 @@
"Модерно"
"Заглушаване"
"Няма резултати"
+ "Без шифроване"
"Офлайн"
"или"
"Парола"
"Хора"
"Постоянна връзка"
"Разрешение"
+ "Моля, изчакайте…"
"Сигурни ли сте, че искате да приключите тази анкета?"
"Анкета: %1$s"
"Общо гласове: %1$s"
@@ -156,6 +177,7 @@
"Политика за поверителност"
"Реакция"
"Реакции"
+ "Причина"
"Ключ за възстановяване"
"Съобщаване за грешка"
"Съобщаване за проблем"
@@ -163,6 +185,7 @@
"Стая"
"Име на стаята"
"напр. името на вашия проект"
+ "Запазва се"
"Заключване на екрана"
"Търсене на някого"
"Резултати от търсенето"
@@ -175,6 +198,7 @@
"Настройки"
"Споделено местоположение"
"Излизате"
+ "Възникна проблем. Моля, опитайте отново."
"Започване на чат…"
"Успешно"
"Предложения"
@@ -192,16 +216,23 @@
"Потребителско име"
"Потвърждаването е отменено"
"Потвърждаването е завършено"
+ "Неуспешно потвърждаване"
+ "Потвърден"
"Потвърждаване на устройството"
+ "Потвърждаване на самоличността"
+ "Потвърждаване на потребителя"
"Видео"
"Гласово съобщение"
"В очакване на това съобщение"
+ "Вие"
"Грешка"
"Успешно"
"Внимание"
+ "Без шифроване"
"🔐️ Присъединете се към мен в %1$s"
"Хей, говорете с мен в %1$s: %2$s"
"%1$s Android"
+ "Закачени съобщения"
"Споделяне на местоположение"
"Споделяне на моето местоположение"
"Отваряне в Apple Maps"
@@ -211,4 +242,6 @@
"Местоположение"
"Версия: %1$s (%2$s)"
"bg"
+ "Трябва да потвърдите това устройство за да достъпите исторически съобщения"
+ "Съобщението не може да се разшифрова"
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 b4c26ab1e0..7091d73b8b 100644
--- a/libraries/ui-strings/src/main/res/values-cs/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml
@@ -1,5 +1,6 @@
+ "Přidat reakci: %1$s"
"Profilový obrázek"
"Smazat"
@@ -29,7 +30,8 @@
"%1$s přečetl(a)"
"Klepnutím zobrazíte vše"
- "Odstraňit reakci s %1$s"
+ "Odstraňit reakci s %1$s"
+ "Odstranit reakci pomocí %1$s"
"Odeslat soubory"
"Zobrazit heslo"
"Zahájit hovor"
@@ -140,15 +142,13 @@
"Zobrazit zdroj"
"Ano"
"Ano, zkusit znovu"
- "Zakažte optimalizaci baterie pro tuto aplikaci, abyste měli jistotu, že budou přijata všechna oznámení."
- "Zakázat optimalizaci"
- "Nepřicházejí vám oznámení?"
"Váš server nyní podporuje nový, rychlejší protokol. Chcete-li upgradovat, odhlaste se a znovu se přihlaste. Pokud to uděláte nyní, pomůže vám vyhnout se nucenému odhlášení, když bude starý protokol později odstraněn."
"Upgrade k dispozici"
"O aplikaci"
"Zásady používání"
"Přidání titulku"
"Pokročilá nastavení"
+ "obrázek"
"Analytika"
"Vzhled"
"Zvuk"
@@ -248,6 +248,9 @@ Důvod: %1$s."
"Důvod"
"Klíč pro obnovení"
"Obnovování…"
+
+ - "%1$d odpovědí"
+
"Odpověď na %1$s"
"Nahlásit chybu"
"Nahlásit problém"
@@ -267,6 +270,7 @@ Důvod: %1$s."
"Odesílání…"
"Odeslání se nezdařilo"
"Odesláno"
+ ". "
"Server není podporován"
"URL serveru"
"Nastavení"
@@ -352,6 +356,10 @@ Opravdu chcete pokračovat?"
"Ahoj, ozvi se mi na %1$s: %2$s"
"%1$s Android"
"Zatřeste zařízením pro nahlášení chyby"
+ "%1$s: %2$s"
+ "Možnosti"
+ "Odstranit %1$s"
+ "Nastavení"
"Výběr média se nezdařil, zkuste to prosím znovu."
"Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace."
"Nahrání média se nezdařilo, zkuste to prosím znovu."
@@ -377,17 +385,14 @@ Opravdu chcete pokračovat?"
"Nahrání média se nezdařilo, zkuste to prosím znovu."
"Nepodařilo se načíst údaje o uživateli"
"Zpráva v %1$s"
+ "Rozbalit"
+ "Zmenšit"
+ "Již si prohlížíte tuto místnost!"
"%1$s z %2$s"
"%1$s Připnuté zprávy"
"Načítání zprávy…"
"Zobrazit vše"
- "Přejít do nové místnosti"
- "Tato místnost byla nahrazena a již není aktivní"
- "Zobrazit staré zprávy"
- "Tato místnost je pokračováním jiné místnosti"
"Chat"
- "Žádost o vstup odeslána"
- "Tato místnost byla aktualizována"
"Sdílet polohu"
"Sdílet moji polohu"
"Otevřít v Mapách Apple"
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 52c1046030..6dc6b9237c 100644
--- a/libraries/ui-strings/src/main/res/values-cy/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml
@@ -1,5 +1,6 @@
+ "Ychwanegu adwaith: %1$s"
"Afatar"
"Dileu"
@@ -15,6 +16,7 @@
"Symud i\'r gwaelod"
"Crybwylliadau\'n unig"
"Wedi\'i Dewi"
+ "Afatar defnyddiwr arall"
"Tudalen %1$d"
"Oedi"
"Neges llais, hyd: %1$s, safle presennol: %2$s"
@@ -35,15 +37,20 @@
"Wedi\'i ddarllen gan %1$s"
"Tapio i ddangos y cyfan"
+ "Wedi dileu adwaith gyda %1$s"
"Wedi dileu adwaith gyda %1$s"
+ "Afatar ystafell"
"Anfon ffeiliau"
"Dangos y cyfrinair"
"Cychwyn galwad"
+ "Afatar defnyddiwr"
"Dewislen defnyddiwr"
+ "Gweld afatar"
"Manylion"
"Neges llais, hyd: %1$s"
"Recordio neges llais."
"Stopio recordio"
+ "Eich afatar"
"Derbyn"
"Ychwanegu capsiwn"
"Ychwanegu at y llinell amser"
@@ -142,6 +149,7 @@
"Tapio am ddewisiadau"
"Ceisiwch eto"
"Dad-binio"
+ "Golwg"
"Gweld yn yr amserlen"
"Gweld ffynhonnell"
"Iawn"
@@ -152,6 +160,7 @@
"Polisi defnydd derbyniol"
"Ychwanegu capsiwn"
"Gosodiadau uwch"
+ "Delwedd wedi\'i thocio."
"Dadansoddeg"
"Gwedd"
"Sain"
@@ -279,6 +288,7 @@ Rheswm: %1$s."
"Yn anfon…"
"Methodd anfon"
"Anfonwyd"
+ ". "
"Nid yw\'r gweinydd yn cael ei gynnal"
"URL gweinydd"
"Gosodiadau"
@@ -344,6 +354,7 @@ Ydych chi\'n siŵr eich bod am barhau?"
"Wedi methu llwytho negeseuon"
"Doedd dim modd i %1$s gael mynediad i\'ch lleoliad. Ceisiwch eto yn nes ymlaen."
"Wedi methu llwytho eich neges llais."
+ "Nid yw\'r ystafell yn bodoli mwyach neu nid yw\'r gwahoddiad yn ddilys mwyach."
"Neges heb ei chanfod"
"Does gan %1$s ddim caniatâd i gael mynediad i\'ch lleoliad. Gallwch alluogi mynediad yn y Gosodiadau."
"Does gan %1$s ddim caniatâd i gael mynediad i\'ch lleoliad. Galluogwch fynediad isod."
@@ -353,6 +364,7 @@ Ydych chi\'n siŵr eich bod am barhau?"
"Dyw rhai nodau ddim yn cael eu caniatáu. Dim ond llythrennau, digidau a\'r symbolau canlynol sy\'n cael eu cefnogi ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Nid yw rhai negeseuon wedi\'u hanfon"
"Ymddiheuriadau, mae gwall wedi digwydd"
+ "Nid yw anfonwr y digwyddiad yn cyfateb i berchennog y ddyfais a\'i hanfonodd."
"Nid oes modd gwarantu dilysrwydd y neges hon sydd wedi\'i hamgryptio ar y ddyfais hon."
"Wedi\'i amgryptio gan ddefnyddiwr a wiriwyd gynt."
"Heb ei amgryptio."
@@ -363,6 +375,10 @@ Ydych chi\'n siŵr eich bod am barhau?"
"Hei, siaradwch â mi ar %1$s: %2$s"
"Android %1$s"
"Rageshake i adrodd gwall"
+ "%1$s: %2$s"
+ "Dewisiadau"
+ "Tynnu %1$s"
+ "Gosodiadau"
"Wedi methu dewis cyfrwng, ceisiwch eto."
"Efallai na fydd capsiynau yn weladwy i bobl sy\'n defnyddio apiau hŷn."
"Wedi methu â phrosesu cyfryngau i\'w llwytho, ceisiwch eto."
@@ -391,6 +407,9 @@ Ydych chi\'n siŵr eich bod am barhau?"
"Wedi methu â phrosesu cyfryngau i\'w llwytho, ceisiwch eto."
"Methu â nôl manylion defnyddiwr"
"Neges yn %1$s"
+ "Dangos"
+ "Lleihau"
+ "Eisoes yn gweld yr ystafell hon!"
"%1$s o %2$s"
"%1$s Neges wedi\'u pinio"
"Wrthi\'n llwytho neges…"
diff --git a/libraries/ui-strings/src/main/res/values-da/translations.xml b/libraries/ui-strings/src/main/res/values-da/translations.xml
new file mode 100644
index 0000000000..bad79e2d16
--- /dev/null
+++ b/libraries/ui-strings/src/main/res/values-da/translations.xml
@@ -0,0 +1,409 @@
+
+
+ "Tilføj reaktion: %1$s"
+ "Avatar"
+ "Slet"
+
+ - "%1$d ciffer indtastet"
+ - "%1$d cifre indtastet"
+
+ "Skjul adgangskode"
+ "Deltag i opkald"
+ "Hop til bunden"
+ "Kun omtaler"
+ "Lyd slået fra"
+ "Side %1$d"
+ "Pausér"
+ "Talebesked, varighed: %1$s, aktuel position: %2$s"
+ "PIN-felt"
+ "Afspil"
+ "Afstemning"
+ "Afsluttet afstemning"
+ "Reager med%1$s"
+ "Reager med andre emojis"
+ "Læs af %1$s og %2$s"
+
+ - "Læst af %1$s og %2$d andre"
+ - "Læst af %1$s og %2$d andre"
+
+ "Læst af%1$s"
+ "Tryk for at vise alle"
+ "Fjern reaktion med%1$s"
+ "Fjern reaktion med %1$s"
+ "Send filer"
+ "Vis adgangskode"
+ "Start et opkald"
+ "Brugermenu"
+ "Se avatar"
+ "Se detaljer"
+ "Talebesked, varighed: %1$s"
+ "Optag talebesked."
+ "Stop optagelsen"
+ "Accepter"
+ "Tilføj billedtekst"
+ "Føj til tidslinje"
+ "Tilbage"
+ "Opkald"
+ "Anullér"
+ "Spring over ind til videre"
+ "Vælg billede"
+ "Ryd"
+ "Luk"
+ "Fuldfør verifikation"
+ "Bekræft"
+ "Bekræft adgangskode"
+ "Fortsæt"
+ "Kopiér"
+ "Kopiér billedtekst"
+ "Kopiér link"
+ "Kopier link til besked"
+ "Kopiér tekst"
+ "Opret"
+ "Opret et rum"
+ "Deaktiver"
+ "Deaktiver konto"
+ "Afvis"
+ "Afvis og blokér"
+ "Slet afstemning"
+ "Deaktiver"
+ "Kassér"
+ "Afvis"
+ "Færdig"
+ "Redigér"
+ "Rediger billedtekst"
+ "Redigér afstemning"
+ "Slå til"
+ "Afslut afstemning"
+ "Indtast PIN-kode"
+ "Har du glemt din adgangskode?"
+ "Videresend"
+ "Gå tilbage"
+ "Ignorér"
+ "Invitér"
+ "Invitér folk"
+ "Invitér folk til %1$s"
+ "Invitér folk til %1$s"
+ "Invitationer"
+ "Deltag"
+ "Få mere at vide"
+ "Forlad"
+ "Forlad samtalen"
+ "Forlad rum"
+ "Indlæs mere"
+ "Administrer konto"
+ "Administrer enheder"
+ "Besked"
+ "Næste"
+ "Nej"
+ "Ikke nu"
+ "OK"
+ "Indstillinger"
+ "Åbn med"
+ "Fastgør"
+ "Hurtigt svar"
+ "Citér"
+ "Reagér"
+ "Afvis"
+ "Fjern"
+ "Fjern billedtekst"
+ "Fjern besked"
+ "Svar"
+ "Svar i tråd"
+ "Anmeld"
+ "Anmeld fejl"
+ "Anmeld indhold"
+ "Anmeld samtale"
+ "Anmeld rummet"
+ "Nulstil"
+ "Nulstil identitet"
+ "Prøv igen"
+ "Prøv at dekryptere igen"
+ "Gem"
+ "Søg"
+ "Send"
+ "Send besked"
+ "Del"
+ "Del link"
+ "Vis"
+ "Log ind igen"
+ "Log ud"
+ "Log ud alligevel"
+ "Spring over"
+ "Start"
+ "Start samtale"
+ "Begynd verifikation"
+ "Tryk for at indlæse kort"
+ "Tag billede"
+ "Tryk for indstillinger"
+ "Prøv igen"
+ "Frigør"
+ "Se i tidslinjen"
+ "Se kilde"
+ "Ja"
+ "Ja, prøv igen"
+ "Din server understøtter nu en ny, hurtigere protokol. Log ud og log ind igen for at opgradere nu. Hvis du gør dette nu, vil du undgå en tvungen logout, når den gamle protokol bliver fjerne senere."
+ "Opgradering tilgængelig"
+ "Om"
+ "Politik for acceptabel brug"
+ "Tilføjelse af billedtekst"
+ "Avancerede indstillinger"
+ "et billede"
+ "Analyse-værktøj"
+ "Udseende"
+ "Lyd"
+ "Blokerede brugere"
+ "Bobler"
+ "Opkald startet"
+ "Backup af samtale"
+ "Kopieret til udklipsholder"
+ "Ophavsret"
+ "Opretter rum…"
+ "Anmodning annulleret"
+ "Forlod rummet"
+ "Invitationen blev afvist"
+ "Mørkt tema"
+ "Fejl under dekryptering"
+ "Indstillinger for udviklere"
+ "Enheds-ID"
+ "Direkte samtale"
+ "Vis ikke dette igen"
+ "Download mislykkedes"
+ "Downloader"
+ "(redigeret)"
+ "Redigering"
+ "Redigering af billedtekst"
+ "* %1$s %2$s"
+ "Tom fil"
+ "Kryptering"
+ "Kryptering aktiveret"
+ "Indtast din PIN-kode"
+ "Fejl"
+ "Der opstod en fejl, du modtager muligvis ikke meddelelser om nye meddelelser. Fejlfinding af meddelelser fra indstillingerne.
+
+Årsag: %1$s."
+ "Alle"
+ "Mislykkedes"
+ "Favorit"
+ "Favoritmarkeret"
+ "Fil"
+ "Fil slettet"
+ "Fil gemt"
+ "Fil gemt i Downloads"
+ "Videresend besked"
+ "Ofte brugt"
+ "GIF"
+ "Billede"
+ "Som svar på %1$s"
+ "Installer APK"
+ "Dette Matrix-ID kan ikke findes, så invitationen modtages muligvis ikke."
+ "Forlader rummet"
+ "Lyst tema"
+ "Linje kopieret til udklipsholder"
+ "Linket er kopieret til udklipsholderen"
+ "Indlæser…"
+ "Indlæser flere…"
+
+ - "%d anden"
+ - "%d andre"
+
+
+ - "%1$d medlem"
+ - "%1$d medlemmer"
+
+ "Besked"
+ "Beskedhandlinger"
+ "Layout på beskeder"
+ "Beskeden er fjernet"
+ "Moderne"
+ "Lydløs"
+ "%1$s (%2$s)"
+ "Ingen resultater"
+ "Intet rumnavn"
+ "Ikke krypteret"
+ "Offline"
+ "Open Source-licenser"
+ "eller"
+ "Adgangskode"
+ "Mennesker"
+ "Permalink"
+ "Tilladelse"
+ "Fastgjort"
+ "Tjek venligst din internetforbindelse"
+ "Vent venligst…"
+ "Er du sikker på, at du vil afslutte denne afstemning?"
+ "Afstemning: %1$s"
+ "Stemmer i alt: %1$s"
+ "Resultaterne vil blive vist, når afstemningen er afsluttet"
+
+ - "%d stemme"
+ - "%d stemmer"
+
+ "Privatlivspolitik"
+ "Reaktion"
+ "Reaktioner"
+ "Årsag"
+ "Gendannelsesnøgle"
+ "Opdaterer…"
+
+ - "%1$d svar"
+
+ "Svarer til %1$s"
+ "Rapportér en fejl"
+ "Anmeld et problem"
+ "Anmeldelsen er indsendt"
+ "Rich text editor"
+ "Rum"
+ "Navn på rum"
+ "f.eks. navnet på dit projekt"
+ "Gemte ændringer"
+ "Gemmer"
+ "Skærmlås"
+ "Søg efter nogen"
+ "Søgeresultater"
+ "Sikkerhed"
+ "Set af"
+ "Send til"
+ "Sender…"
+ "Afsendelse mislykkedes"
+ "Sendt"
+ ". "
+ "Serveren er ikke understøttet"
+ "Server URL"
+ "Indstillinger"
+ "Delt placering"
+ "Logger ud"
+ "Noget gik galt"
+ "Vi stødte på et problem. Prøv venligst igen."
+ "Starter samtale…"
+ "Klistermærke"
+ "Succes"
+ "Forslag"
+ "Synkroniserer"
+ "System"
+ "Tekst"
+ "Tredjepartsmeddelelser"
+ "Tråd"
+ "Emne"
+ "Hvad handler det her rum om?"
+ "Ude af stand til at dekryptere"
+ "Sendt fra en usikker enhed"
+ "Du har ikke adgang til denne meddelelse"
+ "Afsenderens verificerede identitet blev nulstillet"
+ "Invitationer kunne ikke sendes til en eller flere brugere."
+ "Kan ikke sende invitation(er)"
+ "Lås op"
+ "Slå lyden til"
+ "Ikke-understøttet opkald"
+ "Ikke-understøttet begivenhed"
+ "Brugernavn"
+ "Bekræftelse annulleret"
+ "Bekræftelse fuldført"
+ "Verifikation mislykkedes"
+ "Verificeret"
+ "Bekræft enhed"
+ "Verificér identitet"
+ "Verificér bruger"
+ "Video"
+ "Talebesked"
+ "Venter…"
+ "Venter på denne besked"
+ "Dig"
+ "%1$ss identitet blev nulstillet. %2$s"
+ "%1$ss %2$s identitet blev nulstillet. %3$s"
+ "(%1$s)"
+ "%1$ss identitet blev nulstillet."
+ "%1$ss %2$s identitet blev nulstillet. %3$s"
+ "Tilbagetræk verifikation"
+ "Linket %1$s fører dig til et andet websted %2$s
+
+Er du sikker på, at du vil fortsætte?"
+ "Dobbelttjek dette link"
+ "Rummet er anmeldt"
+ "Anmeldte og forlod rummet"
+ "Bekræftelse"
+ "Fejl"
+ "Succes"
+ "Advarsel"
+ "Dine ændringer er ikke blevet gemt. Er du sikker på, at du vil gå tilbage?"
+ "Gem ændringer?"
+ "Din hjemmeserver skal opgraderes for at understøtte Matrix Authentication Service og kontooprettelse."
+ "Oprettelse af permalink mislykkedes"
+ "%1$s kunne ikke indlæse kortet. Prøv igen senere."
+ "Fejl under indlæsning af beskeder"
+ "%1$s kunne ikke få adgang til din placering. Prøv igen senere."
+ "Kunne ikke uploade din talebesked."
+ "Rummet findes ikke længere, eller invitationen er ikke længere gyldig."
+ "Meddelelsen blev ikke fundet"
+ "%1$s har ikke tilladelse til at få adgang til din placering. Du kan aktivere adgang i Indstillinger."
+ "%1$s har ikke tilladelse til at se din placering. Aktivér adgang nedenfor."
+ "%1$s har ikke tilladelse til at få adgang til din mikrofon. Aktivér adgang for at optage en stemmemeddelelse."
+ "Dette kan skyldes netværks- eller serverproblemer."
+ "Denne rumadresse er allerede taget. Prøv at redigere rummets adressefelt eller at skifte rummets navn"
+ "Nogle tegn er ikke tilladt. Kun bogstaver, cifre og følgende symboler understøttes! $ & \'() * +/; =? @ [] - . _"
+ "Nogle beskeder er ikke blevet sendt"
+ "Beklager, der opstod en fejl"
+ "Afsenderen af begivenheden matcher ikke ejeren af den enhed, der sendte den."
+ "Ægtheden af denne krypterede besked kan ikke garanteres på denne enhed."
+ "Krypteret af en tidligere verificeret bruger."
+ "Ikke krypteret."
+ "Krypteret af en ukendt eller slettet enhed."
+ "Krypteret af en enhed, der ikke er verificeret af sin ejer."
+ "Krypteret af en ikke-verificeret bruger."
+ "🔐️ Kom med mig til %1$s"
+ "Hej, lad os snakkes på %1$s: %2$s"
+ "%1$s Android"
+ "Ryst enheden i frustration for at anmelde en fejl"
+ "%1$s: %2$s"
+ "Valgmuligheder"
+ "Fjern %1$s"
+ "Indstillinger"
+ "Det lykkedes ikke at vælge medie. Prøv igen."
+ "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps."
+ "Det lykkedes ikke at behandle medier til upload. Prøv venligst igen."
+ "Upload af medier mislykkedes. Prøv igen."
+ "Tryk på en besked og vælg \"%1$s\" for at inkludere den her."
+ "Fastgør vigtige beskeder, så de let kan opdages"
+
+ - "%1$d Fastgjort besked"
+ - "%1$d Fastgjorte beskeder"
+
+ "Fastgjorte beskeder"
+ "Du er ved at gå til din %1$s konto for at nulstille din identitet. Derefter vil du blive ført tilbage til appen."
+ "Kan du ikke bekræfte? Gå til din konto for at nulstille din identitet."
+ "Træk verifikationen tilbage og send"
+ "Du kan trække din verifikation tilbage og sende denne meddelelse alligevel, eller du kan annullere for nu og prøve igen senere efter at have gen-verificeret. %1$s"
+ "Din besked blev ikke sendt, fordi %1$s\'s verificerede identitet er blevet nulstillet"
+ "Send besked alligevel"
+ "%1$s bruger en eller flere uverificerede enheder. Du kan sende beskeden alligevel, eller du kan annullere for nu og prøve igen senere, når %2$s har bekræftet alle deres enheder."
+ "Din besked blev ikke sendt, fordi %1$s ikke har bekræftet alle enheder"
+ "En eller flere af dine enheder er ikke verificeret. Du kan sende beskeden alligevel, eller du kan annullere for nu og prøve igen senere, når du har verificeret alle dine enheder."
+ "Din besked blev ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder"
+ "Det lykkedes ikke at behandle medier til upload. Prøv venligst igen."
+ "Kunne ikke hente brugeroplysninger"
+ "Besked i %1$s"
+ "Udvid"
+ "Reducér"
+ "Du ser allerede dette rum!"
+ "%1$s af %2$s"
+ "%1$s Fastgjorte beskeder"
+ "Indlæser besked…"
+ "Se alle"
+ "Samtale"
+ "Del lokation"
+ "Del min lokation"
+ "Åbn i Apple Maps"
+ "Åbn i Google Maps"
+ "Åbn i OpenStreetMap"
+ "Del denne lokation"
+ "Beskeden blev ikke sendt fordi %1$s s bekræftede identitet blev nulstillet."
+ "Meddelelsen er ikke sendt, fordi %1$s ikke har bekræftet alle enheder."
+ "Beskeden er ikke sendt, fordi du ikke har verificeret en eller flere af dine enheder."
+ "Lokation"
+ "Version: %1$s (%2$s)"
+ "da"
+ "Historiske beskeder er ikke tilgængelige på denne enhed"
+ "Du skal verificere denne enhed for at få adgang til historiske beskeder"
+ "Du har ikke adgang til denne besked"
+ "Kan ikke dekryptere beskeden"
+ "Denne besked blev blokeret, enten fordi du ikke verificerede din enhed, eller fordi afsenderen skal have verificeret din identitet."
+
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 94f6dc40fc..c49a3ceaef 100644
--- a/libraries/ui-strings/src/main/res/values-de/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-de/translations.xml
@@ -1,5 +1,6 @@
+ "Reaktion hinzufügen: %1$s"
"Avatar"
"Löschen"
@@ -11,6 +12,7 @@
"Nach unten springen"
"Nur Erwähnungen"
"Stummgeschaltet"
+ "Avatar des anderen Nutzers"
"Seite %1$d"
"Pausieren"
"Sprachnachricht, Dauer:%1$s, aktuelle Position: %2$s"
@@ -27,15 +29,20 @@
"Gelesen von %1$s"
"Tippe, um alle anzuzeigen"
- "Reaktion mit %1$s entfernen"
+ "Reaktion mit %1$s entfernen"
+ "Entferne Reaktionen mit %1$s"
+ "Raum-Avatar"
"Dateien senden"
"Passwort anzeigen"
"Anruf starten"
+ "Benutzer-Avatar"
"Benutzermenü"
+ "Avatar ansehen"
"Details anzeigen"
"Sprachnachricht, Dauer: %1$s"
"Sprachnachricht aufnehmen."
"Aufnahme beenden"
+ "Dein Avatar"
"Akzeptieren"
"Bildunterschrift hinzufügen"
"Zum Nachrichtenverlauf hinzufügen"
@@ -94,6 +101,7 @@
"Nein"
"Später"
"Ok"
+ "Kontextmenü öffnen"
"Einstellungen öffnen"
"Öffnen mit"
"Fixieren"
@@ -118,7 +126,9 @@
"Speichern"
"Suchen"
"Senden"
+ "Bearbeitete Nachricht senden"
"Nachricht senden"
+ "Sprachnachricht senden"
"Teilen"
"Link teilen"
"Zeige"
@@ -134,6 +144,7 @@
"Für Optionen tippen"
"Erneut versuchen"
"Lösen"
+ "Ansicht"
"Im Nachrichtenverlauf anzeigen"
"Quellcode anzeigen"
"Ja"
@@ -144,12 +155,13 @@
"Nutzungsrichtlinie"
"Hinzufügen einer Bildunterschrift"
"Erweiterte Einstellungen"
+ "ein Bild"
"Analysedaten"
"Erscheinungsbild"
"Audio"
"Blockierte Nutzer"
"Sprechblasen"
- "Aufruf gestartet"
+ "Anruf gestartet"
"Chat-Backup"
"In die Zwischenablage kopiert"
"Copyright"
@@ -240,6 +252,10 @@ Grund: %1$s."
"Grund"
"Wiederherstellungsschlüssel"
"Wird erneuert…"
+
+ - "%1$d Antwort"
+ - "%1$d Antworten"
+
"%1$s antworten"
"Einen Fehler melden"
"Ein Problem melden"
@@ -259,6 +275,7 @@ Grund: %1$s."
"Wird gesendet…"
"Senden fehlgeschlagen"
"Gesendet"
+ ". "
"Server wird nicht unterstützt"
"Server-URL"
"Einstellungen"
@@ -324,6 +341,7 @@ Möchten Sie wirklich fortfahren?"
"Fehler beim Laden der Nachrichten"
"%1$s konnte nicht auf deinen Standort zugreifen. Bitte versuche es später erneut."
"Fehler beim Hochladen der Sprachnachricht."
+ "Der Raum existiert nicht mehr oder die Einladung ist nicht mehr gültig."
"Nachricht nicht gefunden"
"%1$s hat keine Erlaubnis, auf deinen Standort zuzugreifen. Du kannst den Zugriff in den Einstellungen aktivieren."
"%1$s hat keine Erlaubnis, auf deinen Standort zuzugreifen. Aktiviere unten den Zugriff."
@@ -333,6 +351,7 @@ Möchten Sie wirklich fortfahren?"
"Einige Zeichen sind nicht erlaubt. Es werden nur Buchstaben, Ziffern und die folgenden Symbole unterstützt: ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Einige Nachrichten wurden nicht gesendet"
"Entschuldigung, es ist ein Fehler aufgetreten"
+ "Der Absender des Ereignisses stimmt nicht mit dem Besitzer des Gerätes überein, das es gesendet hat."
"Die Authentizität dieser verschlüsselten Nachricht kann auf diesem Gerät nicht garantiert werden."
"Verschlüsselt von einem zuvor verifizierten Nutzer."
"Unverschlüsselt."
@@ -343,6 +362,10 @@ Möchten Sie wirklich fortfahren?"
"Hey, sprich mit mir auf %1$s: %2$s"
"%1$s Android"
"Schüttel heftig zum Melden von Fehlern"
+ "%1$s: %2$s"
+ "Optionen"
+ "Entferne %1$s"
+ "Einstellungen"
"Medienauswahl fehlgeschlagen, bitte versuche es erneut."
"Bildunterschriften sind für Nutzer älterer Apps möglicherweise nicht sichtbar."
"Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."
@@ -367,6 +390,9 @@ Möchten Sie wirklich fortfahren?"
"Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."
"Benutzerdetails konnten nicht abgerufen werden"
"Nachricht in %1$s"
+ "Erweitern"
+ "Verkleinern"
+ "Du siehst diesen Raum bereits!"
"%1$s von %2$s"
"%1$s fixierte Nachrichten"
"Nachricht wird geladen…"
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 795acf8c29..a9b1e15f7a 100644
--- a/libraries/ui-strings/src/main/res/values-el/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-el/translations.xml
@@ -1,5 +1,6 @@
+ "Προσθήκη αντίδρασης: %1$s"
"Εικόνα Προφίλ"
"Διαγραφή"
@@ -27,7 +28,8 @@
"Διαβάστηκε από %1$s"
"Πάτα για εμφάνιση όλων"
- "Αφαίρεση αντίδρασης με %1$s"
+ "Αφαίρεση αντίδρασης με %1$s"
+ "Αφαιρέστε την αντίδραση με %1$s"
"Αποστολή αρχείων"
"Εμφάνιση κωδικού πρόσβασης"
"Ξεκίνησε μια κλήση"
@@ -56,7 +58,7 @@
"Αντιγραφή συνδέσμου στο μήνυμα"
"Αντιγραφή κειμένου"
"Δημιουργία"
- "Δημιούργησε ένα δωμάτιο"
+ "Δημιουργία αίθουσας"
"Απενεργοποίηση"
"Απενεργοποίηση λογαριασμού"
"Απόρριψη"
@@ -85,7 +87,7 @@
"Μάθε περισσότερα"
"Αποχώρηση"
"Αποχώρηση από τη συζήτηση"
- "Αποχώρηση από το δωμάτιο"
+ "Αποχώρηση από την αίθουσα"
"Φόρτωσε περισσότερα"
"Διαχείριση λογαριασμού"
"Διαχείριση συσκευών"
@@ -110,7 +112,7 @@
"Αναφορά σφάλματος"
"Αναφορά περιεχομένου"
"Αναφορά συνομιλίας"
- "Αναφορά δωματίου"
+ "Αναφορά αίθουσας"
"Επαναφορά"
"Επαναφορά ταυτότητας"
"Επανάληψη"
@@ -144,6 +146,7 @@
"Πολιτική αποδεκτής χρήσης"
"Η λεζάντα προστίθεται"
"Ρυθμίσεις για προχωρημένους"
+ "μια εικόνα"
"Στατιστικά στοιχεία"
"Εμφάνιση"
"Ήχος"
@@ -153,9 +156,9 @@
"Αντίγραφο ασφαλείας συνομιλίας"
"Αντιγράφηκε στο πρόχειρο"
"Πνευματικά δικαιώματα"
- "Δημιουργία δωματίου…"
+ "Δημιουργία αίθουσας…"
"Το αίτημα ακυρώθηκε"
- "Αποχώρησε από το δωμάτιο"
+ "Αποχώρησε από την αίθουσα"
"Η πρόσκληση απορρίφθηκε"
"Σκοτεινό"
"Σφάλμα αποκρυπτογράφησης"
@@ -192,7 +195,7 @@
"Σε απάντηση στον χρήστη %1$s"
"Εγκατάσταση APK"
"Αυτό το Matrix ID δεν μπορεί να βρεθεί, επομένως η πρόσκληση ενδέχεται να μην ληφθεί."
- "Αποχώρηση από το δωμάτιο"
+ "Αποχώρηση από την αίθουσα"
"Φωτεινό"
"Η γραμμή αντιγράφηκε στο πρόχειρο"
"Ο σύνδεσμος αντιγράφηκε στο πρόχειρο"
@@ -214,7 +217,7 @@
"Σίγαση"
"%1$s (%2$s)"
"Κανένα αποτέλεσμα"
- "Χωρίς όνομα δωματίου"
+ "Δεν υπάρχει όνομα αίθουσας"
"Χωρίς κρυπτογράφηση"
"Εκτός σύνδεσης"
"Άδειες ανοιχτού κώδικα"
@@ -240,13 +243,17 @@
"Αιτιολογία"
"Κλειδί ανάκτησης"
"Ανανέωση…"
+
+ - "%1$d απάντηση"
+ - "%1$d απαντήσεις"
+
"Απάντηση σε %1$s"
"Αναφορά σφάλματος"
"Αναφορά προβλήματος"
"Η αναφορά υποβλήθηκε"
"Επεξεργαστής εμπλουτισμένου κειμένου"
"Αίθουσα"
- "Όνομα δωματίου"
+ "Όνομα αίθουσας"
"πχ. το όνομα του έργου σου"
"Αποθηκευμένες αλλαγές"
"Αποθηκεύεται"
@@ -259,6 +266,7 @@
"Αποστολή…"
"Αποτυχία αποστολής"
"Εστάλη"
+ ". "
"Ο διακομιστής δεν υποστηρίζεται"
"URL διακομιστή"
"Ρυθμίσεις"
@@ -276,7 +284,7 @@
"Ειδοποιήσεις τρίτων"
"Νήμα"
"Θέμα"
- "Τί αφορά το δωμάτιο;"
+ "Τι αφορά αυτή η αίθουσα;"
"Δεν είναι δυνατή η αποκρυπτογράφηση"
"Στάλθηκε από μια μη ασφαλής συσκευή"
"Δεν έχεις πρόσβαση σε αυτό το μήνυμα"
@@ -310,8 +318,8 @@
Είστε βέβαιοι ότι θέλετε να συνεχίσετε;"
"Ελέγξτε ξανά αυτόν τον σύνδεσμο"
- "Το δωμάτιο αναφέρθηκε"
- "Αναφέρθηκε και αποχωρήσατε από το δωμάτιο"
+ "Η αίθουσα αναφέρθηκε"
+ "Αναφέρθηκε και αποχωρήσατε από την αίθουσα"
"Επιβεβαίωση"
"Σφάλμα"
"Επιτυχία"
@@ -324,15 +332,17 @@
"Αποτυχία φόρτωσης μηνυμάτων"
"Το %1$s δεν μπόρεσε να αποκτήσει πρόσβαση στην τοποθεσία σου. Προσπάθησε ξανά αργότερα."
"Αποτυχία μεταφόρτωσης του φωνητικού σου μηνύματος."
+ "Η αίθουσα δεν υπάρχει πλέον ή η πρόσκληση δεν ισχύει πλέον."
"Το μήνυμα δεν βρέθηκε"
"Το %1$s δεν έχει άδεια πρόσβασης στην τοποθεσία σου. Μπορείς να ενεργοποιήσεις την πρόσβαση στις Ρυθμίσεις."
"Ο χρήστης %1$s δεν έχει άδεια πρόσβασης στην τοποθεσία σου. Ενεργοποίησε την πρόσβαση παρακάτω."
"Το %1$s δεν έχει άδεια πρόσβασης στο μικρόφωνό σου. Ενεργοποίησε την πρόσβαση για εγγραφή φωνητικού μηνύματος."
"Αυτό μπορεί να οφείλεται σε προβλήματα δικτύου ή διακομιστή."
- "Αυτή η διεύθυνση δωματίου υπάρχει ήδη, δοκίμασε να επεξεργαστείς το πεδίο διεύθυνσης δωματίου ή να αλλάξεις το όνομα δωματίου"
+ "Αυτή η διεύθυνση αίθουσας υπάρχει ήδη. Παρακαλώ δοκιμάστε να επεξεργαστείτε το πεδίο διεύθυνσης αίθουσας ή αλλάξτε το όνομα της αίθουσας"
"Ορισμένοι χαρακτήρες δεν επιτρέπονται. Υποστηρίζονται μόνο γράμματα, ψηφία και τα ακόλουθα σύμβολα ! $ & \'() * +/; = ? @ [] - . _"
"Ορισμένα μηνύματα δεν έχουν σταλεί"
"Λυπούμαστε, παρουσιάστηκε σφάλμα"
+ "Ο αποστολέας του συμβάντος δεν ταιριάζει με τον κάτοχο της συσκευής που το έστειλε."
"Η αυθεντικότητα αυτού του κρυπτογραφημένου μηνύματος δεν είναι εγγυημένη σε αυτήν τη συσκευή."
"Κρυπτογραφημένο από έναν προηγουμένως επαληθευμένο χρήστη."
"Μη κρυπτογραφημένο."
@@ -343,6 +353,10 @@
"Γεια, μίλα μου στην εφαρμογή %1$s :%2$s"
"%1$s Android"
"Κούνησε δυνατά τη συσκευή σου για να αναφέρεις κάποιο σφάλμα"
+ "%1$s: %2$s"
+ "Επιλογές"
+ "Αφαίρεση %1$s"
+ "Ρυθμίσεις"
"Αποτυχία επιλογής πολυμέσου, δοκίμασε ξανά."
"Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές."
"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."
@@ -367,6 +381,9 @@
"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."
"Δεν ήταν δυνατή η ανάκτηση στοιχείων χρήστη"
"Μήνυμα στο %1$s"
+ "Επέκταση"
+ "Μείωση"
+ "Βλέπετε ήδη αυτήν την αίθουσα!"
"%1$s από %2$s"
"%1$s Καρφιτσωμένα μηνύματα"
"Φόρτωση μηνύματος…"
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 2b0c7b84d4..06b0270525 100644
--- a/libraries/ui-strings/src/main/res/values-es/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-es/translations.xml
@@ -27,7 +27,7 @@
"Leído por %1$s"
"Pulsa para mostrar todo"
- "Elimina la reacción con %1$s"
+ "Elimina la reacción con %1$s"
"Enviar archivos"
"Mostrar contraseña"
"Iniciar llamada"
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 1ed332da5f..805e30ec94 100644
--- a/libraries/ui-strings/src/main/res/values-et/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-et/translations.xml
@@ -1,5 +1,6 @@
+ "Reageeri: %1$s"
"Tunnuspilt"
"Kustuta"
@@ -27,11 +28,13 @@
"Seda luges %1$s"
"Vaata kõiki"
- "Eemalda reageerimine %1$s emotikoniga"
+ "Eemalda reageerimine %1$s emotikoniga"
+ "Eemalda reageerimine: %1$s"
"Saada faile"
"Näita salasõna"
"Helista"
"Kasutajamenüü"
+ "Vaata tunnuspilti"
"Vaata üksikasju"
"Häälsõnum, kestus:%1$s"
"Salvesta häälsõnum."
@@ -144,6 +147,7 @@
"Vastuvõetava kasutamise põhimõtted"
"Lisame selgitust"
"Täiendavad seadistused"
+ "pilt"
"Analüütika"
"Välimus"
"Heli"
@@ -240,6 +244,10 @@ Põhjus: %1$s."
"Põhjus"
"Taastevõti"
"Värskendame andmeid…"
+
+ - "%1$d vastus"
+ - "%1$d vastust"
+
"Vastates kasutajale %1$s"
"Teata veast"
"Teata veast"
@@ -259,6 +267,7 @@ Põhjus: %1$s."
"Saadame…"
"Saatmine ei õnnestunud"
"Saadetud"
+ ". "
"Server pole toetatud"
"Serveri URL"
"Seadistused"
@@ -324,6 +333,7 @@ Kas sa oled kindel, et soovid jätkata?"
"Sõnumite laadimine ei õnnestunud"
"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."
"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."
@@ -333,6 +343,7 @@ Kas sa oled kindel, et soovid jätkata?"
"Mõned tähemärgid pole lubatud. Kasuta vaid tähti, numbreid ja neid kirjavahemärke ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Mõned sõnumid on saatmata"
"Vabandust, ilmnes viga"
+ "Sündmuse saatja ja seadme omanik pole vastavuses."
"Selle krüptitud sõnumi tõepärasus pole selles seadmes tagatud."
"Krüptitud varem verifitseeritud kasutaja poolt"
"Pole krüptitud."
@@ -343,6 +354,10 @@ Kas sa oled kindel, et soovid jätkata?"
"Hei, suhtle minuga %1$s võrgus: %2$s"
"%1$s Android"
"Veast teatamiseks raputa nutiseadet ägedalt"
+ "%1$s: %2$s"
+ "Valikud"
+ "Kustuta: %1$s"
+ "Seadistused"
"Meediafaili valimine ei õnnestunud. Palun proovi uuesti."
"Selgitused ja alapealkirjad ei pruugi olla nähtavad vanemate rakenduste kasutajatele."
"Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti."
@@ -367,17 +382,14 @@ Kas sa oled kindel, et soovid jätkata?"
"Meediafaili töötlemine enne üleslaadimist ei õnnestunud. Palun proovi uuesti."
"Kasutaja andmete laadimine ei õnnestunud"
"Sõnum jututoas %1$s"
+ "Näita rohkem"
+ "Näita vähem"
+ "Sa juba vaatad seda jututuba!"
"%1$s / %2$s"
"%1$s esiletõstetud sõnumit"
"Laadime sõnumit…"
"Näita kõiki"
- "Hüppa uude jututuppa"
- "See jututuba on asendatud uuega ning pole enam aktiivne"
- "Vaata vanu sõnumeid"
- "See jututuba on varasema jututoa jätk"
"Vestlus"
- "Liitumispalve on saadetud"
- "See jututuba on uuendatud"
"Jaga asukohta"
"Jaga minu asukohta"
"Ava Apple Mapsis"
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 f3bbd83167..38cd755a78 100644
--- a/libraries/ui-strings/src/main/res/values-eu/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml
@@ -23,7 +23,7 @@
"%1$s(e)k irakurri du"
"Egin tap guztiak ikusteko"
- "Kendu %1$s erreakzioa"
+ "Kendu %1$s erreakzioa"
"Bidali fitxategiak"
"Erakutsi pasahitza"
"Hasi dei bat"
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 a6cc73c1f6..9ea728cbfa 100644
--- a/libraries/ui-strings/src/main/res/values-fa/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml
@@ -22,7 +22,7 @@
"خوانده به دست %1$s و %2$s"
"خوانده به دست %1$s"
"زدن برای نمایش همه"
- "برداشتن واکنش با %1$s"
+ "برداشتن واکنش با %1$s"
"ارسال پروندهها"
"نمایش گذرواژه"
"آغاز یک تماس"
@@ -296,9 +296,14 @@
"تغییراتتان ذخیره نشدهاند. مطمئنید که میخواهید برگردید؟"
"ذخیرهٔ تغییرات؟"
"شکست در ایجاد پایاپیوند"
+ "%1$s نتوانست نقشه را بارگیری کند. لطفا بعدا دوباره امتحان کنید."
"شکست در بار کردن پیامها"
+ "%1$s نمی تواند به موقعیت مکانی شما دسترسی داشته باشد. لطفا بعدا دوباره امتحان کنید."
"شکست در بارگذاری پیام صوتیتان."
"پیام پیدا نشد"
+ "%1$s اجازه دسترسی به موقعیت مکانی شما را ندارد. می توانید دسترسی را در تنظیمات فعال کنید."
+ "%1$s اجازه دسترسی به موقعیت مکانی شما را ندارد. دسترسی را در زیر فعال کنید."
+ "%1$s اجازه دسترسی به میکروفون شما را ندارد. دسترسی را برای ضبط پیام صوتی فعال کنید."
"برخی پیامها ارسال نشدهاند"
"متأسفیم ، خطایی رخ داد"
"اعتبار این پیام رمز شده نمیتواند روی این افزاره تأیید شود."
@@ -310,6 +315,7 @@
"🔐️ پییوستن به من روی %1$s"
"درود. با من روی %1$s صحبت کن: %2$s"
"%1$s اندروید"
+ "Rageshake برای گزارش اشکال"
"گزینش رسانه شکست خورد. لطفاً دوباره تلاش کنید."
"پردازش رسانه برای بارگذاری شکست خورد. لطفاً دوباره تلاش کنید."
"بارگذاری رسانه شکست خورد. لطفاً دوباره تلاش کنید."
@@ -317,6 +323,7 @@
"داردید برای بازنشانی هویتتان به حساب %1$s میروید. پس از آن به کاره برگردانده خواهید شد."
"فرستادن پیام به هر روی"
"پردازش رسانه برای بارگذاری شکست خورد. لطفاً دوباره تلاش کنید."
+ "نمی توان جزئیات کاربر را بازیابی کرد"
"پیام در %1$s"
"%1$s از %2$s"
"%1$s پیامهای سنجاق شده"
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 aba5d6756e..8b0d3e0cf7 100644
--- a/libraries/ui-strings/src/main/res/values-fi/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fi/translations.xml
@@ -27,7 +27,7 @@
"%1$s on lukenut viestin"
"Näytä kaikki napauttamalla"
- "Poista reaktio emojilla %1$s"
+ "Poista reaktio emojilla %1$s"
"Lähetä tiedostoja"
"Näytä salasana"
"Aloita puhelu"
@@ -371,13 +371,7 @@ Haluatko varmasti jatkaa?"
"Kiinnitetty viesti %1$s"
"Viestiä ladataan…"
"Näytä kaikki"
- "Siirry uuteen huoneeseen"
- "Tämä huone on korvattu, eikä se ole enää aktiivinen"
- "Katso vanhoja viestejä"
- "Tämä huone on jatkoa toiselle huoneelle"
"Keskustelu"
- "Liittymispyyntö lähetetty"
- "Tämä huone on päivitetty"
"Jaa sijainti"
"Jaa sijaintini"
"Avaa Apple Mapsissa"
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 154710c593..d1d1177534 100644
--- a/libraries/ui-strings/src/main/res/values-fr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml
@@ -1,5 +1,6 @@
+ "Ajouter une réaction: %1$s"
"Avatar"
"Supprimer"
@@ -11,6 +12,7 @@
"Retourner à la fin de la conversation"
"Mentions uniquement"
"En sourdine"
+ "Avatar de l’autre utilisateur"
"Page %1$d"
"Pause"
"Message vocal, durée: %1$s, position actuelle: %2$s"
@@ -27,15 +29,20 @@
"Lu par %1$s"
"Taper pour voir toute la liste"
+ "Supprimer la réaction avec %1$s"
"Supprimer la réaction avec %1$s"
+ "Avatar du salon"
"Envoyer des fichiers"
"Afficher le mot de passe"
"Démarrer un appel"
+ "Avatar de l’utilisateur"
"Menu utilisateur"
+ "Voir l’avatar"
"Afficher les détails"
"Message vocal, durée: %1$s"
"Enregistrer un message vocal."
"Arrêter l’enregistrement"
+ "Votre avatar"
"Accepter"
"Ajouter une légende"
"Ajouter à la discussion"
@@ -94,6 +101,7 @@
"Non"
"Pas maintenant"
"OK"
+ "Ouvrir le menu contextuel"
"Ouvrir les paramètres"
"Ouvrir avec"
"Épingler"
@@ -118,7 +126,9 @@
"Enregistrer"
"Rechercher"
"Envoyer"
+ "Envoyer un message modifié"
"Envoyer un message"
+ "Envoyer un message vocal"
"Partager"
"Partager le lien"
"Afficher"
@@ -134,13 +144,11 @@
"Appuyez pour afficher les options"
"Essayer à nouveau"
"Désépingler"
+ "Voir"
"Voir dans la discussion"
"Afficher la source"
"Oui"
"Oui, réessayez"
- "Désactivez l’optimisation de la batterie pour cette application afin de vous assurer que toutes les notifications sont reçues."
- "Désactiver l’optimisation"
- "Ils vous manque des notifications?"
"Votre serveur prend désormais en charge un nouveau protocole plus rapide. Déconnectez-vous, puis reconnectez-vous pour effectuer la mise à niveau dès maintenant. En le faisant tout de suite, vous éviterez une déconnexion forcée lorsque l’ancien protocole sera supprimé."
"Mise à niveau disponible"
"À propos"
@@ -244,6 +252,9 @@ Raison : %1$s."
"Raison"
"Clé de récupération"
"Actualisation…"
+
+ - "%1$d réponses"
+
"En réponse à %1$s"
"Signaler un problème"
"Remonter un problème"
@@ -329,6 +340,7 @@ Raison : %1$s."
"Échec du chargement des messages"
"%1$s n’a pas pu accéder à votre position. Veuillez réessayer ultérieurement."
"Échec lors de l’envoi du message vocal."
+ "Ce salon n’existe plus ou l’invitation n’est plus valable."
"Message introuvable"
"%1$s n’est pas autorisé à accéder à votre position. Vous pouvez activer l’accès dans les Paramètres."
"%1$s n’est pas autorisé à accéder à votre position. Activez l’accès ci-dessous."
@@ -349,6 +361,10 @@ Raison : %1$s."
"Salut, parle-moi sur %1$s : %2$s"
"%1$s Android"
"Rageshake pour signaler un problème"
+ "%1$s: %2$s"
+ "Options"
+ "Supprimer %1$s"
+ "Paramètres"
"Échec de la sélection du média, veuillez réessayer."
"Les légendes peuvent ne pas être visibles pour les utilisateurs d’anciennes applications."
"Échec du traitement des médias à télécharger, veuillez réessayer."
@@ -373,17 +389,14 @@ Raison : %1$s."
"Échec du traitement des médias à télécharger, veuillez réessayer."
"Impossible de récupérer les détails de l’utilisateur"
"Message dans %1$s"
+ "Développer"
+ "Réduire"
+ "Vous êtes déjà dans ce salon!"
"%1$s sur %2$s"
"%1$s Messages épinglés"
"Chargement du message…"
"Voir tout"
- "Aller dans le nouveau salon"
- "Ce salon a été remplacé et n’est plus actif"
- "Voir les anciens messages"
- "Ce salon est la continuation du salon précédent"
"Discussion"
- "Demande de rejoindre le salon envoyée"
- "Ce salon a été mis à niveau."
"Partage de position"
"Partager ma position"
"Ouvrir dans Apple Maps"
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 a58cb9db00..b0d8a37de9 100644
--- a/libraries/ui-strings/src/main/res/values-hu/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml
@@ -1,5 +1,6 @@
+ "Reakció hozzáadása: %1$s"
"Profilkép"
"Törlés"
@@ -27,11 +28,13 @@
"Olvasta: %1$s"
"Koppintson az összes megjelenítéséhez"
+ "Reakció eltávolítása: %1$s"
"Reakció eltávolítása: %1$s"
"Fájlküldés"
"Jelszó megjelenítése"
"Hanghívás indítása"
"Felhasználói menü"
+ "Profilkép megtekintése"
"Részletek megtekintése"
"Hangüzenet, időtartam: %1$s"
"Hangüzenet felvétele."
@@ -138,15 +141,13 @@
"Forrás megtekintése"
"Igen"
"Igen, újrapróbálkozás"
- "Kapcsolja ki az alkalmazás akkumulátor-optimalizálását, hogy biztosan megkapja az összes értesítést."
- "Optimalizálás letiltása"
- "Nem érkeznek meg az értesítések?"
"A kiszolgálója mostantól egy új, gyorsabb protokollt támogat. A frissítéshez jelentkezzen ki, majd jelentkezzen be újra. Ha ezt most megteszi, elkerülheti a kényszerített kijelentkeztetést a régi protokollt eltávolításakor."
"Frissítés érhető el"
"Névjegy"
"Elfogadható használatra vonatkozó szabályzat"
"Felirat hozzáadása"
"Speciális beállítások"
+ "egy kép"
"Elemzések"
"Megjelenítés"
"Hang"
@@ -243,6 +244,9 @@ Ok: %1$s."
"Ok"
"Helyreállítási kulcs"
"Frissítés…"
+
+ - "%1$d válasz"
+
"Válasz %1$s számára"
"Hiba jelentése"
"Probléma jelentése"
@@ -262,6 +266,7 @@ Ok: %1$s."
"Küldés…"
"A küldés sikertelen"
"Elküldve"
+ ". "
"A kiszolgáló nem támogatott"
"Kiszolgáló webcíme"
"Beállítások"
@@ -327,6 +332,7 @@ Biztos, hogy folytatja?"
"Nem sikerült betölteni az üzeneteket"
"Az %1$s nem tudta elérni a tartózkodási helyét. Próbálja újra később."
"Nem sikerült feltölteni a hangüzenetét."
+ "A szoba már nem létezik, vagy a meghívó már nem érvényes."
"Az üzenet nem található"
"Az %1$snek nincs engedélye, hogy hozzáférjen a tartózkodási helyéhez. Ezt a beállításokban engedélyezheti."
"Az %1$snek nincs engedélye, hogy hozzáférjen a tartózkodási helyéhez. Engedélyezze alább az elérését."
@@ -347,6 +353,10 @@ Biztos, hogy folytatja?"
"Beszélgessünk itt: %1$s, %2$s"
"%1$s Android"
"Az eszköz rázása a hibajelentéshez"
+ "%1$s: %2$s"
+ "Lehetőségek"
+ "Eltávolítás: %1$s"
+ "Beállítások"
"Nem sikerült kiválasztani a médiát, próbálja újra."
"Előfordulhat, hogy a feliratok nem láthatók a régebbi alkalmazásokat használók számára."
"Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."
@@ -371,17 +381,14 @@ Biztos, hogy folytatja?"
"Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."
"Nem sikerült letölteni a felhasználói adatokat"
"Üzenet a következőben: %1$s"
+ "Kibontás"
+ "Csökkentés"
+ "Már ezt a szobát nézi!"
"%1$s / %2$s"
"%1$s kitűzött üzenet"
"Üzenet betöltése…"
"Összes megtekintése"
- "Ugrás az új szobába"
- "Ezt a szobát lecserélték, és már nem aktív."
- "Régi üzenetek megtekintése"
- "Ez a szoba egy másik szoba folytatása"
"Csevegés"
- "Csatlakozási kérés elküldve"
- "A szoba verzióját frissítették"
"Hely megosztása"
"Saját hely megosztása"
"Megnyitás az Apple Mapsben"
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 c27f8ef33b..b77370f81b 100644
--- a/libraries/ui-strings/src/main/res/values-in/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-in/translations.xml
@@ -1,15 +1,20 @@
+ "Tambahkan reaksi: %1$s"
+ "Avatar"
"Hapus"
- "%1$d digit dimasukkan"
"Sembunyikan kata sandi"
+ "Bergabung dalam panggilan"
"Lompat ke bawah"
"Hanya sebutan"
"Dibisukan"
+ "Avatar pengguna lain"
"Halaman %1$d"
"Jeda"
+ "Pesan suara, durasi: %1$s, posisi saat ini: %2$s"
"Kolom PIN"
"Putar"
"Pemungutan suara"
@@ -22,13 +27,20 @@
"Dibaca oleh %1$s"
"Ketuk untuk melihat semua"
+ "Hapus reaksi dengan %1$s"
"Hapus reaksi dengan %1$s"
+ "Avatar ruangan"
"Kirim berkas"
"Tampilkan kata sandi"
"Mulai panggilan"
+ "Avatar pengguna"
"Menu pengguna"
+ "Lihat avatar"
+ "Lihat detail"
+ "Pesan suara, durasi: %1$s"
"Rekam pesan suara."
"Berhenti merekam"
+ "Avatar Anda"
"Terima"
"Tambahkan keterangan"
"Tambahkan ke lini masa"
@@ -53,9 +65,11 @@
"Nonaktifkan"
"Nonaktifkan akun"
"Tolak"
+ "Tolak dan blokir"
"Hapus pemungutan suara"
"Nonaktifkan"
"Abaikan"
+ "Abaikan"
"Selesai"
"Sunting"
"Sunting keterangan"
@@ -97,8 +111,11 @@
"Hapus pesan"
"Balas"
"Balas dalam utas"
+ "Laporkan"
"Laporkan kutu"
"Laporkan Konten"
+ "Laporkan percakapan"
+ "Laporkan ruangan"
"Atur ulang"
"Atur ulang identitas"
"Coba lagi"
@@ -122,6 +139,7 @@
"Ketuk untuk opsi"
"Coba lagi"
"Lepaskan sematan"
+ "Lihat"
"Lihat di lini masa"
"Tampilkan sumber"
"Ya"
@@ -132,6 +150,7 @@
"Kebijakan penggunaan wajar"
"Menambahkan keterangan"
"Pengaturan tingkat lanjut"
+ "sebuah gambar"
"Analitik"
"Penampilan"
"Audio"
@@ -142,7 +161,9 @@
"Disalin ke papan klip"
"Hak cipta"
"Membuat ruangan…"
+ "Permintaan dibatalkan"
"Keluar dari ruangan"
+ "Undangan ditolak"
"Gelap"
"Kesalahan dekripsi"
"Opsi pengembang"
@@ -155,6 +176,7 @@
"Penyuntingan"
"Menyunting keterangan"
"* %1$s %2$s"
+ "Berkas kosong"
"Enkripsi"
"Enkripsi diaktifkan"
"Masukkan PIN Anda"
@@ -179,8 +201,10 @@ Alasan: %1$s."
"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…"
+ "Memuat lebih banyak…"
- "%d lainnya"
@@ -193,8 +217,10 @@ Alasan: %1$s."
"Pesan dihapus"
"Modern"
"Bisukan"
+ "%1$s (%2$s)"
"Tidak ada hasil"
"Tidak ada nama ruangan"
+ "Tidak terenkripsi"
"Luring"
"Lisensi sumber terbuka"
"atau"
@@ -203,6 +229,7 @@ Alasan: %1$s."
"Tautan Permanen"
"Perizinan"
"Disematkan"
+ "Silakan periksa koneksi internet Anda"
"Mohon tunggu…"
"Apakah Anda yakin ingin mengakhiri pemungutan suara ini?"
"Pemungutan suara: %1$s"
@@ -214,8 +241,12 @@ Alasan: %1$s."
"Kebijakan privasi"
"Reaksi"
"Reaksi"
+ "Alasan"
"Kunci pemulihan"
"Menyegarkan…"
+
+ - "%1$d balasan"
+
"Membalas %1$s"
"Laporkan kutu"
"Laporkan masalah"
@@ -235,12 +266,14 @@ Alasan: %1$s."
"Mengirim…"
"Pengiriman gagal"
"Terkirim"
+ ". "
"Server tidak didukung"
"URL Server"
"Pengaturan"
"Lokasi terbagi"
"Mengeluarkan dari akun"
"Ada yang salah"
+ "Kami mengalami masalah. Silakan coba lagi."
"Memulai obrolan…"
"Stiker"
"Berhasil"
@@ -269,6 +302,7 @@ Alasan: %1$s."
"Terverifikasi"
"Verifikasi perangkat"
"Verifikasi identitas"
+ "Verifikasi pengguna"
"Video"
"Pesan suara"
"Menunggu…"
@@ -277,6 +311,15 @@ Alasan: %1$s."
"Identitas %1$s telah diatur ulang. %2$s"
"Identitas %2$s %1$s telah diatur ulang. %3$s"
"(%1$s)"
+ "Identitasnya %1$s sudah diatur ulang."
+ "Identitas %2$s %1$s telah diatur ulang. %3$s"
+ "Tolak verifikasi"
+ "Tautan %1$s membawa Anda ke situs lain %2$s
+
+Apakah Anda yakin ingin melanjutkan?"
+ "Periksa kembali tautan ini"
+ "Ruangan dilaporkan"
+ "Dilaporkan dan ruangan ditinggalkan"
"Konfirmasi"
"Eror"
"Berhasil"
@@ -289,14 +332,17 @@ Alasan: %1$s."
"Gagal memuat pesan"
"%1$s tidak dapat mengakses lokasi Anda. Silakan coba lagi nanti."
"Gagal mengunggah pesan suara Anda."
+ "Ruangan tidak ada lagi atau undangan tidak lagi valid."
"Pesan tidak ditemukan"
"%1$s tidak memiliki izin untuk mengakses lokasi Anda. Anda dapat mengaktifkan akses di Pengaturan."
"%1$s tidak memiliki izin untuk mengakses lokasi Anda. Aktifkan akses di bawah ini."
"%1$s tidak memiliki izin untuk mengakses mikrofon. Aktifkan akses untuk merekam pesan suara."
+ "Hal ini mungkin disebabkan oleh masalah jaringan atau server."
"Alamat ruangan sudah ada, silakan coba sunting kolom alamat ruangan atau ubah nama ruangan"
"Beberapa karakter tidak diperbolehkan. Hanya huruf, angka, dan simbol berikut didukung ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Beberapa pesan belum terkirim"
"Maaf, terjadi kesalahan"
+ "Pengirim peristiwa tidak cocok dengan pemilik perangkat yang mengirimnya."
"Keaslian pesan terenkripsi ini tidak dapat dijamin pada perangkat ini."
"Dienkripsi oleh pengguna yang telah diverifikasi sebelumnya."
"Tidak dienkripsi."
@@ -307,6 +353,10 @@ Alasan: %1$s."
"Hai, bicaralah dengan saya di %1$s: %2$s"
"%1$s Android"
"Rageshake untuk melaporkan kutu"
+ "%1$s: %2$s"
+ "Opsi"
+ "Hapus %1$s"
+ "Pengaturan"
"Gagal memilih media, silakan coba lagi."
"Keterangan mungkin tidak terlihat oleh orang yang menggunakan aplikasi lama."
"Gagal memproses media untuk diunggah, silakan coba lagi."
@@ -329,6 +379,10 @@ Alasan: %1$s."
"Pesan Anda tidak terkirim karena Anda belum memverifikasi satu atau beberapa perangkat Anda"
"Gagal memproses media untuk diunggah, silakan coba lagi."
"Tidak dapat mengambil detail pengguna"
+ "Pesan dalam %1$s"
+ "Buka"
+ "Kurangi"
+ "Sudah melihat ruangan ini!"
"%1$s dari %2$s"
"%1$s Pesan yang disematkan"
"Memuat pesan…"
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 4f4446050b..d0f28e1319 100644
--- a/libraries/ui-strings/src/main/res/values-it/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-it/translations.xml
@@ -1,16 +1,20 @@
+ "Aggiungi reazione: %1$s"
+ "Avatar"
"Elimina"
- "%1$d cifra inserita"
- "%1$d cifre inserite"
"Nascondi password"
+ "Entra in chiamata"
"Vai alla fine"
"Solo menzioni"
"Silenziato"
"Pagina %1$d"
"Pausa"
+ "Messaggio vocale, durata: %1$s, posizione attuale: %2$s"
"Campo del PIN"
"Riproduci"
"Sondaggio"
@@ -24,12 +28,15 @@
"Visualizzato da %1$s"
"Tocca per mostrare tutti"
- "Rimuovi la reazione con %1$s"
+ "Rimuovi la reazione con %1$s"
+ "Rimuovere la reazione con %1$s"
"Invia file"
"Mostra password"
"Avvia una chiamata"
"Menu utente"
+ "Visualizza avatar"
"Visualizza dettagli"
+ "Messaggio vocale, durata: %1$s"
"Registra un messaggio vocale."
"Ferma la registrazione"
"Accetta"
@@ -56,6 +63,7 @@
"Disattiva"
"Disattiva account"
"Rifiuta"
+ "Rifiuta e blocca"
"Elimina sondaggio"
"Disabilita"
"Annulla"
@@ -101,8 +109,11 @@
"Rimuovi messaggio"
"Rispondi"
"Rispondi nella discussione"
+ "Segnala"
"Segnala un problema"
"Segnala contenuto"
+ "Segnala una conversazione"
+ "Segnala stanza"
"Reimposta"
"Reimposta identità"
"Riprova"
@@ -136,6 +147,7 @@
"Regole sull\'utilizzo consentito"
"Aggiunta didascalia"
"Impostazioni avanzate"
+ "un\'immagine"
"Statistiche di utilizzo"
"Aspetto"
"Audio"
@@ -216,6 +228,7 @@ Motivo:. %1$s"
"Collegamento permanente"
"Autorizzazione"
"Fissato"
+ "Per favore controlla la tua connessione Internet"
"Attendere prego…"
"Vuoi davvero terminare questo sondaggio?"
"Sondaggio: %1$s"
@@ -228,8 +241,13 @@ Motivo:. %1$s"
"Informativa sulla privacy"
"Reazione"
"Reazioni"
+ "Motivo"
"Chiave di recupero"
"Aggiornamento…"
+
+ - "%1$d risposta"
+ - "%1$d risposte"
+
"Risposta a %1$s"
"Segnala un problema"
"Segnala un problema"
@@ -249,12 +267,14 @@ Motivo:. %1$s"
"Invio in corso…"
"Invio fallito"
"Inviato"
+ "."
"Server non supportato"
"URL del server"
"Impostazioni"
"Posizione condivisa"
"Disconnessione"
"Qualcosa è andato storto"
+ "Abbiamo riscontrato un problema. Per favore riprova."
"Avvio della conversazione…"
"Adesivo"
"Operazione riuscita"
@@ -299,6 +319,8 @@ Motivo:. %1$s"
Sei sicuro di voler continuare?"
"Ricontrolla questo link"
+ "Stanza segnalata"
+ "Stanza segnalata ed abbandonata"
"Conferma"
"Errore"
"Operazione riuscita"
@@ -311,6 +333,7 @@ Sei sicuro di voler continuare?"
"Caricamento dei messaggi non riuscito"
"%1$s non è riuscito ad accedere alla tua posizione. Riprova più tardi."
"Invio del messaggio vocale fallito."
+ "La stanza non esiste più o l\'invito non è più valido."
"Messaggio non trovato"
"%1$s non ha l\'autorizzazione di accedere alla tua posizione. Puoi attivare l\'accesso nelle impostazioni."
"%1$s non ha l\'autorizzazione per accedere alla tua posizione. Attiva l\'accesso di seguito."
@@ -320,6 +343,7 @@ Sei sicuro di voler continuare?"
"Alcuni caratteri non sono consentiti. Sono supportate solo lettere, cifre e i seguenti simboli ! $ & \'() * +/; =? @ [] - . _"
"Alcuni messaggi non sono stati inviati"
"Siamo spiacenti, si è verificato un errore"
+ "Il mittente dell\'evento non corrisponde al proprietario del dispositivo che lo ha inviato."
"L\'autenticità di questo messaggio cifrato non può essere garantita su questo dispositivo."
"Cifrato da un utente precedentemente verificato."
"Non cifrato."
@@ -330,6 +354,10 @@ Sei sicuro di voler continuare?"
"Ehi, parliamo su %1$s: %2$s"
"%1$s Android"
"Scuoti per segnalare un problema"
+ "%1$s: %2$s"
+ "Risposte"
+ "Rimuovi %1$s"
+ "Impostazioni"
"Selezione del file multimediale fallita, riprova."
"Le didascalie potrebbero non essere visibili agli utenti di app meno recenti."
"Elaborazione del file multimediale da caricare fallita, riprova."
@@ -354,6 +382,9 @@ Sei sicuro di voler continuare?"
"Elaborazione del file multimediale da caricare fallita, riprova."
"Impossibile recuperare i dettagli dell\'utente"
"Messaggio in %1$s"
+ "Espandi"
+ "Riduci"
+ "Stai già visualizzando questa stanza!"
"%1$s di %2$s"
"%1$s Messaggi fissati"
"Caricamento messaggio…"
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 5688760fc3..7e3fe1912a 100644
--- a/libraries/ui-strings/src/main/res/values-ka/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ka/translations.xml
@@ -24,7 +24,7 @@
"წაიკითხეს: %s"
"შეეხეთ ყველაფრის საჩვენებლად"
- "%1$s რეაქციის წაშლა"
+ "%1$s რეაქციის წაშლა"
"ფაილების გაგზავნა"
"პაროლის ჩვენება"
"დარეკვა"
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 5536fb3a7e..6c2ec13d81 100644
--- a/libraries/ui-strings/src/main/res/values-nb/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml
@@ -1,5 +1,6 @@
+ "Legg til reaksjon: %1$s"
"Profilbilde"
"Slett"
@@ -27,6 +28,7 @@
"Lest av %1$s"
"Trykk for å vise alle"
+ "Fjern reaksjonen med %1$s"
"Fjern reaksjonen med %1$s"
"Sende filer"
"Vis passord"
@@ -138,9 +140,6 @@
"Vis kilde"
"Ja"
"Ja, prøv igjen"
- "Deaktiver batterioptimalisering for denne appen for å sikre at alle varsler mottas."
- "Deaktiver optimalisering"
- "Kommer ikke varslene frem?"
"Serveren din støtter nå en ny, raskere protokoll. Logg ut og logg inn igjen for å oppgradere nå. Ved å gjøre dette nå, unngår du å bli tvunget til å logge ut når den gamle protokollen fjernes senere."
"Oppgradering tilgjengelig"
"Om"
@@ -244,6 +243,9 @@
"Årsak"
"Gjenopprettingsnøkkel"
"Oppdaterer…"
+
+ - "%1$d svar"
+
"Svar til %1$s"
"Rapporter en feil"
"Rapporter et problem"
@@ -328,6 +330,7 @@ Er du sikker på at du vil fortsette?"
"Kunne ikke laste inn meldinger"
"%1$s fikk ikke tilgang til lokasjonen din. Vennligst prøv igjen senere."
"Kunne ikke laste opp talemeldingen din."
+ "Rommet eksisterer ikke lenger, eller invitasjonen er ikke lenger gyldig."
"Melding ikke funnet"
"%1$s har ikke tilgang til lokasjonen din. Du kan aktivere tilgang i Innstillinger."
"%1$s har ikke tilgang til lokasjonen din. Aktiver tilgang nedenfor."
@@ -376,17 +379,14 @@ Er du sikker på at du vil fortsette?"
"Kunne ikke behandle medier for opplasting, vennligst prøv igjen."
"Kunne ikke hente brukerdetaljer"
"Melding i %1$s"
+ "Utvid"
+ "Reduser"
+ "Du ser allerede på dette rommet!"
"%1$s av %2$s"
"%1$s Festede meldinger"
"Laster inn melding…"
"Vis alle"
- "Gå til nytt rom"
- "Dette rommet har blitt erstattet og er ikke lenger aktivt"
- "Se gamle meldinger"
- "Dette rommet er en fortsettelse av et annet rom"
"Chat"
- "Forespørsel om å bli med sendt"
- "Dette rommet har blitt oppgradert"
"Del lokasjon"
"Del min lokasjon"
"Åpne i Apple Maps"
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 fcb11918db..c6a8608fd4 100644
--- a/libraries/ui-strings/src/main/res/values-nl/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-nl/translations.xml
@@ -27,7 +27,7 @@
"Gelezen door %1$s"
"Tik om alles weer te geven"
- "Verwijder reactie met %1$s"
+ "Verwijder reactie met %1$s"
"Bestanden verzenden"
"Wachtwoord weergeven"
"Begin een oproep"
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 bb8e162f30..01bb2cadaa 100644
--- a/libraries/ui-strings/src/main/res/values-pl/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml
@@ -29,7 +29,7 @@
"Odczytane przez %1$s"
"Stuknij, aby pokazać wszystkich"
- "Usuń reakcję %1$s"
+ "Usuń reakcję %1$s"
"Wyślij pliki"
"Pokaż hasło"
"Rozpocznij rozmowę"
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 f5952be07e..40cd039158 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
@@ -1,5 +1,6 @@
+ "Adicionar reação: %1$s"
"Avatar"
"Excluir"
@@ -27,11 +28,13 @@
"Lido por %1$s"
"Toque para mostrar tudo"
+ "Remover reação com %1$s"
"Remover reação com %1$s"
"Enviar arquivos"
"Mostrar senha"
"Iniciar uma chamada"
"Menu do usuário"
+ "Ver avatar"
"Visualizar detalhes"
"Mensagem de voz, duração: %1$s"
"Gravar mensagem de voz."
@@ -127,7 +130,7 @@
"Sair mesmo assim"
"Pular"
"Começar"
- "Iniciar bate-papo"
+ "Iniciar conversa"
"Iniciar verificação"
"Toque para carregar o mapa"
"Tirar foto"
@@ -144,6 +147,7 @@
"Política de uso aceitável"
"Adicionando legenda"
"Configurações avançadas"
+ "uma imagem"
"Telemetria"
"Aparência"
"Áudio"
@@ -240,6 +244,10 @@ Motivo: %1$s."
"Motivo"
"Chave de recuperação"
"Atualizando…"
+
+ - "%1$d resposta"
+ - "%1$d respostas"
+
"Respondendo a %1$s"
"Reportar um erro"
"Reportar um problema"
@@ -259,6 +267,7 @@ Motivo: %1$s."
"Enviando…"
"Envio falhou"
"Enviado"
+ ". "
"Servidor não suportado"
"URL do Servidor"
"Configurações"
@@ -324,6 +333,7 @@ Você tem certeza de que deseja continuar?"
"Falha ao carregar mensagens"
"%1$s não conseguiu acessar sua localização. Por favor, tente novamente mais tarde."
"Falha ao enviar sua mensagem de voz."
+ "A sala não existe mais ou o convite não é mais válido."
"Mensagem não encontrada"
"%1$s não tem permissão para acessar sua localização. Você pode ativar o acesso nas Configurações."
"%1$s não tem permissão para acessar sua localização. Habilite o acesso abaixo."
@@ -333,6 +343,7 @@ Você tem certeza de que deseja continuar?"
"Alguns caracteres não são permitidos. Somente letras, dígitos e os seguintes símbolos são aceitos ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Algumas mensagens não foram enviadas"
"Desculpe, ocorreu um erro"
+ "O remetente do evento não corresponde com o proprietário do dispositivo que o enviou."
"A autenticidade desta mensagem criptografada não pode ser garantida neste aparelho."
"Criptografado por um usuário previamente verificado."
"Não criptografado."
@@ -343,6 +354,10 @@ Você tem certeza de que deseja continuar?"
"Ei, fale comigo em %1$s: %2$s"
"%1$s Android"
"Rageshake para relatar um bug"
+ "%1$s: %2$s"
+ "Opções"
+ "Remover %1$s"
+ "Configurações"
"Falha ao selecionar a mídia, tente novamente."
"As legendas podem não ser visíveis para pessoas que usam aplicativos mais antigos."
"Falha ao processar mídia para upload. Tente novamente."
@@ -367,6 +382,9 @@ Você tem certeza de que deseja continuar?"
"Falha ao processar mídia para upload. Tente novamente."
"Não foi possível recuperar os detalhes do usuário"
"Mensagem em %1$s"
+ "Expandir"
+ "Reduzir"
+ "Já está visualizando esta sala!"
"%1$s de %2$s"
"%1$s Mensagens fixadas"
"Carregando mensagem…"
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 721755f9f1..9027b51547 100644
--- a/libraries/ui-strings/src/main/res/values-pt/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml
@@ -1,12 +1,13 @@
+ "Adicionar reação: %1$s"
"Avatar"
"Eliminar"
- "%1$d dígito inserido"
- "%1$d dígitos inseridos"
- "Ocultar senha"
+ "Ocultar palavra-passe"
"Juntar-se à chamada"
"Saltar para o fundo"
"Apenas menções"
@@ -27,11 +28,13 @@
"Lida por %1$s"
"Toca para mostrar tudo"
+ "Remover reação com %1$s"
"Remover reação com %1$s"
"Enviar ficheiros"
- "Mostrar senha"
+ "Mostrar palavra-passe"
"Iniciar chamada"
"Menu de utilizador"
+ "Ver avatar"
"Ver detalhes"
"Mensagem de voz, duração: %1$s"
"Gravar mensagem de voz."
@@ -59,7 +62,7 @@
"Criar uma sala"
"Desativar"
"Desativar conta"
- "Rejeitar"
+ "Recusar"
"Recusar e bloquear"
"Eliminar sondagem"
"Desativar"
@@ -72,7 +75,7 @@
"Ativar"
"Fim da sondagem"
"Inserir PIN"
- "Esqueceu-se da senha?"
+ "Esqueceu-se da palavra-passe?"
"Reencaminhar"
"Voltar"
"Ignorar"
@@ -86,7 +89,7 @@
"Sair"
"Sair da conversa"
"Sair da sala"
- "Carrega mais"
+ "Carregar mais"
"Gerir conta"
"Gerir dispositivos"
"Enviar mensagem"
@@ -94,7 +97,7 @@
"Não"
"Agora não"
"OK"
- "Configurações"
+ "Definições"
"Abrir com"
"Afixar"
"Resposta rápida"
@@ -144,6 +147,7 @@
"Política de utilização aceitável"
"A adicionar legenda"
"Configurações avançadas"
+ "uma imagem"
"Recolha e análise de dados"
"Aparência"
"Áudio"
@@ -240,6 +244,10 @@ Razão: %1$s."
"Motivo"
"Chave de recuperação"
"A atualizar…"
+
+ - "%1$d resposta"
+ - "%1$d respostas"
+
"Em resposta a %1$s"
"Comunicar falha"
"Comunicar um problema"
@@ -259,6 +267,7 @@ Razão: %1$s."
"A enviar…"
"Falha no envio"
"Enviada"
+ ". "
"Servidor não suportado"
"URL do servidor"
"Configurações"
@@ -324,6 +333,7 @@ Tens a certeza de que queres continuar?"
"Falha ao carregar mensagens"
"A %1$s não conseguiu aceder à tua localização. Por favor, tenta novamente mais tarde."
"Falha ao carregar mensagem de voz."
+ "A sala já não existe ou o convite já não é válido."
"Mensagem não encontrada"
"A %1$s não tem permissão para aceder à tua localização. Podes ativar o acesso nas Definições."
"A %1$s não tem permissão para aceder à tua localização. Continua para ativares o acesso."
@@ -333,6 +343,7 @@ Tens a certeza de que queres continuar?"
"Alguns caracteres não são permitidos. Apenas letras, dígitos e os seguintes símbolos são suportados! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Algumas mensagens não foram enviadas"
"Desculpe, ocorreu um erro"
+ "O remetente deste evento não é o dono do dispositivo que o enviou."
"A autenticidade desta mensagem cifrada não pode ser garantida neste dispositivo."
"Criptografado por um usuário verificado anteriormente."
"Não cifrado."
@@ -343,6 +354,10 @@ Tens a certeza de que queres continuar?"
"Alô! Fala comigo na %1$s: %2$s"
"%1$s Android"
"Agita o dispositivo em fúria para comunicar um problema"
+ "%1$s: %2$s"
+ "Opções"
+ "Remover %1$s"
+ "Configurações"
"Falha ao selecionar multimédia, por favor tente novamente."
"As legendas poderão não ser visíveis em versões mais antigas da aplicação."
"Falha ao processar multimédia para carregamento, por favor tente novamente."
@@ -367,6 +382,9 @@ Tens a certeza de que queres continuar?"
"Falha ao processar multimédia para carregamento, por favor tente novamente."
"Não foi possível obter os detalhes de utilizador."
"Mensagem em %1$s"
+ "Expandir"
+ "Reduzir"
+ "Já estás a ver esta sala!"
"%1$s de %2$s"
"%1$s mensagens afixadas"
"A carregar mensagem…"
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 aad4fc5981..4f370e6924 100644
--- a/libraries/ui-strings/src/main/res/values-ro/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml
@@ -26,7 +26,7 @@
"Citit de%1$s"
"Atingeți pentru a le afișa pe toate"
- "Îndepărtați reacția cu %1$s"
+ "Îndepărtați reacția cu %1$s"
"Trimiteți fișiere"
"Afișați parola"
"Începeți un apel"
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 7d2f9ba66a..93fb5cb170 100644
--- a/libraries/ui-strings/src/main/res/values-ru/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml
@@ -29,7 +29,7 @@
"Прочитано %1$s"
"Нажмите, чтобы показать все"
- "Удалить реакцию с %1$s"
+ "Удалить реакцию с %1$s"
"Отправить файлы"
"Показать пароль"
"Начать звонок"
@@ -377,13 +377,7 @@
"%1$s Закрепленные сообщения"
"Загрузка сообщения…"
"Посмотреть все"
- "Перейти в новую комнату"
- "Эта комната была заменена и больше не активна"
- "Посмотреть старые сообщения"
- "Эта комната является продолжением другой комнаты"
"Чат"
- "Запрос на присоединение отправлен"
- "Эта комната была обновлена"
"Поделиться местоположением"
"Поделиться моим местоположением"
"Открыть в Apple Maps"
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 14dea09167..250691e703 100644
--- a/libraries/ui-strings/src/main/res/values-sk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml
@@ -1,5 +1,6 @@
+ "Pridať reakciu: %1$s"
"Obrázok"
"Vymazať"
@@ -29,11 +30,13 @@
"Prečítal/a %1$s"
"Ťuknutím zobrazíte všetko"
+ "Odstrániť reakciu s %1$s"
"Odstrániť reakciu s %1$s"
"Odoslať súbory"
"Zobraziť heslo"
"Začať hovor"
"Používateľské menu"
+ "Zobraziť profilový obrázok"
"Zobraziť podrobnosti"
"Hlasová správa, dĺžka: %1$s"
"Nahrať hlasovú správu."
@@ -146,6 +149,7 @@
"Zásady prijateľného používania"
"Pridáva sa titulok"
"Pokročilé nastavenia"
+ "obrázok"
"Analytika"
"Vzhľad"
"Zvuk"
@@ -245,6 +249,11 @@ Dôvod: %1$s."
"Dôvod"
"Kľúč na obnovenie"
"Obnovuje sa…"
+
+ - "%1$d odpoveď"
+ - "%1$d odpovede"
+ - "%1$d odpovedí"
+
"Odpoveď na %1$s"
"Nahlásiť chybu"
"Nahlásiť problém"
@@ -264,6 +273,7 @@ Dôvod: %1$s."
"Odosiela sa…"
"Odoslanie zlyhalo"
"Odoslané"
+ ". "
"Server nie je podporovaný"
"URL adresa servera"
"Nastavenia"
@@ -329,6 +339,7 @@ Naozaj chcete pokračovať?"
"Načítanie správ zlyhalo"
"%1$s nemohol získať prístup k vašej polohe. Skúste to prosím neskôr."
"Nepodarilo sa nahrať hlasovú správu."
+ "Miestnosť už neexistuje alebo pozvánka už nie je platná."
"Správa sa nenašla"
"%1$s nemá povolenie na prístup k vašej polohe. Prístup môžete zapnúť v Nastaveniach."
"%1$s nemá povolenie na prístup k vašej polohe. Povoľte prístup nižšie."
@@ -338,6 +349,7 @@ Naozaj chcete pokračovať?"
"Niektoré znaky nie sú povolené. Podporované sú iba písmená, číslice a nasledujúce symboly ! $ & \'() * +/; =? @ [] - . _"
"Niektoré správy neboli odoslané"
"Prepáčte, vyskytla sa chyba"
+ "Odosielateľ udalosti sa nezhoduje s vlastníkom zariadenia, ktoré ju odoslalo."
"Pravosť tejto šifrovanej správy nie je možné zaručiť na tomto zariadení."
"Šifrované predtým overeným používateľom."
"Nie je šifrované."
@@ -348,6 +360,10 @@ Naozaj chcete pokračovať?"
"Ahoj, porozprávajte sa so mnou na %1$s: %2$s"
"%1$s Android"
"Zúrivo potriasť pre nahlásenie chyby"
+ "%1$s: %2$s"
+ "Možnosti"
+ "Odstrániť %1$s"
+ "Nastavenia"
"Nepodarilo sa vybrať médium, skúste to prosím znova."
"Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie."
"Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."
@@ -373,6 +389,9 @@ Naozaj chcete pokračovať?"
"Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."
"Nepodarilo sa získať údaje o používateľovi"
"Správa v %1$s"
+ "Rozbaliť"
+ "Zmenšiť"
+ "Už si prezeráte túto miestnosť!"
"%1$s z %2$s"
"%1$s Pripnutých správ"
"Načítava sa správa…"
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 aa8b4e231e..046da66d2d 100644
--- a/libraries/ui-strings/src/main/res/values-sv/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml
@@ -27,7 +27,7 @@
"Läst av %1$s"
"Tryck för att visa alla"
- "Ta bort reaktionen med %1$s"
+ "Ta bort reaktionen med %1$s"
"Skicka filer"
"Visa lösenord"
"Starta ett samtal"
@@ -371,13 +371,7 @@ Anledning:%1$s."
"%1$s Fästa meddelanden"
"Laddar meddelande …"
"Visa alla"
- "Hoppa till nytt rum"
- "Det här rummet har ersatts och är inte längre aktivt"
- "Se gamla meddelanden"
- "Det här rummet är en fortsättning på ett annat rum"
"Chatt"
- "Begäran om att gå med skickad"
- "Det här rummet har uppgraderats"
"Dela plats"
"Dela min plats"
"Öppna i Apple Maps"
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 fee4cbe5dd..fdec006bb3 100644
--- a/libraries/ui-strings/src/main/res/values-tr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-tr/translations.xml
@@ -24,7 +24,7 @@
"Okuyan %1$s"
"Tümünü göstermek için dokunun"
- "Tepkimeyi kaldır %1$s"
+ "Tepkimeyi kaldır %1$s"
"Dosyaları gönder"
"Şifreyi göster"
"Bir arama başlatın"
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 985a951d93..b57f560076 100644
--- a/libraries/ui-strings/src/main/res/values-uk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml
@@ -1,5 +1,6 @@
+ "Додати реакцію: %1$s"
"Аватар"
"Видалити"
@@ -29,7 +30,8 @@
"Прочитано %1$s"
"Натисніть, щоб показати все"
- "Видалити реакцію з %1$s"
+ "Видалити реакцію з %1$s"
+ "Прибрати реакцію %1$s"
"Надіслати файли"
"Показати пароль"
"Розпочати виклик"
@@ -146,6 +148,7 @@
"Політика прийнятного використання"
"Додавання підпису"
"Додаткові налаштування"
+ "зображення"
"Аналітика"
"Тема"
"Аудіо"
@@ -245,6 +248,11 @@
"Причина"
"Ключ відновлення"
"Оновлення…"
+
+ - "%1$d відповідь"
+ - "%1$d відповіді"
+ - "%1$d відповідей"
+
"Відповідь %1$s"
"Повідомити про ваду"
"Повідомити про проблему"
@@ -264,6 +272,7 @@
"Надсилання…"
"Не вдалося надіслати"
"Надіслано"
+ ". "
"Сервер не підтримується"
"URL-адреса сервера"
"Налаштування"
@@ -329,6 +338,7 @@
"Не вдалося завантажити повідомлення"
"%1$s не вдалося отримати доступ до вашого розташування. Повторіть спробу пізніше."
"Не вдалося завантажити голосове повідомлення."
+ "Кімната більше не існує або запрошення не чинне."
"Повідомлення не знайдено"
"%1$s не має дозволу на доступ до вашого розташування. Увімкнути доступ можна в Налаштуваннях."
"%1$s не має дозволу на доступ до вашого розташування. Увімкніть доступ нижче."
@@ -338,6 +348,7 @@
"Деякі символи не допускаються. Підтримуються тільки букви, цифри і наступні символи! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"
"Деякі повідомлення не були надіслані"
"Вибачте, сталася помилка"
+ "Відправник події не збігається з власником пристрою, який його надіслав."
"Автентичність цього зашифрованого повідомлення не може бути гарантована на цьому пристрої."
"Зашифровано попередньо перевіреним користувачем."
"Не зашифровано."
@@ -348,6 +359,10 @@
"Вітаю, поспілкуйтеся зі мною в %1$s: %2$s"
"%1$s Android"
"Повідомити про ваду за допомогою Rageshake"
+ "%1$s: %2$s"
+ "Варіанти"
+ "Вилучити %1$s"
+ "Налаштування"
"Не вдалося вибрати медіафайл, спробуйте ще раз."
"Користувачі старих застосунків можуть не бачити підписи."
"Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."
@@ -373,6 +388,9 @@
"Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."
"Не вдалося отримати дані користувача"
"Повідомлення в %1$s"
+ "Розгорнути"
+ "Згорнути"
+ "Уже переглядаєте цю кімнату!"
"%1$s із %2$s"
"%1$s закріплених повідомлень"
"Завантаження повідомлення…"
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 e71a5e2014..aa813b829b 100644
--- a/libraries/ui-strings/src/main/res/values-ur/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ur/translations.xml
@@ -24,7 +24,7 @@
"%1$s نے پڑھا"
"سب دکھانے کے لیے تھپتھپائیں"
- "%1$s کے ساتھ رد عمل ہٹائیں"
+ "%1$s کے ساتھ رد عمل ہٹائیں"
"مسلیں بھیجیں"
"لفظ عبور دکھائیں"
"مکالمہ شروع کریں"
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 f83e689b17..86b6dfdaaf 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
@@ -25,7 +25,7 @@
"%1$s 已讀"
"點擊以顯示全部"
- "移除 %1$s 的反應"
+ "移除 %1$s 的反應"
"傳送檔案"
"顯示密碼"
"開始通話"
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 c5a29e7f61..b9dc5d882e 100644
--- a/libraries/ui-strings/src/main/res/values-zh/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml
@@ -25,7 +25,7 @@
"%1$s 已读"
"点击以显示全部"
- "撤回反应 %1$s"
+ "撤回反应 %1$s"
"发送文件"
"显示密码"
"开始通话"
@@ -58,6 +58,7 @@
"停用"
"停用账户"
"拒绝"
+ "拒绝并屏蔽"
"删除投票"
"禁用"
"丢弃"
@@ -103,8 +104,11 @@
"删除消息"
"回复"
"在消息列中回复"
+ "举报"
"报告错误"
"举报内容"
+ "举报对话"
+ "举报房间"
"重置"
"重置身份"
"重试"
@@ -216,6 +220,7 @@
"固定链接"
"权限"
"已置顶"
+ "请检查 Internet 连接"
"请稍候……"
"确定要结束这个投票吗?"
"投票:%1$s"
@@ -230,6 +235,9 @@
"理由"
"恢复密钥"
"正在刷新…"
+
+ - "%1$d 个回复"
+
"正在回复 %1$s"
"报告错误"
"报告问题"
@@ -255,6 +263,7 @@
"共享位置"
"正在登出"
"发生了一些错误"
+ "我们遇到了一个问题。请重试。"
"开始聊天…"
"贴纸"
"成功"
@@ -299,6 +308,8 @@
确定要继续吗?"
"请再次确认链接"
+ "已举报房间"
+ "举报并离开房间"
"确认"
"错误"
"成功"
diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml
index 323b762a43..270e862300 100644
--- a/libraries/ui-strings/src/main/res/values/localazy.xml
+++ b/libraries/ui-strings/src/main/res/values/localazy.xml
@@ -1,5 +1,6 @@
+ "Add reaction: %1$s"
"Avatar"
"Delete"
@@ -11,6 +12,7 @@
"Jump to bottom"
"Mentions only"
"Muted"
+ "Other user\'s avatar"
"Page %1$d"
"Pause"
"Voice message, duration: %1$s, current position: %2$s"
@@ -27,15 +29,20 @@
"Read by %1$s"
"Tap to show all"
+ "Remove reaction: %1$s"
"Remove reaction with %1$s"
+ "Room avatar"
"Send files"
"Show password"
"Start a call"
+ "User avatar"
"User menu"
+ "View avatar"
"View details"
"Voice message, duration: %1$s"
"Record voice message."
"Stop recording"
+ "Your avatar"
"Accept"
"Add caption"
"Add to timeline"
@@ -94,6 +101,7 @@
"No"
"Not now"
"OK"
+ "Open context menu"
"Settings"
"Open with"
"Pin"
@@ -118,7 +126,9 @@
"Save"
"Search"
"Send"
+ "Send edited message"
"Send message"
+ "Send voice message"
"Share"
"Share link"
"Show"
@@ -134,13 +144,11 @@
"Tap for options"
"Try again"
"Unpin"
+ "View"
"View in timeline"
"View source"
"Yes"
"Yes, try again"
- "Disable battery optimization for this app, to make sure all notifications are received."
- "Disable optimization"
- "Notifications not arriving?"
"Your server now supports a new, faster protocol. Log out and log back in to upgrade now. Doing this now will help you avoid a forced logout when the old protocol is removed later."
"Upgrade available"
"About"
@@ -333,6 +341,7 @@ Are you sure you want to continue?"
"Failed loading messages"
"%1$s could not access your location. Please try again later."
"Failed to upload your voice message."
+ "The room no longer exists or the invite is no longer valid."
"Message not found"
"%1$s does not have permission to access your location. You can enable access in Settings."
"%1$s does not have permission to access your location. Enable access below."
@@ -381,18 +390,14 @@ Are you sure you want to continue?"
"Failed processing media to upload, please try again."
"Could not retrieve user details"
"Message in %1$s"
+ "Expand"
+ "Reduce"
"Already viewing this room!"
"%1$s of %2$s"
"%1$s Pinned messages"
"Loading message…"
"View All"
- "Jump to new room"
- "This room has been replaced and is no longer active"
- "See old messages"
- "This room is a continuation of another room"
"Chat"
- "Request to join sent"
- "This room has been upgraded"
"Share location"
"Share my location"
"Open in Apple Maps"
diff --git a/libraries/ui-utils/build.gradle.kts b/libraries/ui-utils/build.gradle.kts
index 40530645dc..fc60dc277e 100644
--- a/libraries/ui-utils/build.gradle.kts
+++ b/libraries/ui-utils/build.gradle.kts
@@ -15,5 +15,7 @@ android {
dependencies {
testImplementation(libs.test.junit)
testImplementation(libs.test.truth)
+ testImplementation(libs.coroutines.test)
+ testImplementation(libs.test.truth)
}
}
diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt
new file mode 100644
index 0000000000..15a8b82eee
--- /dev/null
+++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2025 New Vector 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.ui.utils
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlin.time.Duration.Companion.seconds
+
+/**
+ * Returns true if the user has tapped [numberOfTapToUnlock] times in a short amount of time.
+ * The counter is reset after 2 seconds of inactivity.
+ *
+ * @param numberOfTapToUnlock The number of taps required to unlock.
+ */
+class MultipleTapToUnlock(
+ private val numberOfTapToUnlock: Int = 7,
+) {
+ private var counter = numberOfTapToUnlock
+ private var currentJob: Job? = null
+
+ fun unlock(scope: CoroutineScope): Boolean {
+ counter--
+ currentJob?.cancel()
+ return if (counter > 0) {
+ currentJob = scope.launch {
+ delay(2.seconds)
+ // Reset counter if user is not fast enough
+ counter = numberOfTapToUnlock
+ }
+ false
+ } else {
+ true
+ }
+ }
+}
diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt
index d8be4cb54a..40b0a3cc76 100644
--- a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt
+++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt
@@ -9,12 +9,26 @@ package io.element.android.libraries.ui.utils.time
import android.view.accessibility.AccessibilityManager
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
@Composable
fun isTalkbackActive(): Boolean {
val context = LocalContext.current
val accessibilityManager = remember { context.getSystemService(AccessibilityManager::class.java) }
- return accessibilityManager.isTouchExplorationEnabled
+ var isTouchExplorationEnabled by remember { mutableStateOf(accessibilityManager.isTouchExplorationEnabled) }
+ DisposableEffect(Unit) {
+ val listener = AccessibilityManager.TouchExplorationStateChangeListener { enabled ->
+ isTouchExplorationEnabled = enabled
+ }
+ accessibilityManager.addTouchExplorationStateChangeListener(listener)
+ onDispose {
+ accessibilityManager.removeTouchExplorationStateChangeListener(listener)
+ }
+ }
+ return isTouchExplorationEnabled
}
diff --git a/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt b/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt
new file mode 100644
index 0000000000..1745f617d8
--- /dev/null
+++ b/libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2025 New Vector 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.libraries.ui.utils
+
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.advanceTimeBy
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import kotlin.time.Duration.Companion.seconds
+
+class MultipleTapToUnlockTest {
+ @Test
+ fun `test multiple tap should unlock`() = runTest {
+ val sut = MultipleTapToUnlock(3)
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ assertThat(sut.unlock(backgroundScope)).isTrue()
+ assertThat(sut.unlock(backgroundScope)).isTrue()
+ // All next call returns true
+ advanceTimeBy(3.seconds)
+ assertThat(sut.unlock(backgroundScope)).isTrue()
+ }
+ @Test
+ fun `test waiting should reset counter`() = runTest {
+ val sut = MultipleTapToUnlock(3)
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ advanceTimeBy(3.seconds)
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ assertThat(sut.unlock(backgroundScope)).isFalse()
+ assertThat(sut.unlock(backgroundScope)).isTrue()
+ }
+}
diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt
index fa05b0780a..5b29dd4dd2 100644
--- a/plugins/src/main/kotlin/Versions.kt
+++ b/plugins/src/main/kotlin/Versions.kt
@@ -29,10 +29,10 @@ import org.gradle.jvm.toolchain.JavaLanguageVersion
*/
private const val versionYear = 25
-private const val versionMonth = 6
+private const val versionMonth = 7
// Note: must be in [0,99]
-private const val versionReleaseNumber = 3
+private const val versionReleaseNumber = 0
object Versions {
const val VERSION_CODE = (2000 + versionYear) * 10_000 + versionMonth * 100 + versionReleaseNumber
@@ -42,7 +42,9 @@ object Versions {
const val TARGET_SDK = 35
// When updating the `minSdk`, make sure to update the value of `minSdkVersion` in the file `tools/release/release.sh`
- val minSdk = if (isEnterpriseBuild) 26 else 24
+ private const val MIN_SDK_FOSS = 24
+ private const val MIN_SDK_ENTERPRISE = 33
+ val minSdk = if (isEnterpriseBuild) MIN_SDK_ENTERPRISE else MIN_SDK_FOSS
private const val JAVA_VERSION = 21
val javaVersion: JavaVersion = JavaVersion.toVersion(JAVA_VERSION)
diff --git a/plugins/src/main/kotlin/extension/locales.kt b/plugins/src/main/kotlin/extension/locales.kt
index 8e2f9544b9..b123ac4914 100644
--- a/plugins/src/main/kotlin/extension/locales.kt
+++ b/plugins/src/main/kotlin/extension/locales.kt
@@ -7,6 +7,7 @@ val locales = setOf(
"bg",
"cs",
"cy",
+ "da",
"de",
"el",
"en",
diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png
index c2c39667d3..0a83b12192 100644
--- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png
+++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b281231613c814130499743851deed96cc285b6134ffe64aaa52cbb91e0a5e2a
-size 14402
+oid sha256:b06d5375521caae14aa0621493a93e562e0ec655b9e83e19d05f9c1d9ffbb628
+size 11571
diff --git a/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png b/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png
index b0cdc880cf..9367c10d95 100644
--- a/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png
+++ b/screenshots/de/features.call.impl.ui_CallScreenView_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:27dc69f4e564335bfc868fce9e63448db98e9d82a60d364fc627912659e1025c
-size 14077
+oid sha256:6011ceb2ef963b0410fd0bc3c01906c56a7f1b2a73f36c95f0951469c98f77dd
+size 11128
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 1663a62312..15ebcffdd4 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:240af0e27b7159df0f4f11a1d64f56ea1f209f7dc5de86998c5a9717e61ff82e
-size 22008
+oid sha256:e3f09b0342378a82bbe394877fd03662f8d6554a1f91c9304e7118d171754f6d
+size 19159
diff --git a/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png b/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png
index 3b7e11cf70..d19731fd42 100644
--- a/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png
+++ b/screenshots/de/features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5b5cab99263ef7a2ca101b3292221ce1c04f2f0e3a4e96b59cdcd0060bf5f613
-size 25598
+oid sha256:e2a0bc5c60dd6014333ca545806986bf01dcae29939b6740993a3f3482ebbd72
+size 26953
diff --git a/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png
new file mode 100644
index 0000000000..9efcd392aa
--- /dev/null
+++ b/screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2aaec4eae3539e484846ed564bd3ed53d0f93e4f17c25f1fe3fc7983f6b2c96d
+size 33379
diff --git a/screenshots/de/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png
rename to screenshots/de/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png b/screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png
rename to screenshots/de/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_de.png b/screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_de.png
rename to screenshots/de/features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png
rename to screenshots/de/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_0_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_0_de.png
rename to screenshots/de/features.home.impl.components_RoomListContentView_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_1_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_1_de.png
rename to screenshots/de/features.home.impl.components_RoomListContentView_Day_1_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_3_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_3_de.png
rename to screenshots/de/features.home.impl.components_RoomListContentView_Day_3_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_4_de.png b/screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomListContentView_Day_4_de.png
rename to screenshots/de/features.home.impl.components_RoomListContentView_Day_4_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_29_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_2_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_2_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_2_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_30_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_31_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_31_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_31_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_32_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_32_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_32_de.png
diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_33_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_33_de.png
rename to screenshots/de/features.home.impl.components_RoomSummaryRow_Day_33_de.png
diff --git a/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png
new file mode 100644
index 0000000000..466eac13db
--- /dev/null
+++ b/screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49516bd37dbeee3f00a6cff3f595018e4e779cbb6b4e6dfbcae525e00f78d1a9
+size 14911
diff --git a/screenshots/de/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png b/screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png
rename to screenshots/de/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.filters_RoomListFiltersView_Day_0_de.png b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.filters_RoomListFiltersView_Day_0_de.png
rename to screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl.filters_RoomListFiltersView_Day_1_de.png b/screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.filters_RoomListFiltersView_Day_1_de.png
rename to screenshots/de/features.home.impl.filters_RoomListFiltersView_Day_1_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_de.png b/screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_de.png
rename to screenshots/de/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_de.png
rename to screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_de.png
rename to screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_de.png b/screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_de.png
rename to screenshots/de/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png
diff --git a/screenshots/de/features.roomlist.impl.search_RoomListSearchContent_Day_1_de.png b/screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl.search_RoomListSearchContent_Day_1_de.png
rename to screenshots/de/features.home.impl.search_RoomListSearchContent_Day_1_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_0_de.png b/screenshots/de/features.home.impl_HomeView_Day_0_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_0_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_0_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_7_de.png b/screenshots/de/features.home.impl_HomeView_Day_10_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_7_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_10_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_10_de.png b/screenshots/de/features.home.impl_HomeView_Day_13_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_10_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_13_de.png
diff --git a/screenshots/de/features.home.impl_HomeView_Day_14_de.png b/screenshots/de/features.home.impl_HomeView_Day_14_de.png
new file mode 100644
index 0000000000..98fe76fa22
--- /dev/null
+++ b/screenshots/de/features.home.impl_HomeView_Day_14_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b14795260115bc3eb91066fba38bdcfcadd3cd97d7b2b63188e719c821de9739
+size 105783
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_2_de.png b/screenshots/de/features.home.impl_HomeView_Day_1_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_2_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_1_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_1_de.png b/screenshots/de/features.home.impl_HomeView_Day_2_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_1_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_2_de.png
diff --git a/screenshots/de/features.home.impl_HomeView_Day_3_de.png b/screenshots/de/features.home.impl_HomeView_Day_3_de.png
new file mode 100644
index 0000000000..994d5a4a33
--- /dev/null
+++ b/screenshots/de/features.home.impl_HomeView_Day_3_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0acc8622aa49dc827461b9714f7705862aad85a3381f7d273aedee2ee2dab74e
+size 82992
diff --git a/screenshots/de/features.home.impl_HomeView_Day_5_de.png b/screenshots/de/features.home.impl_HomeView_Day_5_de.png
new file mode 100644
index 0000000000..9facb9192b
--- /dev/null
+++ b/screenshots/de/features.home.impl_HomeView_Day_5_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0e4c98b0229caeb956cf81b81471da453cb8df1f8d544e33442a295e5fda4e77
+size 84014
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_3_de.png b/screenshots/de/features.home.impl_HomeView_Day_6_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_3_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_6_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_4_de.png b/screenshots/de/features.home.impl_HomeView_Day_7_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_4_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_7_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_5_de.png b/screenshots/de/features.home.impl_HomeView_Day_8_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_5_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_8_de.png
diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_6_de.png b/screenshots/de/features.home.impl_HomeView_Day_9_de.png
similarity index 100%
rename from screenshots/de/features.roomlist.impl_RoomListView_Day_6_de.png
rename to screenshots/de/features.home.impl_HomeView_Day_9_de.png
diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png
index a1bdd4c535..b944e9a7b2 100644
--- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png
+++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c61007af7ad374f26b832e7da5653c7d9ed1d0e02c0219fbe331164f2e110a7f
-size 12405
+oid sha256:ee8997d0c539dca790728f8b2227f6a8620c814f69656a209dcfc5fe12aa9f34
+size 22395
diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png
index 6659f4baf8..2ec809e0f1 100644
--- a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png
+++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:69318c3177594668e96c7c14251382ab3a8cde767c84c1a3763aefba074a8256
-size 12057
+oid sha256:97b6da2622c7491563081068c1cbe673b468d8306642c0abfc8f9a8d995c489f
+size 22162
diff --git a/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png
new file mode 100644
index 0000000000..b944e9a7b2
--- /dev/null
+++ b/screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee8997d0c539dca790728f8b2227f6a8620c814f69656a209dcfc5fe12aa9f34
+size 22395
diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png
index 88ce7f8165..99407b4dc5 100644
--- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png
+++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e71425e752a8ecd40579d23be5bb300ef1745e0d28436bfa6553af74590b1154
-size 318115
+oid sha256:4dfbe8da67e61d4681d24f119ba1d9e9d72582d2fb08f5da02b0e885866f800c
+size 314617
diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png
index 4478d30a0a..08b5217d10 100644
--- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png
+++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3e35411d5bdd3070aa61621989dcd75bc4625103c83488a64dacaa32f56e5351
-size 319571
+oid sha256:8beef56d2ec9c0939e594a20dae2aa9d4910fbd0398a71e2fe3798041f2c2508
+size 310229
diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png
index 706aac2785..50a5fabbb1 100644
--- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png
+++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:369c3358762a39c41ed62144ab2b5e15077c0cc35d860d409d3dc07ec91014be
-size 316905
+oid sha256:bc307a1c888ba4238ee113eb62d06303e1a66ba9198bccddcac06a348f8294d5
+size 313215
diff --git a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png
index b82143a424..7717deabda 100644
--- a/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png
+++ b/screenshots/de/features.login.impl.screens.onboarding_OnBoardingView_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f1d640e2499bb791232c179a913cd07cc629254d975e02f5679811e929fbfd20
-size 311421
+oid sha256:1b619aa43723f2b0acefe6a8b06ad0b1c32bcab142dbdd7f2a6df89036b92323
+size 307425
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png
index dc0fa99f96..d9a7c9b57c 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d6feb59d0f97d679a0d5e0ecd9e5c6939b487b829b7a82671db1a6d8403574bb
-size 396515
+oid sha256:6844f7713a4b428a0a1ccfef5980721dc3a561d6921168134e0231cb4b8a7391
+size 396487
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png
deleted file mode 100644
index dc0fa99f96..0000000000
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d6feb59d0f97d679a0d5e0ecd9e5c6939b487b829b7a82671db1a6d8403574bb
-size 396515
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png
index 716168a6c3..9db17042dd 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a6db0a9f5bdb467c1ce39fc8e552753475f8f8b2e77da3bb9ca39f8a1b1a4681
-size 54574
+oid sha256:1397fed8a9781b1f0075fabae221d3bff827fc25aa3b918919202be2a2650d66
+size 54541
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png
index dc0fa99f96..d9a7c9b57c 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d6feb59d0f97d679a0d5e0ecd9e5c6939b487b829b7a82671db1a6d8403574bb
-size 396515
+oid sha256:6844f7713a4b428a0a1ccfef5980721dc3a561d6921168134e0231cb4b8a7391
+size 396487
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png
index 8eb515be35..a64ef3cb97 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9fa4bf73b0d3e48d0e06d939c0b2d9bc824126c116881176d088312b4891d81f
-size 54543
+oid sha256:b7cf927b76093686e123f7f8e45b8ba17f58e15f58bdc1999cdc1a7c2d1f0af6
+size 54509
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png
index 689fa4539c..18148b3dd9 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e5e034198ebca17c608365103c0d9b76180d3fd745912b559a0bf210c25ad91c
-size 55724
+oid sha256:e9bde8eb56bf3df43bc4f58122db1b4229736d9949878e8d1162e9b50bf8314c
+size 55693
diff --git a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png
index dc0fa99f96..d9a7c9b57c 100644
--- a/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png
+++ b/screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d6feb59d0f97d679a0d5e0ecd9e5c6939b487b829b7a82671db1a6d8403574bb
-size 396515
+oid sha256:6844f7713a4b428a0a1ccfef5980721dc3a561d6921168134e0231cb4b8a7391
+size 396487
diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png
index 129987cf6d..05cd75b735 100644
--- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24abc4b97bde6956806e35a9afd12780371bb0071b1c23598e5f0a6abbb218ac
-size 54991
+oid sha256:37d52ac68f524755b1245b8bfddc137e9ae609b2096f958b9920d2f1c6bebba2
+size 54958
diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png
index e8693e5f62..4b9d2d095e 100644
--- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png
+++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bb13812558aa295627e05908477108c8c1bc9cdb0fae5288ca668488cd49d536
-size 65667
+oid sha256:0733dabade5399a419fa04c553a719c32c4925826d34091f7a64a0b4eb929e23
+size 65637
diff --git a/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png b/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png
index 762d8261bb..8c05ba9cdc 100644
--- a/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b420f57f6ac010b9e3cfd3f3d5bff3dfd50474a1dfe18fa295f066273d7b2dae
-size 21317
+oid sha256:982e1555cf3dc1a9e954ad5894ff695612daa54352125f905b033e462787df9a
+size 21314
diff --git a/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png b/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png
index f95dddb777..6643ce9eff 100644
--- a/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.messagecomposer_MessageComposerView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aa5028f3fed84036094624136b5101cbb2a983d063cc64d0547021b510eaae5d
-size 18550
+oid sha256:e4e58b90fc0168991058340c2e29f3a2146c57598ea471aa7ba0b68b950c5574
+size 18507
diff --git a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png
index d0b692554d..f579737b44 100644
--- a/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:78be9296ea0102e3738bffcf76ba11596f996a71355133846b5611b1c9b9f988
-size 14606
+oid sha256:afba149de7c094ec7c49c094df22e22e5482dbc2196decd2af029f00921ac5e2
+size 56367
diff --git a/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png
index cae3730883..c89a3fc130 100644
--- a/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png
+++ b/screenshots/de/features.messages.impl.timeline.components_MessageShieldView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:61be4981840f008add4183ab3581c087d82b8aa453d5e87859e1ddd58ffb294b
-size 48166
+oid sha256:b7095fe731139c16b1f56bab2d7314e6df0bb56778d900bc611d3ddbaa6f4298
+size 58692
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 28340febd3..98acc146d7 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:9367f66dcb7b5aaac0fd38dca80fe4789158da4ad9feeda0818fd533bb6edbe7
-size 42519
+oid sha256:f81a93d139c6904f85395b7bab5576bc6686b8057d18af7d698fd41cc041df1f
+size 41829
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png
new file mode 100644
index 0000000000..720695a5cd
--- /dev/null
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a117fd360262156cef595eabfaee2648cdb185678527d9a0aec602160b7823f4
+size 64801
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png
index 1c6f613b11..cad0d74da6 100644
--- a/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1ed6c7840ad790fc808a6c51bebbfd5ebf0cc1735fa0dea5ce692d99ca0178a5
-size 55646
+oid sha256:f4224b4cb9df1cba1c51d93a8454ac397442e4ddc25226455bc4de6d753c62d8
+size 59300
diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png
index 60f44fd73a..4043448813 100644
--- a/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png
+++ b/screenshots/de/features.messages.impl_MessagesView_Day_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cb29742520c9662f7eee364c28129f4f76ae5ab8fd9ce02dbf657a3429a3e7aa
-size 51530
+oid sha256:4810560dc63bdb17ae199183685f1854f9bfff24515efa1e0cdf634be761b646
+size 54170
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png
new file mode 100644
index 0000000000..33bb12fde2
--- /dev/null
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ff242493b28a6e8ae6847a5674ad05a8752cf35d890430acbc31b366a3ceb7f
+size 53227
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png
new file mode 100644
index 0000000000..0d4a2fc84d
--- /dev/null
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:22e7284a93253845d513f8f1205b19c87a98c8d78ef3192be9f91900204e6999
+size 52935
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png
new file mode 100644
index 0000000000..cac1549c90
--- /dev/null
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6daa75017ffff81889d2640179c2608a74f8fbea7c22fb0a5ef76a716db24a80
+size 55225
diff --git a/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png
new file mode 100644
index 0000000000..b53f27674a
--- /dev/null
+++ b/screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aee7d2d131c88fd9f98a4b2793d6b24e568d962015470788639572ec4824a782
+size 54790
diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png
index 3da56a4789..b3592059e9 100644
--- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png
+++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d1442ad322b2fa249d29cf68785c1642d5bd56128509655bc4a88b41c3b8cf90
-size 56628
+oid sha256:4261bab9dc77c85a8c379831cc35c72348a06d5caca8a9a6ca2d2754dc18dbe1
+size 56393
diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png
index 3da56a4789..b3592059e9 100644
--- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png
+++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d1442ad322b2fa249d29cf68785c1642d5bd56128509655bc4a88b41c3b8cf90
-size 56628
+oid sha256:4261bab9dc77c85a8c379831cc35c72348a06d5caca8a9a6ca2d2754dc18dbe1
+size 56393
diff --git a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png
index 8f3a6eae88..e77301bcd1 100644
--- a/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png
+++ b/screenshots/de/features.preferences.impl.developer_DeveloperSettingsView_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bd3d0a7a7251410fc6ab44e83451fa08035093790891425568e9f2c29c744034
-size 54362
+oid sha256:b8991543cf3bfd4e9fbde2a4c217c2980fb4fc4e751f0755d0abf14faea70058
+size 54130
diff --git a/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png
new file mode 100644
index 0000000000..fed4e6873d
--- /dev/null
+++ b/screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:78688c13e131c5000e7dec50addad0053bb5d3f7dd90ac092eab81623dac69cc
+size 70524
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png
index a97ff5b521..6d022fa45a 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:429df957cda3d0601fe4c451f370241978402033edf6017302115c10aa59f3bc
-size 46237
+oid sha256:5edd8ce73500098587c532e8889baca2c0072cf4194303cb0ddd65e7d26ff398
+size 46184
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png
index a06d8b5f9f..4fed40e2ee 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_17_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:400de13e3e446bc18b1a5d7819fd4b874ffa4bcbc5b80684d84c203b7f5fb897
-size 41836
+oid sha256:52191d77cc9fb34885078c1861eeb25364eacb3d65e0e25b4ca2ebf2a02d3045
+size 44705
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png
index cce1b0aa7a..a06d8b5f9f 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_18_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1de394c34446754f68f028a11fb4112aa56dbbbc69d8d4d5f8f5f48606bd011c
-size 41792
+oid sha256:400de13e3e446bc18b1a5d7819fd4b874ffa4bcbc5b80684d84c203b7f5fb897
+size 41836
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png
new file mode 100644
index 0000000000..cce1b0aa7a
--- /dev/null
+++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1de394c34446754f68f028a11fb4112aa56dbbbc69d8d4d5f8f5f48606bd011c
+size 41792
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png
index 9de805b0a4..af0713f159 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a93f5d684a4f2acef7584f02235e29fe086cd9aaa30a4028c9fe9ee2c01a653d
-size 38689
+oid sha256:567249653f7aad689badeed227f1fb1844151dbe7e839b2ff79ead5ddd5f91a4
+size 42060
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png
index 9eb485f277..ec64a5d2a1 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetails_17_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:422f724e69ca057e5e3031f73bae86fad2fa533af748b930f836c430079c20b0
-size 42861
+oid sha256:be8d3f7dbdc083db4c7698bd8579a33b99fc15e5fae1076a8f8b06b8fb906afd
+size 45981
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png
index dfc9a43500..9eb485f277 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetails_18_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f180e16ec70466bcd5b03bc067ce5a017ea2f345776aa38b8b2a54ed534f1cc5
-size 42739
+oid sha256:422f724e69ca057e5e3031f73bae86fad2fa533af748b930f836c430079c20b0
+size 42861
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png
new file mode 100644
index 0000000000..dfc9a43500
--- /dev/null
+++ b/screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f180e16ec70466bcd5b03bc067ce5a017ea2f345776aa38b8b2a54ed534f1cc5
+size 42739
diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png
index 6c3e1b6460..e6eaca702a 100644
--- a/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png
+++ b/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0abc2fd5fe653f25b3bc13949b1a9c28c5951ca0712db7e399cc7b43dbd71554
-size 39730
+oid sha256:100f6e208e22a312b1ce1009102d5b8d1891d28d0e326e514334e3b53849a65d
+size 43192
diff --git a/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png
index d0f08ffe52..10e166e98a 100644
--- a/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:af4e734f66b3d9e1158d4276f43ab8b6915cf8005c512b59831dd581a3cb438e
-size 55494
+oid sha256:2099eef793b8e48ea898f477cbfb782a470079e1e169cb72fd99fb285cae4022
+size 55497
diff --git a/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png
index 4b8cd97ecc..a9633e8d1f 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:73deeb55c3f7c1734c78fc85ae6892eacc12d3ff507d0b94479f59080af1c505
-size 61242
+oid sha256:bb24147e7a8a9e75c8a8dafd50d83530f2c1e942304f0daa3d6b8b3c28e8bd2a
+size 61442
diff --git a/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png
index c11afad1a6..28f77d2dce 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:413062f9f92a3c0f376c12a30dac541da083c4030069834d83f01143d31949c8
-size 48834
+oid sha256:df3992dca26add78c7d5c325c4dcb1dbbbc73ad89edcb187f823f4b28bc057a6
+size 48865
diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png
index 2b6a9b823c..86489db05d 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a19b9df6856f277082a8cec51d2f278b4ec9d8bbc4623c9026fd8f9246e1ed13
-size 59129
+oid sha256:992054813335b901b58b9708e4ff0ec5e15823b1a712ad810052701571550430
+size 59337
diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png
index 768f400cda..ffc8d8791b 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0f9dcea0ff31cd53affbe4e6adcae2681ec98570d3f26ef9e79b014c75a57919
-size 67937
+oid sha256:c7ddd16c4d67a3aba5de38be25238c8269f71afe1cd7ebc16108226268f088e7
+size 67935
diff --git a/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png
index d0f08ffe52..10e166e98a 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:af4e734f66b3d9e1158d4276f43ab8b6915cf8005c512b59831dd581a3cb438e
-size 55494
+oid sha256:2099eef793b8e48ea898f477cbfb782a470079e1e169cb72fd99fb285cae4022
+size 55497
diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png
index 6ea8c4a052..7860ec1988 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5b45550a4e0579982bda9d9f8ceba223a46111baac3aa91cde7fc55c2d4d63ca
-size 66196
+oid sha256:90706d1d933bb5f730662d812eb846750267a1e2495df9a00aa8b099f407946a
+size 66040
diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png
index 4944157b9c..965bba9f22 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8f521b3c6970fad597fab5a24e4b608bfd9a6d1596c1a4675f402a0ac49d7654
-size 53491
+oid sha256:88b5cef701ed726b9570ef194fd07da2be4b09d3c02a9cecdd0a04894ea5c736
+size 53419
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png
index 23421c86c1..1ef7e3004e 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5649deae47b73edf1f57c9e0836285d67b1e3c15de4e8d6587abe635789de05b
-size 74898
+oid sha256:a73103227c128c1f28b3b50cb1c14a9ae052b118249fa807db41e311e82bcf21
+size 74834
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png
index efb98584bd..e30ff355ac 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:022ebe25ae12c40682454d668ea24dbe749946f0edeee55ddf28ca22d99c360c
-size 61519
+oid sha256:31112b9353107408794ced14e8079b9c5382e153df7efe5428b4dfae1e8ce4fe
+size 61468
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png
index 2873584aae..aa5b22fcc9 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ba32f8394882b4491b345852817e238b30504c2d364a2ab60748e310ecf5f1bd
-size 74291
+oid sha256:da7799a387265659209bbbc28fdef696d603247de596084dc42c84cb1a1e950a
+size 74248
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png
index d704ded910..50632d441e 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5c61e5013cef3e1ebe06c51e24e816d3cdf7fcf04857bc7d02a86a480d83844b
-size 82400
+oid sha256:8c82097113e6a51041aea18ebf5ce4d460920d42b1ec25f0ccf44c623a81bbe7
+size 82346
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png
index cda1620f8c..4e541e3b78 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2e40c4bf8e1a08d8a023067681f86ba887b97f54716aef24e0feb8cde2d34975
-size 63999
+oid sha256:3c44eaf0d7532b9d1d0685c51e34ec7543600c745143f39fee8eaf16ac81dbaf
+size 63947
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png
index c736dc8169..f4d891ead7 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:344b99b0df98328ac83711647ab162fa6b652eac9b05640938f682e4de47d4d0
-size 62896
+oid sha256:cee23d424d4272b9079ee26d49f4f6b2e5a820af8b6a5ed666228db1f389798a
+size 62838
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png
index 177f5135f3..5801097ed8 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7ea10ab065f00bd96553e64dcfe582274bdb075db2fcb882aeeab3710f7b77f9
-size 68530
+oid sha256:11e62a896997c3de594b077b02998359ff96b65b166fccf7bebf419449425e5a
+size 68480
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png
index d2c54e26bb..979ba9c61c 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fe97833d8fb608ade441753fad18ad6e0cce2510b5451e1c5d9b10c18a7e97d4
-size 92039
+oid sha256:1339de24c9c196afc106c955650b13288b7afbebcfae65e68281c7c96c615abd
+size 91982
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png
index 1eab364bad..2de6631075 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:76741feeb6e436310715d45f8fcbe01a1987800f10db5ed9fed478b30a77bd0c
-size 62390
+oid sha256:1b2cbfb2eab3af42ef566bd9cdc21d437144b05d968b98d6d86b36def92acafa
+size 62336
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png
index ced6e2c206..e93966addf 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d33c1114f55bd699ec160b1ebb518fb809b41ca74e145a1cc894b0a54d1a3ee3
-size 63519
+oid sha256:6050a0697ec0e343c1c3e3c118db5c7b0b70e6538f2a7bb903586bd7f6424ce7
+size 63467
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png
index 5505f6779e..c4d965e54c 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:97235ce5cb23cc144a124192cc6849e44beeed331521f289d8d5444df95fc58e
-size 71403
+oid sha256:a0042e41c23d05ccf736061546c8dc30f2a6e15f6f5f7ac82546d90e83c75d55
+size 71344
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png
index cf0160a1bf..39ec0b5132 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:61d7d88797f535e24d84ea5fceb15f8362b31d6a08510e38214288e978bad0e5
-size 61926
+oid sha256:dbaade7bde192beee2f230097bf022f3f091fa64cde85ee8106f2e27f985f055
+size 61874
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png
index 1cf257b5df..366f5c6f55 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:483a47b2450370d7e5cfc267c4c6d21fb6bf91cc09b734215355276bf21d6516
-size 75980
+oid sha256:a9c6ba3a6d39ab7928ce7ccf7e37a399412cd71a8ff790997806f860358c4d01
+size 75900
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png
index 9f238e3d0f..c2a79f6649 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e03d4fb9d9f61c7be275c35f2147f7fe6eb4e0f8185c81ae0e8c92e3a649b705
-size 59483
+oid sha256:dde43a408286bd596221359e3a29ed82325326f9c5f9ea7e83636ec2a07855e4
+size 59435
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png
index 7088990852..3d0a1cb6c8 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2b21561e0a75416139e6cea48147fcf8f94fcb82470c083de2386bc09b6bb638
-size 74179
+oid sha256:8ccdf0f2a87017ff6fd061670450aa6e4fa33dfdef95e0100b94aaf304c8edc9
+size 74099
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png
index 7343ba3a68..5bf71f1dea 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:72cf358766cac6a25856d67b64231e0f197d822d528e6b2677121c939c3af009
-size 85364
+oid sha256:9050d07e311f03077cc9e943ca3dd50612b95804232bda285e076390c4da86c6
+size 85289
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png
index b62091a933..2c3b4f6a5f 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8e97d95e3879db231a277be5811fcb8ad9c4781266180a17ee051b23c70b7d35
-size 62594
+oid sha256:7f9e6b5f62d9ca76b369a204040f583932bc827fb6b5f1c1ca0942c814d30f31
+size 62539
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png
index 4ad99eaff1..048d4842d9 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:04ef750b7bf937ec4f37bfef7b8fe01d8ad5dae3a0e82220a5058a72c2747799
-size 61642
+oid sha256:ea1f6d452f6fbb9ba45bbc3ef777266f99fd71e0f277c8c557adc8d9470adddf
+size 61586
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png
index 6ec236e181..bcf5e5386c 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ceb13e2468d332613c9876f5b1b8b0f2d1d0308f60f8375d1157a28aab6af6a8
-size 69022
+oid sha256:1053bc550660011eee4f313a845d596b5fec2e6a6c65580a7843f855998f2017
+size 68969
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png
index 735caca5a4..2480986170 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7aa44ff345d0b2bb9a4f2c2c94f4cf5acfe1518c33608a4673f748d5f25ac886
-size 104285
+oid sha256:5c53a176cf0f300d40708e01069e27c66349d874c206bd7d079dafa3bcf71abe
+size 104228
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png
index c9f64c9762..7d10e145ec 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a15da02688f8f096b84d61579901b0b1b951a3e3ad185a41959f8bf51a12ba02
-size 60667
+oid sha256:c46f7a68998accd949e8ca2e33bd9f8e663de338ebd464e9178dab4c4dd8deec
+size 60617
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png
index 4b5ed412cc..0419ce4b2a 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5c6b9ef3e544c8b43b037d1d85bffb1c20c19d211ebeae8fde3c1832e2454759
-size 62717
+oid sha256:1fcfe18b254baaff3c93481680979f944fbcbab9e40de45920e35a031e3d64b9
+size 62666
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png
index a020e8e929..ea8a69d22a 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5bcfd88322da25f0222dc25941b3c05a3e1b40bf9c43d6d6479e8c2e9c1590d5
-size 71118
+oid sha256:c4e5601722e9d3e983e168e7725d1bf0538692b89a22784257c6a6f451dad447
+size 71072
diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png
index 5ed4c0135b..dc4559c47d 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:38722413573171f3e32a273e18d1e07d887dc031b56dbc337495e74b972f8d5e
-size 60175
+oid sha256:01a0264c455d738cb46073213f043ab27762bec96d5839c42daaf12cfec9dd0f
+size 60127
diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png
index 55c39845a0..d892e33f6d 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6bf747f7a203f82715af67bfbe1d7833781122f4df5bb1edee6c69b964bd5354
-size 58386
+oid sha256:f553fb21d87d1b6cb92d083e60e873d1aa56b85ff2a06874122c78bd72c250f0
+size 58371
diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png
index 795ba6a267..62761e404a 100644
--- a/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png
+++ b/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:38ec4ada1a2d0f5ca18b8d11d30477be907bc9947cd42e93cf546a86cb75e188
-size 46540
+oid sha256:48afdc8565914ae3782d3c90055bd7686e0e208638a2fb8b86bdaf70c5e48ea3
+size 46578
diff --git a/screenshots/html/data.js b/screenshots/html/data.js
index 5edac704cf..9006dd4020 100644
--- a/screenshots/html/data.js
+++ b/screenshots/html/data.js
@@ -1,70 +1,75 @@
// Generated file, do not edit
export const screenshots = [
["en","en-dark","de",],
-["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20252,],
+["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20273,],
["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",20252,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20252,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20252,],
-["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20252,],
-["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20252,],
-["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20252,],
-["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20252,],
-["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20252,],
-["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20252,],
-["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20252,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_1_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_1_en",20273,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20273,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20273,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20273,],
+["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20273,],
+["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20273,],
+["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20273,],
+["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20273,],
+["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20273,],
+["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20273,],
+["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20273,],
["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,],
["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",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20252,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20273,],
["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",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20252,],
-["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20252,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20252,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20252,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20252,],
-["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20252,],
-["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20252,],
-["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20252,],
-["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20252,],
-["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20252,],
-["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20252,],
-["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20252,],
-["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20252,],
-["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20252,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20273,],
+["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20273,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20273,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20273,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20273,],
+["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en","",20273,],
+["features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en","",20273,],
+["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20273,],
+["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20273,],
+["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20273,],
+["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20273,],
+["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20273,],
+["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20273,],
+["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20273,],
["libraries.designsystem.components_Announcement_Day_0_en","libraries.designsystem.components_Announcement_Night_0_en",0,],
-["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20252,],
+["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20273,],
["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",20252,],
+["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20273,],
["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",20252,],
+["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20273,],
["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",20252,],
+["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20273,],
["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",20252,],
+["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20273,],
["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,],
@@ -74,18 +79,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_AttachmentsView_0_en","",20252,],
-["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20252,],
-["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20252,],
-["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20252,],
-["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20252,],
-["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20252,],
+["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20273,],
+["features.messages.impl.attachments.preview_AttachmentsView_1_en","",0,],
+["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20273,],
+["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20273,],
+["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20273,],
+["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20273,],
["features.messages.impl.attachments.preview_AttachmentsView_6_en","",0,],
-["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20252,],
+["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20273,],
["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",20252,],
+["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20273,],
+["libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en","",0,],
["features.knockrequests.impl.banner_AvatarRowRtl_Day_0_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_0_en",0,],
["features.knockrequests.impl.banner_AvatarRowRtl_Day_1_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_1_en",0,],
["features.knockrequests.impl.banner_AvatarRowRtl_Day_2_en","features.knockrequests.impl.banner_AvatarRowRtl_Night_2_en",0,],
@@ -191,15 +197,16 @@ export const screenshots = [
["libraries.designsystem.components.avatar_Avatar_Avatars_9_en","",0,],
["libraries.designsystem.components.button_BackButton_Buttons_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",20273,],
["libraries.designsystem.components_BigCheckmark_Day_0_en","libraries.designsystem.components_BigCheckmark_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",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20252,],
-["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20252,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20273,],
+["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20273,],
["libraries.designsystem.components_BloomInitials_Day_0_en","libraries.designsystem.components_BloomInitials_Night_0_en",0,],
["libraries.designsystem.components_BloomInitials_Day_1_en","libraries.designsystem.components_BloomInitials_Night_1_en",0,],
["libraries.designsystem.components_BloomInitials_Day_2_en","libraries.designsystem.components_BloomInitials_Night_2_en",0,],
@@ -210,141 +217,138 @@ export const screenshots = [
["libraries.designsystem.components_BloomInitials_Day_7_en","libraries.designsystem.components_BloomInitials_Night_7_en",0,],
["libraries.designsystem.components_Bloom_Day_0_en","libraries.designsystem.components_Bloom_Night_0_en",0,],
["libraries.designsystem.theme.components_BottomSheetDragHandle_Day_0_en","libraries.designsystem.theme.components_BottomSheetDragHandle_Night_0_en",0,],
-["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20252,],
-["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20252,],
-["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20252,],
-["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20252,],
-["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20252,],
+["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20273,],
+["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20273,],
+["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20273,],
+["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20273,],
+["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20273,],
["libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ButtonColumnMolecule_Night_0_en",0,],
["libraries.designsystem.atomic.molecules_ButtonRowMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ButtonRowMolecule_Night_0_en",0,],
["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",20252,],
-["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20252,],
+["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20273,],
+["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20273,],
["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_en",0,],
["features.messages.impl.timeline.components_CallMenuItem_Day_5_en","features.messages.impl.timeline.components_CallMenuItem_Night_5_en",0,],
-["features.call.impl.ui_CallScreenPipView_Day_0_en","features.call.impl.ui_CallScreenPipView_Night_0_en",0,],
-["features.call.impl.ui_CallScreenPipView_Day_1_en","features.call.impl.ui_CallScreenPipView_Night_1_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",20252,],
-["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20252,],
-["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20252,],
-["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20252,],
-["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20252,],
-["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20252,],
+["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20273,],
+["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20273,],
+["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20273,],
+["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20273,],
+["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20273,],
+["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20273,],
["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",20252,],
-["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20252,],
-["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20252,],
+["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20273,],
+["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20273,],
+["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20273,],
["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,],
-["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20252,],
+["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20273,],
["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",20252,],
-["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20252,],
-["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20252,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20252,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20252,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20252,],
-["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20252,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_0_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_0_en",20273,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20273,],
+["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20273,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20273,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20273,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20273,],
+["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20273,],
["libraries.designsystem.theme.components_CircularProgressIndicator_Progress_Indicators_en","",0,],
["libraries.designsystem.components_ClickableLinkText_Text_en","",0,],
["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",20252,],
-["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20252,],
-["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20252,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20273,],
+["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20273,],
+["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20273,],
["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,],
-["libraries.designsystem.components.avatar_CompositeAvatar_Avatars_en","",0,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20252,],
-["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20252,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20252,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20252,],
-["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20252,],
-["features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20252,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20273,],
+["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20273,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20273,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20273,],
+["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20273,],
+["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20273,],
["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_ConnectivityIndicatorView_Day_0_en","features.networkmonitor.api.ui_ConnectivityIndicatorView_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",20252,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20252,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20252,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20252,],
-["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20252,],
-["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20252,],
-["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20252,],
-["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20252,],
-["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20252,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20252,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20252,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20252,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20252,],
-["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20252,],
+["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20273,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20273,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20273,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20273,],
+["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20273,],
+["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20273,],
+["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20273,],
+["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20273,],
+["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20273,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20273,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20273,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20273,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20273,],
+["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20273,],
["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","",20252,],
-["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20252,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20252,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20252,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20252,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20252,],
-["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20252,],
+["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20273,],
+["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20273,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20273,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20273,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20273,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20273,],
+["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20273,],
["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",20252,],
-["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20252,],
-["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20252,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20273,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20273,],
+["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20273,],
["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",20252,],
-["features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20252,],
-["features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en",20252,],
+["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20273,],
+["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20273,],
+["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20273,],
["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",20252,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20252,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20252,],
-["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20252,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20252,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20252,],
-["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20252,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20273,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20273,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20273,],
+["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20273,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20273,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20273,],
+["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20273,],
["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,],
@@ -357,17 +361,18 @@ 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",20252,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20252,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20252,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20252,],
-["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20252,],
-["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20252,],
-["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20252,],
-["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20252,],
-["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20252,],
-["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20252,],
-["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20252,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20273,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20273,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20273,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20273,],
+["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20273,],
+["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20273,],
+["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20273,],
+["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20273,],
+["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20273,],
+["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20273,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20273,],
+["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20273,],
["libraries.matrix.ui.components_EditableAvatarView_Day_0_en","libraries.matrix.ui.components_EditableAvatarView_Night_0_en",0,],
["libraries.matrix.ui.components_EditableAvatarView_Day_1_en","libraries.matrix.ui.components_EditableAvatarView_Night_1_en",0,],
["libraries.matrix.ui.components_EditableAvatarView_Day_2_en","libraries.matrix.ui.components_EditableAvatarView_Night_2_en",0,],
@@ -377,10 +382,11 @@ export const screenshots = [
["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_EmojiPicker_Day_0_en","features.messages.impl.timeline.components.customreaction_EmojiPicker_Night_0_en",0,],
-["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20252,],
-["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20252,],
-["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20252,],
+["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20273,],
+["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20273,],
+["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20273,],
["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,],
["libraries.mediaviewer.impl.gallery.ui_FileItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_FileItemView_Night_0_en",0,],
["libraries.mediaviewer.impl.gallery.ui_FileItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_FileItemView_Night_1_en",0,],
@@ -397,21 +403,36 @@ export const screenshots = [
["libraries.designsystem.theme.components_FloatingActionButton_Floating_Action_Buttons_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",20252,],
-["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20252,],
-["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20252,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20273,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20273,],
+["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20273,],
["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.messages.impl.forward_ForwardMessagesView_Day_0_en","features.messages.impl.forward_ForwardMessagesView_Night_0_en",0,],
["features.messages.impl.forward_ForwardMessagesView_Day_1_en","features.messages.impl.forward_ForwardMessagesView_Night_1_en",0,],
["features.messages.impl.forward_ForwardMessagesView_Day_2_en","features.messages.impl.forward_ForwardMessagesView_Night_2_en",0,],
-["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20252,],
-["features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20252,],
+["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20273,],
+["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20273,],
["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_HomeView_Day_0_en","features.home.impl_HomeView_Night_0_en",20273,],
+["features.home.impl_HomeView_Day_10_en","features.home.impl_HomeView_Night_10_en",20273,],
+["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",20273,],
+["features.home.impl_HomeView_Day_14_en","features.home.impl_HomeView_Night_14_en",20273,],
+["features.home.impl_HomeView_Day_1_en","features.home.impl_HomeView_Night_1_en",20273,],
+["features.home.impl_HomeView_Day_2_en","features.home.impl_HomeView_Night_2_en",20273,],
+["features.home.impl_HomeView_Day_3_en","features.home.impl_HomeView_Night_3_en",20273,],
+["features.home.impl_HomeView_Day_4_en","features.home.impl_HomeView_Night_4_en",0,],
+["features.home.impl_HomeView_Day_5_en","features.home.impl_HomeView_Night_5_en",20273,],
+["features.home.impl_HomeView_Day_6_en","features.home.impl_HomeView_Night_6_en",20273,],
+["features.home.impl_HomeView_Day_7_en","features.home.impl_HomeView_Night_7_en",20273,],
+["features.home.impl_HomeView_Day_8_en","features.home.impl_HomeView_Night_8_en",20273,],
+["features.home.impl_HomeView_Day_9_en","features.home.impl_HomeView_Night_9_en",20273,],
["libraries.designsystem.theme.components_HorizontalDivider_Dividers_en","",0,],
["libraries.designsystem.ruler_HorizontalRuler_Day_0_en","libraries.designsystem.ruler_HorizontalRuler_Night_0_en",0,],
["libraries.designsystem.theme.components_IconButton_Buttons_en","",0,],
@@ -420,8 +441,8 @@ 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.element_Icon_en","",0,],
["appicon.enterprise_Icon_en","",0,],
+["appicon.element_Icon_en","",0,],
["libraries.designsystem.icons_IconsCompound_Day_0_en","libraries.designsystem.icons_IconsCompound_Night_0_en",0,],
["libraries.designsystem.icons_IconsCompound_Day_1_en","libraries.designsystem.icons_IconsCompound_Night_1_en",0,],
["libraries.designsystem.icons_IconsCompound_Day_2_en","libraries.designsystem.icons_IconsCompound_Night_2_en",0,],
@@ -430,8 +451,8 @@ export const screenshots = [
["libraries.designsystem.icons_IconsCompound_Day_5_en","libraries.designsystem.icons_IconsCompound_Night_5_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",20252,],
-["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20252,],
+["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20273,],
+["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20273,],
["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,],
@@ -439,85 +460,85 @@ 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",20252,],
+["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20273,],
["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",20252,],
+["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20273,],
["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",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20252,],
-["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20252,],
+["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20273,],
+["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20273,],
["features.networkmonitor.api.ui_Indicator_Day_0_en","features.networkmonitor.api.ui_Indicator_Night_0_en",0,],
["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,],
-["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20255,],
-["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20252,],
-["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20252,],
+["features.call.impl.ui_InvalidAudioDeviceDialog_Day_0_en","features.call.impl.ui_InvalidAudioDeviceDialog_Night_0_en",20273,],
+["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20273,],
+["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20273,],
["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",20252,],
-["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20252,],
-["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20252,],
-["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20252,],
-["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20252,],
+["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20273,],
+["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20273,],
+["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20273,],
+["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20273,],
["libraries.designsystem.components_LabelledCheckbox_Toggles_en","",0,],
["features.leaveroom.api_LeaveRoomView_Day_0_en","features.leaveroom.api_LeaveRoomView_Night_0_en",0,],
-["features.leaveroom.api_LeaveRoomView_Day_1_en","features.leaveroom.api_LeaveRoomView_Night_1_en",20252,],
-["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20252,],
-["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20252,],
-["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20252,],
-["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20252,],
-["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20252,],
+["features.leaveroom.api_LeaveRoomView_Day_1_en","features.leaveroom.api_LeaveRoomView_Night_1_en",20273,],
+["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20273,],
+["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20273,],
+["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20273,],
+["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20273,],
+["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20273,],
["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.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",20252,],
+["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20273,],
["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,],
@@ -572,31 +593,31 @@ export const screenshots = [
["libraries.designsystem.theme.components_ListSupportingTextSmallPadding_List_supporting_text_-_small_padding_List_sections_en","",0,],
["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",20252,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20252,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20252,],
-["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20252,],
+["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20273,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20273,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20273,],
+["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20273,],
["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",20252,],
-["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20252,],
-["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20252,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20252,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20252,],
-["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20252,],
-["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20252,],
-["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20252,],
-["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20252,],
-["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20252,],
-["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20252,],
-["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20252,],
-["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20252,],
-["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20252,],
-["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20252,],
-["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20252,],
-["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20252,],
-["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20252,],
+["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20273,],
+["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20273,],
+["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20273,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20273,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20273,],
+["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20273,],
+["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20273,],
+["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20273,],
+["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20273,],
+["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20273,],
+["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20273,],
+["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20273,],
+["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20273,],
+["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20273,],
+["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20273,],
+["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20273,],
+["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20273,],
+["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20273,],
["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,],
-["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20252,],
+["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20273,],
["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,],
@@ -609,22 +630,22 @@ 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",20252,],
-["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20252,],
+["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20273,],
+["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20273,],
["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",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20252,],
-["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20252,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20273,],
+["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20273,],
["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,],
@@ -632,14 +653,14 @@ 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_MediaViewerView_0_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_10_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20252,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20252,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20273,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20273,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20252,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20273,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_15_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_16_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_1_en","",0,],
-["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20252,],
+["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20273,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,],
["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,],
@@ -651,7 +672,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",20252,],
+["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20273,],
["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,],
@@ -660,7 +681,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",20252,],
+["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20273,],
["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,],
@@ -668,25 +689,26 @@ export const screenshots = [
["features.messages.impl.timeline.components_MessagesReactionButton_Day_1_en","features.messages.impl.timeline.components_MessagesReactionButton_Night_1_en",0,],
["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.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20252,],
-["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20252,],
-["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20252,],
-["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20252,],
-["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20252,],
-["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20252,],
-["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20252,],
-["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20252,],
-["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20252,],
-["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20252,],
-["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20252,],
-["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20252,],
-["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20252,],
-["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20252,],
-["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20252,],
-["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20252,],
-["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20252,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20273,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20273,],
+["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20273,],
+["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20273,],
+["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20273,],
+["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20273,],
+["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20273,],
+["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20273,],
+["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20273,],
+["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20273,],
+["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20273,],
+["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20273,],
+["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20273,],
+["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20273,],
+["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20273,],
+["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20273,],
+["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20273,],
+["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20273,],
["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",20252,],
+["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20273,],
["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,],
["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,],
["appicon.element_MonochromeIcon_en","",0,],
@@ -695,43 +717,44 @@ export const screenshots = [
["libraries.designsystem.components.list_MutipleSelectionListItemSelectedTrailingContent_Multiple_selection_List_item_-_selection_in_trailing_content_List_items_en","",0,],
["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,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20252,],
-["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20252,],
-["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20252,],
+["libraries.designsystem.theme.components_NavigationBar_App_Bars_en","",0,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20273,],
+["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20273,],
+["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20273,],
["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",20252,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20252,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20252,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20252,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20252,],
-["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20252,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_0_en","features.login.impl.screens.onboarding_OnBoardingView_Night_0_en",20273,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20273,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20273,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20273,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20273,],
+["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20273,],
["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20252,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_0_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_0_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20273,],
["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",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20252,],
-["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20252,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_1_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_1_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20273,],
+["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20273,],
["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,],
["libraries.designsystem.theme.components_OutlinedButtonMediumLowPadding_Buttons_en","",0,],
@@ -745,65 +768,65 @@ export const screenshots = [
["libraries.designsystem.components_PageTitleWithIconFull_Day_5_en","libraries.designsystem.components_PageTitleWithIconFull_Night_5_en",0,],
["libraries.designsystem.components_PageTitleWithIconFull_Day_6_en","libraries.designsystem.components_PageTitleWithIconFull_Night_6_en",0,],
["libraries.designsystem.components_PageTitleWithIconMinimal_Day_0_en","libraries.designsystem.components_PageTitleWithIconMinimal_Night_0_en",0,],
-["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20252,],
-["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20252,],
-["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20252,],
-["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20252,],
-["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20252,],
-["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20252,],
+["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20273,],
+["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20273,],
+["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20273,],
+["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20273,],
+["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20273,],
+["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20273,],
["features.lockscreen.impl.components_PinEntryTextField_Day_0_en","features.lockscreen.impl.components_PinEntryTextField_Night_0_en",0,],
["libraries.designsystem.components_PinIcon_Day_0_en","libraries.designsystem.components_PinIcon_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",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20252,],
-["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20252,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20273,],
+["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20273,],
["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",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20252,],
-["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20252,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20252,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20252,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20252,],
-["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20252,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20273,],
+["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20273,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20273,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20273,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20273,],
+["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20273,],
["libraries.designsystem.atomic.atoms_PlaceholderAtom_Day_0_en","libraries.designsystem.atomic.atoms_PlaceholderAtom_Night_0_en",0,],
-["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20252,],
+["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20273,],
["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",20252,],
-["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20252,],
-["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20252,],
-["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20252,],
-["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20252,],
-["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20252,],
-["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20252,],
-["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20252,],
+["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20273,],
+["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20273,],
+["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20273,],
+["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20273,],
+["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20273,],
+["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20273,],
+["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20273,],
["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,],
@@ -817,321 +840,313 @@ 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","",20252,],
-["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20252,],
-["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20252,],
-["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20252,],
+["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20273,],
+["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20273,],
+["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20273,],
+["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20273,],
["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","",20252,],
-["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20252,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20252,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20252,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20252,],
-["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20252,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20252,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20252,],
-["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20252,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20252,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20252,],
-["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20252,],
-["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20252,],
-["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20252,],
-["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20252,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20252,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20252,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20252,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20252,],
-["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20252,],
+["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20273,],
+["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20273,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20273,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20273,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20273,],
+["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20273,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20273,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20273,],
+["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20273,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20273,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20273,],
+["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20273,],
+["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20273,],
+["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20273,],
+["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20273,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20273,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20273,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20273,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20273,],
+["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20273,],
["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,],
-["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20252,],
-["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20252,],
+["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20273,],
+["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20273,],
["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",20252,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20252,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20252,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20252,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20252,],
-["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20252,],
-["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20252,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20273,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20273,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20273,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20273,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20273,],
+["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20273,],
+["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20273,],
["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",20252,],
-["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20252,],
-["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20252,],
-["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20252,],
-["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20252,],
-["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20252,],
-["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20252,],
-["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20252,],
-["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20252,],
-["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20252,],
-["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20252,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20252,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20252,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20252,],
-["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20252,],
-["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20252,],
-["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20252,],
+["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20273,],
+["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20273,],
+["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20273,],
+["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20273,],
+["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20273,],
+["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20273,],
+["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20273,],
+["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20273,],
+["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20273,],
+["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20273,],
+["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20273,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20273,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20273,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20273,],
+["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20273,],
+["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20273,],
+["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20273,],
["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",20252,],
-["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20252,],
-["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20252,],
-["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20252,],
-["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20252,],
+["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20273,],
+["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20273,],
+["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20273,],
+["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20273,],
+["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20273,],
["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",20252,],
-["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20252,],
-["features.roomdetails.impl_RoomDetailsDark_0_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_10_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_11_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_12_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_13_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_14_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_15_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_16_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_17_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_18_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_1_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_2_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_3_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_4_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_5_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_6_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_7_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_8_en","",20252,],
-["features.roomdetails.impl_RoomDetailsDark_9_en","",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20252,],
-["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20252,],
-["features.roomdetails.impl_RoomDetails_0_en","",20252,],
-["features.roomdetails.impl_RoomDetails_10_en","",20252,],
-["features.roomdetails.impl_RoomDetails_11_en","",20252,],
-["features.roomdetails.impl_RoomDetails_12_en","",20252,],
-["features.roomdetails.impl_RoomDetails_13_en","",20252,],
-["features.roomdetails.impl_RoomDetails_14_en","",20252,],
-["features.roomdetails.impl_RoomDetails_15_en","",20252,],
-["features.roomdetails.impl_RoomDetails_16_en","",20252,],
-["features.roomdetails.impl_RoomDetails_17_en","",20252,],
-["features.roomdetails.impl_RoomDetails_18_en","",20252,],
-["features.roomdetails.impl_RoomDetails_1_en","",20252,],
-["features.roomdetails.impl_RoomDetails_2_en","",20252,],
-["features.roomdetails.impl_RoomDetails_3_en","",20252,],
-["features.roomdetails.impl_RoomDetails_4_en","",20252,],
-["features.roomdetails.impl_RoomDetails_5_en","",20252,],
-["features.roomdetails.impl_RoomDetails_6_en","",20252,],
-["features.roomdetails.impl_RoomDetails_7_en","",20252,],
-["features.roomdetails.impl_RoomDetails_8_en","",20252,],
-["features.roomdetails.impl_RoomDetails_9_en","",20252,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20252,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20252,],
-["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20252,],
-["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20252,],
-["features.roomlist.impl.components_RoomListContentView_Day_0_en","features.roomlist.impl.components_RoomListContentView_Night_0_en",20252,],
-["features.roomlist.impl.components_RoomListContentView_Day_1_en","features.roomlist.impl.components_RoomListContentView_Night_1_en",20252,],
-["features.roomlist.impl.components_RoomListContentView_Day_2_en","features.roomlist.impl.components_RoomListContentView_Night_2_en",0,],
-["features.roomlist.impl.components_RoomListContentView_Day_3_en","features.roomlist.impl.components_RoomListContentView_Night_3_en",20252,],
-["features.roomlist.impl.components_RoomListContentView_Day_4_en","features.roomlist.impl.components_RoomListContentView_Night_4_en",20252,],
-["features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_en","features.roomlist.impl_RoomListDeclineInviteMenuContent_Night_0_en",20252,],
-["features.roomlist.impl.filters_RoomListFiltersView_Day_0_en","features.roomlist.impl.filters_RoomListFiltersView_Night_0_en",20252,],
-["features.roomlist.impl.filters_RoomListFiltersView_Day_1_en","features.roomlist.impl.filters_RoomListFiltersView_Night_1_en",20252,],
-["features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en",20252,],
-["features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en",20252,],
-["features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en",20252,],
-["features.roomlist.impl.search_RoomListSearchContent_Day_0_en","features.roomlist.impl.search_RoomListSearchContent_Night_0_en",0,],
-["features.roomlist.impl.search_RoomListSearchContent_Day_1_en","features.roomlist.impl.search_RoomListSearchContent_Night_1_en",20252,],
-["features.roomlist.impl_RoomListView_Day_0_en","features.roomlist.impl_RoomListView_Night_0_en",20252,],
-["features.roomlist.impl_RoomListView_Day_10_en","features.roomlist.impl_RoomListView_Night_10_en",20252,],
-["features.roomlist.impl_RoomListView_Day_1_en","features.roomlist.impl_RoomListView_Night_1_en",20252,],
-["features.roomlist.impl_RoomListView_Day_2_en","features.roomlist.impl_RoomListView_Night_2_en",20252,],
-["features.roomlist.impl_RoomListView_Day_3_en","features.roomlist.impl_RoomListView_Night_3_en",20252,],
-["features.roomlist.impl_RoomListView_Day_4_en","features.roomlist.impl_RoomListView_Night_4_en",20252,],
-["features.roomlist.impl_RoomListView_Day_5_en","features.roomlist.impl_RoomListView_Night_5_en",20252,],
-["features.roomlist.impl_RoomListView_Day_6_en","features.roomlist.impl_RoomListView_Night_6_en",20252,],
-["features.roomlist.impl_RoomListView_Day_7_en","features.roomlist.impl_RoomListView_Night_7_en",20252,],
-["features.roomlist.impl_RoomListView_Day_8_en","features.roomlist.impl_RoomListView_Night_8_en",0,],
-["features.roomlist.impl_RoomListView_Day_9_en","features.roomlist.impl_RoomListView_Night_9_en",0,],
-["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20252,],
+["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20273,],
+["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20273,],
+["features.roomdetails.impl_RoomDetailsDark_0_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_10_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_11_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_12_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_13_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_14_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_15_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_16_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_17_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_18_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_19_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_1_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_2_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_3_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_4_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_5_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_6_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_7_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_8_en","",20273,],
+["features.roomdetails.impl_RoomDetailsDark_9_en","",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20273,],
+["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20273,],
+["features.roomdetails.impl_RoomDetails_0_en","",20273,],
+["features.roomdetails.impl_RoomDetails_10_en","",20273,],
+["features.roomdetails.impl_RoomDetails_11_en","",20273,],
+["features.roomdetails.impl_RoomDetails_12_en","",20273,],
+["features.roomdetails.impl_RoomDetails_13_en","",20273,],
+["features.roomdetails.impl_RoomDetails_14_en","",20273,],
+["features.roomdetails.impl_RoomDetails_15_en","",20273,],
+["features.roomdetails.impl_RoomDetails_16_en","",20273,],
+["features.roomdetails.impl_RoomDetails_17_en","",20273,],
+["features.roomdetails.impl_RoomDetails_18_en","",20273,],
+["features.roomdetails.impl_RoomDetails_19_en","",20273,],
+["features.roomdetails.impl_RoomDetails_1_en","",20273,],
+["features.roomdetails.impl_RoomDetails_2_en","",20273,],
+["features.roomdetails.impl_RoomDetails_3_en","",20273,],
+["features.roomdetails.impl_RoomDetails_4_en","",20273,],
+["features.roomdetails.impl_RoomDetails_5_en","",20273,],
+["features.roomdetails.impl_RoomDetails_6_en","",20273,],
+["features.roomdetails.impl_RoomDetails_7_en","",20273,],
+["features.roomdetails.impl_RoomDetails_8_en","",20273,],
+["features.roomdetails.impl_RoomDetails_9_en","",20273,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20273,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20273,],
+["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20273,],
+["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20273,],
+["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20273,],
+["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20273,],
+["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",20273,],
+["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20273,],
+["features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en",20273,],
+["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20273,],
+["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20273,],
+["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en",20273,],
+["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en",20273,],
+["features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en","features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en",20273,],
+["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",20273,],
+["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20273,],
["features.roomdetails.impl.members_RoomMemberListView_Day_6_en","features.roomdetails.impl.members_RoomMemberListView_Night_6_en",0,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20252,],
-["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20252,],
-["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20252,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20273,],
+["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20273,],
+["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20273,],
["libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en","libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en",0,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20252,],
-["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20252,],
-["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20252,],
-["features.roomlist.impl.components_RoomSummaryPlaceholderRow_Day_0_en","features.roomlist.impl.components_RoomSummaryPlaceholderRow_Night_0_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_0_en","features.roomlist.impl.components_RoomSummaryRow_Night_0_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_10_en","features.roomlist.impl.components_RoomSummaryRow_Night_10_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_11_en","features.roomlist.impl.components_RoomSummaryRow_Night_11_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_12_en","features.roomlist.impl.components_RoomSummaryRow_Night_12_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_13_en","features.roomlist.impl.components_RoomSummaryRow_Night_13_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_14_en","features.roomlist.impl.components_RoomSummaryRow_Night_14_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_15_en","features.roomlist.impl.components_RoomSummaryRow_Night_15_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_16_en","features.roomlist.impl.components_RoomSummaryRow_Night_16_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_17_en","features.roomlist.impl.components_RoomSummaryRow_Night_17_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_18_en","features.roomlist.impl.components_RoomSummaryRow_Night_18_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_19_en","features.roomlist.impl.components_RoomSummaryRow_Night_19_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_1_en","features.roomlist.impl.components_RoomSummaryRow_Night_1_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_20_en","features.roomlist.impl.components_RoomSummaryRow_Night_20_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_21_en","features.roomlist.impl.components_RoomSummaryRow_Night_21_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_22_en","features.roomlist.impl.components_RoomSummaryRow_Night_22_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_23_en","features.roomlist.impl.components_RoomSummaryRow_Night_23_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_24_en","features.roomlist.impl.components_RoomSummaryRow_Night_24_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_25_en","features.roomlist.impl.components_RoomSummaryRow_Night_25_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_26_en","features.roomlist.impl.components_RoomSummaryRow_Night_26_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_27_en","features.roomlist.impl.components_RoomSummaryRow_Night_27_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_28_en","features.roomlist.impl.components_RoomSummaryRow_Night_28_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_29_en","features.roomlist.impl.components_RoomSummaryRow_Night_29_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_2_en","features.roomlist.impl.components_RoomSummaryRow_Night_2_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_30_en","features.roomlist.impl.components_RoomSummaryRow_Night_30_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_31_en","features.roomlist.impl.components_RoomSummaryRow_Night_31_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_32_en","features.roomlist.impl.components_RoomSummaryRow_Night_32_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_33_en","features.roomlist.impl.components_RoomSummaryRow_Night_33_en",20252,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_3_en","features.roomlist.impl.components_RoomSummaryRow_Night_3_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_4_en","features.roomlist.impl.components_RoomSummaryRow_Night_4_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_5_en","features.roomlist.impl.components_RoomSummaryRow_Night_5_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_6_en","features.roomlist.impl.components_RoomSummaryRow_Night_6_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_7_en","features.roomlist.impl.components_RoomSummaryRow_Night_7_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_8_en","features.roomlist.impl.components_RoomSummaryRow_Night_8_en",0,],
-["features.roomlist.impl.components_RoomSummaryRow_Day_9_en","features.roomlist.impl.components_RoomSummaryRow_Night_9_en",0,],
-["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20252,],
-["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20252,],
-["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20252,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20273,],
+["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20273,],
+["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20273,],
+["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,],
+["features.home.impl.components_RoomSummaryRow_Day_11_en","features.home.impl.components_RoomSummaryRow_Night_11_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_12_en","features.home.impl.components_RoomSummaryRow_Night_12_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_13_en","features.home.impl.components_RoomSummaryRow_Night_13_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_14_en","features.home.impl.components_RoomSummaryRow_Night_14_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_15_en","features.home.impl.components_RoomSummaryRow_Night_15_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_16_en","features.home.impl.components_RoomSummaryRow_Night_16_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_17_en","features.home.impl.components_RoomSummaryRow_Night_17_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_18_en","features.home.impl.components_RoomSummaryRow_Night_18_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_19_en","features.home.impl.components_RoomSummaryRow_Night_19_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_1_en","features.home.impl.components_RoomSummaryRow_Night_1_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_20_en","features.home.impl.components_RoomSummaryRow_Night_20_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_21_en","features.home.impl.components_RoomSummaryRow_Night_21_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_22_en","features.home.impl.components_RoomSummaryRow_Night_22_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_23_en","features.home.impl.components_RoomSummaryRow_Night_23_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_24_en","features.home.impl.components_RoomSummaryRow_Night_24_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_25_en","features.home.impl.components_RoomSummaryRow_Night_25_en",0,],
+["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",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20273,],
+["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",20273,],
+["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,],
+["features.home.impl.components_RoomSummaryRow_Day_5_en","features.home.impl.components_RoomSummaryRow_Night_5_en",0,],
+["features.home.impl.components_RoomSummaryRow_Day_6_en","features.home.impl.components_RoomSummaryRow_Night_6_en",0,],
+["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",20273,],
+["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20273,],
+["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20273,],
["appicon.enterprise_RoundIcon_en","",0,],
["appicon.element_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",20252,],
-["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20252,],
-["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20252,],
+["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20273,],
+["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20273,],
+["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20273,],
["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","",20252,],
+["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20273,],
["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,],
-["features.createroom.impl.components_SearchMultipleUsersResultItem_en","",20252,],
-["features.createroom.impl.components_SearchSingleUserResultItem_en","",20252,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20252,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20252,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20252,],
-["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20252,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20252,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20252,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20252,],
-["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20252,],
-["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20252,],
-["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20252,],
-["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20252,],
+["features.createroom.impl.components_SearchMultipleUsersResultItem_en","",20273,],
+["features.createroom.impl.components_SearchSingleUserResultItem_en","",20273,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20273,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20273,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20273,],
+["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20273,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20273,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20273,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20273,],
+["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20273,],
+["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20273,],
+["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20273,],
+["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20273,],
["libraries.matrix.ui.components_SelectedRoom_Day_0_en","libraries.matrix.ui.components_SelectedRoom_Night_0_en",0,],
["libraries.matrix.ui.components_SelectedRoom_Day_1_en","libraries.matrix.ui.components_SelectedRoom_Night_1_en",0,],
["libraries.matrix.ui.components_SelectedRoom_Day_2_en","libraries.matrix.ui.components_SelectedRoom_Night_2_en",0,],
@@ -1139,11 +1154,11 @@ export const screenshots = [
["libraries.matrix.ui.components_SelectedUser_Day_0_en","libraries.matrix.ui.components_SelectedUser_Night_0_en",0,],
["libraries.matrix.ui.components_SelectedUsersRowList_Day_0_en","libraries.matrix.ui.components_SelectedUsersRowList_Night_0_en",0,],
["libraries.textcomposer.components_SendButton_Day_0_en","libraries.textcomposer.components_SendButton_Night_0_en",0,],
-["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20252,],
-["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20252,],
-["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20252,],
-["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20252,],
-["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20252,],
+["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20273,],
+["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20273,],
+["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20273,],
+["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20273,],
+["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20273,],
["libraries.matrix.ui.messages.sender_SenderName_Day_0_en","libraries.matrix.ui.messages.sender_SenderName_Night_0_en",0,],
["libraries.matrix.ui.messages.sender_SenderName_Day_1_en","libraries.matrix.ui.messages.sender_SenderName_Night_1_en",0,],
["libraries.matrix.ui.messages.sender_SenderName_Day_2_en","libraries.matrix.ui.messages.sender_SenderName_Night_2_en",0,],
@@ -1153,27 +1168,27 @@ 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",20252,],
-["features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20252,],
-["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20252,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20252,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20252,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20252,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20252,],
-["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20252,],
+["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20273,],
+["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20273,],
+["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20273,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20273,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20273,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20273,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20273,],
+["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20273,],
["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",20252,],
-["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20252,],
-["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20252,],
-["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20252,],
+["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20273,],
+["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20273,],
+["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20273,],
["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,],
["libraries.designsystem.components.list_SingleSelectionListItemCustomFormattert_Single_selection_List_item_-_custom_formatter_List_items_en","",0,],
@@ -1182,69 +1197,71 @@ 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",20252,],
+["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20273,],
["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,],
["libraries.designsystem.modifiers_SquareSizeModifierInsideSquare_en","",0,],
["libraries.designsystem.modifiers_SquareSizeModifierLargeHeight_en","",0,],
["libraries.designsystem.modifiers_SquareSizeModifierLargeWidth_en","",0,],
-["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20252,],
+["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20273,],
["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",20252,],
+["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20273,],
["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",20252,],
+["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20273,],
+["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",20252,],
-["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20252,],
-["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20252,],
-["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20252,],
-["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20252,],
-["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20252,],
+["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20273,],
+["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20273,],
+["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20273,],
+["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20273,],
+["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20273,],
["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",20252,],
-["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20252,],
+["libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en",20273,],
+["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20273,],
["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,],
@@ -1256,14 +1273,14 @@ export const screenshots = [
["libraries.mediaviewer.impl.local.txt_TextFileContentView_Day_3_en","libraries.mediaviewer.impl.local.txt_TextFileContentView_Night_3_en",0,],
["libraries.textcomposer.components_TextFormatting_Day_0_en","libraries.textcomposer.components_TextFormatting_Night_0_en",0,],
["libraries.designsystem.theme.components_TextLight_Text_en","",0,],
-["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20252,],
-["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20252,],
-["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20252,],
+["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20273,],
+["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20273,],
+["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20273,],
["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",20252,],
-["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20252,],
+["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20273,],
+["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20273,],
["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,],
@@ -1273,18 +1290,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",20252,],
+["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20273,],
["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",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20252,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20273,],
["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,],
@@ -1292,18 +1309,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",20252,],
-["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20273,],
["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",20252,],
-["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20252,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20273,],
["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",20252,],
-["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20273,],
["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,],
@@ -1312,40 +1329,40 @@ 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",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20273,],
["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",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20273,],
["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en",0,],
["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","",20252,],
+["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20273,],
["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",20252,],
-["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20252,],
+["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20273,],
["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",20252,],
+["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20273,],
["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",0,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20252,],
-["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20252,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20273,],
["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",20252,],
-["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20252,],
+["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20273,],
+["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20273,],
["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",20252,],
+["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20273,],
["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,],
@@ -1354,8 +1371,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",20252,],
-["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20252,],
+["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20273,],
+["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20273,],
["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,],
@@ -1370,8 +1387,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",20252,],
-["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20252,],
+["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20273,],
+["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20273,],
["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,],
@@ -1394,73 +1411,74 @@ 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",20252,],
-["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20252,],
+["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20273,],
["features.messages.impl.timeline_TimelineView_Day_10_en","features.messages.impl.timeline_TimelineView_Night_10_en",0,],
-["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20252,],
-["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20252,],
+["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20273,],
+["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20273,],
["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",20252,],
+["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20273,],
["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",20252,],
+["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20273,],
["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",20252,],
+["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20273,],
["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_TopAppBar_App_Bars_en","",0,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20252,],
-["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20252,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20273,],
+["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20273,],
["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",20252,],
-["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20252,],
-["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20252,],
-["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20252,],
-["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20252,],
-["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20252,],
+["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20273,],
+["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20273,],
+["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20273,],
+["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20273,],
+["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20273,],
+["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20273,],
["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","",20252,],
+["libraries.matrix.ui.components_UnresolvedUserRow_en","",20273,],
["libraries.matrix.ui.components_UnsavedAvatar_Day_0_en","libraries.matrix.ui.components_UnsavedAvatar_Night_0_en",0,],
-["libraries.designsystem.components.avatar_UserAvatarColors_Day_0_en","libraries.designsystem.components.avatar_UserAvatarColors_Night_0_en",0,],
-["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20252,],
-["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20252,],
-["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20252,],
-["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20252,],
+["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",20273,],
+["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20273,],
+["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20273,],
+["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20273,],
["features.createroom.impl.components_UserListView_Day_3_en","features.createroom.impl.components_UserListView_Night_3_en",0,],
["features.createroom.impl.components_UserListView_Day_4_en","features.createroom.impl.components_UserListView_Night_4_en",0,],
["features.createroom.impl.components_UserListView_Day_5_en","features.createroom.impl.components_UserListView_Night_5_en",0,],
["features.createroom.impl.components_UserListView_Day_6_en","features.createroom.impl.components_UserListView_Night_6_en",0,],
-["features.createroom.impl.components_UserListView_Day_7_en","features.createroom.impl.components_UserListView_Night_7_en",20252,],
+["features.createroom.impl.components_UserListView_Day_7_en","features.createroom.impl.components_UserListView_Night_7_en",20273,],
["features.createroom.impl.components_UserListView_Day_8_en","features.createroom.impl.components_UserListView_Night_8_en",0,],
-["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20252,],
+["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20273,],
["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.preferences.impl.user_UserPreferences_Day_2_en","features.preferences.impl.user_UserPreferences_Night_2_en",0,],
-["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20252,],
-["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20252,],
-["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20252,],
+["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20273,],
+["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20273,],
+["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20273,],
["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,],
@@ -1468,7 +1486,7 @@ export const screenshots = [
["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",20252,],
+["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20273,],
["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,],
@@ -1487,6 +1505,6 @@ export const screenshots = [
["libraries.textcomposer.components_VoiceMessageRecording_Day_0_en","libraries.textcomposer.components_VoiceMessageRecording_Night_0_en",0,],
["libraries.textcomposer.components_VoiceMessage_Day_0_en","libraries.textcomposer.components_VoiceMessage_Night_0_en",0,],
["libraries.designsystem.components.media_WaveformPlaybackView_Day_0_en","libraries.designsystem.components.media_WaveformPlaybackView_Night_0_en",0,],
-["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20252,],
+["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20273,],
["libraries.designsystem.ruler_WithRulers_Day_0_en","libraries.designsystem.ruler_WithRulers_Night_0_en",0,],
];
diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImportTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImportTest.kt
index 129f9150ed..c921f3fd60 100644
--- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImportTest.kt
+++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistImportTest.kt
@@ -37,4 +37,17 @@ class KonsistImportTest {
it.name == "androidx.compose.material3.OutlinedTextField"
}
}
+
+ @Test
+ fun `material3 TopAppBar should not be used`() {
+ Konsist
+ .scopeFromProject()
+ .imports
+ .assertFalse(
+ additionalMessage = "Please use 'io.element.android.libraries.designsystem.theme.components.TopAppBar' instead of " +
+ "'androidx.compose.material3.TopAppBar.",
+ ) {
+ it.name == "androidx.compose.material3.TopAppBar"
+ }
+ }
}
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_0_en.png
deleted file mode 100644
index 42d7e86fd0..0000000000
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_0_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b61b391f6380189603939badc2ae5912f5cb072200a001ff946af2d52e81b95a
-size 12734
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_1_en.png
deleted file mode 100644
index 8d0995fd9f..0000000000
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_1_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7696eb0f5bf8698d001ea44be6eb2005f414057f9a65703e6d987e8eb75f7f94
-size 9441
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_0_en.png
deleted file mode 100644
index ba938a8d88..0000000000
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_0_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c3d14805d85b33ce1f0fdd26eec433db1973924542cd85a3bb0e4514cdcd857d
-size 12392
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_1_en.png
deleted file mode 100644
index f8879f9ecb..0000000000
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_1_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:146fc2ce4d344c0ea947fe0370e6b8d94c2e724c69c01c2cc3476a756e1f09e4
-size 9315
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_0_en.png
index 664608b02b..8d0995fd9f 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8cc555b1614f3d9e5181769ec203da84f0fb01bbec9b7edf1ad53944158aea7e
-size 12824
+oid sha256:7696eb0f5bf8698d001ea44be6eb2005f414057f9a65703e6d987e8eb75f7f94
+size 9441
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_1_en.png
index 6c16c57faf..43d80ad979 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5480b1c7a3244e0c702f6623f736bfc76560843a8eba8c118a1560954414b4f4
-size 14560
+oid sha256:5d22e3789c7515c5fcb0ee0c72a7c238947f526b6959e1590a29008c8cfa9919
+size 11737
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_2_en.png
index 90be70d43c..23a7250beb 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8b42b1ad21ab76ffb7b555809e5d5d4495a6b0faceba181735369e0635ed0a56
-size 13847
+oid sha256:b4d802d233fdb12dbbb8136d8b127b10898ba7c5963ebbe2f8ce4d015016b984
+size 10892
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 5d5b02403f..a5eb06f329 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:73bbf4bfe808722a4d2444ab78bd1f6ab6978d0e427dfaed0d0b957d153a00e5
-size 19294
+oid sha256:6d885da406fe9866a5390a65bb6f8dda3e2242bdec4ac59e0ec654a16838bbf6
+size 16309
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_0_en.png
index b970104878..f8879f9ecb 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:037a5e384eef63ade207a6a938409897f11efc83f1cbb1d382474bf21dbb54c2
-size 12524
+oid sha256:146fc2ce4d344c0ea947fe0370e6b8d94c2e724c69c01c2cc3476a756e1f09e4
+size 9315
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_1_en.png
index 516828ebf9..0f1627f188 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:548c1d91bfee3a9fe22e881d61c469369885f51f80e267ce9e16c6f4501948fe
-size 13372
+oid sha256:8f2d4611b2fc7156c855b13d8b390bc9be80b877407f521a8d196434e97650fe
+size 10519
diff --git a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_2_en.png
index 5393549b18..40c8b11139 100644
--- a/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenView_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5cd1c4e6317f6372c3c341f7e681d82533038a15c2287f584603330b3cf62a40
-size 12316
+oid sha256:b58875c87cfdf54fcfd6990cc4c7637d74d85faed1c69bc4e5c671afb827ea4d
+size 9483
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 23fac4cf25..c36c1d92f3 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:6de376c3fa6098ba16522181a7b7835660c57c77bfd2c7d8ca75d372c4144676
-size 17437
+oid sha256:928fecaa9000e8c0309d4bbbd7742921ec83497cb65868ffda1a2faf0cba9b57
+size 14599
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_BatteryOptimizationBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_BatteryOptimizationBanner_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_BatteryOptimizationBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_BatteryOptimizationBanner_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_BatteryOptimizationBanner_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBar_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBar_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBar_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_DefaultRoomListTopBar_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_3_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_3_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_4_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Day_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_4_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_3_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_3_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_4_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomListContentView_Night_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_4_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_10_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_10_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_10_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_11_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_11_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_11_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_12_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_12_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_12_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_13_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_13_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_13_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_13_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_14_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_14_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_14_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_14_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_15_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_15_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_15_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_15_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_16_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_16_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_16_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_16_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_17_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_17_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_17_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_17_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_18_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_18_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_18_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_18_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_19_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_19_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_19_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_19_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_20_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_20_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_20_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_20_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_21_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_21_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_21_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_21_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_22_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_22_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_22_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_22_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_23_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_23_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_23_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_23_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_24_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_24_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_24_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_24_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_25_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_25_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_25_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_25_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_26_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_26_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_26_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_26_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_27_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_27_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_27_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_27_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_28_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_28_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_28_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_28_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_29_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_29_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_29_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_29_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_30_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_30_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_30_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_30_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_31_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_31_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_31_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_31_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_32_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_32_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_32_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_32_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_33_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_33_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_33_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_33_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_34_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_34_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_34_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_34_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_3_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_3_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_4_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_4_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_5_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_5_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_5_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_6_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_6_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_6_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_7_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_7_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_7_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_8_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_8_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_8_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_9_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_9_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Day_9_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_10_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_10_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_10_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_11_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_11_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_11_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_12_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_12_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_12_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_13_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_13_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_13_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_13_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_14_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_14_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_14_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_14_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_15_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_15_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_15_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_15_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_16_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_16_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_16_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_16_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_17_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_17_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_17_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_17_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_18_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_18_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_18_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_18_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_19_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_19_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_19_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_19_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_20_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_20_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_20_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_20_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_21_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_21_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_21_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_21_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_22_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_22_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_22_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_22_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_23_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_23_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_23_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_23_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_24_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_24_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_24_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_24_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_25_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_25_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_25_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_25_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_26_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_26_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_26_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_26_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_27_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_27_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_27_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_27_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_28_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_28_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_28_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_28_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_29_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_29_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_29_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_29_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_30_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_30_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_30_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_30_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_31_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_31_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_31_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_31_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_32_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_32_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_32_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_32_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_33_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_33_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_33_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_33_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_34_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_34_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_34_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_34_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_3_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_3_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_4_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_4_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_5_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_5_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_5_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_6_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_6_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_6_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_7_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_7_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_7_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_8_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_8_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_8_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_9_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_9_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomSummaryRow_Night_9_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.filters_RoomListFiltersView_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.filters_RoomListFiltersView_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListDeclineInviteMenuContent_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListDeclineInviteMenuContent_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl.search_RoomListSearchContent_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl.search_RoomListSearchContent_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_7_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_8_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_9_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_10_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_11_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_3_en.png
new file mode 100644
index 0000000000..f6988f9732
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_3_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:51d89e7c0e8c205c230351c4a00e0d560f3f54c6b423ae3b2b801fd6d00343bf
+size 83509
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png
new file mode 100644
index 0000000000..ec5767287f
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7383bea26cbd09cff981e6b4202f7e9bca788094ea482241b45eaefcbf16127
+size 34927
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png
new file mode 100644
index 0000000000..b3dfe3db1d
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7b0dc90002ec59917ed0c64dae785088117c5aca61961c3d71dc7c05d2fa72b
+size 82238
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_5_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Day_6_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_7_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_8_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_9_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_10_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_11_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_1_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_2_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_1_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_2_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_1_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_2_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_3_en.png
new file mode 100644
index 0000000000..1c65bb2ce7
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_3_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3962f724784add8dc33c7327dd866cab76eff0d53abb781b94e974ae68212e0b
+size 90485
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png
new file mode 100644
index 0000000000..9b2a3650ed
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4850c3002637166016ac75129c0fd4081c540848969b40eb84c4f60a4366c111
+size 43857
diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png
new file mode 100644
index 0000000000..92d58a36cd
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca1e0f43d447faf770ee7aa4f443f3a310f520c9437cbd5baca9ac7ce36d2aae
+size 88613
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_3_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_4_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_5_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/features.roomlist.impl_RoomListView_Night_6_en.png
rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png
index 8c50af672e..6f39152c18 100644
--- a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:05e7a67dfcec946de1e355afed430198c6c89f1938755907db1e83ab1bb68488
-size 12177
+oid sha256:db20190581472583a2f493275d0f7dc46ed4a2128cef475b98730e3695b918c7
+size 19149
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png
index e73f998cc0..a196f7839f 100644
--- a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:96e2d9fd6b20b70dd3bb9b3caaea2cc3eaed1644c3371889cbc56d608bd4b49b
-size 11826
+oid sha256:784fd291db5fc825b8c1f0bac5ed3066e3aaa67fd6cbc35fd65b0df92f7cb052
+size 20504
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png
new file mode 100644
index 0000000000..6f39152c18
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:db20190581472583a2f493275d0f7dc46ed4a2128cef475b98730e3695b918c7
+size 19149
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png
index f9d4df3145..67ef646472 100644
--- a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24adccc976a5611f31d0caaa614212da841a5a9abd5e9ebb706fe1f9cbfb6408
-size 10729
+oid sha256:d4557838eceb90ec501062367413359550ccc927cd4e0c50c9a01c2d9eb0938f
+size 17146
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png
index cf81e64432..a205f24caf 100644
--- a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7f41edac4c092e5999950e97b0352ffa46c083ba2cd50c8b5b408eff8a85df06
-size 10376
+oid sha256:e620cc1fe0e21a92da88948bc8da2db49c3bcaea0480f8abaa61e22a0882a56e
+size 18341
diff --git a/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en.png
new file mode 100644
index 0000000000..67ef646472
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4557838eceb90ec501062367413359550ccc927cd4e0c50c9a01c2d9eb0938f
+size 17146
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Day_0_en.png
index 05ae7c8895..4114b76ed1 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:55663ac9ab6472fe7f302d7f74af536080764a3e581ba50bb8198b8970b35e2c
-size 19164
+oid sha256:577085f16207b31d905cbe94bb60c61c0c7b6be02f01cf6883f98a00eb69fceb
+size 18768
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Night_0_en.png
index a77bb5c452..9678921573 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.details_DependenciesDetailsView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:32c9a5768233fd07c69612dd839f64a2674b9f6905dc432400b93ab6c8259a34
-size 18933
+oid sha256:25be51215130a793208edc2e01d0c15d3151bf9d0543e7d64607d1f829e8fa33
+size 18559
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_0_en.png
index 4f59a86c87..4bd8480af0 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c4c96790d61f5ae03c3b32d5ea85d2b1efddc84f248f2373290f28c15ced4dc0
-size 11443
+oid sha256:44501f02d607565bfcf84d83d53288efb93939e6325eeec1901481941074ab56
+size 10861
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_1_en.png
index 3e28ef04c8..49ded6b6ea 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6c19cd3e9a9e76ad26789ca882e19574ddd8b979f46e2da970b1a31fd6793b81
-size 10659
+oid sha256:4127991f99717671dca28e736e992d1344d9f138bd4a7600cc6d352d7ede3b7b
+size 10079
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_2_en.png
index e0851891b2..4711d36009 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:72a0143f03e008d0961066cd600d7567c5a64b36d8d4ed610324ae68b15660ef
-size 30061
+oid sha256:42ade89c88841182bc0c4295d289eac4dde26bdf763a216944bdf6dc8894a4e7
+size 29491
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_3_en.png
index debbf12ddf..b5ff98014d 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d6c2cbf04f228dc6d63660d4a0d5bd7a56e2dfa7aba0778e01860d99017d25e4
-size 31325
+oid sha256:91a75224ef7854250a2d5b6d525a1481b6c9a7bc6fd6adeec047ff909d759095
+size 30751
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_0_en.png
index 3f468fa931..0e19cf631c 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:da6d82da577060eafd43bd4c13867cac99143fb8bc877f7149db4c3f4aa6e81a
-size 11088
+oid sha256:e8d582ca5d78964c333899eaded2df2febcb238e1e096163ecc55b7ea36523f7
+size 10645
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_1_en.png
index 4481510fcb..7fc56dec82 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cade141584d56fef5ebe38657c3e953914a4e7c7c7167b114327fcae913e50e7
-size 10324
+oid sha256:c5ac6eb568306add765a487eb9156132eba4195847256c9d5b9f73007a3e6d5a
+size 9892
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_2_en.png
index 6fea0e40d1..2ae6d2f3c6 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fd5044ab9be16487d6637d80aa81d2d70f48596f9bd9db2049cc152145ab5b06
-size 29268
+oid sha256:cc6f5fd2548221be498d6788d394bb901467f687c692d73b425ed3f5ad2cb129
+size 28843
diff --git a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_3_en.png
index 88a2f62577..1028071e94 100644
--- a/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.licenses.impl.list_DependencyLicensesListView_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8ecfa7ad0239499dfb3611b0049244d46d2dc795906bf5e5afdefd0bf9ede43f
-size 30464
+oid sha256:646f948869e9a6cad317255c42317aba153d1e50fc3cfca0286525ee048ebb1d
+size 30046
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png
index 679efc4aaf..d77f4d1242 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0ab623f806fc90bef41beccc5d5f444a882e6634cdadecbbc341e10369bbcfdb
-size 315380
+oid sha256:f8dc4806d2d363c326ac777011b95a98111e69d8f7acaccf926dc959bf8e9636
+size 311242
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png
index 4275f3eac1..a67a1981e4 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b73088b5af32e47d18d6961fe5622411f5342388d8a0d78c8f3fb5e27213146a
-size 315116
+oid sha256:0b55b1c3f2f76ac40cba5f7d49d897a4ffe22d6718444ca8a1197173c660f182
+size 306017
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png
index 69d4181bbe..2859c2cced 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24735f133066c55c6d88b7f9930ad983cca431611c7e6833ca5a4d657eeb14a5
-size 313116
+oid sha256:644e67fd8ccb1754ba4bfec6de5bc8c75a6603b75faa96847076cc27ad18804b
+size 309657
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png
index 03edadc7be..48d2f299af 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1d02a7ff9ff40f73d8c72b9378e10ba1f6580524cbdefcf290066b8047fdc33c
-size 307633
+oid sha256:bcc26d88db59b7499a9e1894608831b418a8088b248c5fb390a43ba8cd5aa319
+size 304249
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png
index f087a418d1..d3eec1107f 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f5ac9f2f168b895e8262181f789b0fe2ad2c97b1296a50c1453879438bfe436a
-size 395942
+oid sha256:344fa6743ab2f43819abf6045d4d98ef0ff91f6b31e6de4a87235d6b96160e53
+size 392425
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png
index 8ff0422506..0a84a5b632 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f7c1c7d34935986d01113069c25849fc860133de582fe94ee63f2e28b181e87f
-size 397378
+oid sha256:ed48740f02725790f7de7a867d237449c07148367dc32ef7fbbd7b40d0ed9a4c
+size 379715
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png
index 1597b13f0a..a461b0fbc9 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a11f8383fc481255fb3fa6f1a5475d23c13c0460c33b04bc190cf3b5931893a3
-size 395108
+oid sha256:d6a6c752f1de16c4c64987d8f603d76ec0ed344b59d335b71004ce85500d852e
+size 383032
diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png
index fb78588841..209ec00b37 100644
--- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.onboarding_OnBoardingView_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:36424ccefbbbd35201800dbcbb743a2d22aa6fe7a606054fc3acf8b98aead272
-size 381588
+oid sha256:4b9101e8d1502445e3997230800ac1cd4adc50a5392cebdcdc4dfc3e5fe56abc
+size 364584
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png
index 06c416cbdf..c36a7bc54e 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
-size 395098
+oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
+size 395064
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png
index 06c416cbdf..80ba8d6f67 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
-size 395098
+oid sha256:503e64a8acb9630e3a6cece0028283407bd54fda2f8ca7bd41c09d12491b48d1
+size 394757
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png
index 6bca47e28f..333a4833e9 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cb44dad546b898087ef5d98a69a235a04a84330aab05cdd400b5773885feb592
-size 51252
+oid sha256:0ce509e6357edda6b8206eea46a7818386423c96abaddae8ae8e886244a93784
+size 51168
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png
index 06c416cbdf..c36a7bc54e 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
-size 395098
+oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
+size 395064
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png
index b10f9ac600..5bb1d1133a 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6a571a03f04d9243c1f05b4867f1d117f9e155307fe1520f5f99ea0ca93552d2
-size 51223
+oid sha256:089a84e094a191836ae654f3214b1b3a590a1b13e0d1972c8ef2ac82813b47eb
+size 51139
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png
index d070b8624d..1e37e5322c 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9fcc0bc6b9062dcc25b03470cecfaeeb464a9f9e0335bc1cab2c122400b8efd0
-size 89353
+oid sha256:21a0d4fabf74730d3aff1ec23502c18d84cb53899d8cacfefede48ae8fde19e1
+size 89266
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png
index 06c416cbdf..c36a7bc54e 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:75b41d34ae5ecebdeaed2f4cd236c402757535a19befaf39918bbfc70bb467c7
-size 395098
+oid sha256:cb50ba951a464a7bae750e779f25e2deeda0355a3220fdaf19f60c7c7ed73649
+size 395064
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en.png
index b63cda070b..be11872339 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f1e9382ed4ffc09e206928c33c667cb150dffc830f6215e06c9dd5ea520de4a8
-size 54986
+oid sha256:19066a9752af1dbd27a3403dbc0a85d3b7dfa6b794cfcc314934a91c3e680283
+size 54925
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en.png
index a829e942df..e439e53ed4 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:955c4cce20c5e9f3457923ff76f22488445a891f145f0161cd0ec94c3da2bc55
-size 63485
+oid sha256:9af45d39c400733792e3053e38612205a8c61ef044101d6beca4710b29e12e7b
+size 63435
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en.png
index 92ed199400..7fc98b879e 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d1cdf81418927c64c9cb3bc97828f251da3116f09841ec0bfa2164e321058d67
-size 55435
+oid sha256:70e6b6c940f935d585e210ffa10fa2926f074e4d1ee255e8607345379d2a52f0
+size 55326
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en.png
index 6e52c8dd16..19313223b2 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d568e0e6f80c6161ca33f51106268f5ef95e33bd21923c3dd734f8f67dd51609
-size 67392
+oid sha256:4511572afb1134a5af14cd5cc0bfc248602761b1b32e35608de7dcba97830ae1
+size 67284
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Day_0_en.png
index b2338d9962..84c33b7ede 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eb3362efdf5441cf73ac08196b95bdd5b4426e11188f6cb86c32169be049ed46
-size 19547
+oid sha256:1b2acbefb2319d650215b5933d8ef2a4f407b83e5b7f26379aebbc617fa7bdc8
+size 19418
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Night_0_en.png
index c881726f0c..2ab01f2aec 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer_MessageComposerView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ea025d360bedff971ae77ee3c9e47140dac75d2f8b64ea2d244304c35c8cea5c
-size 18078
+oid sha256:bdaae3b3badf316b130b67fbf0a2876e6620da4e4f22277625bba3590ed2d7dc
+size 17911
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png
index f8be03d1ef..cfe738540b 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:536272e1b1a06848f0f5ffdf50c833156851530c56d03dba1c0443a4efa2a3dd
-size 20043
+oid sha256:b4ebf530f28ccaffdf6c816f51c3fc78903fc9ba4a0775301af26e187d32e6fb
+size 20779
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png
index ae22d49102..a0944d9fcd 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:078fcdde92926d5bbe965cda4e5ee83d0cc04866b05979873d71a3cf1e6a346c
-size 9076
+oid sha256:432f60087c3edff9d184d5aaea7bfc50138c5928257de86ad5cca459f28e03ca
+size 9947
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png
index 95af94340a..836d72c977 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a6cac5cee10ab9ded373ed8275880534fbfa3f88c7f9219278b3805f30afb766
-size 30876
+oid sha256:a41c6035d2d506b36a5c2678302f13c65c77bb095342e5367370c0ae52c009b7
+size 31703
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png
index f2f01538d4..55d9a9f41e 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:622ce8af67b17db0b7f729422ccc311f14c258d900c469901e8ba646d42ad031
-size 42659
+oid sha256:a7711aa43b9c18e15475dcf1a8972dcd5a7d60441991584dd9be70648e83f072
+size 43636
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en.png
index a8c91448c6..b9296469e0 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:747a75188e93af724433ea20b4ad373260acb3ae5f35bd832f97027646f80c8b
-size 18160
+oid sha256:26d70f0c51e1ed3e42fda9db8c5b7904b2e8c28a4de226518c115866fe231e2f
+size 18973
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en.png
index 1d0bf47b5f..b15af48206 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:38838c6edf589ae6d309ea26cdc672363b1ce2c56a2cf7fd5a5bf826f86aae44
-size 8820
+oid sha256:b499af9f0cb9ad3a849832708e28e6b604dbe85199bd29d51dceaaa5c105a6dd
+size 9744
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en.png
index 3ceac1e1c5..66f37b81eb 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e1bdd621283aa96a109b0f391874c2a2bc4d187db5ec408ab2d38f2d14f54eed
-size 29870
+oid sha256:293bc0c9e67e2ba87bb88166ad8f21c6aeb79720f96279cfe33273c0d65d91aa
+size 30779
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en.png
index e2835a19a1..1ca14953bf 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:29ddafc09a16e878cad38d5f1fbc8e18b9936f2ecb3b7dc188178f6a424ddd05
-size 41539
+oid sha256:865cdad040d77b82ab7f8d4151595b7843b2d74dea5a8e5a5516ccafb344b5f4
+size 42502
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png
index 57f5891983..ff037f124d 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:70ab6c6c738a96fd2db7901482cf4110dfcc69a6289e1db734a753751690747a
-size 51622
+oid sha256:61f05b07526302ad051a8df2234a15438f8b2b2889767acb7697f3caecb68aa0
+size 54189
diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_6_en.png
index 72dbaca2b9..bbccfbac19 100644
--- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:237ee8f45cfd01821287669abc4fe7125c0d2828ff60224706eef855910821f0
-size 51048
+oid sha256:629506ad32c56d94906a71a4d779290f1328030d79fd05db3754e4113531587e
+size 53656
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png
new file mode 100644
index 0000000000..38100458c3
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e639d6e0f93e15f3ea39a0e0d9561a8da485abcc97a92b7370d33f2b701c40bb
+size 46602
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png
new file mode 100644
index 0000000000..310b4fc6cb
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:264e12f555c641960f0fef0c1177715fa5d596f7a42e0796d49533b68cfc88b9
+size 46256
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png
new file mode 100644
index 0000000000..3d55d29e23
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b797e153358ac8eb1e226ad537c23c61f4dd97ab8d5947b98bdd9b193f369b7
+size 48487
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en.png
new file mode 100644
index 0000000000..da0c043028
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3853ed9a82dfa5bdf5f0e4d79e7af04bc7e43531e691c4d5fb17a37f5bd4f5b4
+size 48249
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en.png
new file mode 100644
index 0000000000..cd12b08a00
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69fdae3edcd02635868f209a2c1ff21ce807ffb4c6d44dcf89fb0f54e1b9c1f3
+size 68396
diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en.png
new file mode 100644
index 0000000000..5d291def2f
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6da7fb8d713d5d8255593f2007edf068870dbd05225fe2c0562d197a1739b876
+size 67313
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en.png
index c537936bbb..197660c6c5 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:29d32752f291cf258bfe69adb5c5968f776c39584fc8fdb496ecf81d3e78415e
-size 22765
+oid sha256:446392e5f5f87e53ea6647472bb1f50c59301b919978fe97f0aeb2b02a06662f
+size 22576
diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en.png
index dde921b1e1..d6ef208605 100644
--- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:57e243970cb239da471ff3962429c72d50a11478fa49325b1ae4e994dfc8ded6
-size 22078
+oid sha256:19725ce0f5a535af906cd8db38e299ce34e6d11408217ecaf666870f9dadc79a
+size 21874
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 3818826788..d21d1e40f0 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:8201ab8637db30a33b16a1336705f1777fff946832e9f10ac45987eaa44a20b4
-size 42884
+oid sha256:3f40ee24252a856c4680dc0b62865e71108d54b326c81b651dcf9031c8d7ae95
+size 42835
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 d57c2018ca..42c26d9648 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:efe7ab9fb0d5a0d8e14039ae73bb947558ae8c9ac0be1b146d4fba78c7f96f84
-size 34280
+oid sha256:adaa2dedb41e4717fab78875fa5e11572ff768cebe3a8ca94a1871acc634d319
+size 37705
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 4d9769f32d..43582278ef 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:b1835abce4bbf94590dd7e53387987bfee770bca173639c42b4b2b2587719198
-size 35113
+oid sha256:49f36e08fb97b0530ef46c557d04d49fe8e8df9afdabcedec823fa6727bf15a4
+size 38670
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png
index f12cb438d2..aa6c71936b 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a2a171ac0edac9cb734d418b7baf68dd294d9feb93f005cf445420a7538a8ed
-size 7687
+oid sha256:49f6848dbff23f8c906894ee852253c051807c942f968ba3856e361aeae5c2ca
+size 8683
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png
index cd66fcf3c8..4661a04e60 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:56508c5827cfda4c672f924e3e9280659b729b772455c65dbae76ba7815e18dd
-size 7502
+oid sha256:d341142ffd67a41fee3b2f41146011caeee07b9ec3085d9c47131d1a5d68683a
+size 8002
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png
new file mode 100644
index 0000000000..53b5d638de
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c7a7b64a83f68670c0c38eac2782ad5121fe18638c6a21f3b868d0cb4820c7c
+size 59391
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png
new file mode 100644
index 0000000000..30ccebfb08
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57545d6b9690b892859f7bf2d2aa92d3fdc1a3ae7b4849e39cf6df10bb0dbbb4
+size 8719
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png
new file mode 100644
index 0000000000..48fa2bbb5a
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:def7dc550efea75745153ad0cf71c7d92905205549965ba1f192ee3612cec9c4
+size 8041
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TombstonedRoomAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TombstonedRoomAvatar_Avatars_en.png
rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en.png
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_UserAvatarColors_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_UserAvatarColors_Day_0_en.png
rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_UserAvatarColors_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en.png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_UserAvatarColors_Night_0_en.png
rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en.png
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png
deleted file mode 100644
index 72b14d9cc3..0000000000
--- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c6afcae51ee69dcdb9dbf60c8f72e55b9b07e4feb72dfba0a40ffeebed6ab681
-size 25730
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TextAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TextAvatar_Avatars_en.png
deleted file mode 100644
index c0cc7d6d18..0000000000
--- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TextAvatar_Avatars_en.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0645d454bcaac9e38fe9b6400347ee0fc92a71ef531f72b9ec527f644e050862
-size 5488
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ExpandableBottomSheetLayout_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ExpandableBottomSheetLayout_en.png
new file mode 100644
index 0000000000..f8f1c5da7c
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ExpandableBottomSheetLayout_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f33d7b77bbda44a0d044a25b59dbc99a2289bd56884992e1a859743408595b15
+size 16489
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_NavigationBar_App_Bars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_NavigationBar_App_Bars_en.png
new file mode 100644
index 0000000000..f25072200f
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_NavigationBar_App_Bars_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0554fae92f638dcb6f0701c36f67df8126402a74a8864daf8f821cd5d3ffd29c
+size 16367
diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en.png
new file mode 100644
index 0000000000..df3420b26d
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86b77c62b3c95dc10f14f2d511ef2d0cc95337b4c6677efc6f263ad99714c573
+size 13301
diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png
index 661829afbf..31eecc07a5 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2f238177f5bf6e2964aa7f1d661af45c9bf09507d1a7b34dc749603e69056af1
-size 36330
+oid sha256:82c54bb785e7c2c301109f25b59e527193e1c786fdfda1252b82702c685cfd7d
+size 68516
diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png
index 7cdf21906e..2811748c8f 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1ec7b0c98849e856978f3f5601680fa9a72597340aeca40fb03e5c232c3d651f
-size 36002
+oid sha256:ca5be5bfe66000d7730a9405ffb2992644f638fb58b28ac3f647c0c242ed8c4d
+size 68007
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png
index c7ef0a04d3..a533d93146 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a23ecbbee117033cefa5ddfbdf68862bc6f44bf03b9cbb2d468ffe4236f9109
-size 52673
+oid sha256:4f9279dc01e9fdec69ee0819e2b4b7e0f00dec7e1b62c353052530b6bb66d4f0
+size 52621
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png
index b1616ada01..ca9dd3997a 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3c019dc162f360869595392df03359b6333f96e98150ad3f3f65d464ba5317f7
-size 50971
+oid sha256:0c3d263dfa02c775db1f370ac6ada2d3b31f3ce252f605e05f7121367b609bc0
+size 50915
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Day_0_en.png
index 4cf468d5c6..5ee6bdd710 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:93cbe1f644c5f13d7e77f917859333b761640355e6bd8087fc4a9308fb4afc01
-size 53776
+oid sha256:72c662eb1b7c5d85c65d1f7cc25bf484964f0ce31f414406fe8fbf90f2e9173f
+size 53784
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Night_0_en.png
index 1c343a5c38..6f8df5e1e7 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerAddCaption_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:58b867446d31a57350e72768449d8072d70f94203b2ec110950b302c8f1792ba
-size 51764
+oid sha256:d6bef68b39ff88a4020f30c0ef8313eccbe2d360723894414cdabd9b89ee9c84
+size 51768
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Day_0_en.png
index 5aa564cf61..07d884cde4 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2262ca89505ab3d8c896ef818830c2220aef2d0903e51ca3bab36ff63b1a6cfd
-size 47488
+oid sha256:a28794895dd4d6a6389aa2c23e756861e6f07ff13b60c67f273fdf027dd8eb09
+size 47515
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Night_0_en.png
index b957fa4e20..4033cabff3 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerCaption_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cf2354049558d02a1072285d58598353a65974f91702fb7f4b516d7977b03c5b
-size 46035
+oid sha256:3d4214277841ebc15eda9dae5367cec2d1127eadecc7b2fa97ad9d845888cd2d
+size 46042
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Day_0_en.png
index 3e22538057..f8f15e94f6 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8d5feff7d5b06463196a09bf065a62c9e578c15fe9bafdc6e4508fcf93bfcdba
-size 52415
+oid sha256:5fca1c7a63f89d4ae3c63b473a7352f83abda12bde4ef7698fb4d80218ba0cc8
+size 52411
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Night_0_en.png
index b7c52c5961..1c797b94a2 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditCaption_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:440568a0cc345291ff16d49890bd9665af96651702f417ec016f89f6c0475dc4
-size 50833
+oid sha256:5bf7e9b141aef2236b935503a409eae7dc06f824d09a83fb97370450920f6d54
+size 50841
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png
index 7d26bf150c..9d16559ee8 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9e1589df371db7e489c4d8696898c44a919df001f4a30d83d2f32b92dbece2de
-size 63546
+oid sha256:2f1643e255457fcf5511d807235137a5afcf457740a02ad9632e26b06b224f89
+size 63488
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png
index e403de9087..c7be9c1635 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3bf77d27c4fb0f491a40c3ca532e424bbb791660d168f951d8210cc6cb2898ba
-size 61205
+oid sha256:a01bfddaadf8d165d638980d05ebf02076c9ddeb0160e7dff40171fc433d3c05
+size 61161
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Day_0_en.png
index c7ef0a04d3..a533d93146 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a23ecbbee117033cefa5ddfbdf68862bc6f44bf03b9cbb2d468ffe4236f9109
-size 52673
+oid sha256:4f9279dc01e9fdec69ee0819e2b4b7e0f00dec7e1b62c353052530b6bb66d4f0
+size 52621
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Night_0_en.png
index b1616ada01..ca9dd3997a 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerEdit_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3c019dc162f360869595392df03359b6333f96e98150ad3f3f65d464ba5317f7
-size 50971
+oid sha256:0c3d263dfa02c775db1f370ac6ada2d3b31f3ce252f605e05f7121367b609bc0
+size 50915
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png
index a13eab8827..2fec8ddfe9 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:17f126215961643b6b7c3b41fcc5ea970923229b76bb7c918db191cb5c0ef8b9
-size 64672
+oid sha256:3a596e77c10b67cd0295b0676c051d712205839b52bf46f831ecaa24d275dbec
+size 64470
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en.png
index ea9a142676..a74efac0ff 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f72fdf44bd35b6d62b5e75ec1bf2206429e0861da684d370259bea684eb2a76e
-size 62158
+oid sha256:0a8686422da867abcd6dc0d33e021ecd59499509d85ff8d722ea2a53facc6ccd
+size 61934
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Day_0_en.png
index 7b011af46e..d65c236047 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d5226d7599af16015858523607a829d9cbbc0ffa21174f9c528e725673e2e31c
-size 53982
+oid sha256:d552bcec8eb096ae396e545744af9018bcae277597a1098e0477e87e4620e30c
+size 53806
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Night_0_en.png
index ccb1438c05..838cd73d50 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormatting_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:31b2d698e78fa11dc6af9dbc20b07533afd16c26b8f9969756057f07ea4785d0
-size 51371
+oid sha256:54b501a2dc902ba27a701fc8539fa2d2eb64511d2f058b4ff189365df63d5665
+size 51093
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png
index 01ce015b84..e9d269d47f 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d12f482740fbab1a9fb12bd5cdc37dc2bd03fac6d1304208b353d86bc4f558c6
-size 73436
+oid sha256:bfcb5206ea0fc6b89d6ac460d0d78bd8b70cc3e960d4ab0397bd6470e7dd23b8
+size 73608
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png
index ec9d1b1004..5f86ec269b 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:380a1544c59d1f8cf5f73f84341686b042bab24d7d092f43f30fd36cbb85b438
-size 59956
+oid sha256:cdf8092eb79caa45a8f911589af848756218fc7ca8e3c32c11b7b650a4b9564a
+size 60143
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png
index 73cebd3bd6..c4715f2010 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7127c9b52895079a8837bacc7371b31b1b1fd99415157f3246ee56a4272bf39e
-size 72830
+oid sha256:4dd4dbbaef196264c23e4188b34c617d2e72bacaa9f206a18fe2a73ba17adf63
+size 73006
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png
index 29832afde1..c4da3da864 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7856d79bdf5166b6b1676d6cd418a33e0b21713b8d40d02b0187363951d373c3
-size 80957
+oid sha256:7c8920e6be0d01f0038d315a6421fe051b9f205477bb313e8ae8afada023fea1
+size 81122
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png
index 9235dbfb76..c7f1a6c619 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b7407ef412758b7e19e0acb3fd539d15578b4bf94c776e7e6eec7d15e1ad0a40
-size 62484
+oid sha256:e3e2cfa763cf8f73872d108e3c749ced3dc730b9ba2902b1050d2fdddb036c56
+size 62658
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png
index 0cd5f21e7d..419029e254 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:adf521b7a9e451146e13fcfd41ad3d072cfa4cdb01023cf252e39c147d9507b9
-size 61354
+oid sha256:e8b3b3fbdc951585ace8942e9307581cb7793ffaa4c8fe56a52b6063bd5db271
+size 61540
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png
index 3866d16732..71c7b2817b 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dfacf0126a768870f293f6f327c4d5a1379bd51e1d62da6b8953e6f76952c11d
-size 67852
+oid sha256:68bdae9e2b82ba19d7d7de98fc682ffe7eb96777ba86b7fa99f2acc0eb33f7a5
+size 68023
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png
index 108c2af37a..e5c3663080 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bd3639f1d57e2a9e313a6626625c600557cc90e90326310441366e0177f17ada
-size 90429
+oid sha256:d799e7c48c310dd2a9e42bf8765016da88ee69f51555992d2f80f467e8f07be0
+size 90598
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png
index 4e1a4b5a39..dfefb57abd 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b0538f1d4753e95082434db510f8d9b90c8c05be9975729000a6ec122b1b83d1
-size 60841
+oid sha256:ed11b4abb6a6a1a790248026fd9b322d1d00f3988957a9a549573d859dd6fa92
+size 61017
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png
index bff28aa0b8..837f7d577d 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:30532cf8f90261dff21a23f425a2c15334713d4659be97052fe6c796651ba8e2
-size 61988
+oid sha256:851fe33ec8cac57d5ade446cec96dc5ec5790c8ce28d8bb47b111b46b9e30abd
+size 62175
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png
index 49e52a974c..d5dc1d06c0 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:add696fa3700b07bda65546a714887a96406cdc0c883b39e8b9b3eb419d60ef5
-size 68667
+oid sha256:1838d95b241ebe2b83e732569efe344f1bde77b2cff068d0bb40412306c1f2c3
+size 68840
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png
index ea5a5c0445..5d956beeeb 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d60de55c65d7225f077c084c0d345f17a4a1b9d8d8598824e7721b3ae3c53bb4
-size 60385
+oid sha256:4ab214a116f303ef96e58d29edb757ccd4a36100d701c230a5f60d5850ebf0ce
+size 60562
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png
index 9b90030750..ae795c68bf 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0b18891980733fe58d000fcfc7b34f5fa0c355a7b7dc016157f02f633a0d2593
-size 71248
+oid sha256:b38a8b5fd2c82843b4da6d0c4c11400f569d8e38a8c4dcde03056c5e81a53c0f
+size 71405
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png
index 3fd8dcdce7..58444fb956 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:771606c34e4910bb123651706304db185fd2affe48c50e780147b9ecc86e6676
-size 58149
+oid sha256:996e5014e75e88bded0ef2742733b60f55b003486e3b2a418298e39dfc595add
+size 58295
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png
index a159de1955..7f86914fce 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:faa783569b0b56bc6e0853860d6a3aca19bc42d6d8cab8733f365a0c4d7ec076
-size 70683
+oid sha256:eab616b950daa6169f06930d411e1ed75ef1cc2f425d692abb8fb479c658d9bc
+size 70819
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png
index 35e28910a9..1778478c3b 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e689ed91b269984c11e5d3ff9dd8fafb3e9786585eaedb2b9bd3c0c367a8255e
-size 78512
+oid sha256:61b85adda6a18eebcccd149318e6c0da23c791cf4df8405f41e31891bfa9febc
+size 78647
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png
index 118e277c18..201a5202f2 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:061c17ac2134b7ae49b80eb408c49a26b8c8f9bc3d40a0094fa466f6484c4525
-size 60567
+oid sha256:950da1e8c251d711c7ec460234981ac52f6e6bf7528fc904518b93fb0ce35b09
+size 60708
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png
index 83794c24a4..d397948301 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:901c974b774202476d3091ed624df42549f9add3bf7a8b07bcc33fc657412b5b
-size 59591
+oid sha256:2d4756b79b40777acad34655ab49ff9811f20b5196c6f2cbe31207e876290906
+size 59737
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png
index 7ca1691e93..abf0911da5 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b5fdb0fdf6af3368f21dedbdb9e2f1492e20340de1427cd537a2c38aa21a73e4
-size 65871
+oid sha256:9c7e798594d983cc0e544e3eb70ea1654a78a866a7bc64ef620ac6a823b8a691
+size 66011
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png
index 5429072dca..3fd4cb75c1 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:55f9442c5fba907d6602b4f99700c28e5bb2b0229b599bc0497b9e7fd01f4adc
-size 87380
+oid sha256:f65f939395ba3c0736d59d9cdfcd55f1a9f7f9c0e1fcec8ff5da441277313a0e
+size 87547
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png
index 898ddb675c..829941d6c5 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:90a6561fa8d3576d93daf1ececda3bd89fd54ede171186059ec4eabd33d09a04
-size 59020
+oid sha256:4a4fee3963b352bfc49d8ef7e18c0179f304064758daafc8324cdc650458b522
+size 59171
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png
index ff7130d1ed..2d3b89b31e 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cd32e719165a0351ad00ff7a39adb121b7ecbaa58232450d9cf41033cc93b389
-size 60109
+oid sha256:3b075203bb02a9a68b70e24d4aa3b7975c50bbbc2087026f28910427f431ec62
+size 60251
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png
index a605d99424..5e2596ff57 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:52d06e1cc43e7e4fab868faceaec8ceab4513e99422954b859c6f38a93475487
-size 66489
+oid sha256:3bc27af141adfea18c39b86bcdf046392e765e7411453b6143958d5ede017411
+size 66622
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png
index e022450e77..102acf57ed 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:97ba97045331e55b16153ac3d8d37b3ddee0f8395d0b12d270d687e5ccdb662b
-size 58641
+oid sha256:03291891705787b0211dfd7375d755dc1abc985eb88d48bd978555032bea7a4e
+size 58782
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_0_en.png
index c4cafb5fa1..3d64aa3d29 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a3dc5b4b88b11b4398777f9c19f55c760a6da33755206dc3559e8cfd5cf6bcfc
-size 76395
+oid sha256:bb24ef3a0c22045fc9e9ec390dd1785779924f5bd2a10f9bbc88d1a70b106191
+size 76305
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_10_en.png
index 49d7a23848..372645812d 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:513851c2cfe1dd1579962b1913ad389e1cffb0570ff3572f981a780acc3da532
-size 59926
+oid sha256:1974abd76e0a3f8cdf1beefe26209d2bffb5212520f9a4e2655b80925337d1e7
+size 59835
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_11_en.png
index b5857f4191..4ebd5027f7 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:598fd33fab87e4f7095803f52af75843445863b2092130b0d423abbc8bb77c22
-size 74571
+oid sha256:2aaf080dad05b68af3ed2ea9a4d6cd2f2e9bb991da02683a2e195cb01002cb18
+size 74482
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_1_en.png
index 956212465d..9f5cdd792c 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:314a1640f2835e5fb6adc8f2ae199f4f10ef028b6dede17681760860455b3590
-size 85742
+oid sha256:e1185e1fe56eb661dac60465841979a542055436aa5064663641164cef3a6dfd
+size 85660
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_2_en.png
index 2aa00b11cb..c122a69c83 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a1273ac2ab60a7427f676bef8eb232b53be46d47e46963c58b1a134bb482cfb6
-size 63085
+oid sha256:ec74265bb93b5699a79918986ac601c3c2b2eb04b8aac0c72e50e57432ff9c27
+size 62992
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_3_en.png
index 28312571d4..3c8023bc83 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a78d1da2ef8b469b90c06bf715b7c04e4477bc809a9fb2c74f916a8184a8d867
-size 62131
+oid sha256:54d61d2749c5bf4194658359c580616412da386454cf7d06cd7546b6555f52ad
+size 62033
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_4_en.png
index 66631af061..c6c0b542f2 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bae403a239eb103b8c24708ef8fdef3ba92f2c38a80fc16bb1611fb23fc8b2c9
-size 70019
+oid sha256:a23bf0e7a2a2874121ba56dd144316df816432f1989fa8b9d05278e067175b75
+size 69928
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_5_en.png
index 093e104a2d..cecb90d4c8 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a3b31d74b92b2db69c548a78606b606751644124703f5163482b4fe0e0471b6e
-size 104792
+oid sha256:2958634d33600d8e1b2b49cd264e0dd3bc54ba4a4fa5d34b2fef5d195a0d30f1
+size 104699
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_6_en.png
index 2d9b485433..aef349c929 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6e1a3088c752694f7260f2fd45f1b14d2449c7121609109ce93a1232ba9581a8
-size 61145
+oid sha256:0834f567e0de98e55bc7607f5361637c00131c15f249594fd265ca4dafb4966c
+size 61049
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_7_en.png
index 6606246a1e..b1da52d68a 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:39047878c1505a00ca8549ddea2f4373682bf6321eca82d92822d73d689e12c1
-size 63211
+oid sha256:bbf214dfd61e9da88625243ebbca73c68718d15dbb96a11ff6765e8135ceac72
+size 63119
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_8_en.png
index 986228f139..e175b2e143 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:00f12f3c347087b24cdc23fc4c82b93d2a2550c4af1026dcddbe7b22a3dcd334
-size 70522
+oid sha256:a34b3acb890a44a29b58d27e91851e6329d2ef4cadbef5beebcbd21f0444e93e
+size 70432
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_9_en.png
index b5e5e5f40f..7ef00f0247 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Day_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6e9ed3949968e5c8653fddd929e5ebd4bf07dcd9391fab0fcb30d70146635fe1
-size 60638
+oid sha256:fbcdc99699e06603d7e2e285d8eec6103b68dc829f45d29f5c781e932a375552
+size 60550
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_0_en.png
index 3463ed406b..48e0faa0fb 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c956c860f9148891b04eba8b30e8aef29b5e430caddc5340cd51af779596e598
-size 73718
+oid sha256:fa08671396751f9562ea6ee83bc353276bfe72524809ec44f666804c7c164413
+size 73614
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_10_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_10_en.png
index d7187a4541..bcc13c4039 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_10_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_10_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7b367679460940c258542d54316006f9391ca23a30145baca4c2191cbca80363
-size 57953
+oid sha256:b82f3f8fe10b89962c5d3dedd593eee2f11b2c133e863b2bd1d540f83d07dd4f
+size 57893
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_11_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_11_en.png
index e593be7e73..5ed1dc9981 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_11_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_11_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7503402391f7adaa717eeff9d83f359f37cafed3e8502271aa37350a4039de3c
-size 72010
+oid sha256:de1b9014a911c3a7154cad9c52f1d2e60d73efad6e626e10623c59652cff763c
+size 71905
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_1_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_1_en.png
index 9c387b3902..159c59edc0 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_1_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_1_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0417f5f570680d727df49e22408f296b8cbbf4be9086f6cb9b0f0e89208ef0f3
-size 83091
+oid sha256:63a8eb5a1cc04455f270fce24811a389e7d274691e5b20a7df8595549ccbef87
+size 82985
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_2_en.png
index 24f3b8fbb9..e652ef65db 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_2_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_2_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dbe2e2977ae2fd86d154c34cf59ef82b796c4ff75d69455dcae8fdb4041b2f25
-size 61122
+oid sha256:d8648126878bcaf3bb0e05a26c052710627e00ece4e2567977b8b52497a940cd
+size 61057
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_3_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_3_en.png
index d0ac9a258f..32c4e328b6 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_3_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_3_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c221234495c789453447b12ebfca4b03e3b4cb9c381bb21a6454f54bfe8a81f5
-size 60255
+oid sha256:8ff99ca0e81db14b574c734ea5ba5d94c8a059b63b07502aa090113a776f6b22
+size 60195
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_4_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_4_en.png
index cf7b410e50..7f5038f397 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_4_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_4_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bd04747ca75e56c63324893810f4194c84c796e9aeda0db193cb9339b331f890
-size 68015
+oid sha256:b14c0f2ecd79fbed4a6c3a6b3459fe204cae344f42210987fb52eb9de836df6f
+size 67953
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_5_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_5_en.png
index 9f856565c8..7a1cd7f522 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_5_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_5_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7b2b966f1a3b55058d3173df9c80a7492be710f2310fab0d0ae3950e820526a7
-size 101725
+oid sha256:841cbfe819f61338f25484e63916e50d07aa258782b50c6108a71fa10a792fea
+size 101688
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_6_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_6_en.png
index 660890b72d..e1e4aad0f8 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_6_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_6_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d0f4c13986a2f7932e2647ba26d20658a264e382805ed5aaddea5043aeeb70ec
-size 59145
+oid sha256:8e009d6cc28b8d98ae9c72e70a81af22d62b4428fae5dd7b10589d7aa46f1bf4
+size 59075
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_7_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_7_en.png
index 447e12975d..9079286c36 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_7_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_7_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c9c80af6d15b052c07453281260e806ad20b72068903123dc596391edd72dd0f
-size 61237
+oid sha256:74398889e5df4d87fd34196bccd07b0a9d8dd6c545613fb1a7a0c1aee26f37a4
+size 61167
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_8_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_8_en.png
index 8e25531347..d8c49bb94a 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_8_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_8_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:78167ef5ac43202855cc4f683dd0f29930ba818e7f008a3f6561d90965c8ee9c
-size 68351
+oid sha256:a89fecb881a6ae6ce48e23abe2e3f3ed35e29f7a0b231c0c467b6dff022ad77b
+size 68284
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_9_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_9_en.png
index 4fcb2ba345..5a8a7b6faa 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_9_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerReply_Night_9_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2fdde0b6f5c8b4f0b752a983ad746702405fe092d981ace6cb306d5c36b17821
-size 58751
+oid sha256:16e4ac5820b57fe720e3c3b1d8383661b9d90ea230be19955f525ac7df346741
+size 58689
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png
index 4f6b0b1657..ad27b617df 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f97b8a117e03fddd44855bb8bfb696486b601af81edbcc038817946abbb13db1
-size 57037
+oid sha256:899158f6f0ece99609f76ed9d3ee23489043b0bfdf4daa0264bef52814b8af15
+size 56923
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png
index 51938e277e..34951203a5 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6e8f665716e81675ad17f3a65b409f768879baca5156efa38204b8da74c46786
-size 54592
+oid sha256:a8b9c61ee214c3d222eda082120ae681ef5b1e4359c65d34d6d08106403aeef6
+size 54539
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Day_0_en.png
index 6ea3fd2981..2c582cdea1 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Day_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Day_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c72b2267469738863d7570309fc868368e9a897a98f192eb7bf7d561547fb029
-size 46925
+oid sha256:d5e4def8107b07a630a8991b20f541768bf8090e0cd964bb3c5b524955f12318
+size 46869
diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Night_0_en.png
index 0dd5a6d42d..52d5770cf9 100644
--- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Night_0_en.png
+++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerSimple_Night_0_en.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9b4cdcee84b5b48ed4179fb187e34bdcde02c4f8ed5da1b439f343cce8c2a15d
-size 44952
+oid sha256:11633c6e4562ab6a3144d80ff630574bc800a880a2804edf986c1fc8aeeff6b7
+size 44873
diff --git a/tools/adb/disable_talkback.sh b/tools/adb/disable_talkback.sh
new file mode 100755
index 0000000000..b16b693a0a
--- /dev/null
+++ b/tools/adb/disable_talkback.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Copyright 2025 New Vector Ltd.
+#
+# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
+# Please see LICENSE files in the repository root for full details.
+
+adb shell settings put secure enabled_accessibility_services null
+
diff --git a/tools/adb/enable_talkback.sh b/tools/adb/enable_talkback.sh
new file mode 100755
index 0000000000..96f815f685
--- /dev/null
+++ b/tools/adb/enable_talkback.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# Copyright 2025 New Vector Ltd.
+#
+# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
+# Please see LICENSE files in the repository root for full details.
+
+adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService
diff --git a/tools/localazy/config.json b/tools/localazy/config.json
index dbe8c4221a..9d8d1f09b7 100644
--- a/tools/localazy/config.json
+++ b/tools/localazy/config.json
@@ -162,7 +162,7 @@
]
},
{
- "name" : ":features:roomlist:impl",
+ "name" : ":features:home:impl",
"includeRegex" : [
"screen_roomlist_.*",
"screen\\.roomlist\\..*",
diff --git a/tools/release/release.sh b/tools/release/release.sh
index 735c57503e..4120a1da06 100755
--- a/tools/release/release.sh
+++ b/tools/release/release.sh
@@ -62,12 +62,13 @@ if [ ${envError} == 1 ]; then
exit 1
fi
-minSdkVersion=24
+# Read minSdkVersion from file plugins/src/main/kotlin/Versions.kt
+minSdkVersion=$(grep "MIN_SDK_FOSS =" ./plugins/src/main/kotlin/Versions.kt |cut -d '=' -f 2 |xargs)
buildToolsVersion="35.0.0"
buildToolsPath="${androidHome}/build-tools/${buildToolsVersion}"
if [[ ! -d ${buildToolsPath} ]]; then
- printf "Fatal: ${buildToolsPath} folder not found, ensure that you have installed the SDK version ${buildToolsVersion}.\n"
+ printf "Fatal: %s folder not found, ensure that you have installed the SDK version %s.\n" "${buildToolsPath}" "${buildToolsVersion}"
exit 1
fi
@@ -99,7 +100,7 @@ versionYearCandidate=$(date +%y)
currentVersionMonth=$(grep "val versionMonth" ${versionsFile} | cut -d " " -f6)
# Get current month on 2 digits
versionMonthCandidate=$(date +%m)
-versionMonthCandidateNoLeadingZero=$(echo ${versionMonthCandidate} | sed 's/^0//')
+versionMonthCandidateNoLeadingZero=${versionMonthCandidate/#0/}
currentVersionReleaseNumber=$(grep "val versionReleaseNumber" ${versionsFile} | cut -d " " -f6)
# if the current month is the same as the current version, we increment the release number, else we reset it to 0
if [[ ${currentVersionMonth} -eq ${versionMonthCandidateNoLeadingZero} ]]; then
@@ -109,17 +110,17 @@ else
fi
versionCandidate="${versionYearCandidate}.${versionMonthCandidate}.${versionReleaseNumberCandidate}"
-read -p "Please enter the release version (example: ${versionCandidate}). Format must be 'YY.MM.x' or 'YY.MM.xy'. Just press enter if ${versionCandidate} is correct. " version
+read -r -p "Please enter the release version (example: ${versionCandidate}). Format must be 'YY.MM.x' or 'YY.MM.xy'. Just press enter if ${versionCandidate} is correct. " version
version=${version:-${versionCandidate}}
# extract year, month and release number for future use
versionYear=$(echo "${version}" | cut -d "." -f1)
versionMonth=$(echo "${version}" | cut -d "." -f2)
-versionMonthNoLeadingZero=$(echo ${versionMonth} | sed 's/^0//')
+versionMonthNoLeadingZero=${versionMonth/#0/}
versionReleaseNumber=$(echo "${version}" | cut -d "." -f3)
printf "\n================================================================================\n"
-printf "Starting the release ${version}\n"
+printf "Starting the release %s\n" "${version}"
git flow release start "${version}"
# Note: in case the release is already started and the script is started again, checkout the release branch again.
@@ -146,7 +147,7 @@ fastlaneFile="20${versionYear}${versionMonth}${versionReleaseNumber2Digits}0.txt
fastlanePathFile="./fastlane/metadata/android/en-US/changelogs/${fastlaneFile}"
printf "Main changes in this version: TODO.\nFull changelog: https://github.com/element-hq/element-x-android/releases" > "${fastlanePathFile}"
-read -p "I have created the file ${fastlanePathFile}, please edit it and press enter to continue. "
+read -r -p "I have created the file ${fastlanePathFile}, please edit it and press enter to continue. "
git add "${fastlanePathFile}"
git commit -a -m "Adding fastlane file for version ${version}"
@@ -155,11 +156,11 @@ printf "OK, finishing the release...\n"
git flow release finish "${version}"
printf "\n================================================================================\n"
-read -p "Done, push the branch 'main' and the new tag (yes/no) default to yes? " doPush
+read -r -p "Done, push the branch 'main' and the new tag (yes/no) default to yes? " doPush
doPush=${doPush:-yes}
if [ "${doPush}" == "yes" ]; then
- printf "Pushing branch 'main' and tag 'v${version}'...\n"
+ printf "Pushing branch 'main' and tag 'v%s'...\n" "${version}"
git push origin main
git push origin "v${version}"
else
@@ -172,7 +173,7 @@ git checkout develop
printf "\n================================================================================\n"
printf "The GitHub action https://github.com/element-hq/element-x-android/actions/workflows/release.yml?query=branch%%3Amain should have start a new run.\n"
-read -p "Please enter the url of the run, no need to wait for it to complete (example: https://github.com/element-hq/element-x-android/actions/runs/9065756777): " runUrl
+read -r -p "Please enter the url of the run, no need to wait for it to complete (example: https://github.com/element-hq/element-x-android/actions/runs/9065756777): " runUrl
targetPath="./tmp/Element/${version}"
@@ -189,7 +190,7 @@ while [[ $ret -ne 0 ]]; do
ret=$?
if [[ $ret -ne 0 ]]; then
- read -p "Error while downloading the artifacts. You may want to fix the issue and retry. Retry (yes/no) default to yes? " doRetry
+ read -r -p "Error while downloading the artifacts. You may want to fix the issue and retry. Retry (yes/no) default to yes? " doRetry
doRetry=${doRetry:-yes}
if [ "${doRetry}" == "no" ]; then
exit 1
@@ -224,7 +225,7 @@ cp "${fdroidTargetPath}"/app-fdroid-arm64-v8a-release.apk \
--ks-pass pass:"${keyStorePassword}" \
--ks-key-alias elementx \
--key-pass pass:"${keyPassword}" \
- --min-sdk-version ${minSdkVersion} \
+ --min-sdk-version "${minSdkVersion}" \
"${fdroidTargetPath}"/app-fdroid-arm64-v8a-release-signed.apk
cp "${fdroidTargetPath}"/app-fdroid-armeabi-v7a-release.apk \
@@ -236,7 +237,7 @@ cp "${fdroidTargetPath}"/app-fdroid-armeabi-v7a-release.apk \
--ks-pass pass:"${keyStorePassword}" \
--ks-key-alias elementx \
--key-pass pass:"${keyPassword}" \
- --min-sdk-version ${minSdkVersion} \
+ --min-sdk-version "${minSdkVersion}" \
"${fdroidTargetPath}"/app-fdroid-armeabi-v7a-release-signed.apk
cp "${fdroidTargetPath}"/app-fdroid-x86-release.apk \
@@ -248,7 +249,7 @@ cp "${fdroidTargetPath}"/app-fdroid-x86-release.apk \
--ks-pass pass:"${keyStorePassword}" \
--ks-key-alias elementx \
--key-pass pass:"${keyPassword}" \
- --min-sdk-version ${minSdkVersion} \
+ --min-sdk-version "${minSdkVersion}" \
"${fdroidTargetPath}"/app-fdroid-x86-release-signed.apk
cp "${fdroidTargetPath}"/app-fdroid-x86_64-release.apk \
@@ -260,7 +261,7 @@ cp "${fdroidTargetPath}"/app-fdroid-x86_64-release.apk \
--ks-pass pass:"${keyStorePassword}" \
--ks-key-alias elementx \
--key-pass pass:"${keyPassword}" \
- --min-sdk-version ${minSdkVersion} \
+ --min-sdk-version "${minSdkVersion}" \
"${fdroidTargetPath}"/app-fdroid-x86_64-release-signed.apk
printf "\n================================================================================\n"
@@ -276,10 +277,10 @@ printf "File app-fdroid-x86_64-release-signed.apk:\n"
"${buildToolsPath}"/aapt dump badging "${fdroidTargetPath}"/app-fdroid-x86_64-release-signed.apk | grep package
printf "\n"
-read -p "Does it look correct? Press enter when it's done. "
+read -r -p "Does it look correct? Press enter when it's done. "
printf "\n================================================================================\n"
-printf "The APKs in ${fdroidTargetPath} have been signed!\n"
+printf "The APKs in %s have been signed!\n" "${fdroidTargetPath}"
printf "\n================================================================================\n"
printf "Unzipping the Gplay artifact...\n"
@@ -291,7 +292,7 @@ unsignedBundlePath="${gplayTargetPath}/app-gplay-release.aab"
signedBundlePath="${gplayTargetPath}/app-gplay-release-signed.aab"
printf "\n================================================================================\n"
-printf "Signing file ${unsignedBundlePath} with build-tools version ${buildToolsVersion} for min SDK version ${minSdkVersion}...\n"
+printf "Signing file %s with build-tools version %s for min SDK version %s...\n" "${unsignedBundlePath}" "${buildToolsVersion}" "${minSdkVersion}"
cp "${unsignedBundlePath}" "${signedBundlePath}"
@@ -301,7 +302,7 @@ cp "${unsignedBundlePath}" "${signedBundlePath}"
--ks-pass pass:"${keyStorePassword}" \
--ks-key-alias elementx \
--key-pass pass:"${keyPassword}" \
- --min-sdk-version ${minSdkVersion} \
+ --min-sdk-version "${minSdkVersion}" \
"${signedBundlePath}"
printf "\n================================================================================\n"
@@ -313,13 +314,13 @@ printf "Version name: "
bundletool dump manifest --bundle="${signedBundlePath}" --xpath=/manifest/@android:versionName
printf "\n"
-read -p "Does it look correct? Press enter to continue. "
+read -r -p "Does it look correct? Press enter to continue. "
printf "\n================================================================================\n"
-printf "The file ${signedBundlePath} has been signed and can be uploaded to the PlayStore!\n"
+printf "The file %s has been signed and can be uploaded to the PlayStore!\n" "${signedBundlePath}"
printf "\n================================================================================\n"
-read -p "Do you want to build the APKs from the app bundle? You need to do this step if you want to install the application to your device. (yes/no) default to no " doBuildApks
+read -r -p "Do you want to build the APKs from the app bundle? You need to do this step if you want to install the application to your device. (yes/no) default to no " doBuildApks
doBuildApks=${doBuildApks:-no}
if [ "${doBuildApks}" == "yes" ]; then
@@ -328,12 +329,12 @@ if [ "${doBuildApks}" == "yes" ]; then
--ks=./app/signature/debug.keystore --ks-pass=pass:android --ks-key-alias=androiddebugkey --key-pass=pass:android \
--overwrite
- read -p "Do you want to install the application to your device? Make sure there is one (and only one!) connected device first. (yes/no) default to yes " doDeploy
+ read -r -p "Do you want to install the application to your device? Make sure there is one (and only one!) connected device first. (yes/no) default to yes " doDeploy
doDeploy=${doDeploy:-yes}
if [ "${doDeploy}" == "yes" ]; then
printf "Installing apk for your device...\n"
bundletool install-apks --apks="${gplayTargetPath}"/elementx.apks
- read -p "Please run the application on your phone to check that the upgrade went well. Press enter to continue. "
+ read -r -p "Please run the application on your phone to check that the upgrade went well. Press enter to continue. "
else
printf "APK will not be deployed!\n"
fi
@@ -345,14 +346,14 @@ printf "\n======================================================================
printf "Create the open testing release on GooglePlay.\n"
printf "On GooglePlay console, go the the open testing section and click on \"Create new release\" button, then:\n"
-printf " - upload the file ${signedBundlePath}.\n"
+printf " - upload the file %s.\n" "${signedBundlePath}"
printf " - copy the release note from the fastlane file.\n"
printf " - download the universal APK, to be able to provide it to the GitHub release: click on the right arrow next to the \"App bundle\", then click on the \"Download\" tab, and download the \"Signed, universal APK\".\n"
printf " - submit the release.\n"
-read -p "Press enter to continue. "
+read -r -p "Press enter to continue. "
printf "You can then go to \"Publishing overview\" and send the new release for a review by Google.\n"
-read -p "Press enter to continue. "
+read -r -p "Press enter to continue. "
printf "\n================================================================================\n"
githubCreateReleaseLink="https://github.com/element-hq/element-x-android/releases/new?tag=v${version}&title=Element%20X%20Android%20v${version}"
@@ -361,22 +362,22 @@ printf -- "Open this link: %s\n" "${githubCreateReleaseLink}"
printf "Then\n"
printf " - Click on the 'Generate releases notes' button.\n"
printf " - Optionally reorder items and fix typos.\n"
-printf " - Add the file ${signedBundlePath} to the GitHub release.\n"
+printf " - Add the file %s to the GitHub release.\n" "${signedBundlePath}"
printf " - Add the universal APK, downloaded from the GooglePlay console to the GitHub release.\n"
-printf " - Add the 4 signed APKs for F-Droid, located at ${fdroidTargetPath} to the GitHub release.\n"
-read -p ". Press enter to continue. "
+printf " - Add the 4 signed APKs for F-Droid, located at %s to the GitHub release.\n" "${fdroidTargetPath}"
+read -r -p ". Press enter to continue. "
printf "\n================================================================================\n"
printf "Update the project release notes:\n\n"
-read -p "Copy the content of the release note generated by GitHub to the file CHANGES.md and press enter to commit the change. "
+read -r -p "Copy the content of the release note generated by GitHub to the file CHANGES.md and press enter to commit the change. "
printf "\n================================================================================\n"
printf "Committing...\n"
git commit -a -m "Changelog for version ${version}"
printf "\n================================================================================\n"
-read -p "Done, push the branch 'develop' (yes/no) default to yes? (A rebase may be necessary in case develop got new commits) " doPush
+read -r -p "Done, push the branch 'develop' (yes/no) default to yes? (A rebase may be necessary in case develop got new commits) " doPush
doPush=${doPush:-yes}
if [ "${doPush}" == "yes" ]; then
@@ -389,12 +390,12 @@ fi
printf "\n================================================================================\n"
printf "Message for the Android internal room:\n\n"
message="@room Element X Android ${version} is ready to be tested. You can get it from https://github.com/element-hq/element-x-android/releases/tag/v${version}. You can install the universal APK. If you want to install the application from the app bundle, you can follow instructions [here](https://github.com/element-hq/element-x-android/blob/develop/docs/install_from_github_release.md). Please report any feedback. Thanks!"
-printf "${message}\n\n"
+printf "%s\n\n" "${message}"
if [[ -z "${elementBotToken}" ]]; then
- read -p "ELEMENT_BOT_MATRIX_TOKEN is not defined in the environment. Cannot send the message for you. Please send it manually, and press enter to continue. "
+ read -r -p "ELEMENT_BOT_MATRIX_TOKEN is not defined in the environment. Cannot send the message for you. Please send it manually, and press enter to continue. "
else
- read -p "Send this message to the room (yes/no) default to yes? " doSend
+ read -r -p "Send this message to the room (yes/no) default to yes? " doSend
doSend=${doSend:-yes}
if [ "${doSend}" == "yes" ]; then
printf "Sending message...\n"