From d4c8fbac3ea48ee0b19985b3b6b2e42122e53873 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 12:52:10 +0000 Subject: [PATCH 001/156] fix(deps): update dependency org.unifiedpush.android:connector to v3.0.10 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 36392673de..3a6e6d0791 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -180,7 +180,7 @@ sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version. 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" +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" } From d2e15e340b0266649190ed68ee6c4f94c478576f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:23:54 +0000 Subject: [PATCH 002/156] fix(deps): update dependency io.sentry:sentry-android to v8.14.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 14fbe36141..d470a7d02f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -194,7 +194,7 @@ zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics posthog = "com.posthog:posthog-android:3.19.0" -sentry = "io.sentry:sentry-android:8.13.3" +sentry = "io.sentry:sentry-android:8.14.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" From 3153770d3f44df63240efcfdc753eb3116c3eeb7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:13:50 +0000 Subject: [PATCH 003/156] fix(deps): update dependency com.google.crypto.tink:tink-android to v1.18.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 296f70d939..279f8bb1a9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -77,7 +77,7 @@ google_firebase_bom = "com.google.firebase:firebase-bom:33.15.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" } From 921d6c6ae3962fdb3992bdbb1f6441f10652a8eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 19 Jun 2025 12:59:14 +0200 Subject: [PATCH 004/156] Changelog for version 25.06.3 --- CHANGES.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) 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 ============================= From 44940fc0933fdea2aa19b77364dc05aec44770c6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Jun 2025 17:08:05 +0200 Subject: [PATCH 005/156] a11y: improve accessibility on grouped state events header. --- .../components/TimelineItemGroupedEventsRow.kt | 12 ------------ .../timeline/components/group/GroupHeaderView.kt | 14 +++++++++++++- 2 files changed, 13 insertions(+), 13 deletions(-) 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..c98cf24426 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 @@ -143,16 +140,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, 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( From be62f2cd692fccd27e1c4b50b608ddb9ac349328 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 09:34:38 +0200 Subject: [PATCH 006/156] a11y: now that the grouped events are read one by one, we also need to reverse the order because the timeline is last message at the top when screen reader is enabled. --- .../timeline/components/TimelineItemGroupedEventsRow.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 c98cf24426..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 @@ -32,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 @@ -152,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, From ba3e64c3db2c4cf06c9e5e2685f616b19215853e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 09:43:01 +0200 Subject: [PATCH 007/156] a11y: Make isTalkbackActive() live. We made the assumption that the user needs to navigate to the setting to enable or disable the talkback, but there is a way to add a talkback switch on the bottom navigation bar. So the talkback can be enabled/disabled when the application is resumed. Since the UI may render differently depending on the talkback state, we need to make the composable `isTalkbackActive()` backed on a mutable state. --- .../libraries/ui/utils/time/IsTalkbackEnabled.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 } From d4388062b04c4c8a83570ef9d4bb95788fc927d0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 10:11:17 +0200 Subject: [PATCH 008/156] Debug info: render the roomId in the room details screen when developer mode is enabled. --- features/roomdetails/impl/build.gradle.kts | 1 + .../roomdetails/impl/RoomDetailsPresenter.kt | 6 ++++ .../roomdetails/impl/RoomDetailsState.kt | 1 + .../impl/RoomDetailsStateProvider.kt | 4 ++- .../roomdetails/impl/RoomDetailsView.kt | 35 +++++++++++++++++++ .../impl/RoomDetailsPresenterTest.kt | 24 +++++++++++++ 6 files changed, 70 insertions(+), 1 deletion(-) 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..d093fd7e58 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,6 +43,7 @@ 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 @@ -261,6 +263,12 @@ fun RoomDetailsView( onReportRoomClick = onReportRoomClick, onLeaveRoomClick = { state.eventSink(RoomDetailsEvent.LeaveRoom) } ) + + if (state.showDebugInfo) { + DebugInfoSection( + roomId = state.roomId, + ) + } } } } @@ -701,6 +709,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/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..64fc30d1f0 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 @@ -84,6 +86,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 +114,7 @@ class RoomDetailsPresenterTest { isPinnedMessagesFeatureEnabled = { isPinnedMessagesFeatureEnabled }, analyticsService = analyticsService, clipboardHelper = clipboardHelper, + appPreferencesStore = appPreferencesStore, ) } @@ -132,6 +136,7 @@ class RoomDetailsPresenterTest { assertThat(initialState.canShowPinnedMessages).isTrue() assertThat(initialState.pinnedMessagesCount).isEqualTo(0) assertThat(initialState.canShowSecurityAndPrivacy).isFalse() + assertThat(initialState.showDebugInfo).isFalse() cancelAndIgnoreRemainingEvents() } @@ -727,4 +732,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() + } + } + } } From 9baa54028171589f656a88449dd4da4af88ea886 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 10:13:48 +0200 Subject: [PATCH 009/156] Use CompoundIcons.Code() instead of CompoundDrawables.ic_compound_code --- .../features/preferences/impl/root/PreferencesRootView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..836d68b1c4 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 @@ -272,7 +272,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 ) } From e53280aabe16eda0ca1044d4c5896ea4d5c916c4 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 20 Jun 2025 08:28:21 +0000 Subject: [PATCH 010/156] Update screenshots --- .../images/features.roomdetails.impl_RoomDetailsDark_1_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_1_en.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 From d8a09535ba92ecacc95801dc51958ed5722ed9be Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 10:29:52 +0200 Subject: [PATCH 011/156] Remove unused import --- .../features/preferences/impl/root/PreferencesRootView.kt | 1 - 1 file changed, 1 deletion(-) 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 836d68b1c4..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 From 416188824d91cd30aa26dc9e754ced99e3d83604 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 10:33:30 +0200 Subject: [PATCH 012/156] Suppress LargeClass on test. --- .../features/roomdetails/impl/RoomDetailsPresenterTest.kt | 1 + 1 file changed, 1 insertion(+) 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 64fc30d1f0..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 @@ -62,6 +62,7 @@ import org.junit.Rule import org.junit.Test import kotlin.time.Duration.Companion.milliseconds +@Suppress("LargeClass") @ExperimentalCoroutinesApi class RoomDetailsPresenterTest { @get:Rule From 110534687b88ba3681777dd6ba165cd9f3659a53 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:06:02 +0000 Subject: [PATCH 013/156] fix(deps): update wysiwyg to v2.38.4 (#4907) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fa1b800c42..b22ca53c59 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,7 +42,7 @@ 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" # Dependency analysis From 12fdb8e875a517a6b7342cf2183d0c2e06f3d232 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 20 Jun 2025 14:19:33 +0200 Subject: [PATCH 014/156] Add scripts to enable and disable talkback (#4906) --- tools/adb/disable_talkback.sh | 9 +++++++++ tools/adb/enable_talkback.sh | 8 ++++++++ 2 files changed, 17 insertions(+) create mode 100755 tools/adb/disable_talkback.sh create mode 100755 tools/adb/enable_talkback.sh 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 From 4389657a0d14a4a3de8d6d544d0e40058c30a7c9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Jun 2025 09:43:48 +0200 Subject: [PATCH 015/156] Inline `TextInput` so that we have code parity in the when statement --- .../libraries/textcomposer/TextComposer.kt | 74 ++++++------------- 1 file changed, 24 insertions(+), 50 deletions(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 29a5f22449..0014634b7f 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -81,7 +81,6 @@ import io.element.android.libraries.textcomposer.model.aTextEditorStateRich import io.element.android.libraries.textcomposer.model.showCaptionCompatibilityWarning import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.wysiwyg.compose.RichTextEditor -import io.element.android.wysiwyg.compose.RichTextEditorState import io.element.android.wysiwyg.display.TextDisplay import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -174,18 +173,29 @@ fun TextComposer( is TextEditorState.Rich -> { remember(state.richTextEditorState, subcomposing, composerMode, onResetComposerMode, onError) { @Composable { - TextInput( - state = state.richTextEditorState, - subcomposing = subcomposing, - placeholder = placeholder, + TextInputBox( composerMode = composerMode, onResetComposerMode = onResetComposerMode, - resolveMentionDisplay = resolveMentionDisplay, - resolveRoomMentionDisplay = resolveAtRoomMentionDisplay, - onError = onError, - onTyping = onTyping, - onSelectRichContent = onSelectRichContent, - ) + placeholder = placeholder, + showPlaceholder = state.richTextEditorState.messageHtml.isEmpty(), + subcomposing = subcomposing, + ) { + RichTextEditor( + state = state.richTextEditorState, + // Disable most of the editor functionality if it's just being measured for a subcomposition. + // This prevents it gaining focus and mutating the state. + registerStateUpdates = !subcomposing, + modifier = Modifier + .padding(top = 6.dp, bottom = 6.dp) + .fillMaxWidth(), + style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.richTextEditorState.hasFocus), + resolveMentionDisplay = resolveMentionDisplay, + resolveRoomMentionDisplay = resolveAtRoomMentionDisplay, + onError = onError, + onRichContentSelected = onSelectRichContent, + onTyping = onTyping, + ) + } } } } @@ -437,7 +447,9 @@ private fun TextFormattingLayout( ) { val bottomPadding = with(LocalDensity.current) { WindowInsets.systemBars.getBottom(this).toDp() + 8.dp } Column( - modifier = modifier.padding(vertical = 4.dp).padding(bottom = bottomPadding), + modifier = modifier + .padding(vertical = 4.dp) + .padding(bottom = bottomPadding), verticalArrangement = Arrangement.spacedBy(4.dp), ) { if (isRoomEncrypted == false) { @@ -546,44 +558,6 @@ private fun TextInputBox( } } -@Composable -private fun TextInput( - state: RichTextEditorState, - subcomposing: Boolean, - placeholder: String, - composerMode: MessageComposerMode, - onResetComposerMode: () -> Unit, - resolveRoomMentionDisplay: () -> TextDisplay, - resolveMentionDisplay: (text: String, url: String) -> TextDisplay, - onError: (Throwable) -> Unit, - onTyping: (Boolean) -> Unit, - onSelectRichContent: ((Uri) -> Unit)?, -) { - TextInputBox( - composerMode = composerMode, - onResetComposerMode = onResetComposerMode, - placeholder = placeholder, - showPlaceholder = state.messageHtml.isEmpty(), - subcomposing = subcomposing, - ) { - RichTextEditor( - state = state, - // Disable most of the editor functionality if it's just being measured for a subcomposition. - // This prevents it gaining focus and mutating the state. - registerStateUpdates = !subcomposing, - modifier = Modifier - .padding(top = 6.dp, bottom = 6.dp) - .fillMaxWidth(), - style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus), - resolveMentionDisplay = resolveMentionDisplay, - resolveRoomMentionDisplay = resolveRoomMentionDisplay, - onError = onError, - onRichContentSelected = onSelectRichContent, - onTyping = onTyping, - ) - } -} - private fun aTextEditorStateMarkdownList(isRoomEncrypted: Boolean? = null) = persistentListOf( aTextEditorStateMarkdown(initialText = "", initialFocus = true, isRoomEncrypted = isRoomEncrypted), aTextEditorStateMarkdown(initialText = "A message", initialFocus = true, isRoomEncrypted = isRoomEncrypted), From 512ed810f759c67ed0baf00821a29a342ff4d61f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Jun 2025 18:05:37 +0200 Subject: [PATCH 016/156] Improve preview of AttachmentsPreviewViewPreview to have the case with a caption. --- .../AttachmentsPreviewStateProvider.kt | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) 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) }, +) From ff95c4365d3f114f19ddd75a702a8c79ff606374 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 19 Jun 2025 09:54:50 +0200 Subject: [PATCH 017/156] a11y: let Markdown/Rich text input render the placeholder to help for accessibility. --- .../ElementRichTextEditorStyle.kt | 1 + .../libraries/textcomposer/TextComposer.kt | 29 +++++-------------- .../components/markdown/MarkdownTextInput.kt | 9 ++++++ .../markdown/MarkdownTextInputTest.kt | 3 ++ 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ElementRichTextEditorStyle.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ElementRichTextEditorStyle.kt index bf13b8016c..357507ba23 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ElementRichTextEditorStyle.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/ElementRichTextEditorStyle.kt @@ -31,6 +31,7 @@ object ElementRichTextEditorStyle { } else { ElementTheme.colors.textSecondary }, + placeholderColor = ElementTheme.colors.textSecondary, lineHeight = TextUnit.Unspecified, includeFontPadding = true, ) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 0014634b7f..e4ba0d2401 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -39,7 +39,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp @@ -176,12 +175,12 @@ fun TextComposer( TextInputBox( composerMode = composerMode, onResetComposerMode = onResetComposerMode, - placeholder = placeholder, - showPlaceholder = state.richTextEditorState.messageHtml.isEmpty(), + isTextEmpty = state.richTextEditorState.messageHtml.isEmpty(), subcomposing = subcomposing, ) { RichTextEditor( state = state.richTextEditorState, + placeholder = placeholder, // Disable most of the editor functionality if it's just being measured for a subcomposition. // This prevents it gaining focus and mutating the state. registerStateUpdates = !subcomposing, @@ -205,12 +204,13 @@ fun TextComposer( TextInputBox( composerMode = composerMode, onResetComposerMode = onResetComposerMode, - placeholder = placeholder, - showPlaceholder = state.state.text.value().isEmpty(), + isTextEmpty = state.state.text.value().isEmpty(), subcomposing = subcomposing, ) { MarkdownTextInput( state = state.state, + placeholder = placeholder, + placeholderColor = ElementTheme.colors.textSecondary, subcomposing = subcomposing, onTyping = onTyping, onReceiveSuggestion = onReceiveSuggestion, @@ -492,8 +492,7 @@ private fun TextFormattingLayout( private fun TextInputBox( composerMode: MessageComposerMode, onResetComposerMode: () -> Unit, - placeholder: String, - showPlaceholder: Boolean, + isTextEmpty: Boolean, subcomposing: Boolean, textInput: @Composable () -> Unit, ) { @@ -515,7 +514,6 @@ private fun TextInputBox( onResetComposerMode = onResetComposerMode, ) } - val defaultTypography = ElementTheme.typography.fontBodyLgRegular Box( modifier = Modifier .padding(top = 4.dp, bottom = 4.dp, start = 12.dp, end = 12.dp) @@ -523,21 +521,8 @@ private fun TextInputBox( .then(if (!subcomposing) Modifier.testTag(TestTags.textEditor) else Modifier), contentAlignment = Alignment.CenterStart, ) { - // Placeholder - if (showPlaceholder) { - Text( - text = placeholder, - style = defaultTypography.copy( - color = ElementTheme.colors.textSecondary, - ), - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - } - textInput() - - if (showPlaceholder && composerMode.showCaptionCompatibilityWarning()) { + if (isTextEmpty && composerMode.showCaptionCompatibilityWarning()) { var showBottomSheet by remember { mutableStateOf(false) } Icon( modifier = Modifier diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt index 58cd9c29d2..f9baca43ea 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.textcomposer.components.markdown import android.content.ClipData +import android.content.res.ColorStateList import android.graphics.Color import android.net.Uri import android.text.Editable @@ -18,6 +19,7 @@ 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.graphics.toArgb import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.text.getSpans @@ -26,6 +28,7 @@ import androidx.core.view.OnReceiveContentListener import androidx.core.view.ViewCompat import androidx.core.view.setPadding import androidx.core.widget.addTextChangedListener +import io.element.android.compound.theme.ElementTheme import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.testtags.TestTags @@ -43,6 +46,8 @@ import io.element.android.wysiwyg.compose.internal.applyStyleInCompose @Composable fun MarkdownTextInput( state: MarkdownTextEditorState, + placeholder: String, + placeholderColor: androidx.compose.ui.graphics.Color, subcomposing: Boolean, onTyping: (Boolean) -> Unit, onReceiveSuggestion: (Suggestion?) -> Unit, @@ -87,6 +92,8 @@ fun MarkdownTextInput( setBackgroundColor(Color.TRANSPARENT) val text = state.text.value() setText(text) + setHint(placeholder) + setHintTextColor(ColorStateList.valueOf(placeholderColor.toArgb())) inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE or @@ -189,6 +196,8 @@ internal fun MarkdownTextInputPreview() { val style = ElementRichTextEditorStyle.composerStyle(hasFocus = true) MarkdownTextInput( state = aMarkdownTextEditorState(initialText = "Hello, World!"), + placeholder = "Placeholder", + placeholderColor = ElementTheme.colors.textSecondary, subcomposing = false, onTyping = {}, onReceiveSuggestion = {}, diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt index 1176cdadaa..a6cad521b2 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.core.text.getSpans import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import io.element.android.compound.theme.ElementTheme import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser @@ -175,6 +176,8 @@ class MarkdownTextInputTest { val style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus) MarkdownTextInput( state = state, + placeholder = "Placeholder", + placeholderColor = ElementTheme.colors.textSecondary, subcomposing = subcomposing, onTyping = onTyping, onReceiveSuggestion = onSuggestionReceived, From c838a793bbaa0be3fc3b3a76e1ccf7b35ebdb64b Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 20 Jun 2025 13:11:58 +0000 Subject: [PATCH 018/156] Update screenshots --- ...messages.impl.attachments.preview_AttachmentsView_0_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_1_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_2_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_3_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_4_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_5_en.png | 4 ++-- ...messages.impl.attachments.preview_AttachmentsView_7_en.png | 4 ++-- ...rypto.identity_MessagesViewWithIdentityChange_Day_0_en.png | 4 ++-- ...rypto.identity_MessagesViewWithIdentityChange_Day_1_en.png | 4 ++-- ...pto.identity_MessagesViewWithIdentityChange_Night_0_en.png | 4 ++-- ...pto.identity_MessagesViewWithIdentityChange_Night_1_en.png | 4 ++-- ...ages.impl.messagecomposer_MessageComposerView_Day_0_en.png | 4 ++-- ...es.impl.messagecomposer_MessageComposerView_Night_0_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_6_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_6_en.png | 4 ++-- ...braries.textcomposer_MarkdownTextComposerEdit_Day_0_en.png | 4 ++-- ...aries.textcomposer_MarkdownTextComposerEdit_Night_0_en.png | 4 ++-- ...libraries.textcomposer_TextComposerAddCaption_Day_0_en.png | 4 ++-- ...braries.textcomposer_TextComposerAddCaption_Night_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerCaption_Day_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerCaption_Night_0_en.png | 4 ++-- ...ibraries.textcomposer_TextComposerEditCaption_Day_0_en.png | 4 ++-- ...raries.textcomposer_TextComposerEditCaption_Night_0_en.png | 4 ++-- ...ies.textcomposer_TextComposerEditNotEncrypted_Day_0_en.png | 4 ++-- ...s.textcomposer_TextComposerEditNotEncrypted_Night_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerEdit_Day_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerEdit_Night_0_en.png | 4 ++-- ...xtcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png | 4 ++-- ...composer_TextComposerFormattingNotEncrypted_Night_0_en.png | 4 ++-- ...libraries.textcomposer_TextComposerFormatting_Day_0_en.png | 4 ++-- ...braries.textcomposer_TextComposerFormatting_Night_0_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_0_en.png | 4 ++-- ...s.textcomposer_TextComposerReplyNotEncrypted_Day_10_en.png | 4 ++-- ...s.textcomposer_TextComposerReplyNotEncrypted_Day_11_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_1_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_2_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_3_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_4_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_5_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_6_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_7_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_8_en.png | 4 ++-- ...es.textcomposer_TextComposerReplyNotEncrypted_Day_9_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_0_en.png | 4 ++-- ...textcomposer_TextComposerReplyNotEncrypted_Night_10_en.png | 4 ++-- ...textcomposer_TextComposerReplyNotEncrypted_Night_11_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_1_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_2_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_3_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_4_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_5_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_6_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_7_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_8_en.png | 4 ++-- ....textcomposer_TextComposerReplyNotEncrypted_Night_9_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_10_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_11_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_1_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_2_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_3_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_4_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_5_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_6_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_7_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_8_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Day_9_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_10_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_11_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_1_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_2_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_3_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_4_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_5_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_6_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_7_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_8_en.png | 4 ++-- .../libraries.textcomposer_TextComposerReply_Night_9_en.png | 4 ++-- ...s.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en.png | 4 ++-- ...textcomposer_TextComposerSimpleNotEncrypted_Night_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerSimple_Day_0_en.png | 4 ++-- .../libraries.textcomposer_TextComposerSimple_Night_0_en.png | 4 ++-- 83 files changed, 166 insertions(+), 166 deletions(-) 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_MessagesView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_6_en.png index 57f5891983..64c9eb1cdf 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:f65fa2e0b1172f43b9475b8f46c3efc1086b5cf659038190bd8495b98bc21c82 +size 51551 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..ec42814e10 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:dc219f3f79e2f7e061b541398971c36732346b2770fbeea95a4ecca266eb6ac0 +size 50925 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..00b0a7c69a 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:40ce5b17c4b499d9e671b7022ee6445abaddf4e14eed547f8c2b0e4d018d75c5 +size 64598 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..e3ce1e8df4 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:cf923847e52fc8db3a7a27c5b85e27c4db8bcce9005b8009684e9f3b8b8b8c4b +size 62040 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..1a9a40f972 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:30e40a4f602f99ca9ba95842b1aa8955450072d8bb317aea2eb61c704be0d8e3 +size 53900 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..18915e427a 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:ac727cdf60b1a31c386d223df6f9142990468fdb6e387668eb740335c2caf937 +size 51263 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 From b0e3f818c3f83b6ccf2a93d58299b2b3849006e3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 20 Jun 2025 16:36:01 +0200 Subject: [PATCH 019/156] change (accept invite) : map Unknown error to AcceptInvite.Failures.InvalidInvite --- .../android/features/invite/impl/AcceptInvite.kt | 16 ++++++++++++++++ .../features/joinroom/impl/JoinRoomPresenter.kt | 9 +-------- .../features/joinroom/impl/JoinRoomState.kt | 7 ++----- .../joinroom/impl/JoinRoomStateProvider.kt | 15 +++++++++++++-- .../roomlist/impl/RoomListStateProvider.kt | 14 +++++++++++++- .../libraries/matrix/api/room/join/JoinRoom.kt | 4 ++++ .../matrix/impl/room/join/DefaultJoinRoom.kt | 12 ++++++++++++ 7 files changed, 61 insertions(+), 16 deletions(-) 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/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..e8514ac4a5 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,6 @@ 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.meta.BuildMeta import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -222,13 +221,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/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index cb4818ddd1..6b8b3f5ff9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -8,8 +8,8 @@ package io.element.android.features.roomlist.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider +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 @@ -22,9 +22,11 @@ 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.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.push.api.battery.aBatteryOptimizationState @@ -86,6 +88,16 @@ internal fun aRoomListState( 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( 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/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 { } } } From 57a8d30021170dc3f44b75a9da52ed1291fc7936 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 20 Jun 2025 16:40:52 +0200 Subject: [PATCH 020/156] change (accept invite) : updates the error title/content dialog for accept/decline actions --- .../AcceptDeclineInviteStateProvider.kt | 25 +++++++++++++++---- .../acceptdecline/AcceptDeclineInviteView.kt | 18 ++++++++++++- .../src/main/res/values/localazy.xml | 1 + 3 files changed, 38 insertions(+), 6 deletions(-) rename features/invite/{api/src/main/kotlin/io/element/android/features/invite/api => impl/src/main/kotlin/io/element/android/features/invite/impl}/acceptdecline/AcceptDeclineInviteStateProvider.kt (62%) 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/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 323b762a43..9d6a7cb9b9 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -333,6 +333,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." From fc19a9407840435f7bffcc66d82fcf934bcd8d8c Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 20 Jun 2025 14:54:33 +0000 Subject: [PATCH 021/156] Update screenshots --- ...te.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en.png | 4 ++-- ...te.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en.png | 4 ++-- ...te.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png | 3 +++ ....impl.acceptdecline_AcceptDeclineInviteView_Night_3_en.png | 4 ++-- ....impl.acceptdecline_AcceptDeclineInviteView_Night_4_en.png | 4 ++-- ....impl.acceptdecline_AcceptDeclineInviteView_Night_5_en.png | 3 +++ 6 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_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 From dada0bc35beacb1e86687e3bbd1c28170aaf8034 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:23:20 +0200 Subject: [PATCH 022/156] fix(deps): update dependency org.robolectric:robolectric to v4.15 (#4901) * fix(deps): update dependency org.robolectric:robolectric to v4.15 * It seems that there's been some improvement on Robolectric 4.15 so this can be tested properly now. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Benoit Marty --- gradle/libs.versions.toml | 2 +- .../impl/util/FileExtensionExtractorWithValidationTest.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b22ca53c59..191ac71b8d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -150,7 +150,7 @@ 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" 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" } 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 From 3ec965f23f8e28386454a2b0e8f632047db678f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:24:05 +0200 Subject: [PATCH 023/156] fix(deps): update dependency androidx.sqlite:sqlite-ktx to v2.5.2 (#4898) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 191ac71b8d..f564cd3adb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -179,7 +179,7 @@ sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", ver 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" +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" From 4eb4692531877b83e6ee4ea8b2a7de367976bb9e Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 20 Jun 2025 17:24:17 +0200 Subject: [PATCH 024/156] Restore `MarkdownEditText.focusSearch` override (#4908) --- .../textcomposer/components/markdown/MarkdownEditText.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownEditText.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownEditText.kt index 4e66e6c79b..413760e209 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownEditText.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownEditText.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.textcomposer.components.markdown import android.content.Context +import android.view.View import androidx.appcompat.widget.AppCompatEditText internal class MarkdownEditText( @@ -36,4 +37,10 @@ internal class MarkdownEditText( onSelectionChangeListener?.invoke(selStart, selEnd) } } + + // When using the EditText within a Compose layout, we need to override focusSearch to prevent the default behavior + // Otherwise it can try searching for focusable nodes in the Compose hierarchy while they're being laid out, which will crash + override fun focusSearch(direction: Int): View? { + return null + } } From c857f7a243bb77d956c69f041fb329d963ffa463 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 20 Jun 2025 18:14:34 +0200 Subject: [PATCH 025/156] change (accept invite) : fix tests after api break --- .../features/joinroom/impl/JoinRoomPresenterTest.kt | 6 +++--- .../android/features/joinroom/impl/JoinRoomViewTest.kt | 9 +++++---- .../features/roomlist/impl/RoomListPresenterTest.kt | 1 - 3 files changed, 8 insertions(+), 8 deletions(-) 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..ac716a4203 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 @@ -304,7 +304,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 +316,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) } } 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/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index 3184a44a1c..db605b5b6c 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -15,7 +15,6 @@ import im.vector.app.features.analytics.plan.Interaction 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 From 47090481978726dbdc66031fd01412a783566895 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 06:02:24 +0000 Subject: [PATCH 026/156] fix(deps): update dependency org.jsoup:jsoup to v1.21.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f564cd3adb..add431a34e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -168,7 +168,7 @@ 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" From 3f520f5a0a5ad9e6efc798dd503f7a01efbd0e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Mon, 23 Jun 2025 15:29:44 +0800 Subject: [PATCH 027/156] refactor: Migrate SQLCipher Android to new API (#4874) Co-authored-by: Benoit Marty --- gradle/libs.versions.toml | 2 +- libraries/encrypted-db/consumer-proguard-rules.pro | 4 ---- .../io/element/encrypteddb/SqlCipherDriverFactory.kt | 7 ++++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f564cd3adb..f3eb9364d8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -178,7 +178,7 @@ matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" } -sqlcipher = "net.zetetic:android-database-sqlcipher:4.5.4" +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" 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) } } From 7c79f8b8aaf4e2dd089dce0b900bd4bbea375876 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 09:59:44 +0200 Subject: [PATCH 028/156] fix(deps): update dependency io.mockk:mockk to v1.14.4 (#4912) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3eb9364d8..8e1f5d4721 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -145,7 +145,7 @@ 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" From bece4a0ecd0b0adeb437aea054bbadd9e047ad6c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 16:58:29 +0200 Subject: [PATCH 029/156] Add ability to zoom on video. --- .../impl/local/video/MediaVideoView.kt | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) 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 }, ) From 3669128e609a78e097b3dca3c503eae6f7d6ca09 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 17:08:14 +0200 Subject: [PATCH 030/156] Introduce AvatarType to be able to render space avatars --- .../impl/configureroom/ConfigureRoomView.kt | 2 + .../features/joinroom/impl/JoinRoomView.kt | 20 ++++- .../features/messages/impl/MessagesView.kt | 11 ++- .../suggestions/SuggestionsPickerView.kt | 13 +++- .../EditDefaultNotificationSettingView.kt | 9 ++- .../user/editprofile/EditUserProfileView.kt | 2 + .../roomdetails/impl/RoomDetailsView.kt | 15 ++-- .../impl/edit/RoomDetailsEditView.kt | 2 + .../impl/root/RoomDirectoryView.kt | 4 +- .../impl/components/RoomSummaryRow.kt | 13 ++-- .../designsystem/components/avatar/Avatar.kt | 48 +++++++++++- .../components/avatar/AvatarCluster.kt | 23 +++--- .../components/avatar/AvatarShape.kt | 24 ++++++ .../components/avatar/AvatarType.kt | 25 +++++++ .../components/avatar/RoomAvatar.kt | 36 +++++---- .../components/avatar/SpaceAvatar.kt | 74 +++++++++++++++++++ .../components/avatar/TextAvatar.kt | 37 +++++++--- .../components/avatar/TombstonedRoomAvatar.kt | 7 +- .../ui/components/EditableAvatarView.kt | 5 ++ .../matrix/ui/components/SelectedRoom.kt | 11 ++- .../matrix/ui/components/UnsavedAvatar.kt | 19 +++-- .../roomselect/impl/RoomSelectView.kt | 15 ++-- 22 files changed, 337 insertions(+), 78 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt 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..afc6ef0bde 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,6 +40,7 @@ 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.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 @@ -219,6 +220,7 @@ private fun RoomNameWithAvatar( ) { UnsavedAvatar( avatarUri = avatarUri, + avatarType = AvatarType.Room(), modifier = Modifier.clickable(onClick = onAvatarClick), ) 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..7f51773c45 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 @@ -53,6 +53,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 +93,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 +495,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 +554,7 @@ private fun DefaultLoadedContent( @Composable private fun JoinRoomTopBar( contentState: ContentState, + hideAvatarImage: Boolean, onBackClick: () -> Unit, ) { TopAppBar( @@ -561,7 +571,11 @@ 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), text = contentState.name, 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..66fe8723bb 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 @@ -83,8 +83,9 @@ 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.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.preview.ElementPreview @@ -563,10 +564,12 @@ 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), 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..bb2e2c7f4d 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 @@ -109,7 +115,12 @@ private fun SuggestionItemView( 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 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/user/editprofile/EditUserProfileView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt index 5b52f83b66..dc03b593c7 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,6 +32,7 @@ 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 @@ -101,6 +102,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/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 d093fd7e58..02a6a637e3 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 @@ -48,10 +48,11 @@ 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 @@ -399,12 +400,14 @@ 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, + ), modifier = Modifier .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) } .testTag(TestTags.roomDetailAvatar) 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..b77ea44001 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 @@ -34,6 +34,7 @@ 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 @@ -103,6 +104,7 @@ fun RoomDetailsEditView( displayName = state.roomRawName, avatarUrl = state.roomAvatarUrl, avatarSize = AvatarSize.EditRoomDetails, + avatarType = AvatarType.Room(), onAvatarClick = ::onAvatarClick, modifier = Modifier.fillMaxWidth(), ) 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..5c6383ba3b 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,6 +40,7 @@ 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 @@ -248,7 +249,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/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt index 1be57d631a..d6ad371beb 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomSummaryRow.kt @@ -44,7 +44,8 @@ import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryProvid import io.element.android.features.roomlist.impl.model.RoomSummaryDisplayType 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 @@ -184,11 +185,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/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..4f691c9f0d 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 @@ -10,7 +10,6 @@ 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 @@ -37,15 +36,50 @@ import timber.log.Timber fun Avatar( avatarData: AvatarData, modifier: Modifier = Modifier, + avatarType: AvatarType = AvatarType.User, contentDescription: String? = null, // If not null, will be used instead of the size from avatarData forcedAvatarSize: Dp? = null, // If true, will show initials even if avatarData.url is not null hideImage: Boolean = false, +) { + when (avatarType) { + is AvatarType.Room -> RoomAvatar( + avatarData = avatarData, + avatarType = avatarType, + modifier = modifier, + hideAvatarImage = hideImage, + contentDescription = contentDescription, + ) + AvatarType.User -> UserAvatar( + avatarData = avatarData, + modifier = modifier, + contentDescription = contentDescription, + forcedAvatarSize = forcedAvatarSize, + hideImage = hideImage, + ) + is AvatarType.Space -> SpaceAvatar( + avatarData = avatarData, + avatarType = avatarType, + modifier = modifier, + hideAvatarImage = hideImage, + contentDescription = contentDescription, + ) + } +} + +@Composable +private fun UserAvatar( + avatarData: AvatarData, + modifier: Modifier = Modifier, + contentDescription: String? = null, + forcedAvatarSize: Dp? = null, + hideImage: Boolean = false, ) { if (avatarData.url.isNullOrBlank() || hideImage) { InitialLetterAvatar( avatarData = avatarData, + avatarType = AvatarType.User, forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, @@ -53,6 +87,7 @@ fun Avatar( } else { ImageAvatar( avatarData = avatarData, + avatarType = AvatarType.User, forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, @@ -61,8 +96,9 @@ fun Avatar( } @Composable -private fun ImageAvatar( +internal fun ImageAvatar( avatarData: AvatarData, + avatarType: AvatarType, forcedAvatarSize: Dp?, modifier: Modifier = Modifier, contentDescription: String? = null, @@ -74,7 +110,7 @@ private fun ImageAvatar( contentScale = ContentScale.Crop, modifier = modifier .size(size) - .clip(CircleShape) + .clip(avatarShape(avatarType)) ) { val collectedState by painter.state.collectAsState() when (val state = collectedState) { @@ -85,12 +121,14 @@ private fun ImageAvatar( } InitialLetterAvatar( avatarData = avatarData, + avatarType = avatarType, forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) } else -> InitialLetterAvatar( avatarData = avatarData, + avatarType = avatarType, forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) @@ -99,8 +137,9 @@ private fun ImageAvatar( } @Composable -private fun InitialLetterAvatar( +internal fun InitialLetterAvatar( avatarData: AvatarData, + avatarType: AvatarType, forcedAvatarSize: Dp?, contentDescription: String?, modifier: Modifier = Modifier, @@ -109,6 +148,7 @@ private fun InitialLetterAvatar( TextAvatar( text = avatarData.initialLetter, size = forcedAvatarSize ?: avatarData.size.dp, + avatarType = avatarType, colors = avatarColors, contentDescription = contentDescription, modifier = modifier 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/AvatarCluster.kt index 9c7efa864d..8406c951af 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/AvatarCluster.kt @@ -31,9 +31,10 @@ import kotlin.math.sin private const val MAX_AVATAR_COUNT = 4 @Composable -fun AvatarCluster( +internal fun AvatarCluster( avatars: ImmutableList, modifier: Modifier = Modifier, + avatarType: AvatarType = AvatarType.User, hideAvatarImages: Boolean = false, contentDescription: String? = null, ) { @@ -50,6 +51,7 @@ fun AvatarCluster( 1 -> { Avatar( avatarData = limitedAvatars[0], + avatarType = avatarType, modifier = modifier, contentDescription = contentDescription, hideImage = hideAvatarImages @@ -78,10 +80,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,15 +91,16 @@ 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( avatarData = heroAvatar, forcedAvatarSize = heroAvatarSize, + avatarType = avatarType, hideImage = hideAvatarImages, ) } 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..dff82a5a3d --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarShape.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.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 + +@Composable +fun avatarShape( + avatarType: AvatarType, +): Shape { + return when (avatarType) { + is AvatarType.Space -> RoundedCornerShape(avatarType.cornerSize) + is AvatarType.Room, + AvatarType.User -> CircleShape + } +} 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..d210de954b --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarType.kt @@ -0,0 +1,25 @@ +/* + * 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.ui.unit.Dp +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf + +sealed interface AvatarType { + data object User : AvatarType + + data class Room( + val isTombstoned: Boolean = false, + val heroes: ImmutableList = persistentListOf(), + ) : AvatarType + + data class Space( + val cornerSize: Dp, + ) : AvatarType +} 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/RoomAvatar.kt index 44d1c9b491..f01d71e41d 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/RoomAvatar.kt @@ -9,36 +9,46 @@ package io.element.android.libraries.designsystem.components.avatar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import kotlinx.collections.immutable.ImmutableList @Composable -fun RoomAvatar( +internal fun RoomAvatar( avatarData: AvatarData, - heroes: ImmutableList, + avatarType: AvatarType.Room, modifier: Modifier = Modifier, - isTombstoned: Boolean = false, hideAvatarImage: Boolean = false, contentDescription: String? = null, ) { when { - isTombstoned -> { + avatarType.isTombstoned -> { TombstonedRoomAvatar( size = avatarData.size, modifier = modifier, + avatarType = avatarType, contentDescription = contentDescription ) } - avatarData.url != null || heroes.isEmpty() -> { - Avatar( - avatarData = avatarData, - modifier = modifier, - contentDescription = contentDescription, - hideImage = hideAvatarImage - ) + avatarData.url != null || avatarType.heroes.isEmpty() -> { + if (avatarData.url.isNullOrBlank() || hideAvatarImage) { + InitialLetterAvatar( + avatarData = avatarData, + avatarType = avatarType, + modifier = modifier, + contentDescription = contentDescription, + forcedAvatarSize = null, + ) + } else { + ImageAvatar( + avatarData = avatarData, + avatarType = avatarType, + forcedAvatarSize = null, + modifier = modifier, + contentDescription = contentDescription, + ) + } } else -> { AvatarCluster( - avatars = heroes, + avatars = avatarType.heroes, modifier = modifier, hideAvatarImages = hideAvatarImage, contentDescription = contentDescription diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt new file mode 100644 index 0000000000..76f57d159e --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -0,0 +1,74 @@ +/* + * 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.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 io.element.android.libraries.designsystem.preview.ElementThemedPreview +import io.element.android.libraries.designsystem.preview.PreviewGroup +import io.element.android.libraries.designsystem.utils.CommonDrawables + +@Composable +fun SpaceAvatar( + avatarData: AvatarData, + avatarType: AvatarType.Space, + modifier: Modifier = Modifier, + isTombstoned: Boolean = false, + hideAvatarImage: Boolean = false, + contentDescription: String? = null, +) { + when { + isTombstoned -> TombstonedRoomAvatar( + size = avatarData.size, + avatarType = avatarType, + modifier = modifier, + contentDescription = contentDescription, + ) + avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar( + avatarData = avatarData, + avatarType = avatarType, + modifier = modifier, + contentDescription = contentDescription, + forcedAvatarSize = null, + ) + else -> ImageAvatar( + avatarData = avatarData, + avatarType = avatarType, + forcedAvatarSize = null, + 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(cornerSize = 16.dp), + ) + SpaceAvatar( + avatarData = anAvatarData(), + avatarType = AvatarType.Space(cornerSize = 16.dp), + 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/TextAvatar.kt index 65ebba3366..0af6aa4841 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/TextAvatar.kt @@ -8,9 +8,11 @@ package io.element.android.libraries.designsystem.components.avatar 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 @@ -34,12 +36,13 @@ internal fun TextAvatar( size: Dp, colors: AvatarColors, contentDescription: String?, + avatarType: AvatarType, modifier: Modifier = Modifier, ) { Box( modifier .size(size) - .clip(CircleShape) + .clip(avatarShape(avatarType)) .background(color = colors.background) ) { val fontSize = size.toSp() / 2 @@ -64,13 +67,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(8.dp), + ).forEach { avatarType -> + TextAvatar( + text = "AB", + size = 40.dp, + colors = AvatarColors( + background = ElementTheme.colors.bgSubtlePrimary, + foreground = ElementTheme.colors.iconPrimary, + ), + avatarType = avatarType, + 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/TombstonedRoomAvatar.kt index fe09be909d..7da0401b25 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/TombstonedRoomAvatar.kt @@ -16,9 +16,10 @@ import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewGroup @Composable -fun TombstonedRoomAvatar( +internal fun TombstonedRoomAvatar( size: AvatarSize, modifier: Modifier = Modifier, + avatarType: AvatarType, contentDescription: String? = null, ) { TextAvatar( @@ -29,7 +30,8 @@ fun TombstonedRoomAvatar( foreground = ElementTheme.colors.iconTertiary ), modifier = modifier, - contentDescription = contentDescription + avatarType = avatarType, + contentDescription = contentDescription, ) } @@ -38,6 +40,7 @@ fun TombstonedRoomAvatar( internal fun TombstonedRoomAvatarPreview() = ElementPreview { TombstonedRoomAvatar( size = AvatarSize.RoomListItem, + avatarType = AvatarType.Room(), contentDescription = null, ) } 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..8412c18826 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 @@ -35,6 +35,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 +50,7 @@ fun EditableAvatarView( displayName: String?, avatarUrl: Uri?, avatarSize: AvatarSize, + avatarType: AvatarType, onAvatarClick: () -> Unit, modifier: Modifier = Modifier, ) { @@ -74,12 +76,14 @@ fun EditableAvatarView( null, "mxc" -> { Avatar( avatarData = AvatarData(matrixId, displayName, avatarUrl?.toString(), size = avatarSize), + avatarType = avatarType, modifier = Modifier.fillMaxSize(), ) } else -> { UnsavedAvatar( avatarUri = avatarUrl, + avatarType = avatarType, modifier = Modifier.fillMaxSize(), ) } @@ -116,6 +120,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/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/UnsavedAvatar.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnsavedAvatar.kt index 3a31bf916e..161bffbab9 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,8 @@ 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.avatarShape +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 @@ -40,11 +43,12 @@ import io.element.android.libraries.designsystem.theme.temporaryColorBgSpecial @Composable fun UnsavedAvatar( avatarUri: Uri?, + avatarType: AvatarType, modifier: Modifier = Modifier, ) { val commonModifier = modifier .size(70.dp) - .clip(CircleShape) + .clip(avatarShape(avatarType)) if (avatarUri != null) { val context = LocalContext.current @@ -75,8 +79,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, AvatarType.User) + UnsavedAvatar(Uri.EMPTY, AvatarType.User) + UnsavedAvatar(null, AvatarType.Space(8.dp)) + UnsavedAvatar(Uri.EMPTY, AvatarType.Space(8.dp)) } } diff --git a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt index 10769b9aec..f9a95ac4b8 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt @@ -32,8 +32,9 @@ 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.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.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight @@ -214,12 +215,14 @@ private fun RoomSummaryView( .heightIn(56.dp), verticalAlignment = Alignment.CenterVertically ) { - RoomAvatar( + Avatar( avatarData = roomInfo.getAvatarData(size = AvatarSize.RoomSelectRoomListItem), - heroes = roomInfo.heroes.map { user -> - user.getAvatarData(size = AvatarSize.RoomSelectRoomListItem) - }.toPersistentList(), - isTombstoned = roomInfo.isTombstoned, + avatarType = AvatarType.Room( + heroes = roomInfo.heroes.map { user -> + user.getAvatarData(size = AvatarSize.RoomSelectRoomListItem) + }.toPersistentList(), + isTombstoned = roomInfo.isTombstoned, + ), ) Column( modifier = Modifier From cf01390b72c0d3bf9b29fc5974813f66ca8d6082 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Mon, 23 Jun 2025 15:19:46 +0000 Subject: [PATCH 031/156] Update screenshots --- ....designsystem.components.avatar_SpaceAvatar_Avatars_en.png | 3 +++ ...s.designsystem.components.avatar_TextAvatar_Avatars_en.png | 4 ++-- .../libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png | 4 ++-- ...ibraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png new file mode 100644 index 0000000000..1cd1400485 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d61143149a23cbb1549ee11b1ad00fd4eee16d173407bc847bde91c39cd1b5bc +size 9178 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 index c0cc7d6d18..faa0713a56 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0645d454bcaac9e38fe9b6400347ee0fc92a71ef531f72b9ec527f644e050862 -size 5488 +oid sha256:0b632082558328aa485712b8684016a84a9d1eaba7f96cd92b47d364e6c9169f +size 7981 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..38e8527fe3 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:e20e9a7264a6784fbaf6525e73a07318abd27bcf025541b880fd27ac0cca4ba4 +size 69466 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..05dae22db7 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:991318dc36c1e6b86a753241638c36adafb896f852f4d5d0e15dd251fa025311 +size 68974 From 2ac94f2827e10ac465cfdbbd8f43f61aa02324c0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 17:57:44 +0200 Subject: [PATCH 032/156] Cleanup --- .../impl/messagecomposer/suggestions/SuggestionsPickerView.kt | 3 --- .../designsystem/components/avatar/TombstonedRoomAvatar.kt | 2 +- .../android/libraries/matrix/ui/components/UnsavedAvatar.kt | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) 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 bb2e2c7f4d..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 @@ -114,14 +114,11 @@ private fun SuggestionItemView( is ResolvedSuggestion.Member -> suggestion.roomMember.userId.value is ResolvedSuggestion.Alias -> suggestion.roomAlias.value } - Avatar( avatarData = avatarData, avatarType = avatarType, modifier = Modifier.padding(start = 16.dp, top = 12.dp, bottom = 12.dp), ) - - Column( modifier = Modifier .fillMaxWidth() 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/TombstonedRoomAvatar.kt index 7da0401b25..2182c1b63e 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/TombstonedRoomAvatar.kt @@ -18,8 +18,8 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup @Composable internal fun TombstonedRoomAvatar( size: AvatarSize, - modifier: Modifier = Modifier, avatarType: AvatarType, + modifier: Modifier = Modifier, contentDescription: String? = null, ) { TextAvatar( 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 161bffbab9..cf20763d7d 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 @@ -28,8 +28,8 @@ 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.avatarShape 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 From dddf046b43e237380a75ce8571246c541bafc169 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 18:02:34 +0200 Subject: [PATCH 033/156] Extract ImageAvatar and InitialLetterAvatar to their own files. --- .../designsystem/components/avatar/Avatar.kt | 71 ------------------- .../components/avatar/ImageAvatar.kt | 66 +++++++++++++++++ .../components/avatar/InitialLetterAvatar.kt | 32 +++++++++ 3 files changed, 98 insertions(+), 71 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt 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 4f691c9f0d..7358bd4ce3 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,28 +9,17 @@ 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.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.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( @@ -95,66 +84,6 @@ private fun UserAvatar( } } -@Composable -internal fun ImageAvatar( - avatarData: AvatarData, - avatarType: AvatarType, - 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(avatarShape(avatarType)) - ) { - 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, - avatarType = avatarType, - forcedAvatarSize = forcedAvatarSize, - contentDescription = contentDescription, - ) - } - else -> InitialLetterAvatar( - avatarData = avatarData, - avatarType = avatarType, - forcedAvatarSize = forcedAvatarSize, - contentDescription = contentDescription, - ) - } - } -} - -@Composable -internal fun InitialLetterAvatar( - avatarData: AvatarData, - avatarType: AvatarType, - forcedAvatarSize: Dp?, - contentDescription: String?, - modifier: Modifier = Modifier, -) { - val avatarColors = AvatarColorsProvider.provide(avatarData.id) - TextAvatar( - text = avatarData.initialLetter, - size = forcedAvatarSize ?: avatarData.size.dp, - avatarType = avatarType, - colors = avatarColors, - contentDescription = contentDescription, - modifier = modifier - ) -} - @Preview(group = PreviewGroup.Avatars) @Composable internal fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) = diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt new file mode 100644 index 0000000000..38f861b0e8 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt @@ -0,0 +1,66 @@ +/* + * 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.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.layout.ContentScale +import androidx.compose.ui.unit.Dp +import coil3.compose.AsyncImagePainter +import coil3.compose.SubcomposeAsyncImage +import coil3.compose.SubcomposeAsyncImageContent +import timber.log.Timber + +@Composable +internal fun ImageAvatar( + avatarData: AvatarData, + avatarType: AvatarType, + forcedAvatarSize: Dp?, + modifier: Modifier = Modifier.Companion, + contentDescription: String? = null, +) { + val size = forcedAvatarSize ?: avatarData.size.dp + SubcomposeAsyncImage( + model = avatarData, + contentDescription = contentDescription, + contentScale = ContentScale.Companion.Crop, + modifier = modifier + .size(size) + .clip(avatarShape(avatarType)) + ) { + 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, + avatarType = avatarType, + forcedAvatarSize = forcedAvatarSize, + contentDescription = contentDescription, + ) + } + else -> InitialLetterAvatar( + avatarData = avatarData, + avatarType = avatarType, + forcedAvatarSize = forcedAvatarSize, + contentDescription = contentDescription, + ) + } + } +} diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt new file mode 100644 index 0000000000..4c54d337ef --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.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.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp +import io.element.android.libraries.designsystem.colors.AvatarColorsProvider + +@Composable +internal fun InitialLetterAvatar( + avatarData: AvatarData, + avatarType: AvatarType, + forcedAvatarSize: Dp?, + contentDescription: String?, + modifier: Modifier = Modifier.Companion, +) { + val avatarColors = AvatarColorsProvider.provide(avatarData.id) + TextAvatar( + text = avatarData.initialLetter, + size = forcedAvatarSize ?: avatarData.size.dp, + avatarType = avatarType, + colors = avatarColors, + contentDescription = contentDescription, + modifier = modifier + ) +} From e202fbfbd909476830448d1c34eb6a9adc173882 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 18:03:53 +0200 Subject: [PATCH 034/156] AvatarType is Immutable. --- .../libraries/designsystem/components/avatar/AvatarType.kt | 2 ++ 1 file changed, 2 insertions(+) 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 index d210de954b..9e030a4349 100644 --- 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 @@ -7,10 +7,12 @@ package io.element.android.libraries.designsystem.components.avatar +import androidx.compose.runtime.Immutable import androidx.compose.ui.unit.Dp import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +@Immutable sealed interface AvatarType { data object User : AvatarType From 59aec1290672ecefd87c00879cb0c9e845f40898 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 18:31:14 +0200 Subject: [PATCH 035/156] Move isTombstoned to AvatarType.Space --- .../designsystem/components/avatar/AvatarType.kt | 1 + .../designsystem/components/avatar/SpaceAvatar.kt | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) 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 index 9e030a4349..720a0b0e6a 100644 --- 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 @@ -23,5 +23,6 @@ sealed interface AvatarType { data class Space( val cornerSize: Dp, + val isTombstoned: Boolean = false, ) : AvatarType } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt index 76f57d159e..65906244e6 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -23,12 +23,11 @@ fun SpaceAvatar( avatarData: AvatarData, avatarType: AvatarType.Space, modifier: Modifier = Modifier, - isTombstoned: Boolean = false, hideAvatarImage: Boolean = false, contentDescription: String? = null, ) { when { - isTombstoned -> TombstonedRoomAvatar( + avatarType.isTombstoned -> TombstonedRoomAvatar( size = avatarData.size, avatarType = avatarType, modifier = modifier, @@ -67,8 +66,10 @@ internal fun SpaceAvatarPreview() = ) SpaceAvatar( avatarData = anAvatarData(), - avatarType = AvatarType.Space(cornerSize = 16.dp), - isTombstoned = true, + avatarType = AvatarType.Space( + cornerSize = 16.dp, + isTombstoned = true, + ), ) } } From 2bcffe80de57031f34a3f076203fac8be42dab6b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 18:34:52 +0200 Subject: [PATCH 036/156] Let AvatarType be the receiver of avatarShape() --- .../designsystem/components/avatar/AvatarShape.kt | 8 +++----- .../designsystem/components/avatar/ImageAvatar.kt | 2 +- .../designsystem/components/avatar/TextAvatar.kt | 2 +- .../libraries/matrix/ui/components/UnsavedAvatar.kt | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) 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 index dff82a5a3d..8f80286abf 100644 --- 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 @@ -13,11 +13,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Shape @Composable -fun avatarShape( - avatarType: AvatarType, -): Shape { - return when (avatarType) { - is AvatarType.Space -> RoundedCornerShape(avatarType.cornerSize) +fun AvatarType.avatarShape(): Shape { + return when (this) { + is AvatarType.Space -> RoundedCornerShape(cornerSize) is AvatarType.Room, AvatarType.User -> CircleShape } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt index 38f861b0e8..796ed6dfb4 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt @@ -36,7 +36,7 @@ internal fun ImageAvatar( contentScale = ContentScale.Companion.Crop, modifier = modifier .size(size) - .clip(avatarShape(avatarType)) + .clip(avatarType.avatarShape()) ) { val collectedState by painter.state.collectAsState() when (val state = collectedState) { 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/TextAvatar.kt index 0af6aa4841..38200ef8c6 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/TextAvatar.kt @@ -42,7 +42,7 @@ internal fun TextAvatar( Box( modifier .size(size) - .clip(avatarShape(avatarType)) + .clip(avatarType.avatarShape()) .background(color = colors.background) ) { val fontSize = size.toSp() / 2 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 cf20763d7d..5a9ee72c75 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 @@ -48,7 +48,7 @@ fun UnsavedAvatar( ) { val commonModifier = modifier .size(70.dp) - .clip(avatarShape(avatarType)) + .clip(avatarType.avatarShape()) if (avatarUri != null) { val context = LocalContext.current From a676d5fae147f05d16c6f49e4002a4366afeca35 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:24:03 +0200 Subject: [PATCH 037/156] Extract UserAvatar to its own file. --- .../designsystem/components/avatar/Avatar.kt | 27 ------------- .../components/avatar/UserAvatar.kt | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt 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 7358bd4ce3..508c945555 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 @@ -57,33 +57,6 @@ fun Avatar( } } -@Composable -private fun UserAvatar( - avatarData: AvatarData, - modifier: Modifier = Modifier, - contentDescription: String? = null, - forcedAvatarSize: Dp? = null, - hideImage: Boolean = false, -) { - if (avatarData.url.isNullOrBlank() || hideImage) { - InitialLetterAvatar( - avatarData = avatarData, - avatarType = AvatarType.User, - forcedAvatarSize = forcedAvatarSize, - modifier = modifier, - contentDescription = contentDescription, - ) - } else { - ImageAvatar( - avatarData = avatarData, - avatarType = AvatarType.User, - forcedAvatarSize = forcedAvatarSize, - modifier = modifier, - contentDescription = contentDescription, - ) - } -} - @Preview(group = PreviewGroup.Avatars) @Composable internal fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) = diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt new file mode 100644 index 0000000000..54b0708078 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt @@ -0,0 +1,39 @@ +/* + * 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.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp + +@Composable +internal fun UserAvatar( + avatarData: AvatarData, + modifier: Modifier = Modifier, + contentDescription: String? = null, + forcedAvatarSize: Dp? = null, + hideImage: Boolean = false, +) { + if (avatarData.url.isNullOrBlank() || hideImage) { + InitialLetterAvatar( + avatarData = avatarData, + avatarType = AvatarType.User, + forcedAvatarSize = forcedAvatarSize, + modifier = modifier, + contentDescription = contentDescription, + ) + } else { + ImageAvatar( + avatarData = avatarData, + avatarType = AvatarType.User, + forcedAvatarSize = forcedAvatarSize, + modifier = modifier, + contentDescription = contentDescription, + ) + } +} From 0cc11ba6265d910b96a74161ab17833c04cf7101 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:24:40 +0200 Subject: [PATCH 038/156] Cleanup code rework by IDE. --- .../libraries/designsystem/components/avatar/ImageAvatar.kt | 2 +- .../designsystem/components/avatar/InitialLetterAvatar.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt index 796ed6dfb4..f0161469e5 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt @@ -26,7 +26,7 @@ internal fun ImageAvatar( avatarData: AvatarData, avatarType: AvatarType, forcedAvatarSize: Dp?, - modifier: Modifier = Modifier.Companion, + modifier: Modifier = Modifier, contentDescription: String? = null, ) { val size = forcedAvatarSize ?: avatarData.size.dp diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt index 4c54d337ef..2534db52a1 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt @@ -18,7 +18,7 @@ internal fun InitialLetterAvatar( avatarType: AvatarType, forcedAvatarSize: Dp?, contentDescription: String?, - modifier: Modifier = Modifier.Companion, + modifier: Modifier = Modifier, ) { val avatarColors = AvatarColorsProvider.provide(avatarData.id) TextAvatar( From b36f68b8c401e6e5c077d69af4858ce6e5cd9317 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:25:23 +0200 Subject: [PATCH 039/156] SpaceAvatar can be internal --- .../libraries/designsystem/components/avatar/SpaceAvatar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt index 65906244e6..6f8ec2fda9 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -19,7 +19,7 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.utils.CommonDrawables @Composable -fun SpaceAvatar( +internal fun SpaceAvatar( avatarData: AvatarData, avatarType: AvatarType.Space, modifier: Modifier = Modifier, From 63d8d9b09e2a37b51f899cd6d3855b5f07d807fb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:27:40 +0200 Subject: [PATCH 040/156] Remove default param for AvatarCluster.avatarType --- .../libraries/designsystem/components/avatar/AvatarCluster.kt | 3 ++- .../libraries/designsystem/components/avatar/RoomAvatar.kt | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) 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/AvatarCluster.kt index 8406c951af..4827300394 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/AvatarCluster.kt @@ -33,8 +33,8 @@ private const val MAX_AVATAR_COUNT = 4 @Composable internal fun AvatarCluster( avatars: ImmutableList, + avatarType: AvatarType, modifier: Modifier = Modifier, - avatarType: AvatarType = AvatarType.User, hideAvatarImages: Boolean = false, contentDescription: String? = null, ) { @@ -119,6 +119,7 @@ internal fun AvatarClusterPreview() = ElementThemedPreview { for (ngOfAvatars in 1..5) { AvatarCluster( avatars = List(ngOfAvatars) { anAvatarData(it) }.toPersistentList(), + avatarType = AvatarType.User, ) } } 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/RoomAvatar.kt index f01d71e41d..1b14a149d3 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/RoomAvatar.kt @@ -49,6 +49,8 @@ internal fun RoomAvatar( else -> { AvatarCluster( 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 From 52ad634504aa3efa967c56eca4054b75727051c4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:36:53 +0200 Subject: [PATCH 041/156] Remove default param for Avatar.avatarType --- .../call/impl/ui/IncomingCallScreen.kt | 4 +- .../notifications/NotificationsOptInView.kt | 2 + .../knockrequests/impl/banner/AvatarRow.kt | 56 ++++++++++--------- .../impl/banner/KnockRequestsBannerView.kt | 7 ++- .../impl/list/KnockRequestsListView.kt | 6 +- .../impl/actionlist/ActionListView.kt | 8 ++- .../components/TimelineItemCallNotifyView.kt | 6 +- .../components/TimelineItemEventRow.kt | 2 + .../reactionsummary/ReactionSummaryView.kt | 6 +- .../receipt/TimelineItemReadReceiptView.kt | 28 +++++----- .../changeroles/ChangeRolesView.kt | 6 +- .../impl/components/RoomListTopBar.kt | 2 + .../impl/RoomMemberModerationView.kt | 2 + .../shared/UserProfileHeaderSection.kt | 2 + .../impl/ui/VerificationUserProfileContent.kt | 8 ++- .../atomic/molecules/ComposerAlertMolecule.kt | 6 +- .../designsystem/components/Bloom.kt | 2 + .../designsystem/components/avatar/Avatar.kt | 7 ++- .../components/avatar/DmAvatars.kt | 2 + .../components/avatar/UserAvatarPreview.kt | 5 +- .../CreateDmConfirmationBottomSheet.kt | 2 + .../matrix/ui/components/InviteSenderView.kt | 7 ++- .../matrix/ui/components/MatrixUserHeader.kt | 2 + .../matrix/ui/components/SelectedUser.kt | 6 +- .../matrix/ui/components/UnresolvedUserRow.kt | 6 +- .../libraries/matrix/ui/components/UserRow.kt | 6 +- .../impl/details/MediaDetailsBottomSheet.kt | 6 +- 27 files changed, 143 insertions(+), 59 deletions(-) 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/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/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..bc0fbbdbeb 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 @@ -43,6 +44,7 @@ import kotlinx.collections.immutable.toImmutableList @Composable fun AvatarRow( avatarDataList: ImmutableList, + avatarType: AvatarType, modifier: Modifier = Modifier, overlapRatio: Float = 0.5f, ) { @@ -58,35 +60,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 +125,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..7e79203f31 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,6 +56,7 @@ 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 @@ -318,7 +319,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 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..aec3b8219e 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 @@ -74,6 +74,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 +257,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 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..e4aee2febd 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 @@ -55,7 +56,10 @@ internal fun TimelineItemCallNotifyView( 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/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/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..2b1ee08f66 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,6 +50,7 @@ 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 @@ -341,7 +342,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/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt index 1f4c86f579..bee535d8cd 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt @@ -48,6 +48,7 @@ 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 @@ -297,6 +298,7 @@ private fun NavigationIcon( Box { Avatar( avatarData = avatarData, + avatarType = AvatarType.User, contentDescription = stringResource(CommonStrings.common_settings), ) if (showAvatarIndicator) { 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/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..2732e770f4 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 @@ -30,6 +30,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,6 +62,7 @@ fun UserProfileHeaderSection( ) { Avatar( avatarData = AvatarData(userId.value, userName, avatarUrl, AvatarSize.UserHeader), + avatarType = AvatarType.User, modifier = Modifier .clip(CircleShape) .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) } 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/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/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/avatar/Avatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt index 508c945555..93e458bfcc 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 @@ -24,8 +24,8 @@ import io.element.android.libraries.designsystem.utils.CommonDrawables @Composable fun Avatar( avatarData: AvatarData, + avatarType: AvatarType, modifier: Modifier = Modifier, - avatarType: AvatarType = AvatarType.User, contentDescription: String? = null, // If not null, will be used instead of the size from avatarData forcedAvatarSize: Dp? = null, @@ -67,7 +67,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/DmAvatars.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/DmAvatars.kt index 7b4e6dee86..d0134fca78 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 @@ -55,6 +55,7 @@ fun DmAvatars( // Draw user avatar and cut top end corner Avatar( avatarData = userAvatarData, + avatarType = AvatarType.User, modifier = Modifier .align(Alignment.BottomStart) .graphicsLayer { @@ -85,6 +86,7 @@ fun DmAvatars( // Draw other user avatar Avatar( avatarData = otherUserAvatarData, + avatarType = AvatarType.User, modifier = Modifier .align(Alignment.TopEnd) .clip(CircleShape) 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/UserAvatarPreview.kt index 8797c2750a..f3b55e53d2 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/UserAvatarPreview.kt @@ -33,7 +33,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/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/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/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/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/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 From 9e65b7fa637fc4ae38e08c299e8cc9d9bf299406 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:41:15 +0200 Subject: [PATCH 042/156] Extract subcomposable InitialOrImageAvatar --- .../components/avatar/InitialOrImageAvatar.kt | 39 +++++++++++++++++++ .../components/avatar/RoomAvatar.kt | 25 ++++-------- .../components/avatar/SpaceAvatar.kt | 10 +---- .../components/avatar/UserAvatar.kt | 25 ++++-------- 4 files changed, 57 insertions(+), 42 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt new file mode 100644 index 0000000000..e58a9f33c5 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt @@ -0,0 +1,39 @@ +/* + * 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.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp + +@Composable +internal fun InitialOrImageAvatar( + avatarData: AvatarData, + hideAvatarImage: Boolean, + forcedAvatarSize: Dp?, + avatarType: AvatarType, + modifier: Modifier, + contentDescription: String? +) { + when { + avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar( + avatarData = avatarData, + avatarType = avatarType, + forcedAvatarSize = forcedAvatarSize, + modifier = modifier, + contentDescription = contentDescription, + ) + else -> ImageAvatar( + avatarData = avatarData, + avatarType = avatarType, + 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/RoomAvatar.kt index 1b14a149d3..3c3ec8b789 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/RoomAvatar.kt @@ -28,23 +28,14 @@ internal fun RoomAvatar( ) } avatarData.url != null || avatarType.heroes.isEmpty() -> { - if (avatarData.url.isNullOrBlank() || hideAvatarImage) { - InitialLetterAvatar( - avatarData = avatarData, - avatarType = avatarType, - modifier = modifier, - contentDescription = contentDescription, - forcedAvatarSize = null, - ) - } else { - ImageAvatar( - avatarData = avatarData, - avatarType = avatarType, - forcedAvatarSize = null, - modifier = modifier, - contentDescription = contentDescription, - ) - } + InitialOrImageAvatar( + avatarData = avatarData, + hideAvatarImage = hideAvatarImage, + avatarType = avatarType, + forcedAvatarSize = null, + modifier = modifier, + contentDescription = contentDescription, + ) } else -> { AvatarCluster( diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt index 6f8ec2fda9..e70edb0e21 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -33,15 +33,9 @@ internal fun SpaceAvatar( modifier = modifier, contentDescription = contentDescription, ) - avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar( - avatarData = avatarData, - avatarType = avatarType, - modifier = modifier, - contentDescription = contentDescription, - forcedAvatarSize = null, - ) - else -> ImageAvatar( + else -> InitialOrImageAvatar( avatarData = avatarData, + hideAvatarImage = hideAvatarImage, avatarType = avatarType, forcedAvatarSize = null, modifier = modifier, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt index 54b0708078..699b92b3af 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt @@ -19,21 +19,12 @@ internal fun UserAvatar( forcedAvatarSize: Dp? = null, hideImage: Boolean = false, ) { - if (avatarData.url.isNullOrBlank() || hideImage) { - InitialLetterAvatar( - avatarData = avatarData, - avatarType = AvatarType.User, - forcedAvatarSize = forcedAvatarSize, - modifier = modifier, - contentDescription = contentDescription, - ) - } else { - ImageAvatar( - avatarData = avatarData, - avatarType = AvatarType.User, - forcedAvatarSize = forcedAvatarSize, - modifier = modifier, - contentDescription = contentDescription, - ) - } + InitialOrImageAvatar( + avatarData = avatarData, + hideAvatarImage = hideImage, + avatarType = AvatarType.User, + modifier = modifier, + contentDescription = contentDescription, + forcedAvatarSize = forcedAvatarSize, + ) } From 14bb7d3bd1885eb78d83131e686ca23be3974565 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:51:56 +0200 Subject: [PATCH 043/156] Provide avatarShape: Shape instead of AvatarType to sub composable functions --- .../designsystem/components/avatar/ImageAvatar.kt | 11 ++++++----- .../components/avatar/InitialLetterAvatar.kt | 5 +++-- .../components/avatar/InitialOrImageAvatar.kt | 7 ++++--- .../designsystem/components/avatar/RoomAvatar.kt | 4 ++-- .../designsystem/components/avatar/SpaceAvatar.kt | 4 ++-- .../designsystem/components/avatar/TextAvatar.kt | 8 +++++--- .../components/avatar/TombstonedRoomAvatar.kt | 8 +++++--- .../designsystem/components/avatar/UserAvatar.kt | 2 +- 8 files changed, 28 insertions(+), 21 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt index f0161469e5..5d9f124127 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt @@ -14,6 +14,7 @@ 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 @@ -24,7 +25,7 @@ import timber.log.Timber @Composable internal fun ImageAvatar( avatarData: AvatarData, - avatarType: AvatarType, + avatarShape: Shape, forcedAvatarSize: Dp?, modifier: Modifier = Modifier, contentDescription: String? = null, @@ -35,8 +36,8 @@ internal fun ImageAvatar( contentDescription = contentDescription, contentScale = ContentScale.Companion.Crop, modifier = modifier - .size(size) - .clip(avatarType.avatarShape()) + .size(size) + .clip(avatarShape) ) { val collectedState by painter.state.collectAsState() when (val state = collectedState) { @@ -50,14 +51,14 @@ internal fun ImageAvatar( } InitialLetterAvatar( avatarData = avatarData, - avatarType = avatarType, + avatarShape = avatarShape, forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) } else -> InitialLetterAvatar( avatarData = avatarData, - avatarType = avatarType, + avatarShape = avatarShape, forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt index 2534db52a1..95add851de 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt @@ -9,13 +9,14 @@ package io.element.android.libraries.designsystem.components.avatar 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 @Composable internal fun InitialLetterAvatar( avatarData: AvatarData, - avatarType: AvatarType, + avatarShape: Shape, forcedAvatarSize: Dp?, contentDescription: String?, modifier: Modifier = Modifier, @@ -24,7 +25,7 @@ internal fun InitialLetterAvatar( TextAvatar( text = avatarData.initialLetter, size = forcedAvatarSize ?: avatarData.size.dp, - avatarType = avatarType, + avatarShape = avatarShape, colors = avatarColors, contentDescription = contentDescription, modifier = modifier diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt index e58a9f33c5..ce4282f950 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.designsystem.components.avatar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.unit.Dp @Composable @@ -16,21 +17,21 @@ internal fun InitialOrImageAvatar( avatarData: AvatarData, hideAvatarImage: Boolean, forcedAvatarSize: Dp?, - avatarType: AvatarType, + avatarShape: Shape, modifier: Modifier, contentDescription: String? ) { when { avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar( avatarData = avatarData, - avatarType = avatarType, + avatarShape = avatarShape, forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, ) else -> ImageAvatar( avatarData = avatarData, - avatarType = avatarType, + 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/RoomAvatar.kt index 3c3ec8b789..b194262c95 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/RoomAvatar.kt @@ -23,7 +23,7 @@ internal fun RoomAvatar( TombstonedRoomAvatar( size = avatarData.size, modifier = modifier, - avatarType = avatarType, + avatarShape = avatarType.avatarShape(), contentDescription = contentDescription ) } @@ -31,7 +31,7 @@ internal fun RoomAvatar( InitialOrImageAvatar( avatarData = avatarData, hideAvatarImage = hideAvatarImage, - avatarType = avatarType, + avatarShape = avatarType.avatarShape(), forcedAvatarSize = null, modifier = modifier, contentDescription = contentDescription, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt index e70edb0e21..45d0bf4cc9 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -29,14 +29,14 @@ internal fun SpaceAvatar( when { avatarType.isTombstoned -> TombstonedRoomAvatar( size = avatarData.size, - avatarType = avatarType, + avatarShape = avatarType.avatarShape(), modifier = modifier, contentDescription = contentDescription, ) else -> InitialOrImageAvatar( avatarData = avatarData, hideAvatarImage = hideAvatarImage, - avatarType = avatarType, + avatarShape = avatarType.avatarShape(), forcedAvatarSize = null, modifier = modifier, contentDescription = contentDescription, 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/TextAvatar.kt index 38200ef8c6..d2963a9a80 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/TextAvatar.kt @@ -13,10 +13,12 @@ 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 @@ -36,13 +38,13 @@ internal fun TextAvatar( size: Dp, colors: AvatarColors, contentDescription: String?, - avatarType: AvatarType, + avatarShape: Shape, modifier: Modifier = Modifier, ) { Box( modifier .size(size) - .clip(avatarType.avatarShape()) + .clip(avatarShape) .background(color = colors.background) ) { val fontSize = size.toSp() / 2 @@ -83,7 +85,7 @@ internal fun TextAvatarPreview() = ElementPreview { background = ElementTheme.colors.bgSubtlePrimary, foreground = ElementTheme.colors.iconPrimary, ), - avatarType = avatarType, + avatarShape = CircleShape, 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/TombstonedRoomAvatar.kt index 2182c1b63e..7fcbb13ea1 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/TombstonedRoomAvatar.kt @@ -7,8 +7,10 @@ package io.element.android.libraries.designsystem.components.avatar +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 io.element.android.compound.theme.AvatarColors import io.element.android.compound.theme.ElementTheme @@ -18,7 +20,7 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup @Composable internal fun TombstonedRoomAvatar( size: AvatarSize, - avatarType: AvatarType, + avatarShape: Shape, modifier: Modifier = Modifier, contentDescription: String? = null, ) { @@ -30,7 +32,7 @@ internal fun TombstonedRoomAvatar( foreground = ElementTheme.colors.iconTertiary ), modifier = modifier, - avatarType = avatarType, + avatarShape = avatarShape, contentDescription = contentDescription, ) } @@ -40,7 +42,7 @@ internal fun TombstonedRoomAvatar( internal fun TombstonedRoomAvatarPreview() = ElementPreview { TombstonedRoomAvatar( size = AvatarSize.RoomListItem, - avatarType = AvatarType.Room(), + avatarShape = CircleShape, contentDescription = null, ) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt index 699b92b3af..1abbadb119 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt @@ -22,7 +22,7 @@ internal fun UserAvatar( InitialOrImageAvatar( avatarData = avatarData, hideAvatarImage = hideImage, - avatarType = AvatarType.User, + avatarShape = AvatarType.User.avatarShape(), modifier = modifier, contentDescription = contentDescription, forcedAvatarSize = forcedAvatarSize, From abd92d05d4a5884fa2a1d98c10065f7523e4fcf2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 21:56:20 +0200 Subject: [PATCH 044/156] Avoid potential infinite loop. --- .../designsystem/components/avatar/AvatarCluster.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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/AvatarCluster.kt index 4827300394..d2dae9e25c 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/AvatarCluster.kt @@ -49,12 +49,13 @@ internal fun AvatarCluster( error("Unsupported number of avatars: 0") } 1 -> { - Avatar( + InitialOrImageAvatar( avatarData = limitedAvatars[0], - avatarType = avatarType, + hideAvatarImage = hideAvatarImages, + avatarShape = avatarType.avatarShape(), + forcedAvatarSize = null, modifier = modifier, contentDescription = contentDescription, - hideImage = hideAvatarImages ) } else -> { From 57ffa2615c944d924e619a0735accb4b5ebf4652 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 23 Jun 2025 22:00:25 +0200 Subject: [PATCH 045/156] Improve preview of AvatarCluster to show all types. --- .../designsystem/components/avatar/Avatar.kt | 2 + .../components/avatar/AvatarCluster.kt | 40 ++++++++++++++----- .../components/avatar/RoomAvatar.kt | 6 ++- .../components/avatar/SpaceAvatar.kt | 6 ++- .../components/avatar/TombstonedRoomAvatar.kt | 8 ++-- 5 files changed, 45 insertions(+), 17 deletions(-) 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 93e458bfcc..ceb6b64528 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 @@ -38,6 +38,7 @@ fun Avatar( avatarType = avatarType, modifier = modifier, hideAvatarImage = hideImage, + forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) AvatarType.User -> UserAvatar( @@ -52,6 +53,7 @@ fun Avatar( avatarType = avatarType, modifier = modifier, hideAvatarImage = hideImage, + forcedAvatarSize = forcedAvatarSize, contentDescription = contentDescription, ) } 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/AvatarCluster.kt index d2dae9e25c..8c1c650aa2 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/AvatarCluster.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.designsystem.components.avatar 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 @@ -98,11 +99,20 @@ internal fun AvatarCluster( y = yOffset, ) ) { - Avatar( + InitialOrImageAvatar( avatarData = heroAvatar, + hideAvatarImage = hideAvatarImages, + avatarShape = avatarType.let { avatarType -> + if (avatarType is AvatarType.Space) { + // Reduce corner size for small Space avatars + avatarType.copy(cornerSize = avatarType.cornerSize / 2f) + } else { + avatarType + } + }.avatarShape(), forcedAvatarSize = heroAvatarSize, - avatarType = avatarType, - hideImage = hideAvatarImages, + modifier = Modifier, + contentDescription = contentDescription, ) } } @@ -114,14 +124,24 @@ internal 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(), - avatarType = AvatarType.User, - ) + listOf( + AvatarType.User, + AvatarType.Room(), + AvatarType.Space(8.dp), + ).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/RoomAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/RoomAvatar.kt index b194262c95..a27a4e166a 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/RoomAvatar.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.designsystem.components.avatar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp @Composable internal fun RoomAvatar( @@ -16,12 +17,13 @@ internal fun RoomAvatar( avatarType: AvatarType.Room, modifier: Modifier = Modifier, hideAvatarImage: Boolean = false, + forcedAvatarSize: Dp? = null, contentDescription: String? = null, ) { when { avatarType.isTombstoned -> { TombstonedRoomAvatar( - size = avatarData.size, + size = forcedAvatarSize ?: avatarData.size.dp, modifier = modifier, avatarShape = avatarType.avatarShape(), contentDescription = contentDescription @@ -32,7 +34,7 @@ internal fun RoomAvatar( avatarData = avatarData, hideAvatarImage = hideAvatarImage, avatarShape = avatarType.avatarShape(), - forcedAvatarSize = null, + forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt index 45d0bf4cc9..bae590c006 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt @@ -13,6 +13,7 @@ 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.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup @@ -23,12 +24,13 @@ internal fun SpaceAvatar( avatarData: AvatarData, avatarType: AvatarType.Space, modifier: Modifier = Modifier, + forcedAvatarSize: Dp? = null, hideAvatarImage: Boolean = false, contentDescription: String? = null, ) { when { avatarType.isTombstoned -> TombstonedRoomAvatar( - size = avatarData.size, + size = forcedAvatarSize ?: avatarData.size.dp, avatarShape = avatarType.avatarShape(), modifier = modifier, contentDescription = contentDescription, @@ -37,7 +39,7 @@ internal fun SpaceAvatar( avatarData = avatarData, hideAvatarImage = hideAvatarImage, avatarShape = avatarType.avatarShape(), - forcedAvatarSize = null, + forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, ) 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/TombstonedRoomAvatar.kt index 7fcbb13ea1..4610f22514 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/TombstonedRoomAvatar.kt @@ -12,6 +12,8 @@ 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 @@ -19,14 +21,14 @@ import io.element.android.libraries.designsystem.preview.PreviewGroup @Composable internal fun TombstonedRoomAvatar( - size: AvatarSize, + 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 @@ -41,7 +43,7 @@ internal fun TombstonedRoomAvatar( @Composable internal fun TombstonedRoomAvatarPreview() = ElementPreview { TombstonedRoomAvatar( - size = AvatarSize.RoomListItem, + size = 52.dp, avatarShape = CircleShape, contentDescription = null, ) From e5b7e653727b2f2c08aae9b93cb91ef8bc2aed7f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:06:08 +0200 Subject: [PATCH 046/156] Update screenshot --- ...esignsystem.components.avatar_AvatarCluster_Avatars_en.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 72b14d9cc3..337db7278a 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6afcae51ee69dcdb9dbf60c8f72e55b9b07e4feb72dfba0a40ffeebed6ab681 -size 25730 +oid sha256:e1f8da07dfd80edeb381f78397114526d732ab1660ba95bd253690112c348cb4 +size 57397 From 69ceceab41c06f9746544771b327e72e3fd33cb4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:06:29 +0200 Subject: [PATCH 047/156] Fix regression on preview. --- .../libraries/designsystem/components/avatar/TextAvatar.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/TextAvatar.kt index d2963a9a80..2869d0d6b5 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/TextAvatar.kt @@ -85,7 +85,7 @@ internal fun TextAvatarPreview() = ElementPreview { background = ElementTheme.colors.bgSubtlePrimary, foreground = ElementTheme.colors.iconPrimary, ), - avatarShape = CircleShape, + avatarShape = avatarType.avatarShape(), contentDescription = null, ) } From 8281a9d8ce088f32ff8f95ab918e5b1253cd9ebb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:06:39 +0200 Subject: [PATCH 048/156] Quality --- .../android/features/knockrequests/impl/banner/AvatarRow.kt | 1 + .../designsystem/components/avatar/InitialOrImageAvatar.kt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) 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 bc0fbbdbeb..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 @@ -37,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 diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt index ce4282f950..7c583d3ddf 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt @@ -18,8 +18,8 @@ internal fun InitialOrImageAvatar( hideAvatarImage: Boolean, forcedAvatarSize: Dp?, avatarShape: Shape, - modifier: Modifier, - contentDescription: String? + contentDescription: String?, + modifier: Modifier = Modifier, ) { when { avatarData.url.isNullOrBlank() || hideAvatarImage -> InitialLetterAvatar( From 6161e20f6cda2f10d5cac931ee29c3bdfeeca495 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:08:15 +0200 Subject: [PATCH 049/156] Replace `values()` by `entries` --- .../designsystem/components/avatar/AvatarDataProvider.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From 6cbed45acfaf9ebbf23b1f56aa6c7960b6de4065 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:12:12 +0200 Subject: [PATCH 050/156] Move internal elements to `internal` package. --- .../libraries/designsystem/components/avatar/Avatar.kt | 3 +++ .../components/avatar/{ => internal}/AvatarCluster.kt | 6 +++++- .../components/avatar/{ => internal}/ImageAvatar.kt | 3 ++- .../components/avatar/{ => internal}/InitialLetterAvatar.kt | 3 ++- .../avatar/{ => internal}/InitialOrImageAvatar.kt | 3 ++- .../components/avatar/{ => internal}/RoomAvatar.kt | 5 ++++- .../components/avatar/{ => internal}/SpaceAvatar.kt | 6 +++++- .../components/avatar/{ => internal}/TextAvatar.kt | 5 +++-- .../avatar/{ => internal}/TombstonedRoomAvatar.kt | 2 +- .../components/avatar/{ => internal}/UserAvatar.kt | 5 ++++- .../components/avatar/{ => internal}/UserAvatarPreview.kt | 5 ++++- 11 files changed, 35 insertions(+), 11 deletions(-) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/AvatarCluster.kt (94%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/ImageAvatar.kt (96%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/InitialLetterAvatar.kt (91%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/InitialOrImageAvatar.kt (93%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/RoomAvatar.kt (87%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/SpaceAvatar.kt (87%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/TextAvatar.kt (94%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/TombstonedRoomAvatar.kt (99%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/UserAvatar.kt (77%) rename libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/{ => internal}/UserAvatarPreview.kt (86%) 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 ceb6b64528..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 @@ -16,6 +16,9 @@ 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 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 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 94% 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 8c1c650aa2..940917ecfd 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,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.Box @@ -20,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 diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt similarity index 96% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.kt index 5d9f124127..db30a94830 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/ImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/ImageAvatar.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.size import androidx.compose.runtime.Composable @@ -20,6 +20,7 @@ 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 diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt similarity index 91% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt index 95add851de..6503917b23 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialLetterAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialLetterAvatar.kt @@ -5,13 +5,14 @@ * 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 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( diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt similarity index 93% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt index 7c583d3ddf..3111048d3b 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/InitialOrImageAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/InitialOrImageAvatar.kt @@ -5,12 +5,13 @@ * 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 androidx.compose.ui.graphics.Shape import androidx.compose.ui.unit.Dp +import io.element.android.libraries.designsystem.components.avatar.AvatarData @Composable internal fun InitialOrImageAvatar( 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 87% 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 a27a4e166a..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,11 +5,14 @@ * 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 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 RoomAvatar( diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt similarity index 87% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.kt index bae590c006..8f5635105d 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/SpaceAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/SpaceAvatar.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.Row @@ -15,6 +15,10 @@ 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 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 94% 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 2869d0d6b5..c5ce75ad5a 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,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.background import androidx.compose.foundation.layout.Arrangement @@ -13,7 +13,6 @@ 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 @@ -27,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 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 99% 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 4610f22514..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,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.shape.CircleShape import androidx.compose.runtime.Composable diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt similarity index 77% rename from libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt rename to libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt index 1abbadb119..ad0275593d 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/UserAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/UserAvatar.kt @@ -5,11 +5,14 @@ * 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 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( 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 86% 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 f3b55e53d2..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 From cadca03a7e7f2e6f30e5983ecb781e8c8ad95661 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:18:28 +0200 Subject: [PATCH 051/156] Add preview with an image. --- .../user/editprofile/EditUserProfileStateProvider.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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, From 045ca6fbb21756890cd26b5d8ae049b28df7dbb7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 09:49:21 +0200 Subject: [PATCH 052/156] Ensure AvatarSize is correctly used in UnsavedAvatar, instead of hard coded size. --- .../impl/configureroom/ConfigureRoomView.kt | 2 ++ .../matrix/ui/components/EditableAvatarView.kt | 12 +++++++----- .../matrix/ui/components/UnsavedAvatar.kt | 14 ++++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) 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 afc6ef0bde..f68f434707 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,6 +40,7 @@ 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 @@ -220,6 +221,7 @@ private fun RoomNameWithAvatar( ) { UnsavedAvatar( avatarUri = avatarUri, + avatarSize = AvatarSize.EditRoomDetails, avatarType = AvatarType.Room(), modifier = Modifier.clickable(onClick = onAvatarClick), ) 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 8412c18826..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 @@ -61,7 +60,6 @@ fun EditableAvatarView( val a11yAvatar = stringResource(CommonStrings.a11y_avatar) Box( modifier = Modifier - .size(avatarSize.dp) .clickable( interactionSource = remember { MutableInteractionSource() }, onClick = onAvatarClick, @@ -75,16 +73,20 @@ fun EditableAvatarView( when (avatarUrl?.scheme) { null, "mxc" -> { Avatar( - avatarData = AvatarData(matrixId, displayName, avatarUrl?.toString(), size = avatarSize), + avatarData = AvatarData( + id = matrixId, + name = displayName, + url = avatarUrl?.toString(), + size = avatarSize, + ), avatarType = avatarType, - modifier = Modifier.fillMaxSize(), ) } else -> { UnsavedAvatar( avatarUri = avatarUrl, + avatarSize = avatarSize, avatarType = avatarType, - modifier = Modifier.fillMaxSize(), ) } } 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 5a9ee72c75..db26ecb8da 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 @@ -28,6 +28,7 @@ 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 @@ -43,11 +44,12 @@ 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) + .size(avatarSize.dp) .clip(avatarType.avatarShape()) if (avatarUri != null) { @@ -69,7 +71,7 @@ fun UnsavedAvatar( contentDescription = null, modifier = Modifier .align(Alignment.Center) - .size(40.dp), + .size(avatarSize.dp * 4 / 7), tint = ElementTheme.colors.iconSecondary, ) } @@ -83,9 +85,9 @@ internal fun UnsavedAvatarPreview() = ElementPreview { modifier = Modifier.padding(8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { - UnsavedAvatar(null, AvatarType.User) - UnsavedAvatar(Uri.EMPTY, AvatarType.User) - UnsavedAvatar(null, AvatarType.Space(8.dp)) - UnsavedAvatar(Uri.EMPTY, AvatarType.Space(8.dp)) + UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.User) + UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.User) + UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.Space(8.dp)) + UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.Space(8.dp)) } } From 0f4939b689ff0ab13fea5a1845436731c82523cf Mon Sep 17 00:00:00 2001 From: ElementBot Date: Tue, 24 Jun 2025 08:10:17 +0000 Subject: [PATCH 053/156] Update screenshots --- ...nces.impl.user.editprofile_EditUserProfileView_Day_1_en.png | 3 +++ ...es.impl.user.editprofile_EditUserProfileView_Night_1_en.png | 3 +++ ...em.components.avatar.internal_AvatarCluster_Avatars_en.png} | 0 ...stem.components.avatar.internal_SpaceAvatar_Avatars_en.png} | 0 ...ystem.components.avatar.internal_TextAvatar_Avatars_en.png} | 0 ...onents.avatar.internal_TombstonedRoomAvatar_Avatars_en.png} | 0 ...m.components.avatar.internal_UserAvatarColors_Day_0_en.png} | 0 ...components.avatar.internal_UserAvatarColors_Night_0_en.png} | 0 8 files changed, 6 insertions(+) create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en.png rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png => libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png => libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_TextAvatar_Avatars_en.png => libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_TombstonedRoomAvatar_Avatars_en.png => libraries.designsystem.components.avatar.internal_TombstonedRoomAvatar_Avatars_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_UserAvatarColors_Day_0_en.png => libraries.designsystem.components.avatar.internal_UserAvatarColors_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{libraries.designsystem.components.avatar_UserAvatarColors_Night_0_en.png => libraries.designsystem.components.avatar.internal_UserAvatarColors_Night_0_en.png} (100%) 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/libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_AvatarCluster_Avatars_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_AvatarCluster_Avatars_en.png diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_SpaceAvatar_Avatars_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_SpaceAvatar_Avatars_en.png 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.internal_TextAvatar_Avatars_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar_TextAvatar_Avatars_en.png rename to tests/uitests/src/test/snapshots/images/libraries.designsystem.components.avatar.internal_TextAvatar_Avatars_en.png 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 From fb1d0760b73cc672d2bd60e9f90d4afa8126d34c Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 24 Jun 2025 10:24:05 +0200 Subject: [PATCH 054/156] Simplify syncing the room list when receiving a push (#4915) --- .../push/impl/push/SyncOnNotifiableEvent.kt | 43 +++---------------- .../impl/push/SyncOnNotifiableEventTest.kt | 26 +---------- 2 files changed, 7 insertions(+), 62 deletions(-) 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/test/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEventTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEventTest.kt index 8ad5e28e6e..e1c4b33acf 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEventTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/SyncOnNotifiableEventTest.kt @@ -13,27 +13,20 @@ import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.sync.SyncState -import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.test.A_ROOM_ID -import io.element.android.libraries.matrix.test.A_UNIQUE_ID import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClientProvider 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.sync.FakeSyncService -import io.element.android.libraries.matrix.test.timeline.FakeTimeline -import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableCallEvent import io.element.android.libraries.push.impl.notifications.fixtures.aNotifiableMessageEvent -import io.element.android.services.appnavstate.api.ActiveRoomsHolder import io.element.android.services.appnavstate.test.FakeAppForegroundStateService import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceTimeBy @@ -43,16 +36,11 @@ import java.util.concurrent.atomic.AtomicBoolean import kotlin.time.Duration.Companion.seconds class SyncOnNotifiableEventTest { - private val timelineItems = MutableStateFlow>(emptyList()) private val startSyncLambda = lambdaRecorder> { Result.success(Unit) } private val stopSyncLambda = lambdaRecorder> { Result.success(Unit) } private val subscribeToSyncLambda = lambdaRecorder { } - private val liveTimeline = FakeTimeline( - timelineItems = timelineItems, - ) private val room = FakeJoinedRoom( - liveTimeline = liveTimeline, baseRoom = FakeBaseRoom( roomId = A_ROOM_ID, subscribeToSyncLambda = subscribeToSyncLambda, @@ -130,10 +118,6 @@ class SyncOnNotifiableEventTest { ) val sut = createSyncOnNotifiableEvent(client = client, appForegroundStateService = appForegroundStateService, isSyncOnPushEnabled = true) - timelineItems.emit( - listOf(MatrixTimelineItem.Event(A_UNIQUE_ID, anEventTimelineItem())) - ) - appForegroundStateService.isSyncingNotificationEvent.test { syncService.emitSyncState(SyncState.Running) sut(listOf(notifiableEvent)) @@ -150,7 +134,7 @@ class SyncOnNotifiableEventTest { } @Test - fun `when feature flag is enabled and app is in background, running multiple time only call once`() = runTest { + fun `when feature flag is enabled and app is in background, running multiple times only call once`() = runTest { val appForegroundStateService = FakeAppForegroundStateService( initialForegroundValue = false, ) @@ -159,12 +143,6 @@ class SyncOnNotifiableEventTest { appForegroundStateService.isSyncingNotificationEvent.test { launch { sut(listOf(notifiableEvent)) } launch { sut(listOf(notifiableEvent)) } - launch { - delay(1) - timelineItems.emit( - listOf(MatrixTimelineItem.Event(A_UNIQUE_ID, anEventTimelineItem())) - ) - } // It's initially false assertThat(awaitItem()).isFalse() @@ -183,7 +161,6 @@ class SyncOnNotifiableEventTest { appForegroundStateService: FakeAppForegroundStateService = FakeAppForegroundStateService( initialForegroundValue = true, ), - activeRoomsHolder: ActiveRoomsHolder = ActiveRoomsHolder(), ): SyncOnNotifiableEvent { val featureFlagService = FakeFeatureFlagService( initialState = mapOf( @@ -196,7 +173,6 @@ class SyncOnNotifiableEventTest { featureFlagService = featureFlagService, appForegroundStateService = appForegroundStateService, dispatchers = testCoroutineDispatchers(), - activeRoomsHolder = activeRoomsHolder, ) } } From 655e2c212da20fde7d4c566a25dc0e3220d710a7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 10:41:44 +0200 Subject: [PATCH 055/156] Add unit test on ChooseAccountProviderState so that the coverage is above 90% Fixes issue: Rule 'Check code coverage of states' violated: instructions covered percentage for class 'io.element.android.features.login.impl.screens.chooseaccountprovider.ChooseAccountProviderState' is 88.571400, but expected minimum is 90 --- .../ChooseAccountProviderStateTest.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/chooseaccountprovider/ChooseAccountProviderStateTest.kt 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() + } +} From b8f22fc3eb8b83a824a261495876cb8271a7c434 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 11:00:53 +0200 Subject: [PATCH 056/156] Space avatar rounded corner has radius of 25% of the width. --- .../components/avatar/AvatarShape.kt | 18 ++++++++++++++---- .../components/avatar/AvatarType.kt | 2 -- .../avatar/internal/AvatarCluster.kt | 13 +++---------- .../components/avatar/internal/SpaceAvatar.kt | 10 +++++----- .../components/avatar/internal/TextAvatar.kt | 4 ++-- .../matrix/ui/components/UnsavedAvatar.kt | 6 +++--- 6 files changed, 27 insertions(+), 26 deletions(-) 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 index 8f80286abf..c4c2c77766 100644 --- 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 @@ -11,12 +11,22 @@ 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.avatarShape(): Shape { +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 -> RoundedCornerShape(cornerSize) - is AvatarType.Room, - AvatarType.User -> CircleShape + 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 index 720a0b0e6a..6d99574a55 100644 --- 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 @@ -8,7 +8,6 @@ package io.element.android.libraries.designsystem.components.avatar import androidx.compose.runtime.Immutable -import androidx.compose.ui.unit.Dp import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -22,7 +21,6 @@ sealed interface AvatarType { ) : AvatarType data class Space( - val cornerSize: Dp, val isTombstoned: Boolean = false, ) : AvatarType } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt index 940917ecfd..c100988053 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/AvatarCluster.kt @@ -57,7 +57,7 @@ internal fun AvatarCluster( InitialOrImageAvatar( avatarData = limitedAvatars[0], hideAvatarImage = hideAvatarImages, - avatarShape = avatarType.avatarShape(), + avatarShape = avatarType.avatarShape(limitedAvatars[0].size.dp), forcedAvatarSize = null, modifier = modifier, contentDescription = contentDescription, @@ -106,14 +106,7 @@ internal fun AvatarCluster( InitialOrImageAvatar( avatarData = heroAvatar, hideAvatarImage = hideAvatarImages, - avatarShape = avatarType.let { avatarType -> - if (avatarType is AvatarType.Space) { - // Reduce corner size for small Space avatars - avatarType.copy(cornerSize = avatarType.cornerSize / 2f) - } else { - avatarType - } - }.avatarShape(), + avatarShape = avatarType.avatarShape(heroAvatarSize), forcedAvatarSize = heroAvatarSize, modifier = Modifier, contentDescription = contentDescription, @@ -134,7 +127,7 @@ internal fun AvatarClusterPreview() = ElementThemedPreview { listOf( AvatarType.User, AvatarType.Room(), - AvatarType.Space(8.dp), + AvatarType.Space(), ).forEach { avatarType -> Row( horizontalArrangement = Arrangement.spacedBy(8.dp) 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 index 8f5635105d..b8880744c9 100644 --- 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 @@ -32,17 +32,18 @@ internal fun SpaceAvatar( hideAvatarImage: Boolean = false, contentDescription: String? = null, ) { + val size = forcedAvatarSize ?: avatarData.size.dp when { avatarType.isTombstoned -> TombstonedRoomAvatar( - size = forcedAvatarSize ?: avatarData.size.dp, - avatarShape = avatarType.avatarShape(), + size = size, + avatarShape = avatarType.avatarShape(size), modifier = modifier, contentDescription = contentDescription, ) else -> InitialOrImageAvatar( avatarData = avatarData, hideAvatarImage = hideAvatarImage, - avatarShape = avatarType.avatarShape(), + avatarShape = avatarType.avatarShape(size), forcedAvatarSize = forcedAvatarSize, modifier = modifier, contentDescription = contentDescription, @@ -62,12 +63,11 @@ internal fun SpaceAvatarPreview() = ) { SpaceAvatar( avatarData = anAvatarData(), - avatarType = AvatarType.Space(cornerSize = 16.dp), + avatarType = AvatarType.Space(), ) SpaceAvatar( avatarData = anAvatarData(), avatarType = AvatarType.Space( - cornerSize = 16.dp, isTombstoned = true, ), ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt index c5ce75ad5a..f44319fece 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/internal/TextAvatar.kt @@ -77,7 +77,7 @@ internal fun TextAvatarPreview() = ElementPreview { listOf( AvatarType.User, AvatarType.Room(), - AvatarType.Space(8.dp), + AvatarType.Space(), ).forEach { avatarType -> TextAvatar( text = "AB", @@ -86,7 +86,7 @@ internal fun TextAvatarPreview() = ElementPreview { background = ElementTheme.colors.bgSubtlePrimary, foreground = ElementTheme.colors.iconPrimary, ), - avatarShape = avatarType.avatarShape(), + avatarShape = avatarType.avatarShape(40.dp), contentDescription = null, ) } 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 db26ecb8da..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 @@ -50,7 +50,7 @@ fun UnsavedAvatar( ) { val commonModifier = modifier .size(avatarSize.dp) - .clip(avatarType.avatarShape()) + .clip(avatarType.avatarShape(avatarSize.dp)) if (avatarUri != null) { val context = LocalContext.current @@ -87,7 +87,7 @@ internal fun UnsavedAvatarPreview() = ElementPreview { ) { UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.User) UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.User) - UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.Space(8.dp)) - UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.Space(8.dp)) + UnsavedAvatar(null, AvatarSize.EditRoomDetails, AvatarType.Space()) + UnsavedAvatar(Uri.EMPTY, AvatarSize.EditRoomDetails, AvatarType.Space()) } } From 342aae624a3d342fd042d5ec132d32daa8744c71 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:06:45 +0200 Subject: [PATCH 057/156] fix(deps): update dependency org.robolectric:robolectric to v4.15.1 (#4911) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín --- .../impl/timeline/components/MessageEventBubble.kt | 5 +---- gradle/libs.versions.toml | 2 +- .../designsystem/theme/components/ModalBottomSheet.kt | 7 +------ 3 files changed, 3 insertions(+), 11 deletions(-) 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/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e1f5d4721..7d597000b8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -150,7 +150,7 @@ 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.15" +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" } 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, From f92b64660515d3325a34ba3cd06f12e4821c5286 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Tue, 24 Jun 2025 09:13:33 +0000 Subject: [PATCH 058/156] Update screenshots --- ...em.components.avatar.internal_AvatarCluster_Avatars_en.png | 4 ++-- ...stem.components.avatar.internal_SpaceAvatar_Avatars_en.png | 4 ++-- ...ystem.components.avatar.internal_TextAvatar_Avatars_en.png | 4 ++-- .../libraries.matrix.ui.components_UnsavedAvatar_Day_0_en.png | 4 ++-- ...ibraries.matrix.ui.components_UnsavedAvatar_Night_0_en.png | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) 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 index 337db7278a..53b5d638de 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1f8da07dfd80edeb381f78397114526d732ab1660ba95bd253690112c348cb4 -size 57397 +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 index 1cd1400485..30ccebfb08 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d61143149a23cbb1549ee11b1ad00fd4eee16d173407bc847bde91c39cd1b5bc -size 9178 +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 index faa0713a56..48fa2bbb5a 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b632082558328aa485712b8684016a84a9d1eaba7f96cd92b47d364e6c9169f -size 7981 +oid sha256:def7dc550efea75745153ad0cf71c7d92905205549965ba1f192ee3612cec9c4 +size 8041 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 38e8527fe3..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:e20e9a7264a6784fbaf6525e73a07318abd27bcf025541b880fd27ac0cca4ba4 -size 69466 +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 05dae22db7..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:991318dc36c1e6b86a753241638c36adafb896f852f4d5d0e15dd251fa025311 -size 68974 +oid sha256:ca5be5bfe66000d7730a9405ffb2992644f638fb58b28ac3f647c0c242ed8c4d +size 68007 From bfd684cd53e599ffa705cefabd9220bde8a2c3c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 11:23:20 +0200 Subject: [PATCH 059/156] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.23 (#4917) * fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.23 * Fix API break. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Benoit Marty --- .../impl/analytics/AnalyticUtils.kt | 4 +-- .../RolesAndPermissionsPresenter.kt | 2 +- .../ChangeRoomPermissionsPresenter.kt | 6 ++-- .../permissions/ChangeRoomPermissionsState.kt | 4 +-- .../ChangeRoomPermissionsStateProvider.kt | 8 +++--- .../permissions/ChangeRoomPermissionsView.kt | 6 ++-- .../RolesAndPermissionPresenterTest.kt | 3 +- .../ChangeBaseRoomPermissionsPresenterTest.kt | 17 ++--------- gradle/libs.versions.toml | 2 +- .../libraries/matrix/api/room/BaseRoom.kt | 4 +-- .../libraries/matrix/api/room/JoinedRoom.kt | 6 ++-- ...owerLevels.kt => RoomPowerLevelsValues.kt} | 2 +- .../matrix/impl/room/JoinedRustRoom.kt | 25 ++++++++--------- .../matrix/impl/room/RustBaseRoom.kt | 28 ++++++++++--------- .../room/powerlevels/RoomPowerLevelsMapper.kt | 26 ----------------- .../RoomPowerLevelsValuesMapper.kt | 26 +++++++++++++++++ .../fixtures/factories/RoomPowerLevels.kt | 6 ++-- ....kt => RoomPowerLevelsValuesMapperTest.kt} | 14 +++++----- .../matrix/test/room/FakeBaseRoom.kt | 8 +++--- .../matrix/test/room/FakeJoinedRoom.kt | 12 ++++---- 20 files changed, 99 insertions(+), 110 deletions(-) rename libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/{RoomPowerLevels.kt => RoomPowerLevelsValues.kt} (98%) delete mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsValuesMapper.kt rename libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/{RoomPowerLevelsMapperTest.kt => RoomPowerLevelsValuesMapperTest.kt} (80%) 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/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt index 2f2f14a157..812a9d4e1a 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,7 +105,7 @@ class RolesAndPermissionsPresenter @Inject constructor( ) = launch(dispatchers.io) { runUpdatingState(resetPermissionsAction) { analyticsService.capture(RoomModeration(RoomModeration.Action.ResetPermissions)) - room.resetPowerLevels().map {} + room.resetPowerLevels() } } 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..d8eb707927 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 @@ -36,7 +36,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) @@ -133,7 +133,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 +153,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/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/permissions/ChangeBaseRoomPermissionsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeBaseRoomPermissionsPresenterTest.kt index 8021d09c8d..cf764a39fb 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,7 +18,7 @@ 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 @@ -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() = defaultRoomPowerLevels() private suspend fun TurbineTestContext.awaitUpdatedItem(): ChangeRoomPermissionsState { skipItems(1) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7d597000b8..f2945b8c89 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -172,7 +172,7 @@ jsoup = "org.jsoup:jsoup:1.20.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.6.23" 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" } 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/powerlevels/RoomPowerLevels.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt similarity index 98% rename from libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt rename to libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevelsValues.kt index 8f548cc601..0acafc2a43 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/RoomPowerLevelsValues.kt @@ -12,7 +12,7 @@ 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 RoomPowerLevels( +data class RoomPowerLevelsValues( val ban: Long, val invite: Long, val kick: Long, 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..153dc92274 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 @@ -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/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/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/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/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/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..c74635d1f9 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 defaultRoomPowerLevels() = 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() } From 25ba79a6813a16393411b269726c213e8f1c22ed Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Jun 2025 14:34:33 +0200 Subject: [PATCH 060/156] Move `isElementCallAvailable` fun to new `SessionEnterpriseService`, which implementations can get the current `MatrixClient`. --- enterprise | 2 +- .../enterprise/api/EnterpriseService.kt | 2 -- .../api/SessionEnterpriseService.kt | 12 +++++++++++ .../impl/DefaultEnterpriseService.kt | 2 -- .../impl/DefaultSessionEnterpriseService.kt | 18 +++++++++++++++++ .../DefaultSessionEnterpriseServiceTest.kt | 20 +++++++++++++++++++ .../enterprise/test/FakeEnterpriseService.kt | 5 ----- .../test/FakeSessionEnterpriseService.kt | 20 +++++++++++++++++++ .../roomcall/impl/RoomCallStatePresenter.kt | 6 +++--- .../impl/RoomCallStatePresenterTest.kt | 4 ++-- .../impl/root/UserProfilePresenter.kt | 6 +++--- .../impl/UserProfilePresenterTest.kt | 4 ++-- .../libraries/matrix/api/MatrixClient.kt | 5 +++++ .../libraries/matrix/impl/RustMatrixClient.kt | 4 ++++ .../libraries/matrix/test/FakeMatrixClient.kt | 5 +++++ 15 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 features/enterprise/api/src/main/kotlin/io/element/android/features/enterprise/api/SessionEnterpriseService.kt create mode 100644 features/enterprise/impl/src/main/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseService.kt create mode 100644 features/enterprise/impl/src/test/kotlin/io/element/android/features/enterprise/impl/DefaultSessionEnterpriseServiceTest.kt create mode 100644 features/enterprise/test/src/main/kotlin/io/element/android/features/enterprise/test/FakeSessionEnterpriseService.kt diff --git a/enterprise b/enterprise index 4a07c862a2..afc6cbf41a 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit 4a07c862a23a9fd1418eabf132cf9d6b25ea4927 +Subproject commit afc6cbf41a962f4f46f3aeca44f9e5c269f1e70e 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/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/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/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..f7d95d7078 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 @@ -164,6 +164,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/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..07b8b3de09 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 @@ -678,6 +678,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/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..c76d54a85c 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 @@ -89,6 +89,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 @@ -334,4 +335,8 @@ class FakeMatrixClient( override suspend fun canReportRoom(): Boolean { return canReportRoomLambda() } + + override suspend fun isLivekitRtcSupported(): Boolean { + return isLivekitRtcSupportedLambda() + } } From 289ad46bfafbe87b17f04250d3199ba3f9edabb9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 24 Jun 2025 11:59:25 +0200 Subject: [PATCH 061/156] Update submodule ref. --- enterprise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enterprise b/enterprise index afc6cbf41a..b7ababb953 160000 --- a/enterprise +++ b/enterprise @@ -1 +1 @@ -Subproject commit afc6cbf41a962f4f46f3aeca44f9e5c269f1e70e +Subproject commit b7ababb9537da8bec254b8ed00b5a4122e9f3e3b From a10734de021e5fbb4023567a31bf5db19251a8cb Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 24 Jun 2025 14:05:28 +0200 Subject: [PATCH 062/156] Simplify message composer layout (#4884) Co-authored-by: ElementBot --- .../impl/ExpandableBottomSheetScaffold.kt | 175 ---------- .../features/messages/impl/MessagesView.kt | 298 +++++++++--------- .../messagecomposer/MessageComposerView.kt | 5 - .../android/libraries/androidutils/ui/View.kt | 11 +- .../components/ExpandableBottomSheetLayout.kt | 280 ++++++++++++++++ .../ExpandableBottomSheetLayoutState.kt | 62 ++++ .../textcomposer/SoftKeyboardEffect.kt | 10 +- .../libraries/textcomposer/TextComposer.kt | 58 ++-- .../components/markdown/MarkdownTextInput.kt | 81 ++--- .../markdown/MarkdownTextInputTest.kt | 2 - ...es.messages.impl_MessagesView_Day_6_en.png | 4 +- ....messages.impl_MessagesView_Night_6_en.png | 4 +- ...ponents_ExpandableBottomSheetLayout_en.png | 3 + ...omposerFormattingNotEncrypted_Day_0_en.png | 4 +- ...poserFormattingNotEncrypted_Night_0_en.png | 4 +- ...mposer_TextComposerFormatting_Day_0_en.png | 4 +- ...oser_TextComposerFormatting_Night_0_en.png | 4 +- 17 files changed, 574 insertions(+), 435 deletions(-) delete mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayout.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ExpandableBottomSheetLayoutState.kt create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components_ExpandableBottomSheetLayout_en.png 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 66fe8723bb..debea82cf0 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,22 +26,17 @@ 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.text.font.FontStyle @@ -83,11 +78,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.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 @@ -112,7 +109,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 @@ -186,69 +182,114 @@ 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( @@ -348,88 +389,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.pinnedMessagesCount(), + ) + 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, @@ -440,23 +442,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) { @@ -474,7 +459,6 @@ private fun MessagesViewComposerBottomSheetContents( MessageComposerView( state = state.composerState, voiceMessageState = state.voiceMessageComposerState, - subcomposing = subcomposing, enableVoiceMessages = state.enableVoiceMessages, modifier = Modifier.fillMaxWidth(), ) 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/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/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/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt index 8f6ca0530d..e98c6453e7 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt @@ -7,8 +7,6 @@ package io.element.android.libraries.textcomposer -import android.os.Build -import android.view.WindowInsets import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -44,12 +42,8 @@ internal fun SoftKeyboardEffect( view.awaitWindowFocus() if (!view.isKeyboardVisible()) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - view.windowInsetsController?.show(WindowInsets.Type.ime()) - } else { - // Show the keyboard, temporarily using the root view for focus - view.showKeyboard(andRequestFocus = true) - } + // Show the keyboard, temporarily using the root view for focus + view.showKeyboard(andRequestFocus = true) // Refocus to the correct view latestOnRequestFocus() diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index e4ba0d2401..b7bd04b282 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -12,38 +12,41 @@ import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeightIn import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberUpdatedState 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.platform.LocalDensity +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.hideFromAccessibility +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview 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.androidutils.ui.showKeyboard import io.element.android.libraries.designsystem.components.media.createFakeWaveform import io.element.android.libraries.designsystem.preview.DAY_MODE_NAME import io.element.android.libraries.designsystem.preview.ElementPreview @@ -84,6 +87,7 @@ import io.element.android.wysiwyg.display.TextDisplay import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList +import kotlinx.coroutines.launch import uniffi.wysiwyg_composer.MenuAction import kotlin.time.Duration.Companion.seconds @@ -110,7 +114,6 @@ fun TextComposer( resolveAtRoomMentionDisplay: () -> TextDisplay, modifier: Modifier = Modifier, showTextFormatting: Boolean = false, - subcomposing: Boolean = false, ) { val markdown = when (state) { is TextEditorState.Markdown -> state.state.text.value() @@ -170,20 +173,30 @@ fun TextComposer( } else { when (state) { is TextEditorState.Rich -> { - remember(state.richTextEditorState, subcomposing, composerMode, onResetComposerMode, onError) { + val coroutineScope = rememberCoroutineScope() + val view = LocalView.current + remember(state.richTextEditorState, composerMode, onResetComposerMode, onError) { @Composable { TextInputBox( + modifier = Modifier.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + coroutineScope.launch { + state.requestFocus() + view.showKeyboard() + } + }.semantics { + hideFromAccessibility() + }, composerMode = composerMode, onResetComposerMode = onResetComposerMode, isTextEmpty = state.richTextEditorState.messageHtml.isEmpty(), - subcomposing = subcomposing, ) { RichTextEditor( state = state.richTextEditorState, placeholder = placeholder, - // Disable most of the editor functionality if it's just being measured for a subcomposition. - // This prevents it gaining focus and mutating the state. - registerStateUpdates = !subcomposing, + registerStateUpdates = true, modifier = Modifier .padding(top = 6.dp, bottom = 6.dp) .fillMaxWidth(), @@ -205,13 +218,11 @@ fun TextComposer( composerMode = composerMode, onResetComposerMode = onResetComposerMode, isTextEmpty = state.state.text.value().isEmpty(), - subcomposing = subcomposing, ) { MarkdownTextInput( state = state.state, placeholder = placeholder, placeholderColor = ElementTheme.colors.textSecondary, - subcomposing = subcomposing, onTyping = onTyping, onReceiveSuggestion = onReceiveSuggestion, richTextEditorStyle = style, @@ -326,14 +337,12 @@ fun TextComposer( ) } - if (!subcomposing) { - SoftKeyboardEffect(composerMode, onRequestFocus) { - it is MessageComposerMode.Special - } - - SoftKeyboardEffect(showTextFormatting, onRequestFocus) { it } + SoftKeyboardEffect(composerMode, onRequestFocus) { + it is MessageComposerMode.Special } + SoftKeyboardEffect(showTextFormatting, onRequestFocus) { it } + val latestOnReceiveSuggestion by rememberUpdatedState(onReceiveSuggestion) if (state is TextEditorState.Rich) { val menuAction = state.richTextEditorState.menuAction @@ -445,11 +454,8 @@ private fun TextFormattingLayout( sendButton: @Composable () -> Unit, modifier: Modifier = Modifier ) { - val bottomPadding = with(LocalDensity.current) { WindowInsets.systemBars.getBottom(this).toDp() + 8.dp } Column( - modifier = modifier - .padding(vertical = 4.dp) - .padding(bottom = bottomPadding), + modifier = modifier.padding(vertical = 4.dp), verticalArrangement = Arrangement.spacedBy(4.dp), ) { if (isRoomEncrypted == false) { @@ -493,7 +499,7 @@ private fun TextInputBox( composerMode: MessageComposerMode, onResetComposerMode: () -> Unit, isTextEmpty: Boolean, - subcomposing: Boolean, + modifier: Modifier = Modifier, textInput: @Composable () -> Unit, ) { val bgColor = ElementTheme.colors.bgSubtleSecondary @@ -501,12 +507,13 @@ private fun TextInputBox( val roundedCorners = textInputRoundedCornerShape(composerMode = composerMode) Column( - modifier = Modifier + modifier = modifier .clip(roundedCorners) .border(0.5.dp, borderColor, roundedCorners) .background(color = bgColor) .requiredHeightIn(min = 42.dp) - .fillMaxSize(), + .fillMaxSize() + .then(modifier), ) { if (composerMode is MessageComposerMode.Special) { ComposerModeView( @@ -517,8 +524,7 @@ private fun TextInputBox( Box( modifier = Modifier .padding(top = 4.dp, bottom = 4.dp, start = 12.dp, end = 12.dp) - // Apply test tag only once, otherwise 2 nodes will have it (both the normal and subcomposing one) and tests will fail - .then(if (!subcomposing) Modifier.testTag(TestTags.textEditor) else Modifier), + .then(Modifier.testTag(TestTags.textEditor)), contentAlignment = Alignment.CenterStart, ) { textInput() diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt index f9baca43ea..ffce571dc4 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt @@ -48,14 +48,11 @@ fun MarkdownTextInput( state: MarkdownTextEditorState, placeholder: String, placeholderColor: androidx.compose.ui.graphics.Color, - subcomposing: Boolean, onTyping: (Boolean) -> Unit, onReceiveSuggestion: (Suggestion?) -> Unit, richTextEditorStyle: RichTextEditorStyle, onSelectRichContent: ((Uri) -> Unit)?, ) { - val canUpdateState = !subcomposing - // Copied from io.element.android.wysiwyg.internal.utils.UriContentListener class ReceiveUriContentListener( private val onContent: (uri: Uri) -> Unit, @@ -98,39 +95,32 @@ fun MarkdownTextInput( InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_AUTO_CORRECT - if (canUpdateState) { - val textRange = 0..text.length - setSelection(state.selection.first.coerceIn(textRange), state.selection.last.coerceIn(textRange)) - setOnFocusChangeListener { _, hasFocus -> - state.hasFocus = hasFocus - } - addTextChangedListener { editable -> - onTyping(!editable.isNullOrEmpty()) - state.text.update(editable, false) - state.lineCount = lineCount - - state.currentSuggestion = editable?.checkSuggestionNeeded() - onReceiveSuggestion(state.currentSuggestion) - } - onSelectionChangeListener = { selStart, selEnd -> - state.selection = selStart..selEnd - state.currentSuggestion = editableText.checkSuggestionNeeded() - onReceiveSuggestion(state.currentSuggestion) - } - if (onSelectRichContent != null) { - ViewCompat.setOnReceiveContentListener( - this, - arrayOf("image/*"), - ReceiveUriContentListener { onSelectRichContent(it) } - ) - } - state.requestFocusAction = { this.requestFocus() } - } else { - isEnabled = false - isFocusable = false - isFocusableInTouchMode = false - isClickable = false + val textRange = 0..text.length + setSelection(state.selection.first.coerceIn(textRange), state.selection.last.coerceIn(textRange)) + setOnFocusChangeListener { _, hasFocus -> + state.hasFocus = hasFocus } + addTextChangedListener { editable -> + onTyping(!editable.isNullOrEmpty()) + state.text.update(editable, false) + state.lineCount = lineCount + + state.currentSuggestion = editable?.checkSuggestionNeeded() + onReceiveSuggestion(state.currentSuggestion) + } + onSelectionChangeListener = { selStart, selEnd -> + state.selection = selStart..selEnd + state.currentSuggestion = editableText.checkSuggestionNeeded() + onReceiveSuggestion(state.currentSuggestion) + } + if (onSelectRichContent != null) { + ViewCompat.setOnReceiveContentListener( + this, + arrayOf("image/*"), + ReceiveUriContentListener { onSelectRichContent(it) } + ) + } + state.requestFocusAction = { this.requestFocus() } } }, update = { editText -> @@ -139,19 +129,15 @@ fun MarkdownTextInput( mentionSpanUpdater.updateMentionSpans(text) if (state.text.needsDisplaying()) { editText.updateEditableText(text) - if (canUpdateState) { - state.text.update(editText.editableText, false) - } + state.text.update(editText.editableText, false) } - if (canUpdateState) { - val newSelectionStart = state.selection.first - val newSelectionEnd = state.selection.last - val currentTextRange = 0..editText.editableText.length - val didSelectionChange = { editText.selectionStart != newSelectionStart || editText.selectionEnd != newSelectionEnd } - val isNewSelectionValid = { newSelectionStart in currentTextRange && newSelectionEnd in currentTextRange } - if (didSelectionChange() && isNewSelectionValid()) { - editText.setSelection(state.selection.first, state.selection.last) - } + val newSelectionStart = state.selection.first + val newSelectionEnd = state.selection.last + val currentTextRange = 0..editText.editableText.length + val didSelectionChange = { editText.selectionStart != newSelectionStart || editText.selectionEnd != newSelectionEnd } + val isNewSelectionValid = { newSelectionStart in currentTextRange && newSelectionEnd in currentTextRange } + if (didSelectionChange() && isNewSelectionValid()) { + editText.setSelection(state.selection.first, state.selection.last) } } ) @@ -198,7 +184,6 @@ internal fun MarkdownTextInputPreview() { state = aMarkdownTextEditorState(initialText = "Hello, World!"), placeholder = "Placeholder", placeholderColor = ElementTheme.colors.textSecondary, - subcomposing = false, onTyping = {}, onReceiveSuggestion = {}, richTextEditorStyle = style, diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt index a6cad521b2..fa003b74d8 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt @@ -168,7 +168,6 @@ class MarkdownTextInputTest { private fun AndroidComposeTestRule.setMarkdownTextInput( state: MarkdownTextEditorState = aMarkdownTextEditorState(), - subcomposing: Boolean = false, onTyping: (Boolean) -> Unit = {}, onSuggestionReceived: (Suggestion?) -> Unit = {}, ) { @@ -178,7 +177,6 @@ class MarkdownTextInputTest { state = state, placeholder = "Placeholder", placeholderColor = ElementTheme.colors.textSecondary, - subcomposing = subcomposing, onTyping = onTyping, onReceiveSuggestion = onSuggestionReceived, richTextEditorStyle = style, 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 64c9eb1cdf..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:f65fa2e0b1172f43b9475b8f46c3efc1086b5cf659038190bd8495b98bc21c82 -size 51551 +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 ec42814e10..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:dc219f3f79e2f7e061b541398971c36732346b2770fbeea95a4ecca266eb6ac0 -size 50925 +oid sha256:629506ad32c56d94906a71a4d779290f1328030d79fd05db3754e4113531587e +size 53656 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.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en.png index 00b0a7c69a..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:40ce5b17c4b499d9e671b7022ee6445abaddf4e14eed547f8c2b0e4d018d75c5 -size 64598 +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 e3ce1e8df4..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:cf923847e52fc8db3a7a27c5b85e27c4db8bcce9005b8009684e9f3b8b8b8c4b -size 62040 +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 1a9a40f972..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:30e40a4f602f99ca9ba95842b1aa8955450072d8bb317aea2eb61c704be0d8e3 -size 53900 +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 18915e427a..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:ac727cdf60b1a31c386d223df6f9142990468fdb6e387668eb740335c2caf937 -size 51263 +oid sha256:54b501a2dc902ba27a701fc8539fa2d2eb64511d2f058b4ff189365df63d5665 +size 51093 From e752323f37484cbfb458b599d135a8e5a1a81bb7 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 24 Jun 2025 16:57:20 +0200 Subject: [PATCH 063/156] Fix duplicate usage of a `modifier` variable in `TextInputBox` (#4928) --- .../io/element/android/libraries/textcomposer/TextComposer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index b7bd04b282..815000c626 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -507,7 +507,7 @@ private fun TextInputBox( val roundedCorners = textInputRoundedCornerShape(composerMode = composerMode) Column( - modifier = modifier + modifier = Modifier .clip(roundedCorners) .border(0.5.dp, borderColor, roundedCorners) .background(color = bgColor) From 613bf27d42b329c41d5226c45803d1e7c9814fed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 19:45:41 +0000 Subject: [PATCH 064/156] fix(deps): update android.gradle.plugin to v8.11.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f2945b8c89..88309e31b8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ [versions] # Project -android_gradle_plugin = "8.10.1" +android_gradle_plugin = "8.11.0" kotlin = "2.1.21" kotlinpoet = "2.2.0" ksp = "2.1.21-2.0.2" From 385b8c37cb612cd3d63d5933fa5f270306ea3467 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 24 Jun 2025 20:26:07 +0200 Subject: [PATCH 065/156] misc : simplify timeline diff logic --- .../timeline/MatrixTimelineDiffProcessor.kt | 8 ---- .../matrix/impl/timeline/RustTimeline.kt | 19 +------- .../impl/timeline/TimelineItemsSubscriber.kt | 44 +------------------ .../LastForwardIndicatorsPostProcessor.kt | 2 - .../LoadingIndicatorsPostProcessor.kt | 2 - .../matrix/impl/timeline/RustTimelineTest.kt | 5 --- .../timeline/TimelineItemsSubscriberTest.kt | 6 --- .../LastForwardIndicatorsPostProcessorTest.kt | 21 +++------ .../LoadingIndicatorsPostProcessorTest.kt | 16 ------- 9 files changed, 10 insertions(+), 113 deletions(-) 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/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, ) From 17dfd18f5d5a98239f5cfd942e9905a52b07af75 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 25 Jun 2025 08:43:29 +0200 Subject: [PATCH 066/156] Display error dialog if Element Call can't be joined (#4919) --- .../features/call/impl/data/WidgetMessage.kt | 3 ++ .../call/impl/ui/CallScreenPresenter.kt | 24 +++++++---- .../call/ui/CallScreenPresenterTest.kt | 43 ++++++++++++++++--- 3 files changed, 55 insertions(+), 15 deletions(-) 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/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/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() From 03fded9ae70d068b3728b5ade5955de66c6a4aa5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 08:44:12 +0200 Subject: [PATCH 067/156] fix(deps): update dependencyanalysis to v2.19.0 (#4932) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f2945b8c89..f2d650d9c3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ wysiwyg = "2.38.4" telephoto = "0.16.0" # Dependency analysis -dependencyAnalysis = "2.18.0" +dependencyAnalysis = "2.19.0" # DI dagger = "2.56.2" From 7d3f4cbb09a5113bcaff971a0d2d790bd8bc5b2e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 19:25:42 +0000 Subject: [PATCH 068/156] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.6.25 (#4936) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix broken API changes: - `RoomInfo.isPublic` is now optional, so we need to assume its default value in some places of the app. - `RoomInfo.userPowerLevels` is now `RoomInfo.roomPowerLevels` and also contains this info. - `ClientBuilder` now uses a `DecryptionSettings` value. - The call widget settings provider now internally uses a different Rust type. - `Client.clearCache` now takes a `syncService` so it can stop it. --- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín --- .../leaveroom/impl/LeaveRoomPresenter.kt | 3 +- .../RolesAndPermissionsNode.kt | 2 +- .../RolesAndPermissionsPresenter.kt | 4 +-- .../changeroles/ChangeRolesPresenter.kt | 2 +- .../changeroles/ChangeRolesPresenterTest.kt | 31 ++++++++++++----- .../ChangeBaseRoomPermissionsPresenterTest.kt | 4 +-- gradle/libs.versions.toml | 2 +- .../matrix/api/analytics/ViewRoomExt.kt | 2 +- .../libraries/matrix/api/room/RoomInfo.kt | 6 ++-- .../powerlevels/MatrixRoomMembersWithRole.kt | 2 +- .../api/room/powerlevels/RoomPowerLevels.kt | 16 +++++++++ .../api/room/preview/RoomPreviewInfo.kt | 2 +- .../libraries/matrix/impl/RustMatrixClient.kt | 4 +-- .../matrix/impl/RustMatrixClientFactory.kt | 15 +++++---- .../matrix/impl/room/JoinedRustRoom.kt | 2 +- .../matrix/impl/room/RoomInfoMapper.kt | 13 +++++--- .../room/preview/RoomPreviewInfoMapper.kt | 2 +- .../DefaultCallWidgetSettingsProvider.kt | 7 ++-- .../fixtures/factories/NotificationItem.kt | 2 -- .../impl/fixtures/factories/RoomInfo.kt | 6 ++-- .../impl/fixtures/fakes/FakeFfiClient.kt | 3 +- .../fixtures/fakes/FakeFfiClientBuilder.kt | 4 +-- .../fixtures/fakes/FakeFfiRoomPowerLevels.kt | 33 +++++++++++++++++++ .../matrix/impl/room/RoomInfoMapperTest.kt | 19 ++++++++--- .../matrix/test/room/FakeBaseRoom.kt | 2 +- .../matrix/test/room/RoomInfoFixture.kt | 9 +++-- .../matrix/test/room/RoomSummaryFixture.kt | 9 +++-- .../matrix/ui/room/MatrixRoomState.kt | 2 +- 28 files changed, 148 insertions(+), 60 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt create mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeFfiRoomPowerLevels.kt 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/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 812a9d4e1a..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 @@ -110,8 +110,8 @@ class RolesAndPermissionsPresenter @Inject constructor( } 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/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 cf764a39fb..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 @@ -21,7 +21,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember.Role.USER 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 @@ -296,7 +296,7 @@ class ChangeBaseRoomPermissionsPresenterTest { analyticsService = analyticsService, ) - private fun defaultPermissions() = defaultRoomPowerLevels() + private fun defaultPermissions() = defaultRoomPowerLevelValues() private suspend fun TurbineTestContext.awaitUpdatedItem(): ChangeRoomPermissionsState { skipItems(1) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 15701f17be..fba82d46cf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -172,7 +172,7 @@ 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.23" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.6.25" 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" } 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/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/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 new file mode 100644 index 0000000000..08f2166494 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/RoomPowerLevels.kt @@ -0,0 +1,16 @@ +/* + * 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.room.powerlevels + +import io.element.android.libraries.matrix.api.core.UserId +import kotlinx.collections.immutable.ImmutableMap + +data class RoomPowerLevels( + val values: RoomPowerLevelsValues, + val users: ImmutableMap, +) 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/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 07b8b3de09..b14d7adb22 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 @@ -129,7 +129,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, @@ -531,7 +531,7 @@ class RustMatrixClient( } override suspend fun clearCache() { - innerClient.clearCaches() + innerClient.clearCaches(innerSyncService) destroy() } 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/room/JoinedRustRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt index 153dc92274..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 @@ -139,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 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/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/widget/DefaultCallWidgetSettingsProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/widget/DefaultCallWidgetSettingsProvider.kt index eed81c2dcb..2b166a5dde 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,11 @@ 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.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( @@ -50,6 +50,7 @@ class DefaultCallWidgetSettingsProvider @Inject constructor( parentUrl = null, hideHeader = true, controlledMediaDevices = true, + header = null, ) val rustWidgetSettings = newVirtualElementCallWidget(options) return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings) 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..797958e151 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 @@ -52,7 +52,6 @@ fun aRustNotificationRoomInfo( isEncrypted: Boolean? = true, isDirect: Boolean = false, joinRule: JoinRule? = null, - isPublic: Boolean = true, ) = NotificationRoomInfo( displayName = displayName, avatarUrl = avatarUrl, @@ -61,7 +60,6 @@ fun aRustNotificationRoomInfo( 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/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/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 c74635d1f9..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 @@ -225,7 +225,7 @@ class FakeBaseRoom( override fun predecessorRoom(): PredecessorRoom? = predecessorRoomResult() } -fun defaultRoomPowerLevels() = RoomPowerLevelsValues( +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/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/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 } From 2a0783a7b675206883672312e6d15bf03db51267 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 08:46:53 +0200 Subject: [PATCH 069/156] fix(deps): update dependency io.sentry:sentry-android to v8.15.0 (#4938) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fba82d46cf..6e67062654 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -194,7 +194,7 @@ zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics posthog = "com.posthog:posthog-android:3.19.0" -sentry = "io.sentry:sentry-android:8.14.0" +sentry = "io.sentry:sentry-android:8.15.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" From aedd98d34a5457c5e26f112187fb99cdfc0cd9d7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 09:28:21 +0200 Subject: [PATCH 070/156] Add NavigationBar component --- .../designsystem/atomic/atoms/CounterAtom.kt | 25 ++- .../theme/components/NavigationBar.kt | 186 ++++++++++++++++++ .../tests/konsist/KonsistComposableTest.kt | 2 + 3 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt 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..4af1e3f6b5 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 @@ -41,13 +41,14 @@ private const val MAX_COUNT_STRING = "+$MAX_COUNT" 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 +59,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 +91,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/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..6cab9a8464 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBar.kt @@ -0,0 +1,186 @@ +/* + * 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.Box +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.offset +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBarDefaults +import androidx.compose.material3.NavigationBarItemColors +import androidx.compose.material3.NavigationBarItemDefaults +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.graphics.vector.ImageVector +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.ElementTheme +import io.element.android.compound.tokens.generated.CompoundIcons +import io.element.android.libraries.designsystem.atomic.atoms.CounterAtom +import io.element.android.libraries.designsystem.preview.ElementThemedPreview +import io.element.android.libraries.designsystem.preview.PreviewGroup +import androidx.compose.material3.NavigationBarItem as MaterialNavigationBarItem + +@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 +} + +@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 = ElementNavigationBarItemDefaultsDefaults.colors(), + interactionSource: MutableInteractionSource? = null +) { + MaterialNavigationBarItem( + selected = selected, + onClick = onClick, + icon = icon, + modifier = modifier, + enabled = enabled, + label = label, + alwaysShowLabel = alwaysShowLabel, + colors = colors, + interactionSource = interactionSource, + ) +} + +object ElementNavigationBarItemDefaultsDefaults { + @Composable + fun colors() = NavigationBarItemDefaults.colors().copy( + selectedIconColor = ElementTheme.colors.iconPrimary, + selectedTextColor = ElementTheme.colors.textPrimary, + unselectedIconColor = ElementTheme.colors.iconTertiary, + unselectedTextColor = ElementTheme.colors.textDisabled, + selectedIndicatorColor = Color.Transparent, + ) +} + +@Composable +fun NavigationBarIcon( + imageVector: ImageVector, + count: Int, + isCritical: Boolean, +) { + Box { + Icon( + imageVector = imageVector, + contentDescription = null, + ) + CounterAtom( + modifier = Modifier.offset(11.dp, (-11).dp), + textStyle = ElementTheme.typography.fontBodyXsMedium, + count = count, + isCritical = isCritical, + ) + } +} + +@Composable +fun NavigationBarText( + text: String, +) { + Text( + text = text, + style = ElementTheme.typography.fontBodySmMedium, + ) +} + +@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/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt index d1435e409d..88a5bd738c 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt @@ -34,6 +34,8 @@ class KonsistComposableTest { // Add some exceptions... "InvisibleButton", "OutlinedButton", + "NavigationBarIcon", + "NavigationBarText", "SimpleAlertDialogContent", "TextButton", ) From 67e280280f21b9122e382ad867bee88f56ca6334 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Thu, 26 Jun 2025 07:45:17 +0000 Subject: [PATCH 071/156] Update screenshots --- .../features.roomdetails.impl_RoomDetailsDark_15_en.png | 4 ++-- ...braries.designsystem.atomic.atoms_CounterAtom_Day_0_en.png | 4 ++-- ...aries.designsystem.atomic.atoms_CounterAtom_Night_0_en.png | 4 ++-- ...esignsystem.theme.components_NavigationBar_App_Bars_en.png | 3 +++ 4 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_NavigationBar_App_Bars_en.png 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/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.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 From 71e309f6c3ca517425d194e5dc7d13681ea1b82e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 12:59:08 +0200 Subject: [PATCH 072/156] Split function into separate files. --- .../theme/components/NavigationBar.kt | 75 ------------------- .../theme/components/NavigationBarIcon.kt | 37 +++++++++ .../theme/components/NavigationBarItem.kt | 54 +++++++++++++ .../theme/components/NavigationBarText.kt | 21 ++++++ .../tests/konsist/KonsistComposableTest.kt | 2 - 5 files changed, 112 insertions(+), 77 deletions(-) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarItem.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt 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 index 6cab9a8464..9d67f4ec05 100644 --- 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 @@ -7,29 +7,20 @@ package io.element.android.libraries.designsystem.theme.components -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.offset import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBarDefaults -import androidx.compose.material3.NavigationBarItemColors -import androidx.compose.material3.NavigationBarItemDefaults 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.graphics.vector.ImageVector 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.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.libraries.designsystem.atomic.atoms.CounterAtom import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup -import androidx.compose.material3.NavigationBarItem as MaterialNavigationBarItem @Composable fun NavigationBar( @@ -64,72 +55,6 @@ object ElementNavigationBarDefaults { @Composable get() = NavigationBarDefaults.windowInsets } -@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 = ElementNavigationBarItemDefaultsDefaults.colors(), - interactionSource: MutableInteractionSource? = null -) { - MaterialNavigationBarItem( - selected = selected, - onClick = onClick, - icon = icon, - modifier = modifier, - enabled = enabled, - label = label, - alwaysShowLabel = alwaysShowLabel, - colors = colors, - interactionSource = interactionSource, - ) -} - -object ElementNavigationBarItemDefaultsDefaults { - @Composable - fun colors() = NavigationBarItemDefaults.colors().copy( - selectedIconColor = ElementTheme.colors.iconPrimary, - selectedTextColor = ElementTheme.colors.textPrimary, - unselectedIconColor = ElementTheme.colors.iconTertiary, - unselectedTextColor = ElementTheme.colors.textDisabled, - selectedIndicatorColor = Color.Transparent, - ) -} - -@Composable -fun NavigationBarIcon( - imageVector: ImageVector, - count: Int, - isCritical: Boolean, -) { - Box { - Icon( - imageVector = imageVector, - contentDescription = null, - ) - CounterAtom( - modifier = Modifier.offset(11.dp, (-11).dp), - textStyle = ElementTheme.typography.fontBodyXsMedium, - count = count, - isCritical = isCritical, - ) - } -} - -@Composable -fun NavigationBarText( - text: String, -) { - Text( - text = text, - style = ElementTheme.typography.fontBodySmMedium, - ) -} - @Preview(group = PreviewGroup.AppBars) @Composable internal fun NavigationBarPreview() = ElementThemedPreview { 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..50963d2d40 --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarIcon.kt @@ -0,0 +1,37 @@ +/* + * 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, + count: Int, + isCritical: Boolean, +) { + Box { + Icon( + imageVector = imageVector, + contentDescription = null, + ) + CounterAtom( + modifier = Modifier.Companion.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..add305242b --- /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 = ElementNavigationBarItemDefaultsDefaults.colors(), + interactionSource: MutableInteractionSource? = null +) { + NavigationBarItem( + selected = selected, + onClick = onClick, + icon = icon, + modifier = modifier, + enabled = enabled, + label = label, + alwaysShowLabel = alwaysShowLabel, + colors = colors, + interactionSource = interactionSource, + ) +} + +object ElementNavigationBarItemDefaultsDefaults { + @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..4b8881f06a --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt @@ -0,0 +1,21 @@ +/* + * 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 io.element.android.compound.theme.ElementTheme + +@Composable +fun NavigationBarText( + text: String, +) { + Text( + text = text, + style = ElementTheme.typography.fontBodySmMedium, + ) +} diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt index 88a5bd738c..d1435e409d 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistComposableTest.kt @@ -34,8 +34,6 @@ class KonsistComposableTest { // Add some exceptions... "InvisibleButton", "OutlinedButton", - "NavigationBarIcon", - "NavigationBarText", "SimpleAlertDialogContent", "TextButton", ) From c5cdcc4d370111165ca85154cd6324b5136ff3c5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 12:59:36 +0200 Subject: [PATCH 073/156] Fix typo --- .../designsystem/theme/components/NavigationBarItem.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index add305242b..8c42b932dd 100644 --- 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 @@ -26,7 +26,7 @@ fun RowScope.NavigationBarItem( enabled: Boolean = true, label: @Composable (() -> Unit)? = null, alwaysShowLabel: Boolean = true, - colors: NavigationBarItemColors = ElementNavigationBarItemDefaultsDefaults.colors(), + colors: NavigationBarItemColors = ElementNavigationBarItemDefaults.colors(), interactionSource: MutableInteractionSource? = null ) { NavigationBarItem( @@ -42,7 +42,7 @@ fun RowScope.NavigationBarItem( ) } -object ElementNavigationBarItemDefaultsDefaults { +object ElementNavigationBarItemDefaults { @Composable fun colors() = NavigationBarItemDefaults.colors().copy( selectedIconColor = ElementTheme.colors.iconPrimary, From bdaeaf25aa08569ed2c500b118114136e9b8cefd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 13:01:55 +0200 Subject: [PATCH 074/156] Fix quality issues on Composables --- .../libraries/designsystem/atomic/atoms/CounterAtom.kt | 2 ++ .../designsystem/theme/components/NavigationBarIcon.kt | 9 +++++---- .../designsystem/theme/components/NavigationBarText.kt | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) 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 4af1e3f6b5..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 @@ -36,6 +36,8 @@ 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( 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 index 50963d2d40..2c2890f854 100644 --- 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 @@ -19,16 +19,17 @@ import io.element.android.libraries.designsystem.atomic.atoms.CounterAtom @Composable fun NavigationBarIcon( imageVector: ImageVector, - count: Int, - isCritical: Boolean, + modifier: Modifier = Modifier, + count: Int = 0, + isCritical: Boolean = false, ) { - Box { + Box(modifier) { Icon( imageVector = imageVector, contentDescription = null, ) CounterAtom( - modifier = Modifier.Companion.offset(11.dp, (-11).dp), + 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/NavigationBarText.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/NavigationBarText.kt index 4b8881f06a..826c99f743 100644 --- 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 @@ -8,13 +8,16 @@ 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, ) From 9bd2c178f47a4ca222f3925144e8560e4ae09f94 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:14:58 +0200 Subject: [PATCH 075/156] fix(deps): update dependency org.maplibre.gl:android-sdk to v11.11.0 (#4939) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6e67062654..b1b43c97b6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -186,7 +186,7 @@ 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" From 871fb880183882d4de87931ba8424a8b89383815 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 15:28:53 +0200 Subject: [PATCH 076/156] a11y: improve content description of the clear filter button. Change from "Clear" to "Clear filters" --- .../features/roomlist/impl/filters/RoomListFiltersView.kt | 3 ++- features/roomlist/impl/src/main/res/values/localazy.xml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt index 214ac44cfd..6cb94d9f96 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/filters/RoomListFiltersView.kt @@ -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.roomlist.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/res/values/localazy.xml b/features/roomlist/impl/src/main/res/values/localazy.xml index 90432433c2..58afb06591 100644 --- a/features/roomlist/impl/src/main/res/values/localazy.xml +++ b/features/roomlist/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" From 3b687a129c9f6166146e6d45f052a3eb8baaf9de Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 15:55:15 +0200 Subject: [PATCH 077/156] a11y: improve content description of the close formatting button. Change from "Close" to "Cancel and close text formatting" --- .../libraries/textcomposer/TextComposer.kt | 24 ++++++++++--------- .../impl/src/main/res/values/localazy.xml | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 815000c626..47216d7e88 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -178,17 +178,19 @@ fun TextComposer( remember(state.richTextEditorState, composerMode, onResetComposerMode, onError) { @Composable { TextInputBox( - modifier = Modifier.clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = null, - ) { - coroutineScope.launch { - state.requestFocus() - view.showKeyboard() + modifier = Modifier + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + coroutineScope.launch { + state.requestFocus() + view.showKeyboard() + } } - }.semantics { - hideFromAccessibility() - }, + .semantics { + hideFromAccessibility() + }, composerMode = composerMode, onResetComposerMode = onResetComposerMode, isTextEmpty = state.richTextEditorState.messageHtml.isEmpty(), @@ -317,7 +319,7 @@ fun TextComposer( IconColorButton( onClick = onDismissTextFormatting, imageVector = CompoundIcons.Close(), - contentDescription = stringResource(CommonStrings.action_close), + contentDescription = stringResource(R.string.rich_text_editor_close_formatting_options), ) }, textFormatting = textFormattingOptions, diff --git a/libraries/textcomposer/impl/src/main/res/values/localazy.xml b/libraries/textcomposer/impl/src/main/res/values/localazy.xml index 2be7a12577..89331da7ed 100644 --- a/libraries/textcomposer/impl/src/main/res/values/localazy.xml +++ b/libraries/textcomposer/impl/src/main/res/values/localazy.xml @@ -2,7 +2,7 @@ "Add attachment" "Toggle bullet list" - "Close formatting options" + "Cancel and close text formatting" "Toggle code block" "Add a caption" "Encrypted message…" From e806d078652e79e2a91e67f9d0919574a8d16644 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 17:44:08 +0200 Subject: [PATCH 078/156] Extract and unit test MultipleTapToUnlock --- features/preferences/impl/build.gradle.kts | 1 + .../impl/root/PreferencesRootPresenter.kt | 4 +- .../utils/ShowDeveloperSettingsProvider.kt | 13 +++--- libraries/ui-utils/build.gradle.kts | 2 + .../libraries/ui/utils/MultipleTapToUnlock.kt | 42 +++++++++++++++++++ .../ui/utils/MultipleTapToUnlockTest.kt | 41 ++++++++++++++++++ 6 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlock.kt create mode 100644 libraries/ui-utils/src/test/kotlin/io/element/android/libraries/ui/utils/MultipleTapToUnlockTest.kt diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index 6fb6e4a55b..fa7aeb4bca 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) 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/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/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/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() + } +} From adf539473d98d739e24b8ef210de1c9f9b0e3e10 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 18:13:13 +0200 Subject: [PATCH 079/156] Show version on OnBoarding screen. --- features/login/impl/build.gradle.kts | 1 + .../screens/onboarding/OnBoardingEvents.kt | 1 + .../screens/onboarding/OnBoardingPresenter.kt | 17 +++++++++++- .../screens/onboarding/OnBoardingState.kt | 1 + .../onboarding/OnBoardingStateProvider.kt | 2 ++ .../impl/screens/onboarding/OnBoardingView.kt | 15 +++++++++-- .../impl/src/main/res/values/localazy.xml | 1 + .../onboarding/OnBoardingPresenterTest.kt | 27 ++++++++++++++++--- 8 files changed, 59 insertions(+), 6 deletions(-) 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/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/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/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() } } From 2cefa92a2ae21116b9fe536816ed0d87b9ccca88 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Thu, 26 Jun 2025 16:40:38 +0000 Subject: [PATCH 080/156] Update screenshots --- ....login.impl.screens.onboarding_OnBoardingView_Day_0_en.png | 4 ++-- ....login.impl.screens.onboarding_OnBoardingView_Day_1_en.png | 4 ++-- ....login.impl.screens.onboarding_OnBoardingView_Day_2_en.png | 4 ++-- ....login.impl.screens.onboarding_OnBoardingView_Day_3_en.png | 4 ++-- ...ogin.impl.screens.onboarding_OnBoardingView_Night_0_en.png | 4 ++-- ...ogin.impl.screens.onboarding_OnBoardingView_Night_1_en.png | 4 ++-- ...ogin.impl.screens.onboarding_OnBoardingView_Night_2_en.png | 4 ++-- ...ogin.impl.screens.onboarding_OnBoardingView_Night_3_en.png | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) 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 From 416f4f2215ed56358ecc38def617b385c9f7469e Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 25 Jun 2025 20:38:39 +0200 Subject: [PATCH 081/156] change (media preview config) : introduce new apis from sdk --- .../libraries/matrix/api/MatrixClient.kt | 7 ++ .../matrix/api/media/MediaPreviewConfig.kt | 16 ++++ .../matrix/api/media/MediaPreviewService.kt | 42 ++++++++++ .../libraries/matrix/impl/RustMatrixClient.kt | 14 ++++ .../matrix/impl/di/SessionMatrixModule.kt | 6 ++ .../impl/media/RustMediaPreviewService.kt | 84 +++++++++++++++++++ .../libraries/matrix/test/FakeMatrixClient.kt | 8 ++ .../test/media/FakeMediaPreviewService.kt | 50 +++++++++++ 8 files changed, 227 insertions(+) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.kt 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 f7d95d7078..81aa28be6b 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 @@ -8,6 +8,7 @@ package io.element.android.libraries.matrix.api import io.element.android.libraries.core.data.tryOrNull +import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.MatrixPatterns import io.element.android.libraries.matrix.api.core.ProgressCallback @@ -19,6 +20,9 @@ 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.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.notification.NotificationService import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -40,6 +44,7 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.withContext import java.util.Optional interface MatrixClient { @@ -72,6 +77,7 @@ interface MatrixClient { fun notificationSettingsService(): NotificationSettingsService fun encryptionService(): EncryptionService fun roomDirectoryService(): RoomDirectoryService + fun mediaPreviewService(): MediaPreviewService suspend fun getCacheSize(): Long /** @@ -169,6 +175,7 @@ interface MatrixClient { * 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/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..5c964ca15e --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt @@ -0,0 +1,16 @@ +/* + * 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, +) 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..19cbe9cf2a --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewService.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.matrix.api.media + +import kotlinx.coroutines.flow.Flow + +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. + */ + fun getMediaPreviewConfigFlow(): Flow + + /** + * Get the media preview display policy from the cache. This value is updated through sync. + */ + suspend fun getMediaPreviewValue(): MediaPreviewValue? + + /** + * Get the invite avatars display policy from the cache. This value is updated through sync. + */ + suspend fun getHideInviteAvatars(): Boolean + + /** + * 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 +} 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 07b8b3de09..1e9d703b28 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,9 @@ 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.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.notification.NotificationService import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -52,6 +55,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 @@ -107,6 +111,7 @@ import org.matrix.rustcomponents.sdk.AuthDataPasswordDetails import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.ClientException import org.matrix.rustcomponents.sdk.IgnoredUsersListener +import org.matrix.rustcomponents.sdk.InviteAvatars import org.matrix.rustcomponents.sdk.NotificationProcessSetup import org.matrix.rustcomponents.sdk.PowerLevels import org.matrix.rustcomponents.sdk.RoomInfoListener @@ -214,6 +219,11 @@ class RustMatrixClient( innerClient = innerClient, ) + private val mediaPreviewService = RustMediaPreviewService( + innerClient = innerClient, + sessionDispatcher = sessionDispatcher, + ) + private var clientDelegateTaskHandle: TaskHandle? = innerClient.setDelegate(sessionDelegate) private val _userProfile: MutableStateFlow = MutableStateFlow( @@ -507,6 +517,8 @@ class RustMatrixClient( override fun roomDirectoryService(): RoomDirectoryService = roomDirectoryService + override fun mediaPreviewService(): MediaPreviewService = mediaPreviewService + internal suspend fun destroy() { innerNotificationClient.close() @@ -682,6 +694,8 @@ class RustMatrixClient( 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/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..a2ab6c8bb9 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt @@ -0,0 +1,84 @@ +/* + * 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.flow.Flow +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( + private val sessionDispatcher: CoroutineDispatcher, + private val innerClient: Client, +) : MediaPreviewService { + override suspend fun fetchMediaPreviewConfig(): Result = withContext(sessionDispatcher) { + runCatchingExceptions { + innerClient.fetchMediaPreviewConfig()?.into() + } + } + + override fun getMediaPreviewConfigFlow(): Flow = innerClient.getMediaPreviewConfigFlow() + + override suspend fun getMediaPreviewValue(): MediaPreviewValue? = innerClient.getMediaPreviewDisplayPolicy()?.into() + + override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = withContext(sessionDispatcher) { + runCatchingExceptions { + innerClient.setMediaPreviewDisplayPolicy(mediaPreviewValue.into()) + } + } + + override suspend fun getHideInviteAvatars(): Boolean = innerClient.getInviteAvatarsDisplayPolicy() == InviteAvatars.OFF + + 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 = this@into.mediaPreviews.into(), + hideInviteAvatar = inviteAvatars == InviteAvatars.OFF + ) +} + +private fun Client.getMediaPreviewConfigFlow() = mxCallbackFlow { + subscribeToMediaPreviewConfig(object : MediaPreviewConfigListener { + override fun onChange(mediaPreviewConfig: RustMediaPreviewConfig?) { + 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/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 c76d54a85c..11b95a647e 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 @@ -17,7 +17,10 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters import io.element.android.libraries.matrix.api.encryption.EncryptionService +import io.element.android.libraries.matrix.api.media.MediaPreviewConfig +import io.element.android.libraries.matrix.api.media.MediaPreviewValue 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 +39,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 +76,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( @@ -91,6 +96,7 @@ class FakeMatrixClient( private val canReportRoomLambda: () -> Boolean = { false }, private val isLivekitRtcSupportedLambda: () -> Boolean = { false }, override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()), + ) : MatrixClient { var setDisplayNameCalled: Boolean = false private set @@ -234,11 +240,13 @@ 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() } + // Mocks fun givenCreateRoomResult(result: Result) { 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..7e41b03e41 --- /dev/null +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/media/FakeMediaPreviewService.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.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.Flow +import kotlinx.coroutines.flow.flowOf + +class FakeMediaPreviewService( + private val fetchMediaPreviewConfigResult: () -> Result = { lambdaError() }, + private val mediaPreviewConfigFlow: Flow = flowOf(null), + private val getMediaPreviewValue: ()-> MediaPreviewValue? = { null }, + private val getHideInviteAvatars: () -> Boolean = { false }, + private val setMediaPreviewValueResult: (MediaPreviewValue) -> Result = { lambdaError() }, + private val setHideInviteAvatarsResult: (Boolean) -> Result = { lambdaError() }, +): MediaPreviewService { + + override suspend fun fetchMediaPreviewConfig(): Result = simulateLongTask { + fetchMediaPreviewConfigResult() + } + + override fun getMediaPreviewConfigFlow(): Flow { + return mediaPreviewConfigFlow + } + + override suspend fun getMediaPreviewValue(): MediaPreviewValue? = simulateLongTask { + getMediaPreviewValue.invoke() + } + + override suspend fun getHideInviteAvatars(): Boolean = simulateLongTask { + getHideInviteAvatars.invoke() + } + + override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = simulateLongTask { + setMediaPreviewValueResult(mediaPreviewValue) + } + + override suspend fun setHideInviteAvatars(hide: Boolean): Result = simulateLongTask { + setHideInviteAvatarsResult(hide) + } +} From 5332246bde31a6f3b66840bebafedb6ed50e3c7f Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 26 Jun 2025 20:52:44 +0200 Subject: [PATCH 082/156] change (media preview config) : use the new apis --- .../advanced/AdvancedSettingsPresenter.kt | 44 +++---- .../impl/advanced/AdvancedSettingsState.kt | 3 + .../advanced/AdvancedSettingsStateProvider.kt | 9 +- .../advanced/MediaPreviewConfigStateStore.kt | 109 ++++++++++++++++++ .../advanced/AdvancedSettingsPresenterTest.kt | 13 ++- .../api/store/AppPreferencesStore.kt | 2 - .../impl/store/DefaultAppPreferencesStore.kt | 12 -- .../test/InMemoryAppPreferencesStore.kt | 8 -- .../DefaultNotifiableEventResolver.kt | 16 +-- .../DefaultNotifiableEventResolverTest.kt | 2 - 10 files changed, 158 insertions(+), 60 deletions(-) create mode 100644 features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt 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..a47ea25e4e 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 @@ -8,27 +8,36 @@ package io.element.android.features.preferences.impl.advanced 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.mutableStateOf 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.AsyncAction import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.architecture.runUpdatingState +import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.media.MediaPreviewValue 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 +50,6 @@ 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 themeOption by remember { derivedStateOf { @@ -61,28 +63,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 +89,11 @@ class AdvancedSettingsPresenter @Inject constructor( isSharePresenceEnabled = isSharePresenceEnabled, doesCompressMedia = doesCompressMedia, theme = themeOption, - hideInviteAvatars = hideInviteAvatars, - timelineMediaPreviewValue = timelineMediaPreviewValue, - eventSink = { handleEvents(it) } + hideInviteAvatars = mediaPreviewConfigStateStore.hideInviteAvatars.value, + timelineMediaPreviewValue = mediaPreviewConfigStateStore.timelineMediaPreviewValue.value, + setHideInviteAvatarsAction = mediaPreviewConfigStateStore.setHideInviteAvatarsAction.value, + setTimelineMediaPreviewAction = mediaPreviewConfigStateStore.setTimelineMediaPreviewAction.value, + 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..6386984146 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 @@ -10,6 +10,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.res.stringResource +import io.element.android.libraries.architecture.AsyncAction 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 @@ -21,6 +22,8 @@ data class AdvancedSettingsState( val theme: ThemeOption, val hideInviteAvatars: Boolean, val timelineMediaPreviewValue: MediaPreviewValue, + val setHideInviteAvatarsAction: AsyncAction, + val setTimelineMediaPreviewAction: AsyncAction, 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..09b3b6e1a5 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, @@ -37,5 +42,7 @@ fun aAdvancedSettingsState( theme = theme, 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/MediaPreviewConfigStateStore.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt new file mode 100644 index 0000000000..c503ba49a2 --- /dev/null +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStore.kt @@ -0,0 +1,109 @@ +/* + * 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.State +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.SharingStarted +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.shareIn +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +interface MediaPreviewConfigStateStore { + val hideInviteAvatars: State + val timelineMediaPreviewValue: State + val setHideInviteAvatarsAction: State> + val setTimelineMediaPreviewAction: State> + + fun setHideInviteAvatars(hide: Boolean) + fun setTimelineMediaPreviewValue(value: MediaPreviewValue) +} + +@ContributesBinding(SessionScope::class, boundType = MediaPreviewConfigStateStore::class) +@SingleIn(SessionScope::class) +class DefaultMediaPreviewConfigStateStore @Inject constructor( + @SessionCoroutineScope + private val sessionCoroutineScope: CoroutineScope, + private val mediaPreviewService: MediaPreviewService, + private val snackbarDispatcher: SnackbarDispatcher, +) : MediaPreviewConfigStateStore { + override val hideInviteAvatars = mutableStateOf(false) + override val timelineMediaPreviewValue = mutableStateOf(MediaPreviewValue.On) + override val setHideInviteAvatarsAction = mutableStateOf>(AsyncAction.Uninitialized) + override val setTimelineMediaPreviewAction = mutableStateOf>(AsyncAction.Uninitialized) + + init { + val configFlow = mediaPreviewService.getMediaPreviewConfigFlow().shareIn(sessionCoroutineScope, SharingStarted.Eagerly) + val hideInviteAvatarsFlow = configFlow.mapNotNull { it?.hideInviteAvatar }.distinctUntilChanged() + val timelineMediaPreviewFlow = configFlow.mapNotNull { it?.mediaPreviewValue }.distinctUntilChanged() + + hideInviteAvatarsFlow + .onEach { + Timber.d("Hide invi@te 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) + } + + override fun setHideInviteAvatars(hide: Boolean) { + sessionCoroutineScope.launch { + Timber.d("Setting hide invite avatars to $hide") + val prevHideInviteAvatars = hideInviteAvatars.value + 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 { + Timber.d("Setting timeline media preview value to $value") + val prevTimelineMediaPreviewValue = timelineMediaPreviewValue.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/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..de841f3f6d 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,14 @@ 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.matrix.api.MatrixClient +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.FakeMatrixClient 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.flow.MutableStateFlow import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -144,7 +148,12 @@ class AdvancedSettingsPresenterTest { @Test fun `present - timeline media preview value`() = runTest { - val presenter = createAdvancedSettingsPresenter() + val mediaPreviewConfigFlow = MutableStateFlow(null) + val presenter = createAdvancedSettingsPresenter( + matrixClient = FakeMatrixClient( + mediaPreviewConfigFlow = mediaPreviewConfigFlow + ) + ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -165,8 +174,10 @@ class AdvancedSettingsPresenterTest { private fun createAdvancedSettingsPresenter( appPreferencesStore: InMemoryAppPreferencesStore = InMemoryAppPreferencesStore(), sessionPreferencesStore: InMemorySessionPreferencesStore = InMemorySessionPreferencesStore(), + matrixClient: MatrixClient = FakeMatrixClient(), ) = AdvancedSettingsPresenter( appPreferencesStore = appPreferencesStore, sessionPreferencesStore = sessionPreferencesStore, + matrixClient = matrixClient, ) } 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..2434823b58 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,10 +22,8 @@ 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 suspend fun setTracingLogLevel(logLevel: LogLevel) 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..abdd481f67 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,24 +85,12 @@ class DefaultAppPreferencesStore @Inject constructor( } } - override suspend fun setHideInviteAvatars(value: Boolean) { - store.edit { prefs -> - prefs[hideInviteAvatarsKey] = value - } - } - override fun getHideInviteAvatarsFlow(): Flow { return store.data.map { prefs -> prefs[hideInviteAvatarsKey] == true } } - override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) { - store.edit { prefs -> - prefs[timelineMediaPreviewValueKey] = value.name - } - } - override fun getTimelineMediaPreviewValueFlow(): Flow { return store.data.map { prefs -> prefs[timelineMediaPreviewValueKey]?.let { MediaPreviewValue.valueOf(it) } ?: MediaPreviewValue.On 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..33b69dc8ac 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 @@ -55,18 +55,10 @@ class InMemoryAppPreferencesStore( return theme } - override suspend fun setHideInviteAvatars(value: Boolean) { - hideInviteAvatars.value = value - } - override fun getHideInviteAvatarsFlow(): Flow { return hideInviteAvatars } - override suspend fun setTimelineMediaPreviewValue(value: MediaPreviewValue) { - timelineMediaPreviewValue.value = value - } - override fun getTimelineMediaPreviewValueFlow(): Flow { return timelineMediaPreviewValue } 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..dd2f7eb760 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 @@ -41,7 +41,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 +49,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 +77,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 +114,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 +127,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 +321,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 +344,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/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..cb3c0a78f0 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 @@ -826,7 +826,6 @@ class DefaultNotifiableEventResolverTest { private fun createDefaultNotifiableEventResolver( notificationService: FakeNotificationService? = FakeNotificationService(), notificationResult: Result> = Result.success(emptyMap()), - appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(), callNotificationEventResolver: FakeCallNotificationEventResolver = FakeCallNotificationEventResolver(), ): DefaultNotifiableEventResolver { val context = RuntimeEnvironment.getApplication() as Context @@ -849,7 +848,6 @@ class DefaultNotifiableEventResolverTest { context = context, permalinkParser = FakePermalinkParser(), callNotificationEventResolver = callNotificationEventResolver, - appPreferencesStore = appPreferencesStore, ) } } From 98b60d46b11fac5a050ceb55006a615c354fe0fd Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 26 Jun 2025 20:53:00 +0200 Subject: [PATCH 083/156] change (media preview config) : handle loading and failure ui --- .../impl/advanced/AdvancedSettingsView.kt | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) 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..924f178b32 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,10 @@ package io.element.android.features.preferences.impl.advanced +import androidx.compose.foundation.layout.Row +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 +30,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 +47,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), @@ -119,15 +137,18 @@ private fun ModerationAndSafety( onCheckedChange = { state.eventSink(AdvancedSettingsEvents.SetHideInviteAvatars(it)) }, + enabled = !state.setHideInviteAvatarsAction.isLoading() ) ListSectionHeader( title = stringResource(R.string.screen_advanced_settings_show_media_timeline_title), hasDivider = false, description = { - ListSupportingText( - text = stringResource(R.string.screen_advanced_settings_show_media_timeline_subtitle), - contentPadding = ListSupportingTextDefaults.Padding.None, - ) + Row { + ListSupportingText( + text = stringResource(R.string.screen_advanced_settings_show_media_timeline_subtitle), + contentPadding = ListSupportingTextDefaults.Padding.None, + ) + } } ) ListItem( @@ -136,6 +157,7 @@ private fun ModerationAndSafety( onClick = { state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Off)) }, + enabled = !state.setTimelineMediaPreviewAction.isLoading() ) ListItem( headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_private_rooms)) }, @@ -143,6 +165,7 @@ private fun ModerationAndSafety( onClick = { state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.Private)) }, + enabled = !state.setTimelineMediaPreviewAction.isLoading() ) ListItem( headlineContent = { Text(text = stringResource(R.string.screen_advanced_settings_show_media_timeline_always_show)) }, @@ -150,6 +173,7 @@ private fun ModerationAndSafety( onClick = { state.eventSink(AdvancedSettingsEvents.SetTimelineMediaPreviewValue(MediaPreviewValue.On)) }, + enabled = !state.setTimelineMediaPreviewAction.isLoading() ) } } From 0e738821b88436558c459bff258145c6129e89e8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 26 Jun 2025 21:44:03 +0200 Subject: [PATCH 084/156] change (media preview config) : manage migration of local data --- .../android/appnav/LoggedInFlowNode.kt | 3 + .../loggedin/MediaPreviewConfigMigration.kt | 56 +++++++++++++++++++ .../api/store/AppPreferencesStore.kt | 7 ++- .../impl/store/DefaultAppPreferencesStore.kt | 28 ++++++++-- .../test/InMemoryAppPreferencesStore.kt | 16 ++++-- 5 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt 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..12b61b2ee6 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 @@ -114,6 +115,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( @@ -179,6 +181,7 @@ class LoggedInFlowNode @AssistedInject constructor( appNavigationStateService.onNavigateToSpace(id, MAIN_SPACE) loggedInFlowProcessor.observeEvents(sessionCoroutineScope) matrixClient.sessionVerificationService().setListener(verificationListener) + mediaPreviewConfigMigration() ftueService.state .onEach { ftueState -> 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..ac7a1c6145 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt @@ -0,0 +1,56 @@ +/* + * 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, +) { + 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.d("Couldn't perform migration, failed to fetch media preview config.") + } + } +} 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 2434823b58..59a074c99b 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,9 +22,10 @@ interface AppPreferencesStore { suspend fun setTheme(theme: String) fun getThemeFlow(): Flow - fun getHideInviteAvatarsFlow(): Flow - - fun getTimelineMediaPreviewValueFlow(): Flow + suspend fun setHideInviteAvatars(hide: Boolean?) + fun getHideInviteAvatarsFlow(): Flow + suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) + 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 abdd481f67..1ea7c1f874 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,15 +85,35 @@ class DefaultAppPreferencesStore @Inject constructor( } } - override fun getHideInviteAvatarsFlow(): Flow { + override fun getHideInviteAvatarsFlow(): Flow { return store.data.map { prefs -> - prefs[hideInviteAvatarsKey] == true + prefs[hideInviteAvatarsKey] } } - override fun getTimelineMediaPreviewValueFlow(): Flow { + override suspend fun setHideInviteAvatars(hide: Boolean?) { + store.edit { prefs -> + if (hide != null) { + prefs[hideInviteAvatarsKey] = hide + } else { + prefs.remove(hideInviteAvatarsKey) + } + } + } + + override suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) { + store.edit { prefs -> + if (mediaPreviewValue != null) { + prefs[timelineMediaPreviewValueKey] = mediaPreviewValue.name + } else { + prefs.remove(timelineMediaPreviewValueKey) + } + } + } + + 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 33b69dc8ac..b474ec63ea 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,14 +55,22 @@ class InMemoryAppPreferencesStore( return theme } - override fun getHideInviteAvatarsFlow(): Flow { + override fun getHideInviteAvatarsFlow(): Flow { return hideInviteAvatars } - override fun getTimelineMediaPreviewValueFlow(): Flow { + override fun getTimelineMediaPreviewValueFlow(): Flow { return timelineMediaPreviewValue } + override suspend fun setHideInviteAvatars(hide: Boolean?) { + hideInviteAvatars.value = hide + } + + override suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) { + timelineMediaPreviewValue.value = mediaPreviewValue + } + override suspend fun setTracingLogLevel(logLevel: LogLevel) { this.logLevel.value = logLevel } From bebe2d4ab5377a864b773a882a43a8b9d01cfeb3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 21:48:11 +0000 Subject: [PATCH 085/156] fix(deps): update dependency com.google.gms:google-services to v4.4.3 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b1b43c97b6..b3a7c3bde0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -71,7 +71,7 @@ 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" firebase_appdistribution_gradle = { module = "com.google.firebase:firebase-appdistribution-gradle", version.ref = "firebaseAppDistribution" } From 2f6ce3da33bed94e217d42845f5439343bf35f0a Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 27 Jun 2025 08:41:10 +0200 Subject: [PATCH 086/156] Element Call: remove top app bar and add it inside the webview instead (#4927) Co-authored-by: ElementBot --- .../impl/pip/PictureInPictureStateProvider.kt | 10 --- .../features/call/impl/ui/CallScreenView.kt | 45 ++++------ .../call/impl/ui/CallScreenViewTest.kt | 83 ------------------- .../DefaultCallWidgetSettingsProvider.kt | 4 +- ...all.impl.ui_CallScreenPipView_Day_0_en.png | 3 - ...all.impl.ui_CallScreenPipView_Day_1_en.png | 3 - ...l.impl.ui_CallScreenPipView_Night_0_en.png | 3 - ...l.impl.ui_CallScreenPipView_Night_1_en.png | 3 - ...s.call.impl.ui_CallScreenView_Day_0_en.png | 4 +- ...s.call.impl.ui_CallScreenView_Day_1_en.png | 4 +- ...s.call.impl.ui_CallScreenView_Day_2_en.png | 4 +- ...s.call.impl.ui_CallScreenView_Day_3_en.png | 4 +- ...call.impl.ui_CallScreenView_Night_0_en.png | 4 +- ...call.impl.ui_CallScreenView_Night_1_en.png | 4 +- ...call.impl.ui_CallScreenView_Night_2_en.png | 4 +- ...call.impl.ui_CallScreenView_Night_3_en.png | 4 +- 16 files changed, 33 insertions(+), 153 deletions(-) delete mode 100644 features/call/impl/src/test/kotlin/io/element/android/features/call/impl/ui/CallScreenViewTest.kt delete mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Day_1_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.call.impl.ui_CallScreenPipView_Night_1_en.png 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/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/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/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 2b166a5dde..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 @@ -18,6 +18,7 @@ import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.flow.first import org.matrix.rustcomponents.sdk.newVirtualElementCallWidget import uniffi.matrix_sdk.EncryptionSystem +import uniffi.matrix_sdk.HeaderStyle import uniffi.matrix_sdk.VirtualElementCallWidgetOptions import javax.inject.Inject import uniffi.matrix_sdk.Intent as CallIntent @@ -48,9 +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 = null, + header = HeaderStyle.APP_BAR, ) val rustWidgetSettings = newVirtualElementCallWidget(options) return MatrixWidgetSettings.fromRustWidgetSettings(rustWidgetSettings) 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 From 56b5afcfccc444b51739c79e113206fc150580f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:07:22 +0200 Subject: [PATCH 087/156] fix(deps): update dependency com.google.firebase:firebase-bom to v33.16.0 (#4945) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b1b43c97b6..32ceabdf68 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ kover_gradle_plugin = { module = "org.jetbrains.kotlinx:kover-gradle-plugin", ve 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" # 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" } From 60083ad5eae0f572f4531ed613e79480d0267cc7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Jun 2025 15:05:44 +0200 Subject: [PATCH 088/156] Rename module `roomlist` to `home` --- .../android/appnav/LoggedInFlowNode.kt | 33 ++++++++++++------- .../{roomlist => home}/api/build.gradle.kts | 2 +- .../features/home/api/HomeEntryPoint.kt} | 4 +-- .../{roomlist => home}/impl/build.gradle.kts | 4 +-- .../home/impl/DefaultHomeEntryPoint.kt} | 14 ++++---- .../features/home/impl/HomeFlowNode.kt} | 26 +++++++-------- .../impl/RoomListContentStateProvider.kt | 4 +-- .../home}/impl/RoomListContextMenu.kt | 2 +- .../home}/impl/RoomListDeclineInviteMenu.kt | 4 +-- .../features/home}/impl/RoomListEvents.kt | 4 +-- .../features/home}/impl/RoomListPresenter.kt | 10 +++--- .../features/home}/impl/RoomListState.kt | 8 ++--- .../RoomListStateContextMenuShownProvider.kt | 2 +- .../home}/impl/RoomListStateProvider.kt | 18 +++++----- .../features/home}/impl/RoomListView.kt | 12 +++---- .../home}/impl/components/BannerPadding.kt | 2 +- .../components/BatteryOptimizationBanner.kt | 4 +-- .../components/ConfirmRecoveryKeyBanner.kt | 4 +-- .../FullScreenIntentPermissionBanner.kt | 4 +-- .../impl/components/RoomListContentView.kt | 28 ++++++++-------- .../impl/components/RoomListMenuAction.kt | 2 +- .../home}/impl/components/RoomListTopBar.kt | 9 +++-- .../components/RoomSummaryPlaceholderRow.kt | 2 +- .../home}/impl/components/RoomSummaryRow.kt | 12 +++---- .../impl/components/SetUpRecoveryKeyBanner.kt | 4 +-- .../impl/datasource/RoomListDataSource.kt | 4 +-- .../datasource/RoomListRoomSummaryFactory.kt | 6 ++-- .../features/home}/impl/di/RoomListModule.kt | 10 +++--- .../home}/impl/filters/RoomListFilter.kt | 4 +-- .../RoomListFiltersEmptyStateResources.kt | 4 +-- .../impl/filters/RoomListFiltersEvents.kt | 2 +- .../impl/filters/RoomListFiltersPresenter.kt | 4 +-- .../impl/filters/RoomListFiltersState.kt | 4 +-- .../filters/RoomListFiltersStateProvider.kt | 4 +-- .../home}/impl/filters/RoomListFiltersView.kt | 2 +- .../DefaultFilterSelectionStrategy.kt | 4 +-- .../filters/selection/FilterSelectionState.kt | 4 +-- .../selection/FilterSelectionStrategy.kt | 4 +-- .../home}/impl/model/RoomListRoomSummary.kt | 2 +- .../impl/model/RoomListRoomSummaryProvider.kt | 2 +- .../impl/model/RoomSummaryDisplayType.kt | 2 +- .../impl/search/RoomListSearchDataSource.kt | 6 ++-- .../home}/impl/search/RoomListSearchEvents.kt | 2 +- .../impl/search/RoomListSearchPresenter.kt | 2 +- .../home}/impl/search/RoomListSearchState.kt | 4 +-- .../search/RoomListSearchStateProvider.kt | 6 ++-- .../home}/impl/search/RoomListSearchView.kt | 10 +++--- .../src/main/res/values-be/translations.xml | 0 .../src/main/res/values-bg/translations.xml | 0 .../src/main/res/values-cs/translations.xml | 0 .../src/main/res/values-cy/translations.xml | 0 .../src/main/res/values-de/translations.xml | 0 .../src/main/res/values-el/translations.xml | 0 .../main/res/values-en-rUS/translations.xml | 0 .../src/main/res/values-es/translations.xml | 0 .../src/main/res/values-et/translations.xml | 0 .../src/main/res/values-eu/translations.xml | 0 .../src/main/res/values-fa/translations.xml | 0 .../src/main/res/values-fi/translations.xml | 0 .../src/main/res/values-fr/translations.xml | 0 .../src/main/res/values-hu/translations.xml | 0 .../src/main/res/values-in/translations.xml | 0 .../src/main/res/values-it/translations.xml | 0 .../src/main/res/values-ka/translations.xml | 0 .../src/main/res/values-lt/translations.xml | 0 .../src/main/res/values-nb/translations.xml | 0 .../src/main/res/values-nl/translations.xml | 0 .../src/main/res/values-pl/translations.xml | 0 .../main/res/values-pt-rBR/translations.xml | 0 .../src/main/res/values-pt/translations.xml | 0 .../src/main/res/values-ro/translations.xml | 0 .../src/main/res/values-ru/translations.xml | 0 .../src/main/res/values-sk/translations.xml | 0 .../src/main/res/values-sv/translations.xml | 0 .../src/main/res/values-tr/translations.xml | 0 .../src/main/res/values-uk/translations.xml | 0 .../src/main/res/values-ur/translations.xml | 0 .../src/main/res/values-uz/translations.xml | 0 .../main/res/values-zh-rTW/translations.xml | 0 .../src/main/res/values-zh/translations.xml | 0 .../impl/src/main/res/values/localazy.xml | 0 .../home}/impl/RoomListContextMenuTest.kt | 2 +- .../impl/RoomListDeclineInviteMenuTest.kt | 4 +-- .../home}/impl/RoomListPresenterTest.kt | 18 +++++----- .../features/home}/impl/RoomListState.kt | 2 +- .../features/home}/impl/RoomListViewTest.kt | 8 ++--- .../impl/datasource/RoomListDataSourceTest.kt | 4 +-- .../RoomListRoomSummaryFactoryTest.kt | 2 +- .../RoomListFiltersEmptyStateResourcesTest.kt | 4 +-- .../filters/RoomListFiltersPresenterTest.kt | 6 ++-- .../impl/filters/RoomListFiltersViewTest.kt | 6 ++-- .../impl/model/RoomListBaseRoomSummaryTest.kt | 2 +- .../search/RoomListSearchPresenterTest.kt | 4 +-- features/preferences/impl/build.gradle.kts | 2 +- tools/localazy/config.json | 2 +- 95 files changed, 192 insertions(+), 184 deletions(-) rename features/{roomlist => home}/api/build.gradle.kts (86%) rename features/{roomlist/api/src/main/kotlin/io/element/android/features/roomlist/api/RoomListEntryPoint.kt => home/api/src/main/kotlin/io/element/android/features/home/api/HomeEntryPoint.kt} (91%) rename features/{roomlist => home}/impl/build.gradle.kts (96%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/DefaultRoomListEntryPoint.kt => home/impl/src/main/kotlin/io/element/android/features/home/impl/DefaultHomeEntryPoint.kt} (62%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListFlowNode.kt => home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt} (85%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListContentStateProvider.kt (94%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListContextMenu.kt (99%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListDeclineInviteMenu.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListEvents.kt (91%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListPresenter.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListState.kt (91%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListStateContextMenuShownProvider.kt (95%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListStateProvider.kt (90%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/RoomListView.kt (95%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/BannerPadding.kt (88%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/BatteryOptimizationBanner.kt (93%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/ConfirmRecoveryKeyBanner.kt (92%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/FullScreenIntentPermissionBanner.kt (94%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/RoomListContentView.kt (91%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/RoomListMenuAction.kt (81%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/RoomListTopBar.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/RoomSummaryPlaceholderRow.kt (98%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/RoomSummaryRow.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/components/SetUpRecoveryKeyBanner.kt (92%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/datasource/RoomListDataSource.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/datasource/RoomListRoomSummaryFactory.kt (93%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/di/RoomListModule.kt (65%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFilter.kt (90%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersEmptyStateResources.kt (96%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersEvents.kt (86%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersPresenter.kt (94%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersState.kt (83%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersStateProvider.kt (87%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersView.kt (99%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/selection/DefaultFilterSelectionStrategy.kt (92%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/selection/FilterSelectionState.kt (67%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/filters/selection/FilterSelectionStrategy.kt (82%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/model/RoomListRoomSummary.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/model/RoomListRoomSummaryProvider.kt (99%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/model/RoomSummaryDisplayType.kt (86%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchDataSource.kt (90%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchEvents.kt (87%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchPresenter.kt (97%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchState.kt (76%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchStateProvider.kt (84%) rename features/{roomlist/impl/src/main/kotlin/io/element/android/features/roomlist => home/impl/src/main/kotlin/io/element/android/features/home}/impl/search/RoomListSearchView.kt (95%) rename features/{roomlist => home}/impl/src/main/res/values-be/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-bg/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-cs/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-cy/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-de/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-el/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-en-rUS/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-es/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-et/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-eu/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-fa/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-fi/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-fr/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-hu/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-in/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-it/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-ka/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-lt/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-nb/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-nl/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-pl/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-pt-rBR/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-pt/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-ro/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-ru/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-sk/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-sv/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-tr/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-uk/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-ur/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-uz/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-zh-rTW/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values-zh/translations.xml (100%) rename features/{roomlist => home}/impl/src/main/res/values/localazy.xml (100%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/RoomListContextMenuTest.kt (99%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/RoomListDeclineInviteMenuTest.kt (96%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/RoomListPresenterTest.kt (98%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/RoomListState.kt (84%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/RoomListViewTest.kt (97%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/datasource/RoomListDataSourceTest.kt (97%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/datasource/RoomListRoomSummaryFactoryTest.kt (92%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersEmptyStateResourcesTest.kt (97%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersPresenterTest.kt (95%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/filters/RoomListFiltersViewTest.kt (90%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/model/RoomListBaseRoomSummaryTest.kt (98%) rename features/{roomlist/impl/src/test/kotlin/io/element/android/features/roomlist => home/impl/src/test/kotlin/io/element/android/features/home}/impl/search/RoomListSearchPresenterTest.kt (97%) 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..aa33641318 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -49,11 +49,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 +90,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 +107,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, @@ -160,7 +169,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 } } } @@ -185,7 +194,7 @@ class LoggedInFlowNode @AssistedInject constructor( 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 +221,7 @@ class LoggedInFlowNode @AssistedInject constructor( data object LoggedInPermanent : NavTarget @Parcelize - data object RoomList : NavTarget + data object Home : NavTarget @Parcelize data class Room( @@ -269,8 +278,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 +312,7 @@ class LoggedInFlowNode @AssistedInject constructor( backstack.push(NavTarget.LogoutForNativeSlidingSyncMigrationNeeded) } } - roomListEntryPoint + homeEntryPoint .nodeBuilder(this, buildContext) .callback(callback) .build() @@ -487,7 +496,7 @@ class LoggedInFlowNode @AssistedInject constructor( clearBackstack: Boolean, ) { waitForNavTargetAttached { navTarget -> - navTarget is NavTarget.RoomList + navTarget is NavTarget.Home } attachChild { val roomNavTarget = NavTarget.Room( @@ -504,7 +513,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 +526,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 +564,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/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 96% rename from features/roomlist/impl/build.gradle.kts rename to features/home/impl/build.gradle.kts index e0d795efd6..5ea238081b 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 { @@ -52,7 +52,7 @@ dependencies { implementation(projects.services.analytics.api) implementation(libs.androidx.datastore.preferences) 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/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 85% 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..c21cb2093b 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,7 +41,7 @@ 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, @@ -51,7 +51,7 @@ class RoomListFlowNode @AssistedInject constructor( 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() } } } } 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/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/RoomListContentStateProvider.kt index 5825c0a1e5..28edbc73a0 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/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 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/RoomListContextMenu.kt similarity index 99% 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/RoomListContextMenu.kt index 10a591bcbd..bb0cd060e3 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/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 import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column 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/RoomListDeclineInviteMenu.kt similarity index 97% 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/RoomListDeclineInviteMenu.kt index 0f986999f8..452f6e472b 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/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 import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -20,7 +20,7 @@ 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.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/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/RoomListEvents.kt index b17b45b86b..e5d74e7f70 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/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 -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/RoomListPresenter.kt similarity index 97% 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/RoomListPresenter.kt index 9e8199cd80..c192c1bc58 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/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 import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -23,6 +23,10 @@ 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 @@ -31,10 +35,6 @@ 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 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/RoomListState.kt similarity index 91% 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/RoomListState.kt index 0cf6147df7..3c515192d8 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/RoomListState.kt @@ -5,15 +5,15 @@ * 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 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 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/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/RoomListStateContextMenuShownProvider.kt index 2f347a1659..39175f3ce6 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/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 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/RoomListStateProvider.kt similarity index 90% 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/RoomListStateProvider.kt index 6b8b3f5ff9..378a4a9b44 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/RoomListStateProvider.kt @@ -5,23 +5,23 @@ * 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 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.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 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/RoomListView.kt similarity index 95% 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/RoomListView.kt index b00796c1fe..11bda8546a 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/RoomListView.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 androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -25,13 +25,13 @@ 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.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.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 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 91% 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..35c582c58e 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 @@ -34,19 +34,19 @@ 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.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.RoomListContentState +import io.element.android.features.home.impl.RoomListContentStateProvider +import io.element.android.features.home.impl.RoomListEvents +import io.element.android.features.home.impl.SecurityBannerState +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.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/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 97% 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 bee535d8cd..4c21d296e2 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 @@ -40,10 +40,9 @@ 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.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 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 97% 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 d6ad371beb..95d54f42ef 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,11 +37,11 @@ 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.RoomListEvents +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.libraries.core.extensions.orEmpty import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom import io.element.android.libraries.designsystem.components.avatar.Avatar 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 65% 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..19505402da 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,15 +5,15 @@ * 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.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 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 99% 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 6cb94d9f96..8e2b4d4a22 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 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/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..cdc69ec0d6 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.aRoomListRoomSummaryList +import io.element.android.features.home.impl.model.RoomListRoomSummary 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..bbefebbf38 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.RoomListEvents +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.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/roomlist/impl/src/main/res/values-bg/translations.xml b/features/home/impl/src/main/res/values-bg/translations.xml similarity index 100% rename from features/roomlist/impl/src/main/res/values-bg/translations.xml rename to features/home/impl/src/main/res/values-bg/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-cs/translations.xml rename to features/home/impl/src/main/res/values-cs/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-cy/translations.xml rename to features/home/impl/src/main/res/values-cy/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-de/translations.xml rename to features/home/impl/src/main/res/values-de/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-el/translations.xml rename to features/home/impl/src/main/res/values-el/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-et/translations.xml rename to features/home/impl/src/main/res/values-et/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-fa/translations.xml rename to features/home/impl/src/main/res/values-fa/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-fi/translations.xml rename to features/home/impl/src/main/res/values-fi/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-fr/translations.xml rename to features/home/impl/src/main/res/values-fr/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-hu/translations.xml rename to features/home/impl/src/main/res/values-hu/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-in/translations.xml rename to features/home/impl/src/main/res/values-in/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-it/translations.xml rename to features/home/impl/src/main/res/values-it/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-nb/translations.xml rename to features/home/impl/src/main/res/values-nb/translations.xml 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 100% 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 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 100% rename from features/roomlist/impl/src/main/res/values-pt/translations.xml rename to features/home/impl/src/main/res/values-pt/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-ru/translations.xml rename to features/home/impl/src/main/res/values-ru/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-sk/translations.xml rename to features/home/impl/src/main/res/values-sk/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-sv/translations.xml rename to features/home/impl/src/main/res/values-sv/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-uk/translations.xml rename to features/home/impl/src/main/res/values-uk/translations.xml 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 100% rename from features/roomlist/impl/src/main/res/values-zh/translations.xml rename to features/home/impl/src/main/res/values-zh/translations.xml diff --git a/features/roomlist/impl/src/main/res/values/localazy.xml b/features/home/impl/src/main/res/values/localazy.xml similarity index 100% rename from features/roomlist/impl/src/main/res/values/localazy.xml rename to features/home/impl/src/main/res/values/localazy.xml 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/RoomListContextMenuTest.kt similarity index 99% 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/RoomListContextMenuTest.kt index 6becb39e7a..7496f4ddfb 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/RoomListContextMenuTest.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 androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule 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/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/RoomListDeclineInviteMenuTest.kt index 8c75027ec5..098a32bf81 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/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 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/RoomListPresenterTest.kt similarity index 98% 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/RoomListPresenterTest.kt index db605b5b6c..89d4e7b5fd 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/RoomListPresenterTest.kt @@ -5,13 +5,21 @@ * 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 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.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 @@ -21,14 +29,6 @@ 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 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/RoomListState.kt similarity index 84% 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/RoomListState.kt index faf3fcfb5c..26069bba4f 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/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 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/RoomListViewTest.kt similarity index 97% 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/RoomListViewTest.kt index 60da841e96..77d805601e 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/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 import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule @@ -16,9 +16,9 @@ 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.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 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/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/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index fa7aeb4bca..8eb3c5d860 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -75,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/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\\..*", From b02aa0d546635fa546a73552c3522ad022e111a9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Jun 2025 15:18:53 +0200 Subject: [PATCH 089/156] Add TODO --- .../io/element/android/features/home/impl/RoomListPresenter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt index c192c1bc58..3e6ffb85c0 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt @@ -75,6 +75,7 @@ import javax.inject.Inject private const val EXTENDED_RANGE_SIZE = 40 private const val SUBSCRIBE_TO_VISIBLE_ROOMS_DEBOUNCE_IN_MILLIS = 300L +// TODO Create HomePresenter to split the state. class RoomListPresenter @Inject constructor( private val client: MatrixClient, private val syncService: SyncService, From 67f36f3d7413f7dfa211eed1fe9e9af984fd69ec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Jun 2025 15:48:14 +0200 Subject: [PATCH 090/156] Add missing import --- .../android/features/home/impl/components/RoomListTopBar.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt index 4c21d296e2..1b7edcbfd4 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt @@ -40,6 +40,7 @@ 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.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 From 082b012bc5a58507f2dcd09e8f264e95ac0860f8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Jun 2025 15:51:13 +0200 Subject: [PATCH 091/156] Fix incorrect import --- .../android/features/home/impl/filters/RoomListFiltersView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt index 8e2b4d4a22..91b00b1180 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/filters/RoomListFiltersView.kt @@ -40,7 +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.roomlist.impl.R +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 From 2ba5d10f6a797798791a8f3c376bff2a9582bfb6 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 27 Jun 2025 14:25:41 +0000 Subject: [PATCH 092/156] Update screenshots --- ...s.home.impl.components_BatteryOptimizationBanner_Day_0_en.png} | 0 ...home.impl.components_BatteryOptimizationBanner_Night_0_en.png} | 0 ...es.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png} | 0 ....home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png} | 0 ...pl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png} | 0 ....components_DefaultRoomListTopBarWithIndicator_Night_0_en.png} | 0 ...tures.home.impl.components_DefaultRoomListTopBar_Day_0_en.png} | 0 ...res.home.impl.components_DefaultRoomListTopBar_Night_0_en.png} | 0 ...impl.components_FullScreenIntentPermissionBanner_Day_0_en.png} | 0 ...pl.components_FullScreenIntentPermissionBanner_Night_0_en.png} | 0 ...eatures.home.impl.components_RoomListContentView_Day_0_en.png} | 0 ...eatures.home.impl.components_RoomListContentView_Day_1_en.png} | 0 ...eatures.home.impl.components_RoomListContentView_Day_2_en.png} | 0 ...eatures.home.impl.components_RoomListContentView_Day_3_en.png} | 0 ...eatures.home.impl.components_RoomListContentView_Day_4_en.png} | 0 ...tures.home.impl.components_RoomListContentView_Night_0_en.png} | 0 ...tures.home.impl.components_RoomListContentView_Night_1_en.png} | 0 ...tures.home.impl.components_RoomListContentView_Night_2_en.png} | 0 ...tures.home.impl.components_RoomListContentView_Night_3_en.png} | 0 ...tures.home.impl.components_RoomListContentView_Night_4_en.png} | 0 ...s.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png} | 0 ...home.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_0_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_10_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_11_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_12_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_13_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_14_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_15_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_16_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_17_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_18_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_19_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_1_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_20_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_21_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_22_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_23_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_24_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_25_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_26_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_27_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_28_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_29_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_2_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_30_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_31_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_32_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_33_en.png} | 0 ...=> features.home.impl.components_RoomSummaryRow_Day_34_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_3_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_4_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_5_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_6_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_7_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_8_en.png} | 0 ... => features.home.impl.components_RoomSummaryRow_Day_9_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_0_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_10_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_11_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_12_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_13_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_14_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_15_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_16_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_17_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_18_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_19_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_1_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_20_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_21_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_22_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_23_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_24_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_25_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_26_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_27_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_28_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_29_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_2_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_30_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_31_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_32_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_33_en.png} | 0 ... features.home.impl.components_RoomSummaryRow_Night_34_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_3_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_4_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_5_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_6_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_7_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_8_en.png} | 0 ...> features.home.impl.components_RoomSummaryRow_Night_9_en.png} | 0 ...ures.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png} | 0 ...es.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png} | 0 ...> features.home.impl.filters_RoomListFiltersView_Day_0_en.png} | 0 ...> features.home.impl.filters_RoomListFiltersView_Day_1_en.png} | 0 ...features.home.impl.filters_RoomListFiltersView_Night_0_en.png} | 0 ...features.home.impl.filters_RoomListFiltersView_Night_1_en.png} | 0 ... features.home.impl.search_RoomListSearchContent_Day_0_en.png} | 0 ... features.home.impl.search_RoomListSearchContent_Day_1_en.png} | 0 ...eatures.home.impl.search_RoomListSearchContent_Night_0_en.png} | 0 ...eatures.home.impl.search_RoomListSearchContent_Night_1_en.png} | 0 ...tures.home.impl_RoomListDeclineInviteMenuContent_Day_0_en.png} | 0 ...res.home.impl_RoomListDeclineInviteMenuContent_Night_0_en.png} | 0 ...atures.home.impl_RoomListModalBottomSheetContent_Day_0_en.png} | 0 ...atures.home.impl_RoomListModalBottomSheetContent_Day_1_en.png} | 0 ...atures.home.impl_RoomListModalBottomSheetContent_Day_2_en.png} | 0 ...ures.home.impl_RoomListModalBottomSheetContent_Night_0_en.png} | 0 ...ures.home.impl_RoomListModalBottomSheetContent_Night_1_en.png} | 0 ...ures.home.impl_RoomListModalBottomSheetContent_Night_2_en.png} | 0 ..._Day_0_en.png => features.home.impl_RoomListView_Day_0_en.png} | 0 ...ay_10_en.png => features.home.impl_RoomListView_Day_10_en.png} | 0 ...ay_11_en.png => features.home.impl_RoomListView_Day_11_en.png} | 0 ..._Day_1_en.png => features.home.impl_RoomListView_Day_1_en.png} | 0 ..._Day_2_en.png => features.home.impl_RoomListView_Day_2_en.png} | 0 ..._Day_3_en.png => features.home.impl_RoomListView_Day_3_en.png} | 0 ..._Day_4_en.png => features.home.impl_RoomListView_Day_4_en.png} | 0 ..._Day_5_en.png => features.home.impl_RoomListView_Day_5_en.png} | 0 ..._Day_6_en.png => features.home.impl_RoomListView_Day_6_en.png} | 0 ..._Day_7_en.png => features.home.impl_RoomListView_Day_7_en.png} | 0 ..._Day_8_en.png => features.home.impl_RoomListView_Day_8_en.png} | 0 ..._Day_9_en.png => features.home.impl_RoomListView_Day_9_en.png} | 0 ...ht_0_en.png => features.home.impl_RoomListView_Night_0_en.png} | 0 ..._10_en.png => features.home.impl_RoomListView_Night_10_en.png} | 0 ..._11_en.png => features.home.impl_RoomListView_Night_11_en.png} | 0 ...ht_1_en.png => features.home.impl_RoomListView_Night_1_en.png} | 0 ...ht_2_en.png => features.home.impl_RoomListView_Night_2_en.png} | 0 ...ht_3_en.png => features.home.impl_RoomListView_Night_3_en.png} | 0 ...ht_4_en.png => features.home.impl_RoomListView_Night_4_en.png} | 0 ...ht_5_en.png => features.home.impl_RoomListView_Night_5_en.png} | 0 ...ht_6_en.png => features.home.impl_RoomListView_Night_6_en.png} | 0 ...ht_7_en.png => features.home.impl_RoomListView_Night_7_en.png} | 0 ...ht_8_en.png => features.home.impl_RoomListView_Night_8_en.png} | 0 ...ht_9_en.png => features.home.impl_RoomListView_Night_9_en.png} | 0 134 files changed, 0 insertions(+), 0 deletions(-) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_BatteryOptimizationBanner_Day_0_en.png => features.home.impl.components_BatteryOptimizationBanner_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_BatteryOptimizationBanner_Night_0_en.png => features.home.impl.components_BatteryOptimizationBanner_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png => features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png => features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png => features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png => features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en.png => features.home.impl.components_DefaultRoomListTopBar_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en.png => features.home.impl.components_DefaultRoomListTopBar_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png => features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png => features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Day_0_en.png => features.home.impl.components_RoomListContentView_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Day_1_en.png => features.home.impl.components_RoomListContentView_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Day_2_en.png => features.home.impl.components_RoomListContentView_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Day_3_en.png => features.home.impl.components_RoomListContentView_Day_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Day_4_en.png => features.home.impl.components_RoomListContentView_Day_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Night_0_en.png => features.home.impl.components_RoomListContentView_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Night_1_en.png => features.home.impl.components_RoomListContentView_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Night_2_en.png => features.home.impl.components_RoomListContentView_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Night_3_en.png => features.home.impl.components_RoomListContentView_Night_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomListContentView_Night_4_en.png => features.home.impl.components_RoomListContentView_Night_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png => features.home.impl.components_RoomSummaryPlaceholderRow_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png => features.home.impl.components_RoomSummaryPlaceholderRow_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_0_en.png => features.home.impl.components_RoomSummaryRow_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_10_en.png => features.home.impl.components_RoomSummaryRow_Day_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_11_en.png => features.home.impl.components_RoomSummaryRow_Day_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_12_en.png => features.home.impl.components_RoomSummaryRow_Day_12_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_13_en.png => features.home.impl.components_RoomSummaryRow_Day_13_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_14_en.png => features.home.impl.components_RoomSummaryRow_Day_14_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_15_en.png => features.home.impl.components_RoomSummaryRow_Day_15_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_16_en.png => features.home.impl.components_RoomSummaryRow_Day_16_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_17_en.png => features.home.impl.components_RoomSummaryRow_Day_17_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_18_en.png => features.home.impl.components_RoomSummaryRow_Day_18_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_19_en.png => features.home.impl.components_RoomSummaryRow_Day_19_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_1_en.png => features.home.impl.components_RoomSummaryRow_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_20_en.png => features.home.impl.components_RoomSummaryRow_Day_20_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_21_en.png => features.home.impl.components_RoomSummaryRow_Day_21_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_22_en.png => features.home.impl.components_RoomSummaryRow_Day_22_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_23_en.png => features.home.impl.components_RoomSummaryRow_Day_23_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_24_en.png => features.home.impl.components_RoomSummaryRow_Day_24_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_25_en.png => features.home.impl.components_RoomSummaryRow_Day_25_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_26_en.png => features.home.impl.components_RoomSummaryRow_Day_26_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_27_en.png => features.home.impl.components_RoomSummaryRow_Day_27_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_28_en.png => features.home.impl.components_RoomSummaryRow_Day_28_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_29_en.png => features.home.impl.components_RoomSummaryRow_Day_29_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_2_en.png => features.home.impl.components_RoomSummaryRow_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_30_en.png => features.home.impl.components_RoomSummaryRow_Day_30_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_31_en.png => features.home.impl.components_RoomSummaryRow_Day_31_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_32_en.png => features.home.impl.components_RoomSummaryRow_Day_32_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_33_en.png => features.home.impl.components_RoomSummaryRow_Day_33_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_34_en.png => features.home.impl.components_RoomSummaryRow_Day_34_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_3_en.png => features.home.impl.components_RoomSummaryRow_Day_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_4_en.png => features.home.impl.components_RoomSummaryRow_Day_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_5_en.png => features.home.impl.components_RoomSummaryRow_Day_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_6_en.png => features.home.impl.components_RoomSummaryRow_Day_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_7_en.png => features.home.impl.components_RoomSummaryRow_Day_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_8_en.png => features.home.impl.components_RoomSummaryRow_Day_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Day_9_en.png => features.home.impl.components_RoomSummaryRow_Day_9_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_0_en.png => features.home.impl.components_RoomSummaryRow_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_10_en.png => features.home.impl.components_RoomSummaryRow_Night_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_11_en.png => features.home.impl.components_RoomSummaryRow_Night_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_12_en.png => features.home.impl.components_RoomSummaryRow_Night_12_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_13_en.png => features.home.impl.components_RoomSummaryRow_Night_13_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_14_en.png => features.home.impl.components_RoomSummaryRow_Night_14_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_15_en.png => features.home.impl.components_RoomSummaryRow_Night_15_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_16_en.png => features.home.impl.components_RoomSummaryRow_Night_16_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_17_en.png => features.home.impl.components_RoomSummaryRow_Night_17_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_18_en.png => features.home.impl.components_RoomSummaryRow_Night_18_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_19_en.png => features.home.impl.components_RoomSummaryRow_Night_19_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_1_en.png => features.home.impl.components_RoomSummaryRow_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_20_en.png => features.home.impl.components_RoomSummaryRow_Night_20_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_21_en.png => features.home.impl.components_RoomSummaryRow_Night_21_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_22_en.png => features.home.impl.components_RoomSummaryRow_Night_22_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_23_en.png => features.home.impl.components_RoomSummaryRow_Night_23_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_24_en.png => features.home.impl.components_RoomSummaryRow_Night_24_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_25_en.png => features.home.impl.components_RoomSummaryRow_Night_25_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_26_en.png => features.home.impl.components_RoomSummaryRow_Night_26_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_27_en.png => features.home.impl.components_RoomSummaryRow_Night_27_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_28_en.png => features.home.impl.components_RoomSummaryRow_Night_28_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_29_en.png => features.home.impl.components_RoomSummaryRow_Night_29_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_2_en.png => features.home.impl.components_RoomSummaryRow_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_30_en.png => features.home.impl.components_RoomSummaryRow_Night_30_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_31_en.png => features.home.impl.components_RoomSummaryRow_Night_31_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_32_en.png => features.home.impl.components_RoomSummaryRow_Night_32_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_33_en.png => features.home.impl.components_RoomSummaryRow_Night_33_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_34_en.png => features.home.impl.components_RoomSummaryRow_Night_34_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_3_en.png => features.home.impl.components_RoomSummaryRow_Night_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_4_en.png => features.home.impl.components_RoomSummaryRow_Night_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_5_en.png => features.home.impl.components_RoomSummaryRow_Night_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_6_en.png => features.home.impl.components_RoomSummaryRow_Night_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_7_en.png => features.home.impl.components_RoomSummaryRow_Night_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_8_en.png => features.home.impl.components_RoomSummaryRow_Night_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_RoomSummaryRow_Night_9_en.png => features.home.impl.components_RoomSummaryRow_Night_9_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png => features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png => features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.filters_RoomListFiltersView_Day_0_en.png => features.home.impl.filters_RoomListFiltersView_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.filters_RoomListFiltersView_Day_1_en.png => features.home.impl.filters_RoomListFiltersView_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.filters_RoomListFiltersView_Night_0_en.png => features.home.impl.filters_RoomListFiltersView_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.filters_RoomListFiltersView_Night_1_en.png => features.home.impl.filters_RoomListFiltersView_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.search_RoomListSearchContent_Day_0_en.png => features.home.impl.search_RoomListSearchContent_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.search_RoomListSearchContent_Day_1_en.png => features.home.impl.search_RoomListSearchContent_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.search_RoomListSearchContent_Night_0_en.png => features.home.impl.search_RoomListSearchContent_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl.search_RoomListSearchContent_Night_1_en.png => features.home.impl.search_RoomListSearchContent_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_en.png => features.home.impl_RoomListDeclineInviteMenuContent_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListDeclineInviteMenuContent_Night_0_en.png => features.home.impl_RoomListDeclineInviteMenuContent_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en.png => features.home.impl_RoomListModalBottomSheetContent_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en.png => features.home.impl_RoomListModalBottomSheetContent_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en.png => features.home.impl_RoomListModalBottomSheetContent_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en.png => features.home.impl_RoomListModalBottomSheetContent_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en.png => features.home.impl_RoomListModalBottomSheetContent_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en.png => features.home.impl_RoomListModalBottomSheetContent_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_0_en.png => features.home.impl_RoomListView_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_10_en.png => features.home.impl_RoomListView_Day_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_11_en.png => features.home.impl_RoomListView_Day_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_1_en.png => features.home.impl_RoomListView_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_2_en.png => features.home.impl_RoomListView_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_3_en.png => features.home.impl_RoomListView_Day_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_4_en.png => features.home.impl_RoomListView_Day_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_5_en.png => features.home.impl_RoomListView_Day_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_6_en.png => features.home.impl_RoomListView_Day_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_7_en.png => features.home.impl_RoomListView_Day_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_8_en.png => features.home.impl_RoomListView_Day_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Day_9_en.png => features.home.impl_RoomListView_Day_9_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_0_en.png => features.home.impl_RoomListView_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_10_en.png => features.home.impl_RoomListView_Night_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_11_en.png => features.home.impl_RoomListView_Night_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_1_en.png => features.home.impl_RoomListView_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_2_en.png => features.home.impl_RoomListView_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_3_en.png => features.home.impl_RoomListView_Night_3_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_4_en.png => features.home.impl_RoomListView_Night_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_5_en.png => features.home.impl_RoomListView_Night_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_6_en.png => features.home.impl_RoomListView_Night_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_7_en.png => features.home.impl_RoomListView_Night_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_8_en.png => features.home.impl_RoomListView_Night_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.roomlist.impl_RoomListView_Night_9_en.png => features.home.impl_RoomListView_Night_9_en.png} (100%) 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.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_RoomListDeclineInviteMenuContent_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_RoomListModalBottomSheetContent_Night_2_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_RoomListView_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_RoomListView_Day_0_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_RoomListView_Day_10_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_RoomListView_Day_10_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_RoomListView_Day_11_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_RoomListView_Day_11_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_RoomListView_Day_1_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_RoomListView_Day_1_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_RoomListView_Day_2_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_RoomListView_Day_2_en.png 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_RoomListView_Day_3_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_RoomListView_Day_3_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_RoomListView_Day_4_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_RoomListView_Day_4_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_RoomListView_Day_5_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_RoomListView_Day_5_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_RoomListView_Day_6_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_RoomListView_Day_6_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_RoomListView_Day_7_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_RoomListView_Day_7_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_RoomListView_Day_8_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_RoomListView_Day_8_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_RoomListView_Day_9_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_RoomListView_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_RoomListView_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_RoomListView_Night_0_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_RoomListView_Night_10_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_RoomListView_Night_10_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_RoomListView_Night_11_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_RoomListView_Night_11_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_RoomListView_Night_1_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_RoomListView_Night_1_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_RoomListView_Night_2_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_RoomListView_Night_2_en.png 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_RoomListView_Night_3_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_RoomListView_Night_3_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_RoomListView_Night_4_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_RoomListView_Night_4_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_RoomListView_Night_5_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_RoomListView_Night_5_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_RoomListView_Night_6_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_RoomListView_Night_6_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_RoomListView_Night_7_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_RoomListView_Night_7_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_RoomListView_Night_8_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_RoomListView_Night_8_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_RoomListView_Night_9_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_RoomListView_Night_9_en.png From 284241a4ecdfa6386c2e53174c4719800d19bd47 Mon Sep 17 00:00:00 2001 From: bmarty <3940906+bmarty@users.noreply.github.com> Date: Mon, 30 Jun 2025 00:33:54 +0000 Subject: [PATCH 093/156] Sync Strings from Localazy --- app/src/main/res/xml/locales_config.xml | 1 + .../src/main/res/values-da/translations.xml | 6 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 10 + .../src/main/res/values-cs/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 1 + .../src/main/res/values-et/translations.xml | 1 + .../src/main/res/values-hu/translations.xml | 1 + .../src/main/res/values-pt/translations.xml | 1 + .../src/main/res/values-sk/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 1 + .../src/main/res/values-bg/translations.xml | 17 +- .../src/main/res/values-da/translations.xml | 30 + .../src/main/res/values-el/translations.xml | 40 +- .../src/main/res/values-bg/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 14 + .../src/main/res/values-el/translations.xml | 2 +- .../src/main/res/values-bg/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 22 + .../src/main/res/values-el/translations.xml | 2 +- .../src/main/res/values-bg/translations.xml | 16 +- .../src/main/res/values-cs/translations.xml | 3 + .../src/main/res/values-da/translations.xml | 49 + .../src/main/res/values-el/translations.xml | 12 +- .../src/main/res/values-et/translations.xml | 5 + .../src/main/res/values-fi/translations.xml | 1 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-nb/translations.xml | 4 + .../src/main/res/values-pt/translations.xml | 5 + .../src/main/res/values-ru/translations.xml | 1 + .../src/main/res/values-sk/translations.xml | 5 + .../src/main/res/values-sv/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 4 + .../src/main/res/values-zh/translations.xml | 2 + .../src/main/res/values-bg/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 18 + .../src/main/res/values-el/translations.xml | 6 +- .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 32 + .../src/main/res/values-el/translations.xml | 30 +- .../src/main/res/values-da/translations.xml | 36 + .../src/main/res/values-el/translations.xml | 12 +- .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-el/translations.xml | 6 +- .../src/main/res/values-da/translations.xml | 38 + .../src/main/res/values-el/translations.xml | 10 +- .../src/main/res/values-bg/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 94 + .../src/main/res/values-el/translations.xml | 7 + .../src/main/res/values-et/translations.xml | 1 + .../src/main/res/values-fr/translations.xml | 1 + .../src/main/res/values-pt/translations.xml | 1 + .../src/main/res/values-sk/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 18 + .../src/main/res/values-bg/translations.xml | 1 + .../src/main/res/values-cs/translations.xml | 12 + .../src/main/res/values-da/translations.xml | 67 + .../src/main/res/values-el/translations.xml | 24 +- .../src/main/res/values-et/translations.xml | 14 + .../src/main/res/values-fa/translations.xml | 1 + .../src/main/res/values-fi/translations.xml | 4 + .../src/main/res/values-fr/translations.xml | 5 + .../src/main/res/values-hu/translations.xml | 14 + .../src/main/res/values-nb/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 14 + .../src/main/res/values-ru/translations.xml | 4 + .../src/main/res/values-sk/translations.xml | 16 + .../src/main/res/values-sv/translations.xml | 4 + .../src/main/res/values-uk/translations.xml | 16 + .../impl/src/main/res/values/localazy.xml | 1 + .../src/main/res/values-cs/translations.xml | 9 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 8 + .../src/main/res/values-et/translations.xml | 8 + .../src/main/res/values-hu/translations.xml | 8 + .../src/main/res/values-pt/translations.xml | 8 + .../src/main/res/values-sk/translations.xml | 9 + .../src/main/res/values-uk/translations.xml | 9 + .../src/main/res/values-cs/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 20 + .../src/main/res/values-el/translations.xml | 1 + .../src/main/res/values-et/translations.xml | 1 + .../src/main/res/values-hu/translations.xml | 1 + .../src/main/res/values-pt/translations.xml | 1 + .../src/main/res/values-sk/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 1 + .../src/main/res/values-bg/translations.xml | 8 + .../src/main/res/values-da/translations.xml | 69 + .../src/main/res/values-el/translations.xml | 8 +- .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 17 + .../src/main/res/values-et/translations.xml | 1 + .../src/main/res/values-fr/translations.xml | 1 + .../src/main/res/values-hu/translations.xml | 1 + .../src/main/res/values-nb/translations.xml | 1 + .../src/main/res/values-pt/translations.xml | 1 + .../src/main/res/values-sk/translations.xml | 1 + .../src/main/res/values-uk/translations.xml | 1 + .../impl/src/main/res/values/localazy.xml | 1 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-el/translations.xml | 8 +- .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 4 +- .../src/main/res/values-bg/translations.xml | 42 + .../src/main/res/values-da/translations.xml | 147 ++ .../src/main/res/values-el/translations.xml | 80 +- .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-el/translations.xml | 2 +- .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 20 + .../src/main/res/values-el/translations.xml | 11 +- .../src/main/res/values-bg/translations.xml | 21 +- .../src/main/res/values-da/translations.xml | 70 + .../src/main/res/values-da/translations.xml | 8 + .../src/main/res/values-bg/translations.xml | 2 + .../src/main/res/values-da/translations.xml | 19 + .../src/main/res/values-bg/translations.xml | 15 + .../src/main/res/values-da/translations.xml | 53 + .../src/main/res/values-da/translations.xml | 4 + .../src/main/res/values-bg/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-bg/translations.xml | 10 +- .../src/main/res/values-da/translations.xml | 73 + .../src/main/res/values-el/translations.xml | 44 +- .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-bg/translations.xml | 6 + .../src/main/res/values-da/translations.xml | 21 + .../src/main/res/values-el/translations.xml | 4 +- .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-da/translations.xml | 5 + .../src/main/res/values-be/translations.xml | 1 - .../src/main/res/values-bg/translations.xml | 1 - .../src/main/res/values-da/translations.xml | 81 + .../src/main/res/values-de/translations.xml | 1 - .../src/main/res/values-el/translations.xml | 12 +- .../src/main/res/values-es/translations.xml | 1 - .../src/main/res/values-et/translations.xml | 2 +- .../src/main/res/values-eu/translations.xml | 1 - .../src/main/res/values-fi/translations.xml | 1 - .../src/main/res/values-fr/translations.xml | 2 +- .../src/main/res/values-in/translations.xml | 1 - .../src/main/res/values-it/translations.xml | 1 - .../src/main/res/values-ka/translations.xml | 1 - .../src/main/res/values-lt/translations.xml | 1 - .../src/main/res/values-nb/translations.xml | 2 +- .../src/main/res/values-nl/translations.xml | 1 - .../src/main/res/values-pl/translations.xml | 1 - .../main/res/values-pt-rBR/translations.xml | 1 - .../src/main/res/values-pt/translations.xml | 2 +- .../src/main/res/values-ro/translations.xml | 1 - .../src/main/res/values-ru/translations.xml | 1 - .../src/main/res/values-sk/translations.xml | 2 +- .../src/main/res/values-sv/translations.xml | 1 - .../src/main/res/values-tr/translations.xml | 1 - .../src/main/res/values-uk/translations.xml | 2 +- .../src/main/res/values-ur/translations.xml | 1 - .../src/main/res/values-uz/translations.xml | 1 - .../main/res/values-zh-rTW/translations.xml | 1 - .../src/main/res/values-zh/translations.xml | 1 - .../src/main/res/values-da/translations.xml | 11 + .../src/main/res/values-da/translations.xml | 10 + .../src/main/res/values-da/translations.xml | 32 + .../src/main/res/values-de/translations.xml | 1 - .../src/main/res/values-el/translations.xml | 4 + .../src/main/res/values-et/translations.xml | 6 +- .../src/main/res/values-fr/translations.xml | 2 +- .../src/main/res/values-hu/translations.xml | 2 +- .../src/main/res/values-pt/translations.xml | 6 +- .../src/main/res/values-sk/translations.xml | 6 +- .../src/main/res/values-uk/translations.xml | 2 + .../src/main/res/values-zh/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 12 + .../src/main/res/values-be/translations.xml | 2 +- .../src/main/res/values-bg/translations.xml | 37 +- .../src/main/res/values-cs/translations.xml | 25 +- .../src/main/res/values-cy/translations.xml | 2 +- .../src/main/res/values-da/translations.xml | 402 ++++ .../src/main/res/values-de/translations.xml | 2 +- .../src/main/res/values-el/translations.xml | 43 +- .../src/main/res/values-es/translations.xml | 2 +- .../src/main/res/values-et/translations.xml | 26 +- .../src/main/res/values-eu/translations.xml | 2 +- .../src/main/res/values-fa/translations.xml | 2 +- .../src/main/res/values-fi/translations.xml | 8 +- .../src/main/res/values-fr/translations.xml | 23 +- .../src/main/res/values-hu/translations.xml | 25 +- .../src/main/res/values-in/translations.xml | 2 +- .../src/main/res/values-it/translations.xml | 2 +- .../src/main/res/values-ka/translations.xml | 2 +- .../src/main/res/values-nb/translations.xml | 18 +- .../src/main/res/values-nl/translations.xml | 2 +- .../src/main/res/values-pl/translations.xml | 2 +- .../main/res/values-pt-rBR/translations.xml | 2 +- .../src/main/res/values-pt/translations.xml | 20 +- .../src/main/res/values-ro/translations.xml | 2 +- .../src/main/res/values-ru/translations.xml | 8 +- .../src/main/res/values-sk/translations.xml | 19 + .../src/main/res/values-sv/translations.xml | 8 +- .../src/main/res/values-tr/translations.xml | 2 +- .../src/main/res/values-uk/translations.xml | 14 +- .../src/main/res/values-ur/translations.xml | 2 +- .../main/res/values-zh-rTW/translations.xml | 2 +- .../src/main/res/values-zh/translations.xml | 13 +- .../src/main/res/values/localazy.xml | 14 +- plugins/src/main/kotlin/extension/locales.kt | 1 + ...s.call.impl.ui_CallScreenView_Day_1_de.png | 4 +- ...s.call.impl.ui_CallScreenView_Day_2_de.png | 4 +- ...s.call.impl.ui_CallScreenView_Day_3_de.png | 4 +- ...nts_ConfirmRecoveryKeyBanner_Day_0_de.png} | 0 ...tRoomListTopBarWithIndicator_Day_0_de.png} | 0 ...onents_DefaultRoomListTopBar_Day_0_de.png} | 0 ...ScreenIntentPermissionBanner_Day_0_de.png} | 0 ...mponents_RoomListContentView_Day_0_de.png} | 0 ...mponents_RoomListContentView_Day_1_de.png} | 0 ...mponents_RoomListContentView_Day_3_de.png} | 0 ...mponents_RoomListContentView_Day_4_de.png} | 0 ...l.components_RoomSummaryRow_Day_29_de.png} | 0 ...pl.components_RoomSummaryRow_Day_2_de.png} | 0 ...l.components_RoomSummaryRow_Day_30_de.png} | 0 ...l.components_RoomSummaryRow_Day_31_de.png} | 0 ...l.components_RoomSummaryRow_Day_32_de.png} | 0 ...l.components_RoomSummaryRow_Day_33_de.png} | 0 ...nents_SetUpRecoveryKeyBanner_Day_0_de.png} | 0 ....filters_RoomListFiltersView_Day_0_de.png} | 0 ....filters_RoomListFiltersView_Day_1_de.png} | 0 ...search_RoomListSearchContent_Day_1_de.png} | 0 ...ListDeclineInviteMenuContent_Day_0_de.png} | 0 ...mListModalBottomSheetContent_Day_0_de.png} | 0 ...mListModalBottomSheetContent_Day_1_de.png} | 0 ...mListModalBottomSheetContent_Day_2_de.png} | 0 ...tures.home.impl_RoomListView_Day_0_de.png} | 0 ...ures.home.impl_RoomListView_Day_10_de.png} | 0 ...tures.home.impl_RoomListView_Day_11_de.png | 3 + ...tures.home.impl_RoomListView_Day_1_de.png} | 0 ...tures.home.impl_RoomListView_Day_2_de.png} | 0 ...tures.home.impl_RoomListView_Day_3_de.png} | 0 ...tures.home.impl_RoomListView_Day_4_de.png} | 0 ...tures.home.impl_RoomListView_Day_5_de.png} | 0 ...tures.home.impl_RoomListView_Day_6_de.png} | 0 ...tures.home.impl_RoomListView_Day_7_de.png} | 0 ...cline_AcceptDeclineInviteView_Day_3_de.png | 4 +- ...cline_AcceptDeclineInviteView_Day_4_de.png | 4 +- ...cline_AcceptDeclineInviteView_Day_5_de.png | 3 + ...ens.onboarding_OnBoardingView_Day_0_de.png | 4 +- ...ens.onboarding_OnBoardingView_Day_1_de.png | 4 +- ...ens.onboarding_OnBoardingView_Day_2_de.png | 4 +- ...ens.onboarding_OnBoardingView_Day_3_de.png | 4 +- ...tachments.preview_AttachmentsView_0_de.png | 4 +- ...tachments.preview_AttachmentsView_1_de.png | 3 - ...tachments.preview_AttachmentsView_2_de.png | 4 +- ...tachments.preview_AttachmentsView_3_de.png | 4 +- ...tachments.preview_AttachmentsView_4_de.png | 4 +- ...tachments.preview_AttachmentsView_5_de.png | 4 +- ...tachments.preview_AttachmentsView_7_de.png | 4 +- ...essagesViewWithIdentityChange_Day_0_de.png | 4 +- ...essagesViewWithIdentityChange_Day_1_de.png | 4 +- ...estions_SuggestionsPickerView_Day_0_de.png | 4 +- ...ecomposer_MessageComposerView_Day_0_de.png | 4 +- ...TimelineItemRoomBeginningView_Day_0_de.png | 4 +- ....components_MessageShieldView_Day_0_de.png | 4 +- ...s.messages.impl_MessagesView_Day_14_de.png | 3 + ...es.messages.impl_MessagesView_Day_5_de.png | 4 +- ...es.messages.impl_MessagesView_Day_6_de.png | 4 +- ...itprofile_EditUserProfileView_Day_1_de.png | 3 + ...roomdetails.impl_RoomDetailsDark_15_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_17_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_18_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_19_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_1_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_17_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_18_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_19_de.png | 3 + ...ures.roomdetails.impl_RoomDetails_1_de.png | 4 +- ...oser_MarkdownTextComposerEdit_Day_0_de.png | 4 +- ...mposer_TextComposerAddCaption_Day_0_de.png | 4 +- ...tcomposer_TextComposerCaption_Day_0_de.png | 4 +- ...poser_TextComposerEditCaption_Day_0_de.png | 4 +- ..._TextComposerEditNotEncrypted_Day_0_de.png | 4 +- ...textcomposer_TextComposerEdit_Day_0_de.png | 4 +- ...omposerFormattingNotEncrypted_Day_0_de.png | 4 +- ...mposer_TextComposerFormatting_Day_0_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_0_de.png | 4 +- ...extComposerReplyNotEncrypted_Day_10_de.png | 4 +- ...extComposerReplyNotEncrypted_Day_11_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_1_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_2_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_3_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_4_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_5_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_6_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_7_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_8_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_9_de.png | 4 +- ...extcomposer_TextComposerReply_Day_0_de.png | 4 +- ...xtcomposer_TextComposerReply_Day_10_de.png | 4 +- ...xtcomposer_TextComposerReply_Day_11_de.png | 4 +- ...extcomposer_TextComposerReply_Day_1_de.png | 4 +- ...extcomposer_TextComposerReply_Day_2_de.png | 4 +- ...extcomposer_TextComposerReply_Day_3_de.png | 4 +- ...extcomposer_TextComposerReply_Day_4_de.png | 4 +- ...extcomposer_TextComposerReply_Day_5_de.png | 4 +- ...extcomposer_TextComposerReply_Day_6_de.png | 4 +- ...extcomposer_TextComposerReply_Day_7_de.png | 4 +- ...extcomposer_TextComposerReply_Day_8_de.png | 4 +- ...extcomposer_TextComposerReply_Day_9_de.png | 4 +- ...extComposerSimpleNotEncrypted_Day_0_de.png | 4 +- ...xtcomposer_TextComposerSimple_Day_0_de.png | 4 +- screenshots/html/data.js | 1735 +++++++++-------- 311 files changed, 3428 insertions(+), 1292 deletions(-) create mode 100644 appnav/src/main/res/values-da/translations.xml create mode 100644 features/analytics/api/src/main/res/values-da/translations.xml create mode 100644 features/analytics/impl/src/main/res/values-da/translations.xml create mode 100644 features/call/impl/src/main/res/values-da/translations.xml create mode 100644 features/createroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-bg/translations.xml create mode 100644 features/deactivation/impl/src/main/res/values-da/translations.xml create mode 100644 features/ftue/impl/src/main/res/values-da/translations.xml create mode 100644 features/home/impl/src/main/res/values-da/translations.xml create mode 100644 features/invite/impl/src/main/res/values-da/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-bg/translations.xml create mode 100644 features/joinroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/knockrequests/impl/src/main/res/values-da/translations.xml create mode 100644 features/leaveroom/api/src/main/res/values-da/translations.xml create mode 100644 features/lockscreen/impl/src/main/res/values-da/translations.xml create mode 100644 features/login/impl/src/main/res/values-da/translations.xml create mode 100644 features/logout/impl/src/main/res/values-da/translations.xml create mode 100644 features/messages/impl/src/main/res/values-da/translations.xml create mode 100644 features/poll/api/src/main/res/values-cs/translations.xml create mode 100644 features/poll/api/src/main/res/values-da/translations.xml create mode 100644 features/poll/api/src/main/res/values-el/translations.xml create mode 100644 features/poll/api/src/main/res/values-et/translations.xml create mode 100644 features/poll/api/src/main/res/values-hu/translations.xml create mode 100644 features/poll/api/src/main/res/values-pt/translations.xml create mode 100644 features/poll/api/src/main/res/values-sk/translations.xml create mode 100644 features/poll/api/src/main/res/values-uk/translations.xml create mode 100644 features/poll/impl/src/main/res/values-da/translations.xml create mode 100644 features/preferences/impl/src/main/res/values-da/translations.xml create mode 100644 features/rageshake/api/src/main/res/values-da/translations.xml create mode 100644 features/rageshake/impl/src/main/res/values-da/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomaliasresolver/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomdetails/impl/src/main/res/values-da/translations.xml create mode 100644 features/roomdirectory/impl/src/main/res/values-da/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-bg/translations.xml create mode 100644 features/roommembermoderation/impl/src/main/res/values-da/translations.xml create mode 100644 features/securebackup/impl/src/main/res/values-da/translations.xml create mode 100644 features/signedout/impl/src/main/res/values-da/translations.xml create mode 100644 features/userprofile/shared/src/main/res/values-da/translations.xml create mode 100644 features/verifysession/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-da/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/dateformatter/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/eventformatter/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/matrixui/src/main/res/values-da/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/mediaviewer/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/permissions/api/src/main/res/values-da/translations.xml create mode 100644 libraries/permissions/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/push/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/pushproviders/firebase/src/main/res/values-da/translations.xml create mode 100644 libraries/pushproviders/unifiedpush/src/main/res/values-da/translations.xml create mode 100644 libraries/textcomposer/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/troubleshoot/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/ui-strings/src/main/res/values-da/translations.xml rename screenshots/de/{features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png => features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png => features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_de.png => features.home.impl.components_DefaultRoomListTopBar_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png => features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomListContentView_Day_0_de.png => features.home.impl.components_RoomListContentView_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomListContentView_Day_1_de.png => features.home.impl.components_RoomListContentView_Day_1_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomListContentView_Day_3_de.png => features.home.impl.components_RoomListContentView_Day_3_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomListContentView_Day_4_de.png => features.home.impl.components_RoomListContentView_Day_4_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png => features.home.impl.components_RoomSummaryRow_Day_29_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_2_de.png => features.home.impl.components_RoomSummaryRow_Day_2_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png => features.home.impl.components_RoomSummaryRow_Day_30_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_31_de.png => features.home.impl.components_RoomSummaryRow_Day_31_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_32_de.png => features.home.impl.components_RoomSummaryRow_Day_32_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_RoomSummaryRow_Day_33_de.png => features.home.impl.components_RoomSummaryRow_Day_33_de.png} (100%) rename screenshots/de/{features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png => features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.filters_RoomListFiltersView_Day_0_de.png => features.home.impl.filters_RoomListFiltersView_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl.filters_RoomListFiltersView_Day_1_de.png => features.home.impl.filters_RoomListFiltersView_Day_1_de.png} (100%) rename screenshots/de/{features.roomlist.impl.search_RoomListSearchContent_Day_1_de.png => features.home.impl.search_RoomListSearchContent_Day_1_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListDeclineInviteMenuContent_Day_0_de.png => features.home.impl_RoomListDeclineInviteMenuContent_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_de.png => features.home.impl_RoomListModalBottomSheetContent_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_de.png => features.home.impl_RoomListModalBottomSheetContent_Day_1_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_de.png => features.home.impl_RoomListModalBottomSheetContent_Day_2_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_0_de.png => features.home.impl_RoomListView_Day_0_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_10_de.png => features.home.impl_RoomListView_Day_10_de.png} (100%) create mode 100644 screenshots/de/features.home.impl_RoomListView_Day_11_de.png rename screenshots/de/{features.roomlist.impl_RoomListView_Day_1_de.png => features.home.impl_RoomListView_Day_1_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_2_de.png => features.home.impl_RoomListView_Day_2_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_3_de.png => features.home.impl_RoomListView_Day_3_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_4_de.png => features.home.impl_RoomListView_Day_4_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_5_de.png => features.home.impl_RoomListView_Day_5_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_6_de.png => features.home.impl_RoomListView_Day_6_de.png} (100%) rename screenshots/de/{features.roomlist.impl_RoomListView_Day_7_de.png => features.home.impl_RoomListView_Day_7_de.png} (100%) create mode 100644 screenshots/de/features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_de.png delete mode 100644 screenshots/de/features.messages.impl.attachments.preview_AttachmentsView_1_de.png create mode 100644 screenshots/de/features.messages.impl_MessagesView_Day_14_de.png create mode 100644 screenshots/de/features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetailsDark_19_de.png create mode 100644 screenshots/de/features.roomdetails.impl_RoomDetails_19_de.png 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/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/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/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/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-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-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-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/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/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/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/home/impl/src/main/res/values-bg/translations.xml b/features/home/impl/src/main/res/values-bg/translations.xml index 4afa8044f3..8a555ebbb8 100644 --- a/features/home/impl/src/main/res/values-bg/translations.xml +++ b/features/home/impl/src/main/res/values-bg/translations.xml @@ -1,7 +1,8 @@ - "Резервното копие на чатовете ви в момента не е синхронизирано. Въведете ключа си за възстановяване, за да потвърдите достъпа до резервното копие на чатовете си." - "Потвърдете ключа си за възстановяване" + "Потвърдете ключа си за възстановяване, за да запазите достъп до хранилището за ключове и историята на съобщенията си." + "Въведете ключа си за възстановяване" + "Хранилището ви за ключове не е синхронизирано" "Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?" "Отказване на покана" "Няма покани" @@ -9,10 +10,21 @@ "Създаване на нов разговор или стая" "Започнете, като изпратите съобщение на някого." "Все още няма чатове." + "Любими" + "Можете да добавите чат към фаворизираните си в настройките на чата. +Засега можете да премахнете избора на филтрите, за да видите другите си чатове." + "Все още нямате фаворизирани чатове" "Покани" + "Нямате чакащи покани." "Нисък приоритет" + "Можете да премахнете избора на филтрите, за да видите другите си чатове" "Хора" + "Все още нямате директни съобщения" "Стаи" + "Все още не сте в никоя стая" + "Непрочетени" + "Поздравления! +Нямате непрочетени съобщения!" "Всички чатове" "Отбелязване като прочетено" "Отбелязване като непрочетено" diff --git a/features/home/impl/src/main/res/values-cs/translations.xml b/features/home/impl/src/main/res/values-cs/translations.xml index 7c15f1c82a..9fcea2887a 100644 --- a/features/home/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/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..fe0ed70a9d --- /dev/null +++ b/features/home/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,49 @@ + + + "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" + "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/home/impl/src/main/res/values-el/translations.xml b/features/home/impl/src/main/res/values-el/translations.xml index 596592f594..692aace0ab 100644 --- a/features/home/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/home/impl/src/main/res/values-et/translations.xml b/features/home/impl/src/main/res/values-et/translations.xml index ecba029e6e..f8dd7fc086 100644 --- a/features/home/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/home/impl/src/main/res/values-fi/translations.xml b/features/home/impl/src/main/res/values-fi/translations.xml index 910564ba32..10da41c88b 100644 --- a/features/home/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/home/impl/src/main/res/values-fr/translations.xml b/features/home/impl/src/main/res/values-fr/translations.xml index 4ffd377d4f..3f86a64810 100644 --- a/features/home/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/home/impl/src/main/res/values-hu/translations.xml b/features/home/impl/src/main/res/values-hu/translations.xml index 4c1b882ef6..e0763e4c6f 100644 --- a/features/home/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/home/impl/src/main/res/values-nb/translations.xml b/features/home/impl/src/main/res/values-nb/translations.xml index b4fc0b1950..2ce6733b8a 100644 --- a/features/home/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/home/impl/src/main/res/values-pt/translations.xml b/features/home/impl/src/main/res/values-pt/translations.xml index b332c4f1f8..daba977faa 100644 --- a/features/home/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/home/impl/src/main/res/values-ru/translations.xml b/features/home/impl/src/main/res/values-ru/translations.xml index 1ae52ac1a5..a70efcfdfd 100644 --- a/features/home/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/home/impl/src/main/res/values-sk/translations.xml b/features/home/impl/src/main/res/values-sk/translations.xml index 9898a0cbad..ade2c192c7 100644 --- a/features/home/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/home/impl/src/main/res/values-sv/translations.xml b/features/home/impl/src/main/res/values-sv/translations.xml index 9cc2fe2f99..ab00fd3dd3 100644 --- a/features/home/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/home/impl/src/main/res/values-uk/translations.xml b/features/home/impl/src/main/res/values-uk/translations.xml index 16836724df..57d750d029 100644 --- a/features/home/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/home/impl/src/main/res/values-zh/translations.xml b/features/home/impl/src/main/res/values-zh/translations.xml index e7e97040dd..4ca91cb796 100644 --- a/features/home/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/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/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/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/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/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-da/translations.xml b/features/login/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..e996117378 --- /dev/null +++ b/features/login/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,94 @@ + + + "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" + "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-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-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-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/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/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-da/translations.xml b/features/messages/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..1498428e98 --- /dev/null +++ b/features/messages/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,67 @@ + + + "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" + "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-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..f25bc49b7c 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,7 @@ "سفر و مکان‌ها" "نمادها" "انسداد کاربر" + "این پیام به مدیر سرور خانگی شما گزارش خواهد شد. آنها قادر به خواندن پیام های رمزگذاری شده نخواهند بود." "دلیل گزارش این محتوا" "دوربین" "عکس گرفتن" 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-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/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/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-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-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-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/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-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-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-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/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-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/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/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..fe0e94fd57 --- /dev/null +++ b/features/rageshake/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,17 @@ + + + "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" + "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-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-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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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-da/translations.xml b/libraries/push/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..7888c16f7c --- /dev/null +++ b/libraries/push/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,81 @@ + + + "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" + + "📹 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..a1e2553034 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,6 @@ "%d Mitteilung" "%d Mitteilungen" - "Mitteilung" "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-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..58ac1a0028 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,6 @@ "%d pemberitahuan" - "Notifikasi" "📹 Panggilan masuk" "** Gagal mengirim — silakan buka ruangan" "Gabung" 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..73130fc8d5 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,6 @@ "%d notifica" "%d notifiche" - "Notifica" "📹 Chiamata in arrivo" "** Invio fallito - si prega di aprire la stanza" "Entra" 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..e0e51b76a1 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,6 @@ "%d notificação" "%d notificações" - "Notificação" "📹 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/pushproviders/firebase/src/main/res/values-da/translations.xml b/libraries/pushproviders/firebase/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..ea9afebf7f --- /dev/null +++ b/libraries/pushproviders/firebase/src/main/res/values-da/translations.xml @@ -0,0 +1,11 @@ + + + "Sørg for, at Firebase er tilgængelig." + "Firebase er ikke tilgængelig." + "Firebase er tilgængelig." + "Tjek Firebase" + "Sørg for, at Firebase-tokenet er tilgængeligt." + "Firebase-tokenet er ikke kendt." + "Firebase-token: %1$s." + "Tjek Firebase-token" + diff --git a/libraries/pushproviders/unifiedpush/src/main/res/values-da/translations.xml b/libraries/pushproviders/unifiedpush/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..b6d549b58f --- /dev/null +++ b/libraries/pushproviders/unifiedpush/src/main/res/values-da/translations.xml @@ -0,0 +1,10 @@ + + + "Sørg for, at UnifiedPush-distributører er tilgængelige." + "Ingen push-distributører fundet." + + "%1$d distributør fundet:%2$s." + "%1$d distributører fundet:%2$s." + + "Afprøv UnifiedPush" + diff --git a/libraries/textcomposer/impl/src/main/res/values-da/translations.xml b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..c1b8bc6780 --- /dev/null +++ b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,32 @@ + + + "Tilføj vedhæftet fil" + "Slå punktopstilling til/fra" + "Luk formateringsindstillinger" + "Slå kodeblok til/fra" + "Tilføj en billedtekst" + "Krypteret besked…" + "Besked…" + "Ukrypteret besked…" + "Opret et link" + "Rediger link" + "%1$s, tilstand: %2$s" + "Anvend fed skrift" + "Anvend kursiv" + "deaktiveret" + "slukket" + "aktiv" + "Anvend gennemstregning" + "Anvend understregning" + "Slå fuldskærmsvisning til/fra" + "Indrykning" + "Anvend inline kodeformat" + "Indstil link" + "Slå nummereret liste til/fra" + "Åbn skriveindstillinger" + "Slå citation til/fra" + "Fjern link" + "Fjern indrykning" + "Link" + "Hold nede for at optage" + diff --git a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml index e33c36e38e..90b37c584e 100644 --- a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml @@ -2,7 +2,6 @@ "Anhang hinzufügen" "Aufzählungsliste umschalten" - "Formatierungsoptionen schließen" "Codeblock umschalten" "Bildunterschrift hinzufügen" "Verschlüsselte Nachricht…" diff --git a/libraries/textcomposer/impl/src/main/res/values-el/translations.xml b/libraries/textcomposer/impl/src/main/res/values-el/translations.xml index 200b1f660d..1c8f6c8b65 100644 --- a/libraries/textcomposer/impl/src/main/res/values-el/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-el/translations.xml @@ -10,8 +10,12 @@ "Μη κρυπτογραφημένο μήνυμα…" "Δημιούργησε έναν σύνδεσμο" "Επεξεργασία συνδέσμου" + "%1$s, κατάσταση: %2$s" "Εφαρμογή έντονης μορφής" "Εφαρμογή πλάγιας μορφής" + "ανενεργό" + "κλειστό" + "ενεργό" "Εφαρμογή μορφής διαγραφής" "Εφαρμογή μορφής υπογράμμισης" "Εναλλαγή λειτουργίας πλήρους οθόνης" diff --git a/libraries/textcomposer/impl/src/main/res/values-et/translations.xml b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml index 0fb7b98de5..05c09aa335 100644 --- a/libraries/textcomposer/impl/src/main/res/values-et/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-et/translations.xml @@ -2,7 +2,7 @@ "Lisa manus" "Lülita mummudega loend sisse/välja" - "Sulge vorminduse valikud" + "Katkesta ja sulge tekstivorminduse valikud" "Lülita lähtekoodi lõik sisse/välja" "Selgitus või nimi, kui soovid lisada…" "Krüptitud sõnum…" @@ -10,8 +10,12 @@ "Krüptimata sõnum…" "Lisa link" "Muuda linki" + "%1$s, olek: %2$s" "Kasuta paksu kirja" "Kasuta kaldkirja" + "pole kasutusel" + "väljas" + "sees" "Kasuta läbikriipsutatud kirja" "Kasuta allajoonitud kirja" "Lülita täisekraanivaade sisse/välja" diff --git a/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml b/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml index 82f646931c..f21e9f90ba 100644 --- a/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-fr/translations.xml @@ -2,7 +2,7 @@ "Ajouter une pièce jointe" "Afficher une liste à puces" - "Fermer les options de formatage" + "Annuler et fermer les options de formatage" "Afficher le bloc de code" "Légende facultative…" "Message chiffré…" diff --git a/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml b/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml index cad42803fc..462b18aa9f 100644 --- a/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-hu/translations.xml @@ -2,7 +2,7 @@ "Melléklet hozzáadása" "Felsorolás be/ki" - "Formázási beállítások bezárása" + "Mégse, és a formázási beállítások bezárása" "Kódblokk be/ki" "Felirat hozzáadása…" "Titkosított üzenet…" diff --git a/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml index 48ea1ad27a..2eb61ac739 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pt/translations.xml @@ -2,7 +2,7 @@ "Adicionar anexo" "Ativar/desativar lista de pontos" - "Fechar opções de formatação" + "Cancelar e fechar opções de formatação" "Ativar/desativar bloco de código" "Legenda opcional…" "Mensagem encriptada…" @@ -10,8 +10,12 @@ "Mensagem não encriptada…" "Criar uma ligação" "Editar ligação" + "%1$s, estado: %2$s" "Aplicar negrito" "Aplicar itálico" + "desativado" + "desligado" + "ligado" "Aplicar rasura" "Aplicar sublinhado" "Entrar/sair do modo de ecrã inteiro" diff --git a/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml b/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml index fa2d3a11df..7b46624011 100644 --- a/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-sk/translations.xml @@ -2,7 +2,7 @@ "Pridať prílohu" "Prepnúť zoznam odrážok" - "Zatvoriť možnosti formátovania" + "Zrušiť a zatvoriť formátovanie textu" "Prepnúť blok kódu" "Voliteľný titulok…" "Šifrovaná správa…" @@ -10,8 +10,12 @@ "Nešifrovaná správa…" "Vytvoriť odkaz" "Upraviť odkaz" + "%1$s, stav: %2$s" "Použiť tučný formát" "Použiť formát kurzívy" + "zakázané" + "vypnuté" + "zapnuté" "Použiť formát prečiarknutia" "Použiť formát podčiarknutia" "Prepnúť režim celej obrazovky" diff --git a/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml b/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml index 8eb5561bfc..6a386e9d74 100644 --- a/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-uk/translations.xml @@ -10,8 +10,10 @@ "Незашифроване повідомлення…" "Створити посилання" "Редагувати посилання" + "%1$s, стан: %2$s" "Жирний формат" "Курсивний формат" + "вимкнено" "Застосувати формат закреслення" "Застосувати формат підкреслення" "Перемкнути повноекранний режим" diff --git a/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml b/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml index d1fe69e539..7fbdc32c2e 100644 --- a/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-zh/translations.xml @@ -10,8 +10,12 @@ "未加密的消息…" "创建链接" "编辑链接" + "%1$s,状态:%2$s" "应用粗体格式" "应用斜体格式" + "已禁用" + "关" + "开" "应用删除线格式" "应用下划线格式" "切换全屏模式" diff --git a/libraries/troubleshoot/impl/src/main/res/values-da/translations.xml b/libraries/troubleshoot/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..c6c913dfa4 --- /dev/null +++ b/libraries/troubleshoot/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,12 @@ + + + "Push-historik" + "Kør test" + "Kør test igen" + "Nogle tests mislykkedes. Tjek venligst detaljerne." + "Kør testene for at registrere de problemer i din konfiguration, der kan medføre, at meddelelser ikke opfører sig som forventet." + "Forsøg på at reparere" + "Alle tests bestået med succes." + "Fejlfinding af meddelelser" + "Nogle tests kræver din opmærksomhed. Tjek venligst detaljerne." + diff --git a/libraries/ui-strings/src/main/res/values-be/translations.xml b/libraries/ui-strings/src/main/res/values-be/translations.xml index 2fbe44f312..0a508dfd5e 100644 --- a/libraries/ui-strings/src/main/res/values-be/translations.xml +++ b/libraries/ui-strings/src/main/res/values-be/translations.xml @@ -28,7 +28,7 @@ "Прачытана %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..8047acb810 100644 --- a/libraries/ui-strings/src/main/res/values-cy/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml @@ -35,7 +35,7 @@ "Wedi\'i ddarllen gan %1$s" "Tapio i ddangos y cyfan" - "Wedi dileu adwaith gyda %1$s" + "Wedi dileu adwaith gyda %1$s" "Anfon ffeiliau" "Dangos y cyfrinair" "Cychwyn galwad" 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..14b637216f --- /dev/null +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -0,0 +1,402 @@ + + + "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" + "Send filer" + "Vis adgangskode" + "Start et opkald" + "Brugermenu" + "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." + "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" + "%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..7fc09c9d53 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -27,7 +27,7 @@ "Gelesen von %1$s" "Tippe, um alle anzuzeigen" - "Reaktion mit %1$s entfernen" + "Reaktion mit %1$s entfernen" "Dateien senden" "Passwort anzeigen" "Anruf starten" 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..4701ff08f7 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" "ارسال پرونده‌ها" "نمایش گذرواژه" "آغاز یک تماس" 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..8266d8ce0a 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" @@ -27,11 +28,13 @@ "Lu par %1$s" "Taper pour voir toute la liste" + "Supprimer la réaction avec %1$s" "Supprimer la réaction avec %1$s" "Envoyer des fichiers" "Afficher le mot de passe" "Démarrer un appel" "Menu utilisateur" + "Voir l’avatar" "Afficher les détails" "Message vocal, durée: %1$s" "Enregistrer un message vocal." @@ -138,9 +141,6 @@ "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 +244,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 +332,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 +353,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 +381,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..05387a00a3 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -22,7 +22,7 @@ "Dibaca oleh %1$s" "Ketuk untuk melihat semua" - "Hapus reaksi dengan %1$s" + "Hapus reaksi dengan %1$s" "Kirim berkas" "Tampilkan kata sandi" "Mulai panggilan" 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..52df6ff9ec 100644 --- a/libraries/ui-strings/src/main/res/values-it/translations.xml +++ b/libraries/ui-strings/src/main/res/values-it/translations.xml @@ -24,7 +24,7 @@ "Visualizzato da %1$s" "Tocca per mostrare tutti" - "Rimuovi la reazione con %1$s" + "Rimuovi la reazione con %1$s" "Invia file" "Mostra password" "Avvia una chiamata" 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..5e617e1c3e 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 @@ -27,7 +27,7 @@ "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" 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..aed2fa6f04 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" "Iniciar chamada" "Menu de utilizador" + "Ver avatar" "Ver detalhes" "Mensagem de voz, duração: %1$s" "Gravar mensagem de voz." @@ -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..b4b1b5578d 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" "Надіслати файли" "Показати пароль" "Розпочати виклик" @@ -264,6 +266,7 @@ "Надсилання…" "Не вдалося надіслати" "Надіслано" + ". " "Сервер не підтримується" "URL-адреса сервера" "Налаштування" @@ -329,6 +332,7 @@ "Не вдалося завантажити повідомлення" "%1$s не вдалося отримати доступ до вашого розташування. Повторіть спробу пізніше." "Не вдалося завантажити голосове повідомлення." + "Кімната більше не існує або запрошення не чинне." "Повідомлення не знайдено" "%1$s не має дозволу на доступ до вашого розташування. Увімкнути доступ можна в Налаштуваннях." "%1$s не має дозволу на доступ до вашого розташування. Увімкніть доступ нижче." @@ -338,6 +342,7 @@ "Деякі символи не допускаються. Підтримуються тільки букви, цифри і наступні символи! $ & ‘ ( ) * + / ; = ? @ [ ] - . _" "Деякі повідомлення не були надіслані" "Вибачте, сталася помилка" + "Відправник події не збігається з власником пристрою, який його надіслав." "Автентичність цього зашифрованого повідомлення не може бути гарантована на цьому пристрої." "Зашифровано попередньо перевіреним користувачем." "Не зашифровано." @@ -348,6 +353,10 @@ "Вітаю, поспілкуйтеся зі мною в %1$s: %2$s" "%1$s Android" "Повідомити про ваду за допомогою Rageshake" + "%1$s: %2$s" + "Варіанти" + "Вилучити %1$s" + "Налаштування" "Не вдалося вибрати медіафайл, спробуйте ще раз." "Користувачі старих застосунків можуть не бачити підписи." "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз." @@ -373,6 +382,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 9d6a7cb9b9..bf97f4c46b 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" @@ -27,11 +28,13 @@ "Read by %1$s" "Tap to show all" + "Remove reaction: %1$s" "Remove reaction with %1$s" "Send files" "Show password" "Start a call" "User menu" + "View avatar" "View details" "Voice message, duration: %1$s" "Record voice message." @@ -138,9 +141,6 @@ "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" @@ -382,18 +382,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/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.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.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.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_RoomListDeclineInviteMenuContent_Day_0_de.png b/screenshots/de/features.home.impl_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_RoomListDeclineInviteMenuContent_Day_0_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_de.png b/screenshots/de/features.home.impl_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_RoomListModalBottomSheetContent_Day_0_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_de.png b/screenshots/de/features.home.impl_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_RoomListModalBottomSheetContent_Day_1_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_de.png b/screenshots/de/features.home.impl_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_RoomListModalBottomSheetContent_Day_2_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_0_de.png b/screenshots/de/features.home.impl_RoomListView_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_RoomListView_Day_0_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_10_de.png b/screenshots/de/features.home.impl_RoomListView_Day_10_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_10_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_10_de.png diff --git a/screenshots/de/features.home.impl_RoomListView_Day_11_de.png b/screenshots/de/features.home.impl_RoomListView_Day_11_de.png new file mode 100644 index 0000000000..8ea198ec99 --- /dev/null +++ b/screenshots/de/features.home.impl_RoomListView_Day_11_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:540b721270f65172ff2c231ebf5a83c8c17716f655780adb19549cbb368db675 +size 101728 diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_1_de.png b/screenshots/de/features.home.impl_RoomListView_Day_1_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_1_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_1_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_2_de.png b/screenshots/de/features.home.impl_RoomListView_Day_2_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_2_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_2_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_3_de.png b/screenshots/de/features.home.impl_RoomListView_Day_3_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_3_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_3_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_4_de.png b/screenshots/de/features.home.impl_RoomListView_Day_4_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_4_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_4_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_5_de.png b/screenshots/de/features.home.impl_RoomListView_Day_5_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_5_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_5_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_6_de.png b/screenshots/de/features.home.impl_RoomListView_Day_6_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_6_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_6_de.png diff --git a/screenshots/de/features.roomlist.impl_RoomListView_Day_7_de.png b/screenshots/de/features.home.impl_RoomListView_Day_7_de.png similarity index 100% rename from screenshots/de/features.roomlist.impl_RoomListView_Day_7_de.png rename to screenshots/de/features.home.impl_RoomListView_Day_7_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..5ee5f5866f 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:00f553a66eb9afb952a35387e6988ca2e56f396dc2b329ec08172122a13661d4 +size 20743 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..e5c06e8e2f 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:eb4cb0382f0da7e276049900e18af9aa4e3dfa3b85eb58cc234696efe5b712c8 +size 49826 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..870e9837ad 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:93f8eebe5be37e8ee6ba1dd59e3780f7bc96ec94b3b76aa5e3c7d98344e55e36 +size 55948 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..75d959028f --- /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:16dadbf00de495615b692187852e0d2e12a749f9ef5bf652b8cfe5d8c5a90d8c +size 63369 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.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..c2fa336194 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,70 +1,71 @@ // 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",20266,], ["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",20266,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20266,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20266,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20266,], +["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20269,], +["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20266,], +["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20266,], +["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20266,], +["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20266,], +["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20266,], +["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20266,], ["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",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20266,], ["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",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20266,], +["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20266,], +["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20266,], +["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20266,], +["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20266,], +["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20266,], +["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20266,], +["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20266,], +["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20266,], +["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20266,], +["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20266,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20266,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20266,], +["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20266,], ["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",20266,], ["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",20266,], ["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",20266,], ["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",20266,], ["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",20266,], ["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 +75,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","",20266,], +["features.messages.impl.attachments.preview_AttachmentsView_1_en","",0,], +["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20266,], +["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20266,], +["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20266,], +["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20266,], ["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","",20266,], ["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",20266,], +["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 +193,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",0,], ["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",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20266,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20266,], ["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 +213,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",20266,], +["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20266,], +["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20266,], +["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20266,], +["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20266,], ["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",20266,], +["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20266,], ["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",20266,], +["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20266,], +["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20266,], +["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20266,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20266,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20266,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20266,], ["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",20266,], +["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20266,], +["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20266,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20252,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20266,], ["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",20266,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20266,], +["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20266,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20266,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20266,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20266,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20266,], ["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",20266,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20266,], +["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20266,], ["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","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20266,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20266,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20266,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20266,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20266,], +["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20269,], ["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",20266,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20266,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20266,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20266,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20266,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20266,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20266,], +["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20266,], +["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20266,], +["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20266,], +["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20266,], +["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20266,], +["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20266,], +["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20266,], +["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20266,], +["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20266,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20266,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20266,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20266,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20266,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20266,], ["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","",20266,], +["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20266,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20266,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20266,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20266,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20266,], +["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20266,], ["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",20266,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20266,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20266,], ["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",20266,], +["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20269,], +["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20269,], ["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",20266,], +["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20266,], +["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20266,], +["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20266,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20266,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20266,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20266,], ["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 +357,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",20266,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20266,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20266,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20266,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20266,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20266,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20266,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20266,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20266,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20266,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20266,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20269,], ["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 +378,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","",20266,], +["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20266,], +["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20266,], ["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,16 +399,16 @@ 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",20266,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20266,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20266,], ["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",20266,], +["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20269,], ["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,], @@ -420,8 +422,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 +432,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",20266,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20266,], ["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 +441,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",20266,], ["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",20266,], ["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",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20266,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20266,], ["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",20266,], +["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20266,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20266,], ["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",20266,], +["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20266,], +["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20266,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20266,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20266,], ["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",20266,], +["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20266,], +["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20266,], +["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20266,], +["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20266,], +["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20266,], ["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",20266,], ["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 +574,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",20266,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20266,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20266,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20266,], ["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",20266,], +["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20266,], +["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20266,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20266,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20266,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20266,], +["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20266,], +["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20266,], +["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20266,], +["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20266,], +["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20266,], +["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20266,], +["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20266,], +["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20266,], +["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20266,], +["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20266,], +["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20266,], +["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20266,], ["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",20266,], ["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 +611,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",20266,], +["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20266,], ["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",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20266,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20266,], ["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 +634,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","",20266,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20266,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20252,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20266,], ["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","",20266,], ["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 +653,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",20266,], ["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 +662,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",20266,], ["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 +670,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",20266,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20266,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20266,], +["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20266,], +["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20266,], +["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20266,], +["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20266,], +["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20266,], +["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20269,], +["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20266,], +["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20266,], +["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20266,], +["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20266,], +["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20266,], +["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20266,], +["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20266,], +["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20266,], +["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20266,], ["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",20266,], ["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 +698,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",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20266,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20266,], +["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20266,], ["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",20266,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20266,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20266,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20266,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20266,], +["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20266,], ["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",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20266,], ["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",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20266,], +["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20266,], ["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 +749,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",20266,], +["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20266,], +["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20266,], +["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20266,], +["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20266,], +["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20266,], ["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",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20266,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20266,], ["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",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20266,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20266,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20266,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20266,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20266,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20266,], ["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",20266,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20266,], +["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20266,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20266,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20266,], ["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",20266,], +["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20266,], +["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20266,], +["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20266,], +["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20266,], +["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20266,], +["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20266,], +["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20266,], +["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20266,], +["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20266,], +["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20266,], ["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 +821,325 @@ 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","",20266,], +["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20266,], +["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20266,], +["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20266,], ["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","",20266,], +["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20266,], +["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20266,], +["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20266,], +["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20266,], +["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20266,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20266,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20266,], +["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20266,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20266,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20266,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20266,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20266,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20266,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20266,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20266,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20266,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20266,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20266,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20266,], ["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",20266,], +["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20266,], ["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",20266,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20266,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20266,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20266,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20266,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20266,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20266,], ["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",20266,], +["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20266,], +["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20266,], +["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20266,], +["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20266,], +["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20266,], +["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20266,], +["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20266,], +["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20266,], +["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20266,], +["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20266,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20266,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20266,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20266,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20266,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20266,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20266,], ["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",20266,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20266,], +["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20266,], +["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20266,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20266,], ["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",20266,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20266,], +["features.roomdetails.impl_RoomDetailsDark_0_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_10_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_11_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_12_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_13_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_14_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_15_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_16_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_17_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_18_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_19_en","",20269,], +["features.roomdetails.impl_RoomDetailsDark_1_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_2_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_3_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_4_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_5_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_6_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_7_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_8_en","",20266,], +["features.roomdetails.impl_RoomDetailsDark_9_en","",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20266,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20266,], +["features.roomdetails.impl_RoomDetails_0_en","",20266,], +["features.roomdetails.impl_RoomDetails_10_en","",20266,], +["features.roomdetails.impl_RoomDetails_11_en","",20266,], +["features.roomdetails.impl_RoomDetails_12_en","",20266,], +["features.roomdetails.impl_RoomDetails_13_en","",20266,], +["features.roomdetails.impl_RoomDetails_14_en","",20266,], +["features.roomdetails.impl_RoomDetails_15_en","",20266,], +["features.roomdetails.impl_RoomDetails_16_en","",20266,], +["features.roomdetails.impl_RoomDetails_17_en","",20266,], +["features.roomdetails.impl_RoomDetails_18_en","",20266,], +["features.roomdetails.impl_RoomDetails_19_en","",20269,], +["features.roomdetails.impl_RoomDetails_1_en","",20266,], +["features.roomdetails.impl_RoomDetails_2_en","",20266,], +["features.roomdetails.impl_RoomDetails_3_en","",20266,], +["features.roomdetails.impl_RoomDetails_4_en","",20266,], +["features.roomdetails.impl_RoomDetails_5_en","",20266,], +["features.roomdetails.impl_RoomDetails_6_en","",20266,], +["features.roomdetails.impl_RoomDetails_7_en","",20266,], +["features.roomdetails.impl_RoomDetails_8_en","",20266,], +["features.roomdetails.impl_RoomDetails_9_en","",20266,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20266,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20266,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20266,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20266,], +["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20269,], +["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20269,], +["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",20269,], +["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20269,], +["features.home.impl_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl_RoomListDeclineInviteMenuContent_Night_0_en",20269,], +["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20269,], +["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20269,], +["features.home.impl_RoomListModalBottomSheetContent_Day_0_en","features.home.impl_RoomListModalBottomSheetContent_Night_0_en",20269,], +["features.home.impl_RoomListModalBottomSheetContent_Day_1_en","features.home.impl_RoomListModalBottomSheetContent_Night_1_en",20269,], +["features.home.impl_RoomListModalBottomSheetContent_Day_2_en","features.home.impl_RoomListModalBottomSheetContent_Night_2_en",20269,], +["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",20269,], +["features.home.impl_RoomListView_Day_0_en","features.home.impl_RoomListView_Night_0_en",20269,], +["features.home.impl_RoomListView_Day_10_en","features.home.impl_RoomListView_Night_10_en",20269,], +["features.home.impl_RoomListView_Day_11_en","features.home.impl_RoomListView_Night_11_en",20269,], +["features.home.impl_RoomListView_Day_1_en","features.home.impl_RoomListView_Night_1_en",20269,], +["features.home.impl_RoomListView_Day_2_en","features.home.impl_RoomListView_Night_2_en",20269,], +["features.home.impl_RoomListView_Day_3_en","features.home.impl_RoomListView_Night_3_en",20269,], +["features.home.impl_RoomListView_Day_4_en","features.home.impl_RoomListView_Night_4_en",20269,], +["features.home.impl_RoomListView_Day_5_en","features.home.impl_RoomListView_Night_5_en",20269,], +["features.home.impl_RoomListView_Day_6_en","features.home.impl_RoomListView_Night_6_en",20269,], +["features.home.impl_RoomListView_Day_7_en","features.home.impl_RoomListView_Night_7_en",20269,], +["features.home.impl_RoomListView_Day_8_en","features.home.impl_RoomListView_Night_8_en",0,], +["features.home.impl_RoomListView_Day_9_en","features.home.impl_RoomListView_Night_9_en",0,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20266,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20266,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20266,], ["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",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20266,], +["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20266,], +["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20266,], ["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",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20266,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20266,], +["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20266,], +["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",20269,], +["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20269,], +["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20269,], +["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20269,], +["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20269,], +["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20269,], +["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_en",0,], +["features.home.impl.components_RoomSummaryRow_Day_3_en","features.home.impl.components_RoomSummaryRow_Night_3_en",0,], +["features.home.impl.components_RoomSummaryRow_Day_4_en","features.home.impl.components_RoomSummaryRow_Night_4_en",0,], +["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",20266,], +["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20266,], +["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20266,], ["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",20266,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20266,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20266,], ["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","",20266,], ["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","",20266,], +["features.createroom.impl.components_SearchSingleUserResultItem_en","",20266,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20266,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20266,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20266,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20266,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20266,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20266,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20266,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20266,], +["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20266,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20266,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20266,], ["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 +1147,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",20266,], +["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20266,], +["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20266,], +["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20266,], +["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20266,], ["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 +1161,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",20266,], +["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20269,], +["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20266,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20266,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20266,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20266,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20266,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20266,], ["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",20266,], +["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20266,], +["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20266,], +["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20266,], +["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20266,], +["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20266,], +["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20266,], +["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20266,], +["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20266,], +["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20266,], ["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 +1190,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",20266,], ["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",20266,], ["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",20266,], ["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",20266,], +["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",20266,], +["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20266,], +["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20266,], +["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20266,], +["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20266,], +["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20266,], +["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20266,], +["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20266,], +["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20266,], +["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20266,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20266,], +["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20266,], +["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20266,], +["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20266,], +["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20266,], ["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",20266,], +["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20266,], ["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 +1266,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","",20266,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20266,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20266,], ["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",20266,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20266,], ["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 +1283,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",20266,], ["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",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20266,], ["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 +1302,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",20266,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20266,], ["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",20266,], +["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20266,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20266,], ["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",20266,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20266,], ["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 +1322,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",20266,], ["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",20266,], ["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","",20266,], ["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",20266,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20266,], ["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",20266,], ["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",20266,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20266,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20266,], +["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20266,], ["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",20266,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20266,], ["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",20266,], ["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 +1364,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",20266,], +["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20266,], ["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 +1380,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",20266,], +["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20266,], ["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 +1404,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",20266,], +["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20266,], ["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",20266,], +["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20266,], +["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20266,], ["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",20266,], ["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",20266,], ["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",20266,], ["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",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20266,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20266,], ["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",20266,], +["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20266,], +["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20266,], +["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20266,], +["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20266,], +["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20266,], ["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","",20266,], ["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",20266,], +["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20266,], +["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20266,], +["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20266,], ["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",20266,], ["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",20266,], ["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",20266,], +["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20266,], +["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20266,], +["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20266,], +["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20266,], +["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20266,], +["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20266,], +["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20266,], +["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20266,], +["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20266,], +["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20266,], +["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20266,], ["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 +1479,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",20266,], ["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 +1498,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",20266,], ["libraries.designsystem.ruler_WithRulers_Day_0_en","libraries.designsystem.ruler_WithRulers_Night_0_en",0,], ]; From 1b05c2a96558603ac07729d51ef9d756d6f0543d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 27 Jun 2025 18:13:57 +0200 Subject: [PATCH 094/156] Split RoomListPresenter and introduce HomePresenter --- .../android/features/home/impl/HomeEvents.kt | 10 ++ .../features/home/impl/HomeFlowNode.kt | 8 +- .../features/home/impl/HomePresenter.kt | 69 +++++++++++ .../android/features/home/impl/HomeState.kt | 28 +++++ .../features/home/impl/HomeStateProvider.kt | 50 ++++++++ .../impl/{RoomListView.kt => HomeView.kt} | 42 ++++--- .../impl/components/RoomListContentView.kt | 15 ++- .../home/impl/components/RoomSummaryRow.kt | 2 +- .../features/home/impl/di/RoomListModule.kt | 5 + .../RoomListContentStateProvider.kt | 2 +- .../{ => roomlist}/RoomListContextMenu.kt | 3 +- .../RoomListDeclineInviteMenu.kt | 3 +- .../impl/{ => roomlist}/RoomListEvents.kt | 2 +- .../impl/{ => roomlist}/RoomListPresenter.kt | 30 +---- .../home/impl/{ => roomlist}/RoomListState.kt | 12 +- .../RoomListStateContextMenuShownProvider.kt | 2 +- .../{ => roomlist}/RoomListStateProvider.kt | 22 +--- .../search/RoomListSearchStateProvider.kt | 2 +- .../home/impl/search/RoomListSearchView.kt | 2 +- .../home/impl/FakeDateTimeObserver.kt | 19 +++ .../features/home/impl/HomePresenterTest.kt | 113 ++++++++++++++++++ .../{ => roomlist}/RoomListContextMenuTest.kt | 3 +- .../RoomListDeclineInviteMenuTest.kt | 2 +- .../{ => roomlist}/RoomListPresenterTest.kt | 92 +------------- .../home/impl/{ => roomlist}/RoomListState.kt | 2 +- .../impl/{ => roomlist}/RoomListViewTest.kt | 12 +- 26 files changed, 359 insertions(+), 193 deletions(-) create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{RoomListView.kt => HomeView.kt} (85%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListContentStateProvider.kt (97%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListContextMenu.kt (98%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListDeclineInviteMenu.kt (97%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListEvents.kt (96%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListPresenter.kt (90%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListState.kt (84%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListStateContextMenuShownProvider.kt (95%) rename features/home/impl/src/main/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListStateProvider.kt (82%) create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/FakeDateTimeObserver.kt create mode 100644 features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt rename features/home/impl/src/test/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListContextMenuTest.kt (98%) rename features/home/impl/src/test/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListDeclineInviteMenuTest.kt (98%) rename features/home/impl/src/test/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListPresenterTest.kt (88%) rename features/home/impl/src/test/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListState.kt (83%) rename features/home/impl/src/test/kotlin/io/element/android/features/home/impl/{ => roomlist}/RoomListViewTest.kt (96%) 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..0762bbfb5a --- /dev/null +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeEvents.kt @@ -0,0 +1,10 @@ +/* + * 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 diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt index c21cb2093b..4a7e5eb258 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeFlowNode.kt @@ -44,7 +44,7 @@ import kotlinx.parcelize.Parcelize 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, @@ -126,8 +126,8 @@ class HomeFlowNode @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 HomeFlowNode @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/HomePresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt new file mode 100644 index 0000000000..b1160b4b6b --- /dev/null +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.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.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +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.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, +) : 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() + + 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) { + // TODO + } + + val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() + + return HomeState( + matrixUser = matrixUser.value, + showAvatarIndicator = showAvatarIndicator, + hasNetworkConnection = isOnline, + roomListState = roomListState, + snackbarMessage = snackbarMessage, + canReportBug = canReportBug, + directLogoutState = directLogoutState, + 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..f7b4f644a6 --- /dev/null +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt @@ -0,0 +1,28 @@ +/* + * 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 roomListState: RoomListState, + val snackbarMessage: SnackbarMessage?, + val canReportBug: Boolean, + val directLogoutState: DirectLogoutState, + val eventSink: (HomeEvents) -> Unit, +) { + val displayActions = true +} 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..621a36bf5e --- /dev/null +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.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.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.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)), + ) + 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, + roomListState: RoomListState = aRoomListState(), + canReportBug: Boolean = true, + directLogoutState: DirectLogoutState = aDirectLogoutState(), + eventSink: (HomeEvents) -> Unit = {} +) = HomeState( + matrixUser = matrixUser, + showAvatarIndicator = showAvatarIndicator, + hasNetworkConnection = hasNetworkConnection, + snackbarMessage = snackbarMessage, + canReportBug = canReportBug, + directLogoutState = directLogoutState, + roomListState = roomListState, + eventSink = eventSink, +) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt similarity index 85% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListView.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt index 11bda8546a..fbd47bf52b 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt @@ -29,6 +29,10 @@ 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 @@ -43,8 +47,8 @@ import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbar 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 +61,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 +90,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 +119,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,6 +136,7 @@ private fun RoomListScaffold( val appBarState = rememberTopAppBarState() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(appBarState) val snackbarHostState = rememberSnackbarHostState(snackbarMessage = state.snackbarMessage) + val roomListState: RoomListState = state.roomListState Scaffold( modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), @@ -138,23 +144,23 @@ private fun RoomListScaffold( RoomListTopBar( 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, + filtersState = roomListState.filtersState, canReportBug = state.canReportBug, ) }, content = { padding -> RoomListContentView( - contentState = state.contentState, - filtersState = state.filtersState, - hideInvitesAvatars = state.hideInvitesAvatars, - eventSink = state.eventSink, + contentState = roomListState.contentState, + filtersState = roomListState.filtersState, + hideInvitesAvatars = roomListState.hideInvitesAvatars, + eventSink = roomListState.eventSink, onSetUpRecoveryClick = onSetUpRecoveryClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onRoomClick = ::onRoomClick, @@ -186,9 +192,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/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt index 35c582c58e..c4144b22e9 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt @@ -35,10 +35,6 @@ 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.home.impl.R -import io.element.android.features.home.impl.RoomListContentState -import io.element.android.features.home.impl.RoomListContentStateProvider -import io.element.android.features.home.impl.RoomListEvents -import io.element.android.features.home.impl.SecurityBannerState 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 @@ -47,6 +43,10 @@ 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 @@ -311,7 +311,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 = {}, diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt index 95d54f42ef..0baa0e66d9 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt @@ -38,10 +38,10 @@ 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.home.impl.R -import io.element.android.features.home.impl.RoomListEvents 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.Avatar diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt index 19505402da..ef64512462 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/di/RoomListModule.kt @@ -12,6 +12,8 @@ import dagger.Binds import dagger.Module 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 @@ -20,6 +22,9 @@ 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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListContentStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt similarity index 97% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListContentStateProvider.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt index 28edbc73a0..a421c239cb 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListContentStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.impl +package io.element.android.features.home.impl.roomlist import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.home.impl.model.RoomListRoomSummary diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListContextMenu.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenu.kt index bb0cd060e3..27883e88d5 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/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.home.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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListDeclineInviteMenu.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt similarity index 97% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListDeclineInviteMenu.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenu.kt index 452f6e472b..c6b91a02fc 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/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.home.impl +package io.element.android.features.home.impl.roomlist import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -20,6 +20,7 @@ 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.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 diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt similarity index 96% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListEvents.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt index e5d74e7f70..4ba37d810b 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListEvents.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.impl +package io.element.android.features.home.impl.roomlist import io.element.android.features.home.impl.model.RoomListRoomSummary import io.element.android.libraries.matrix.api.core.RoomId diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt similarity index 90% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListPresenter.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt index 3e6ffb85c0..dd7ada703d 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/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.home.impl +package io.element.android.features.home.impl.roomlist import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -33,22 +33,16 @@ import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteE 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.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.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 @@ -75,15 +69,11 @@ import javax.inject.Inject private const val EXTENDED_RANGE_SIZE = 40 private const val SUBSCRIBE_TO_VISIBLE_ROOMS_DEBOUNCE_IN_MILLIS = 300L -// TODO Create HomePresenter to split the state. 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, @@ -92,9 +82,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() @@ -103,23 +91,17 @@ 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) @@ -127,8 +109,6 @@ class RoomListPresenter @Inject constructor( 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 { @@ -163,26 +143,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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt similarity index 84% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListState.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt index 3c515192d8..4cfa82fbfc 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListState.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.impl +package io.element.android.features.home.impl.roomlist import androidx.compose.runtime.Immutable import io.element.android.features.home.impl.filters.RoomListFiltersState @@ -13,36 +13,26 @@ 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.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/home/impl/src/main/kotlin/io/element/android/features/home/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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListStateContextMenuShownProvider.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateContextMenuShownProvider.kt index 39175f3ce6..0cd3117de4 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/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.home.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/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt similarity index 82% rename from features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListStateProvider.kt rename to features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt index 378a4a9b44..9fd5324d57 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/RoomListStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.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 @@ -20,17 +20,11 @@ import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteE import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState 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.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.RoomId -import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.api.user.MatrixUser 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 @@ -38,8 +32,6 @@ 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)), @@ -53,36 +45,24 @@ 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, diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt index cdc69ec0d6..503e334418 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchStateProvider.kt @@ -8,8 +8,8 @@ package io.element.android.features.home.impl.search import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.features.home.impl.aRoomListRoomSummaryList 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/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt index bbefebbf38..29c8078c09 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/search/RoomListSearchView.kt @@ -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.home.impl.RoomListEvents 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/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..0ca344cafd --- /dev/null +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt @@ -0,0 +1,113 @@ +/* + * 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.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 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() + } + } + + @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 + } + } + + private fun TestScope.createHomePresenter( + client: MatrixClient = FakeMatrixClient(), + syncService: SyncService = FakeSyncService(), + snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher(), + rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true }, + indicatorService: IndicatorService = FakeIndicatorService(), + ) = HomePresenter( + client = client, + syncService = syncService, + snackbarDispatcher = snackbarDispatcher, + indicatorService = indicatorService, + logoutPresenter = { aDirectLogoutState() }, + roomListPresenter = { aRoomListState() }, + rageshakeFeatureAvailability = rageshakeFeatureAvailability, + ) +} diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/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/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListContextMenuTest.kt rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListContextMenuTest.kt index 7496f4ddfb..b336178d22 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/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.home.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/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListDeclineInviteMenuTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt similarity index 98% rename from features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListDeclineInviteMenuTest.kt rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt index 098a32bf81..48a51b87bb 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListDeclineInviteMenuTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListDeclineInviteMenuTest.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.impl +package io.element.android.features.home.impl.roomlist import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.createAndroidComposeRule diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt similarity index 88% rename from features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListPresenterTest.kt rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt index 89d4e7b5fd..bc0163585f 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListPresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt @@ -5,13 +5,14 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.home.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 @@ -27,20 +28,14 @@ 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.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 @@ -48,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 @@ -88,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 @@ -100,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() @@ -672,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(), @@ -685,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, @@ -705,7 +628,6 @@ class RoomListPresenterTest { dateTimeObserver = FakeDateTimeObserver(), ), featureFlagService = featureFlagService, - indicatorService = indicatorService, searchPresenter = searchPresenter, sessionPreferencesStore = sessionPreferencesStore, filtersPresenter = filtersPresenter, @@ -714,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/home/impl/src/test/kotlin/io/element/android/features/home/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/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListState.kt rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt index 26069bba4f..3837fe6f55 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/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.home.impl +package io.element.android.features.home.impl.roomlist internal fun RoomListState.contentAsRooms() = contentState as RoomListContentState.Rooms diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListViewTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt similarity index 96% rename from features/home/impl/src/test/kotlin/io/element/android/features/home/impl/RoomListViewTest.kt rename to features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt index 77d805601e..1b241ab294 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/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.home.impl +package io.element.android.features.home.impl.roomlist import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule @@ -16,6 +16,9 @@ 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.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 @@ -35,7 +38,8 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class RoomListViewTest { - @get:Rule val rule = createAndroidComposeRule() + @get:Rule + val rule = createAndroidComposeRule() @Test fun `displaying the view automatically sends a couple of UpdateVisibleRangeEvents`() { @@ -272,8 +276,8 @@ private fun AndroidComposeTestRule.setRoomL onDeclineInviteAndBlockUser: (RoomListRoomSummary) -> Unit = EnsureNeverCalledWithParam(), ) { setSafeContent { - RoomListView( - state = state, + HomeView( + homeState = aHomeState(roomListState = state), onRoomClick = onRoomClick, onSettingsClick = onSettingsClick, onSetUpRecoveryClick = onSetUpRecoveryClick, From 1aa18aeaf03b793b6aa4b0caf2861efe6c96a306 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Mon, 30 Jun 2025 08:09:42 +0000 Subject: [PATCH 095/156] Update screenshots --- ...mpl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en.png} | 0 ...l.roomlist_RoomListDeclineInviteMenuContent_Night_0_en.png} | 0 ...impl.roomlist_RoomListModalBottomSheetContent_Day_0_en.png} | 0 ...impl.roomlist_RoomListModalBottomSheetContent_Day_1_en.png} | 0 ...impl.roomlist_RoomListModalBottomSheetContent_Day_2_en.png} | 0 ...pl.roomlist_RoomListModalBottomSheetContent_Night_0_en.png} | 0 ...pl.roomlist_RoomListModalBottomSheetContent_Night_1_en.png} | 0 ...pl.roomlist_RoomListModalBottomSheetContent_Night_2_en.png} | 0 ...w_Day_0_en.png => features.home.impl_HomeView_Day_0_en.png} | 0 ..._Day_9_en.png => features.home.impl_HomeView_Day_10_en.png} | 0 ...Day_10_en.png => features.home.impl_HomeView_Day_11_en.png} | 0 ...Day_11_en.png => features.home.impl_HomeView_Day_12_en.png} | 0 ...w_Day_2_en.png => features.home.impl_HomeView_Day_1_en.png} | 0 ...w_Day_1_en.png => features.home.impl_HomeView_Day_2_en.png} | 0 .../snapshots/images/features.home.impl_HomeView_Day_3_en.png | 3 +++ ...w_Day_3_en.png => features.home.impl_HomeView_Day_4_en.png} | 0 ...w_Day_4_en.png => features.home.impl_HomeView_Day_5_en.png} | 0 ...w_Day_5_en.png => features.home.impl_HomeView_Day_6_en.png} | 0 ...w_Day_6_en.png => features.home.impl_HomeView_Day_7_en.png} | 0 ...w_Day_7_en.png => features.home.impl_HomeView_Day_8_en.png} | 0 ...w_Day_8_en.png => features.home.impl_HomeView_Day_9_en.png} | 0 ...ght_0_en.png => features.home.impl_HomeView_Night_0_en.png} | 0 ...ht_9_en.png => features.home.impl_HomeView_Night_10_en.png} | 0 ...t_10_en.png => features.home.impl_HomeView_Night_11_en.png} | 0 ...t_11_en.png => features.home.impl_HomeView_Night_12_en.png} | 0 ...ght_2_en.png => features.home.impl_HomeView_Night_1_en.png} | 0 ...ght_1_en.png => features.home.impl_HomeView_Night_2_en.png} | 0 .../images/features.home.impl_HomeView_Night_3_en.png | 3 +++ ...ght_3_en.png => features.home.impl_HomeView_Night_4_en.png} | 0 ...ght_4_en.png => features.home.impl_HomeView_Night_5_en.png} | 0 ...ght_5_en.png => features.home.impl_HomeView_Night_6_en.png} | 0 ...ght_6_en.png => features.home.impl_HomeView_Night_7_en.png} | 0 ...ght_7_en.png => features.home.impl_HomeView_Night_8_en.png} | 0 ...ght_8_en.png => features.home.impl_HomeView_Night_9_en.png} | 0 34 files changed, 6 insertions(+) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListDeclineInviteMenuContent_Day_0_en.png => features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListDeclineInviteMenuContent_Night_0_en.png => features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Day_0_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Day_1_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Day_2_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Night_0_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Night_1_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListModalBottomSheetContent_Night_2_en.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Night_2_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_0_en.png => features.home.impl_HomeView_Day_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_9_en.png => features.home.impl_HomeView_Day_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_10_en.png => features.home.impl_HomeView_Day_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_11_en.png => features.home.impl_HomeView_Day_12_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_2_en.png => features.home.impl_HomeView_Day_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_1_en.png => features.home.impl_HomeView_Day_2_en.png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_3_en.png rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_3_en.png => features.home.impl_HomeView_Day_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_4_en.png => features.home.impl_HomeView_Day_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_5_en.png => features.home.impl_HomeView_Day_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_6_en.png => features.home.impl_HomeView_Day_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_7_en.png => features.home.impl_HomeView_Day_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Day_8_en.png => features.home.impl_HomeView_Day_9_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_0_en.png => features.home.impl_HomeView_Night_0_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_9_en.png => features.home.impl_HomeView_Night_10_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_10_en.png => features.home.impl_HomeView_Night_11_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_11_en.png => features.home.impl_HomeView_Night_12_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_2_en.png => features.home.impl_HomeView_Night_1_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_1_en.png => features.home.impl_HomeView_Night_2_en.png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_3_en.png rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_3_en.png => features.home.impl_HomeView_Night_4_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_4_en.png => features.home.impl_HomeView_Night_5_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_5_en.png => features.home.impl_HomeView_Night_6_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_6_en.png => features.home.impl_HomeView_Night_7_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_7_en.png => features.home.impl_HomeView_Night_8_en.png} (100%) rename tests/uitests/src/test/snapshots/images/{features.home.impl_RoomListView_Night_8_en.png => features.home.impl_HomeView_Night_9_en.png} (100%) diff --git a/tests/uitests/src/test/snapshots/images/features.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.impl_RoomListView_Day_9_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.home.impl_RoomListView_Day_9_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.home.impl_RoomListView_Day_10_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.home.impl_RoomListView_Day_10_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.home.impl_RoomListView_Day_11_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.home.impl_RoomListView_Day_11_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.home.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.home.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.home.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.home.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..b3dfe3db1d --- /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:a7b0dc90002ec59917ed0c64dae785088117c5aca61961c3d71dc7c05d2fa72b +size 82238 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Day_3_en.png rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Day_4_en.png rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Day_5_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.home.impl_RoomListView_Day_5_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.home.impl_RoomListView_Day_6_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.home.impl_RoomListView_Day_6_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.home.impl_RoomListView_Day_7_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.home.impl_RoomListView_Day_7_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.home.impl_RoomListView_Day_8_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.home.impl_RoomListView_Day_8_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.home.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.home.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.home.impl_RoomListView_Night_9_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.home.impl_RoomListView_Night_9_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.home.impl_RoomListView_Night_10_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.home.impl_RoomListView_Night_10_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.home.impl_RoomListView_Night_11_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.home.impl_RoomListView_Night_11_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.home.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.home.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.home.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.home.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..92d58a36cd --- /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:ca1e0f43d447faf770ee7aa4f443f3a310f520c9437cbd5baca9ac7ce36d2aae +size 88613 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Night_3_en.png rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_4_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png similarity index 100% rename from tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Night_4_en.png rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_RoomListView_Night_5_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.home.impl_RoomListView_Night_5_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.home.impl_RoomListView_Night_6_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.home.impl_RoomListView_Night_6_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.home.impl_RoomListView_Night_7_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.home.impl_RoomListView_Night_7_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.home.impl_RoomListView_Night_8_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.home.impl_RoomListView_Night_8_en.png rename to tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png From 5f9035e100b122776c5b89d349abc002f93c0c78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:28:40 +0200 Subject: [PATCH 096/156] fix(deps): update dependency io.sentry:sentry-android to v8.16.0 (#4941) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 32ceabdf68..34fdbbcb9f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -194,7 +194,7 @@ zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics posthog = "com.posthog:posthog-android:3.19.0" -sentry = "io.sentry:sentry-android:8.15.0" +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" From 7f449fef810fb39f026119f4e3a8b8a0df9146d8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 11:14:35 +0200 Subject: [PATCH 097/156] Introduce MIN_SDK_FOSS and MIN_SDK_ENTERPRISE const. --- plugins/src/main/kotlin/Versions.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index fa05b0780a..c72e2f5aa0 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -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 = 26 + val minSdk = if (isEnterpriseBuild) MIN_SDK_ENTERPRISE else MIN_SDK_FOSS private const val JAVA_VERSION = 21 val javaVersion: JavaVersion = JavaVersion.toVersion(JAVA_VERSION) From 3ff859278552f7336706f834a59fa52222243024 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 11:23:11 +0200 Subject: [PATCH 098/156] Release script: read minSdkVersion from file plugins/src/main/kotlin/Versions.kt --- tools/release/release.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/release/release.sh b/tools/release/release.sh index 735c57503e..d2fe217651 100755 --- a/tools/release/release.sh +++ b/tools/release/release.sh @@ -62,7 +62,8 @@ 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}" From c3b7f38dab3ce62205c72f00969e5adcf0ae0f88 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 11:27:53 +0200 Subject: [PATCH 099/156] Change minSDK to 33 for Element enterprise. #4905 --- README.md | 7 +++++++ plugins/src/main/kotlin/Versions.kt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) 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/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index c72e2f5aa0..5c9bd64c83 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -43,7 +43,7 @@ object Versions { // When updating the `minSdk`, make sure to update the value of `minSdkVersion` in the file `tools/release/release.sh` private const val MIN_SDK_FOSS = 24 - private const val MIN_SDK_ENTERPRISE = 26 + private const val MIN_SDK_ENTERPRISE = 33 val minSdk = if (isEnterpriseBuild) MIN_SDK_ENTERPRISE else MIN_SDK_FOSS private const val JAVA_VERSION = 21 From dcf923c4ae21f57756d43631af5fb5d4f09848a8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 11:48:07 +0200 Subject: [PATCH 100/156] Remove scandir param, it seems that it is not recursive --- .github/workflows/quality.yml | 1 - 1 file changed, 1 deletion(-) 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: From fd83aff81dcfbee331a789f3d2ccd2732436edd4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 11:59:27 +0200 Subject: [PATCH 101/156] Fix shellcheck issue on local-recording.sh --- .github/workflows/scripts/maestro/local-recording.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 0570fb1c0ee50c77dfeffd7a8a0c901653b0b8f9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 12:04:25 +0200 Subject: [PATCH 102/156] Fix shellcheck issue on release.sh --- tools/release/release.sh | 68 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/tools/release/release.sh b/tools/release/release.sh index d2fe217651..4120a1da06 100755 --- a/tools/release/release.sh +++ b/tools/release/release.sh @@ -68,7 +68,7 @@ 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 @@ -100,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 @@ -110,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. @@ -147,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}" @@ -156,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 @@ -173,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}" @@ -190,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 @@ -225,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 \ @@ -237,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 \ @@ -249,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 \ @@ -261,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" @@ -277,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" @@ -292,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}" @@ -302,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" @@ -314,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 @@ -329,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 @@ -346,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}" @@ -362,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 @@ -390,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" From cb091106b657df6446b7ec934f69d2d837a2e6c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 13:54:33 +0200 Subject: [PATCH 103/156] Fix test regression on API 33. --- .../android/features/home/impl/roomlist/RoomListViewTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt index 1b241ab294..0465926abc 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListViewTest.kt @@ -35,12 +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() + @Config(qualifiers = "h1024dp") @Test fun `displaying the view automatically sends a couple of UpdateVisibleRangeEvents`() { val eventsRecorder = EventsRecorder() @@ -54,7 +56,7 @@ class RoomListViewTest { eventsRecorder.assertList( listOf( RoomListEvents.UpdateVisibleRange(IntRange.EMPTY), - RoomListEvents.UpdateVisibleRange(0..2), + RoomListEvents.UpdateVisibleRange(0..5), ) ) } From 71ff72750c785a4e6f0bea73d380064ed55780f2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 15:37:29 +0200 Subject: [PATCH 104/156] Fix test regression on API 33. --- .../preferences/impl/advanced/AdvancedSettingsViewTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..2844c2d7c1 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 @@ -145,7 +145,7 @@ class AdvancedSettingsViewTest { } @Test - @Config(qualifiers = "h640dp") + @Config(qualifiers = "h1024dp") fun `clicking on timeline media preview emits the expected event`() { val eventsRecorder = EventsRecorder() rule.setAdvancedSettingsView( From 4de44b702e7783dbbaea655a5aaee4140e6d2b2c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 16:08:50 +0200 Subject: [PATCH 105/156] Fix test regression on API 33. --- .../impl/securityandprivacy/SecurityAndPrivacyViewTest.kt | 2 +- .../mediaviewer/impl/details/MediaDetailsBottomSheetTest.kt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) 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/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 -> From 06a551c388b0a775e3ae0df58aea2baf1e6b4726 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 16:35:26 +0200 Subject: [PATCH 106/156] Fix test regression on API 33. --- .../mediaupload/impl/AndroidMediaPreProcessorTest.kt | 7 +++++++ .../mediaviewer/impl/viewer/MediaViewerViewTest.kt | 3 +++ 2 files changed, 10 insertions(+) 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/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( From 425e1311608d0f871230acd849ed163d8770656c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 16:45:55 +0200 Subject: [PATCH 107/156] Fix test regression on API 33. --- .../impl/DefaultDateFormatterFrTest.kt | 8 ++--- .../impl/DefaultDateFormatterTest.kt | 36 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) 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..aa78aeba59 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 @@ -34,7 +34,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 +46,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 +241,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 +254,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..a4d02fc2ab 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 @@ -34,7 +34,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 +46,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 +58,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 +84,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 +110,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 +136,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 +162,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 +188,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 +202,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 +214,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 +225,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 +241,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 +254,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") } } From dd188e6cc7295a8dbed5c1af7cb8a3026ed70a1f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 16:46:25 +0200 Subject: [PATCH 108/156] Fix test regression on API 33. --- .../impl/notifications/channels/NotificationChannelsTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt index 2d67cf4705..a6b8bc9985 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt @@ -23,7 +23,7 @@ import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) class NotificationChannelsTest { @Test - @Config(sdk = [Build.VERSION_CODES.O]) + @Config(sdk = [Build.VERSION_CODES.TIRAMISU]) fun `init - creates notification channels and migrates old ones`() { val notificationManager = mockk(relaxed = true) { every { notificationChannels } returns emptyList() From f8adf0bed412ea6f18db99437709ac9ed6fed2dd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 16:51:20 +0200 Subject: [PATCH 109/156] Ensure test works with other minApi level. --- .../libraries/dateformatter/impl/DefaultDateFormatterFrTest.kt | 3 ++- .../libraries/dateformatter/impl/DefaultDateFormatterTest.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 aa78aeba59..7300b0d4ef 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,6 +7,7 @@ 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 @@ -16,7 +17,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(qualifiers = "fr") +@Config(qualifiers = "fr", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterFrTest { @Test fun `test null`() { 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 a4d02fc2ab..25cda55654 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,6 +7,7 @@ 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 @@ -16,7 +17,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(qualifiers = "en") +@Config(qualifiers = "en", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterTest { @Test fun `test null`() { From c804fe0558ea2cbef6c896a950c0ea66535945ef Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 30 Jun 2025 17:06:10 +0200 Subject: [PATCH 110/156] Add "View avatar" content description to all clickable Avatar that will open the avatar preview. (#4948) * Add "View avatar" content description to all clickable Avatar that will open the avatar preview. * Improve accessibility of avatar images. --- .../roomdetails/impl/RoomDetailsView.kt | 4 ++++ .../shared/UserProfileHeaderSection.kt | 4 ++++ .../designsystem/components/avatar/DmAvatars.kt | 8 ++++++++ .../designsystem/modifiers/Clickable.kt | 17 +++++++++++++++++ .../ui-strings/src/main/res/values/localazy.xml | 5 +++++ 5 files changed, 38 insertions(+) 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 02a6a637e3..c60a78dd22 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 @@ -58,6 +58,7 @@ import io.element.android.libraries.designsystem.components.button.MainActionBut 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.PreferenceSwitch +import io.element.android.libraries.designsystem.modifiers.a11yClickLabel import io.element.android.libraries.designsystem.modifiers.niceClickable import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight @@ -400,6 +401,7 @@ private fun RoomHeaderSection( .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { + val actionView = stringResource(CommonStrings.action_view) Avatar( avatarData = AvatarData(roomId.value, roomName, avatarUrl, AvatarSize.RoomHeader), avatarType = AvatarType.Room( @@ -408,9 +410,11 @@ private fun RoomHeaderSection( }.toPersistentList(), isTombstoned = isTombstoned, ), + contentDescription = avatarUrl?.let { stringResource(CommonStrings.a11y_room_avatar) }, modifier = Modifier .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) } .testTag(TestTags.roomDetailAvatar) + .a11yClickLabel(avatarUrl?.let { actionView }) ) TitleAndSubtitle( title = roomName, 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 2732e770f4..47bb9cbdc5 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 @@ -31,6 +31,7 @@ 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.a11yClickLabel import io.element.android.libraries.designsystem.modifiers.niceClickable import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight @@ -60,13 +61,16 @@ fun UserProfileHeaderSection( .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { + val actionView = stringResource(CommonStrings.action_view) 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!!) } .testTag(TestTags.memberDetailAvatar) + .a11yClickLabel(avatarUrl?.let { actionView }) ) Spacer(modifier = Modifier.height(24.dp)) if (userName != null) { 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 d0134fca78..56071de747 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,13 +23,16 @@ 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.modifiers.a11yClickLabel import io.element.android.libraries.designsystem.preview.ElementThemedPreview 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 @@ -49,6 +52,7 @@ fun DmAvatars( val boxSizePx = boxSize.toPx() val otherAvatarRadius = otherUserAvatarData.size.dp.toPx() / 2 val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl + val actionView = stringResource(CommonStrings.action_view) Box( modifier = modifier.size(boxSize), ) { @@ -56,6 +60,7 @@ fun DmAvatars( Avatar( avatarData = userAvatarData, avatarType = AvatarType.User, + contentDescription = userAvatarData.url?.let { stringResource(CommonStrings.a11y_your_avatar) }, modifier = Modifier .align(Alignment.BottomStart) .graphicsLayer { @@ -82,11 +87,13 @@ fun DmAvatars( .clickable(enabled = userAvatarData.url != null) { userAvatarData.url?.let { openAvatarPreview(it) } } + .a11yClickLabel(userAvatarData.url?.let { actionView }) ) // 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) @@ -94,6 +101,7 @@ fun DmAvatars( otherUserAvatarData.url?.let { openOtherAvatarPreview(it) } } .testTag(TestTags.memberDetailAvatar) + .a11yClickLabel(otherUserAvatarData.url?.let { actionView }) ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt index 5789a4525d..753ad952a0 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt @@ -12,6 +12,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = this.then( @@ -29,3 +31,18 @@ fun Modifier.niceClickable( .clickable { onClick() } .padding(horizontal = 4.dp) } + +fun Modifier.a11yClickLabel( + label: String?, +): Modifier = then( + if (label != null) { + Modifier.semantics { + onClick( + label = label, + action = null, + ) + } + } else { + Modifier + } +) diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index bf97f4c46b..41e87f83c5 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -12,6 +12,7 @@ "Jump to bottom" "Mentions only" "Muted" + "Other user avatar" "Page %1$d" "Pause" "Voice message, duration: %1$s, current position: %2$s" @@ -30,15 +31,18 @@ "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" @@ -137,6 +141,7 @@ "Tap for options" "Try again" "Unpin" + "View" "View in timeline" "View source" "Yes" From 9ee371d1b1a6db87ee6eff7437d5796ba75acd06 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 09:44:08 +0200 Subject: [PATCH 111/156] Add Feature flag for Spaces --- .../android/libraries/featureflag/api/FeatureFlags.kt | 7 +++++++ 1 file changed, 7 insertions(+) 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", From 33daa384550b15ac8efff10225a95d42dd1c03fa Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 26 Jun 2025 12:55:09 +0200 Subject: [PATCH 112/156] NavigationBar for Spaces --- features/home/impl/build.gradle.kts | 2 + .../android/features/home/impl/HomeEvents.kt | 4 +- .../home/impl/HomeNavigationBarItem.kt | 38 ++++++ .../features/home/impl/HomePresenter.kt | 28 ++++- .../android/features/home/impl/HomeState.kt | 4 +- .../features/home/impl/HomeStateProvider.kt | 19 +++ .../android/features/home/impl/HomeView.kt | 112 +++++++++++++++--- .../impl/components/RoomListContentView.kt | 10 +- .../home/impl/components/RoomListTopBar.kt | 7 +- .../impl/roomlist/RoomListStateProvider.kt | 16 +++ .../features/home/impl/HomePresenterTest.kt | 35 ++++++ gradle/libs.versions.toml | 3 + 12 files changed, 254 insertions(+), 24 deletions(-) create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeNavigationBarItem.kt diff --git a/features/home/impl/build.gradle.kts b/features/home/impl/build.gradle.kts index 5ea238081b..88184bcbcd 100644 --- a/features/home/impl/build.gradle.kts +++ b/features/home/impl/build.gradle.kts @@ -51,6 +51,8 @@ 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.home.api) 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 index 0762bbfb5a..4632e40d5a 100644 --- 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 @@ -7,4 +7,6 @@ package io.element.android.features.home.impl -sealed interface HomeEvents +sealed interface HomeEvents { + data class SelectHomeNavigationBarItem(val item: HomeNavigationBarItem) : HomeEvents +} 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 index b1160b4b6b..894ed29e8d 100644 --- 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 @@ -10,14 +10,20 @@ 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 @@ -31,6 +37,7 @@ class HomePresenter @Inject constructor( private val roomListPresenter: Presenter, private val logoutPresenter: Presenter, private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, + private val featureFlagService: FeatureFlagService, ) : Presenter { @Composable override fun present(): HomeState { @@ -38,31 +45,42 @@ class HomePresenter @Inject constructor( 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) { - // TODO + 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 index f7b4f644a6..5e6c16d2e4 100644 --- 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 @@ -18,11 +18,13 @@ 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 = true + 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 index 621a36bf5e..7a50296e17 100644 --- 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 @@ -11,6 +11,8 @@ 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 @@ -24,6 +26,19 @@ open class HomeStateProvider : PreviewParameterProvider { 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) } @@ -34,8 +49,10 @@ internal fun aHomeState( 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( @@ -45,6 +62,8 @@ internal fun aHomeState( snackbarMessage = snackbarMessage, canReportBug = canReportBug, directLogoutState = directLogoutState, + currentHomeNavigationBarItem = currentHomeNavigationBarItem, roomListState = roomListState, + isSpaceFeatureEnabled = isSpaceFeatureEnabled, eventSink = eventSink, ) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt index fbd47bf52b..fb5b9c9ae3 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.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. */ +@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,10 +24,19 @@ 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 @@ -41,7 +55,10 @@ 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 @@ -138,10 +155,19 @@ private fun HomeScaffold( 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 = roomListState.searchState.isSearchActive, @@ -150,25 +176,83 @@ private fun HomeScaffold( onOpenSettings = onOpenSettings, scrollBehavior = scrollBehavior, displayMenuItems = state.displayActions, - displayFilters = roomListState.displayFilters, + 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 = roomListState.contentState, - filtersState = roomListState.filtersState, - hideInvitesAvatars = roomListState.hideInvitesAvatars, - eventSink = roomListState.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) { diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt index c4144b22e9..993fb0b85c 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt @@ -31,6 +31,7 @@ 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 @@ -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 -> { @@ -324,5 +329,6 @@ internal fun RoomListContentViewPreview(@PreviewParameter(RoomListContentStatePr onConfirmRecoveryKeyClick = {}, onRoomClick = {}, onCreateRoomClick = {}, + contentBottomPadding = 0.dp, ) } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt index 1b7edcbfd4..ae1d708933 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt @@ -76,6 +76,7 @@ private val avatarBloomSize = 430.dp @OptIn(ExperimentalMaterial3Api::class) @Composable fun RoomListTopBar( + title: String, matrixUser: MatrixUser, showAvatarIndicator: Boolean, areSearchResultsDisplayed: Boolean, @@ -90,6 +91,7 @@ fun RoomListTopBar( modifier: Modifier = Modifier, ) { DefaultRoomListTopBar( + title = title, matrixUser = matrixUser, showAvatarIndicator = showAvatarIndicator, areSearchResultsDisplayed = areSearchResultsDisplayed, @@ -108,6 +110,7 @@ fun RoomListTopBar( @OptIn(ExperimentalMaterial3Api::class) @Composable private fun DefaultRoomListTopBar( + title: String, matrixUser: MatrixUser, showAvatarIndicator: Boolean, areSearchResultsDisplayed: Boolean, @@ -194,7 +197,7 @@ private fun DefaultRoomListTopBar( scrolledContainerColor = Color.Transparent, ), title = { - Text(text = stringResource(id = R.string.screen_roomlist_main_space_title)) + Text(text = title) }, navigationIcon = { NavigationIcon( @@ -315,6 +318,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, @@ -334,6 +338,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/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt index 9fd5324d57..0e4600c16a 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListStateProvider.kt @@ -27,6 +27,7 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.push.api.battery.aBatteryOptimizationState import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentList open class RoomListStateProvider : PreviewParameterProvider { override val values: Sequence @@ -113,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/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 index 0ca344cafd..6913ea19bf 100644 --- 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 @@ -15,6 +15,9 @@ 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 @@ -27,6 +30,7 @@ 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 @@ -58,6 +62,21 @@ class HomePresenterTest { 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() } } @@ -95,12 +114,27 @@ class HomePresenterTest { } } + @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, @@ -109,5 +143,6 @@ class HomePresenterTest { logoutPresenter = { aDirectLogoutState() }, roomListPresenter = { aRoomListState() }, rageshakeFeatureAvailability = rageshakeFeatureAvailability, + featureFlagService = featureFlagService, ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 34fdbbcb9f..de71461257 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,6 +44,7 @@ appyx = "1.7.1" sqldelight = "2.1.0" wysiwyg = "2.38.4" telephoto = "0.16.0" +haze = "1.6.4" # Dependency analysis dependencyAnalysis = "2.19.0" @@ -191,6 +192,8 @@ 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" From f7dde9dd6eeacd99459928ad9849a318e0a8c1ff Mon Sep 17 00:00:00 2001 From: ElementBot Date: Mon, 30 Jun 2025 17:23:15 +0000 Subject: [PATCH 113/156] Update screenshots --- .../images/features.home.impl_HomeView_Day_10_en.png | 4 ++-- .../images/features.home.impl_HomeView_Day_11_en.png | 4 ++-- .../images/features.home.impl_HomeView_Day_12_en.png | 4 ++-- .../images/features.home.impl_HomeView_Day_13_en.png | 3 +++ .../images/features.home.impl_HomeView_Day_14_en.png | 3 +++ .../snapshots/images/features.home.impl_HomeView_Day_3_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_4_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_5_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_6_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_7_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_8_en.png | 4 ++-- .../snapshots/images/features.home.impl_HomeView_Day_9_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_10_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_11_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_12_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_13_en.png | 3 +++ .../images/features.home.impl_HomeView_Night_14_en.png | 3 +++ .../images/features.home.impl_HomeView_Night_3_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_4_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_5_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_6_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_7_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_8_en.png | 4 ++-- .../images/features.home.impl_HomeView_Night_9_en.png | 4 ++-- 24 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png index 1faef9acc6..2bc640fe3a 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd29643f2af1dd5edd37c6ebfc6059db3444810a9dc8002bb5abc8475b4b6b0c -size 5788 +oid sha256:660e96d8c627d8f24bbfbc150a3e2b7e74f6819e7fbaa581c5872f544ed9685e +size 46034 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png index ca0f363c49..6e0088ee14 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20e6d5a1c7218304ede990c1906ec628593acbe57a6496b98a2c1fe9c87d1ae3 -size 105294 +oid sha256:f65131302fab3b0ba710528947376b57230a74731aa6549473998c30f4e07f6e +size 40681 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png index b7e1278591..1faef9acc6 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6041a7693307a30183606e7f8f2b605ba4c9bfb8c7ad5d8122837749813d6e2c -size 99928 +oid sha256:cd29643f2af1dd5edd37c6ebfc6059db3444810a9dc8002bb5abc8475b4b6b0c +size 5788 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png new file mode 100644 index 0000000000..ca0f363c49 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_13_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20e6d5a1c7218304ede990c1906ec628593acbe57a6496b98a2c1fe9c87d1ae3 +size 105294 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png new file mode 100644 index 0000000000..b7e1278591 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_14_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6041a7693307a30183606e7f8f2b605ba4c9bfb8c7ad5d8122837749813d6e2c +size 99928 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 index b3dfe3db1d..f6988f9732 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7b0dc90002ec59917ed0c64dae785088117c5aca61961c3d71dc7c05d2fa72b -size 82238 +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 index 20806bc42c..ec5767287f 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4385b380efbae924d4a8fece278a61003d40acbd795fef1aa2eab4c5fadbf367 -size 60691 +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 index 1b34b511fb..b3dfe3db1d 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d64fa49cfca399eb073a8efac881aebbfed38726116d3113f9a562245ac9a41 -size 60495 +oid sha256:a7b0dc90002ec59917ed0c64dae785088117c5aca61961c3d71dc7c05d2fa72b +size 82238 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png index 13db73a34e..20806bc42c 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:020d732b7b3a4f43918bee7b9424ffd03fe20074c5823341811a1c700551b2f2 -size 58734 +oid sha256:4385b380efbae924d4a8fece278a61003d40acbd795fef1aa2eab4c5fadbf367 +size 60691 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png index 114ba675ce..1b34b511fb 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63f8198b96e49f9a29dad22ef2249503d1528aec874599d9daab3f8634d662d7 -size 99704 +oid sha256:7d64fa49cfca399eb073a8efac881aebbfed38726116d3113f9a562245ac9a41 +size 60495 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png index 2bc640fe3a..13db73a34e 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:660e96d8c627d8f24bbfbc150a3e2b7e74f6819e7fbaa581c5872f544ed9685e -size 46034 +oid sha256:020d732b7b3a4f43918bee7b9424ffd03fe20074c5823341811a1c700551b2f2 +size 58734 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png index 6e0088ee14..114ba675ce 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f65131302fab3b0ba710528947376b57230a74731aa6549473998c30f4e07f6e -size 40681 +oid sha256:63f8198b96e49f9a29dad22ef2249503d1528aec874599d9daab3f8634d662d7 +size 99704 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png index e9b928c558..81c7db17ae 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d1931e55ba639d0732a75612f691b034fb1b5f2d82fa1e9719dadc6ae2c5f980 -size 5662 +oid sha256:6be30df0d8f5ba0a57c720bcc16eefc3a5b7dacfc8115a8d47a42edab3e63e82 +size 53250 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png index 19375d3ec5..66309e8b71 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c93289bc30c3b590360f916a55a86a5cc98028bd2201cb410f329de85ed615c -size 111059 +oid sha256:1c6dc3c0c72d1ea8a980f393d7cfe2c9e0392016c8fc25b901817dd077d8526c +size 47265 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png index 6cafa75e88..e9b928c558 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7563629f9df4012d7cc35b2805e1ac381ccdb171935b35cad0d1ea60186e3e7d -size 105496 +oid sha256:d1931e55ba639d0732a75612f691b034fb1b5f2d82fa1e9719dadc6ae2c5f980 +size 5662 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png new file mode 100644 index 0000000000..19375d3ec5 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_13_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c93289bc30c3b590360f916a55a86a5cc98028bd2201cb410f329de85ed615c +size 111059 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png new file mode 100644 index 0000000000..6cafa75e88 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_14_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7563629f9df4012d7cc35b2805e1ac381ccdb171935b35cad0d1ea60186e3e7d +size 105496 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 index 92d58a36cd..1c65bb2ce7 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca1e0f43d447faf770ee7aa4f443f3a310f520c9437cbd5baca9ac7ce36d2aae -size 88613 +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 index 611da1630c..9b2a3650ed 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acde7691ec0ebe690bcb29478963107e2dc0fe6fa54892b3600f50e0cf1db2a3 -size 69463 +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 index 642eca994d..92d58a36cd 100644 --- 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 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38e55635243d77c084053c4feea03dcedabd549aa556f4a622ec2d629bb4f426 -size 69240 +oid sha256:ca1e0f43d447faf770ee7aa4f443f3a310f520c9437cbd5baca9ac7ce36d2aae +size 88613 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png index 0604b0bc73..611da1630c 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fc45bd4279456b75cadcb8381451f9e6a0e1fadaf4a8f22274c94aa89c7c348 -size 67496 +oid sha256:acde7691ec0ebe690bcb29478963107e2dc0fe6fa54892b3600f50e0cf1db2a3 +size 69463 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png index 48835abda6..642eca994d 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d9f42109a12e450a13d1166f7d7790913e1dd847cd44f00a2c881d825cad9b4 -size 105496 +oid sha256:38e55635243d77c084053c4feea03dcedabd549aa556f4a622ec2d629bb4f426 +size 69240 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png index 81c7db17ae..0604b0bc73 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6be30df0d8f5ba0a57c720bcc16eefc3a5b7dacfc8115a8d47a42edab3e63e82 -size 53250 +oid sha256:1fc45bd4279456b75cadcb8381451f9e6a0e1fadaf4a8f22274c94aa89c7c348 +size 67496 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png index 66309e8b71..48835abda6 100644 --- a/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.home.impl_HomeView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c6dc3c0c72d1ea8a980f393d7cfe2c9e0392016c8fc25b901817dd077d8526c -size 47265 +oid sha256:8d9f42109a12e450a13d1166f7d7790913e1dd847cd44f00a2c881d825cad9b4 +size 105496 From 4b4cfa341e9837c5de760aa33fcc578ed302a770 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 30 Jun 2025 21:24:01 +0200 Subject: [PATCH 114/156] change (media preview config) : fix JoinRule.Private case --- .../android/libraries/matrix/api/media/MediaPreviewValue.kt | 1 + 1 file changed, 1 insertion(+) 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, From ca46166c67023ba31a0d3c6af1029fb37ea3ae0e Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 30 Jun 2025 21:31:58 +0200 Subject: [PATCH 115/156] change (media preview config) : final refactoring and tests --- .../loggedin/MediaPreviewConfigMigration.kt | 4 +- .../MediaPreviewConfigMigrationTest.kt | 160 ++++++++++++++ .../joinroom/impl/JoinRoomPresenter.kt | 10 +- .../joinroom/impl/di/JoinRoomModule.kt | 3 - .../joinroom/impl/JoinRoomPresenterTest.kt | 4 - .../protection/TimelineProtectionPresenter.kt | 10 +- .../TimelineProtectionPresenterTest.kt | 27 ++- .../advanced/AdvancedSettingsPresenter.kt | 13 +- .../impl/advanced/AdvancedSettingsState.kt | 7 +- .../advanced/AdvancedSettingsStateProvider.kt | 12 +- .../impl/advanced/AdvancedSettingsView.kt | 25 ++- .../advanced/MediaPreviewConfigStateStore.kt | 49 +++-- .../advanced/AdvancedSettingsPresenterTest.kt | 90 +++++--- .../impl/advanced/AdvancedSettingsViewTest.kt | 66 +++++- .../FakeMediaPreviewConfigStateStore.kt | 51 +++++ .../MediaPreviewConfigStateStoreTest.kt | 206 ++++++++++++++++++ .../roomlist/impl/RoomListPresenter.kt | 8 +- .../libraries/matrix/api/MatrixClient.kt | 5 - .../matrix/api/media/MediaPreviewConfig.kt | 12 +- .../matrix/api/media/MediaPreviewService.kt | 17 +- .../libraries/matrix/impl/RustMatrixClient.kt | 6 +- .../impl/media/RustMediaPreviewService.kt | 22 +- .../libraries/matrix/test/FakeMatrixClient.kt | 4 - .../test/media/FakeMediaPreviewService.kt | 23 +- .../api/store/AppPreferencesStore.kt | 4 + .../DefaultNotifiableEventResolver.kt | 1 + .../DefaultNotifiableEventResolverTest.kt | 2 - 27 files changed, 676 insertions(+), 165 deletions(-) create mode 100644 appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/FakeMediaPreviewConfigStateStore.kt create mode 100644 features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/advanced/MediaPreviewConfigStateStoreTest.kt 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 index ac7a1c6145..54299acc74 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt @@ -26,6 +26,7 @@ class MediaPreviewConfigMigration @Inject constructor( @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) { + @Suppress("DEPRECATION") operator fun invoke() = sessionCoroutineScope.launch { val hideInviteAvatars = appPreferencesStore.getHideInviteAvatarsFlow().first() val mediaPreviewValue = appPreferencesStore.getTimelineMediaPreviewValueFlow().first() @@ -49,7 +50,8 @@ class MediaPreviewConfigMigration @Inject constructor( appPreferencesStore.setTimelineMediaPreviewValue(null) } } - }.onFailure { + } + .onFailure { Timber.d("Couldn't perform migration, failed to fetch media preview config.") } } 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..e6a17b440f --- /dev/null +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt @@ -0,0 +1,160 @@ +/* + * 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 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/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 e8514ac4a5..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,6 +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.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 @@ -49,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 @@ -67,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 { @@ -94,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( 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/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 ac716a4203..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 @@ -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 @@ -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/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/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/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 a47ea25e4e..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 @@ -8,21 +8,15 @@ package io.element.android.features.preferences.impl.advanced 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.mutableStateOf import androidx.compose.runtime.remember 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.AsyncAction import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.di.annotations.SessionCoroutineScope -import io.element.android.libraries.matrix.api.MatrixClient -import io.element.android.libraries.matrix.api.media.MediaPreviewValue import io.element.android.libraries.preferences.api.store.AppPreferencesStore import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import kotlinx.coroutines.CoroutineScope @@ -51,6 +45,8 @@ class AdvancedSettingsPresenter @Inject constructor( appPreferencesStore.getThemeFlow().mapToTheme() }.collectAsState(initial = Theme.System) + val mediaPreviewConfigState = mediaPreviewConfigStateStore.state() + val themeOption by remember { derivedStateOf { when (theme.value) { @@ -89,10 +85,7 @@ class AdvancedSettingsPresenter @Inject constructor( isSharePresenceEnabled = isSharePresenceEnabled, doesCompressMedia = doesCompressMedia, theme = themeOption, - hideInviteAvatars = mediaPreviewConfigStateStore.hideInviteAvatars.value, - timelineMediaPreviewValue = mediaPreviewConfigStateStore.timelineMediaPreviewValue.value, - setHideInviteAvatarsAction = mediaPreviewConfigStateStore.setHideInviteAvatarsAction.value, - setTimelineMediaPreviewAction = mediaPreviewConfigStateStore.setTimelineMediaPreviewAction.value, + 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 6386984146..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 @@ -10,9 +10,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.res.stringResource -import io.element.android.libraries.architecture.AsyncAction 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( @@ -20,10 +18,7 @@ data class AdvancedSettingsState( val isSharePresenceEnabled: Boolean, val doesCompressMedia: Boolean, val theme: ThemeOption, - val hideInviteAvatars: Boolean, - val timelineMediaPreviewValue: MediaPreviewValue, - val setHideInviteAvatarsAction: AsyncAction, - val setTimelineMediaPreviewAction: AsyncAction, + 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 09b3b6e1a5..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 @@ -29,8 +29,8 @@ fun aAdvancedSettingsState( isDeveloperModeEnabled: Boolean = false, isSharePresenceEnabled: Boolean = false, doesCompressMedia: Boolean = false, - hideInviteAvatars: Boolean = false, theme: ThemeOption = ThemeOption.System, + hideInviteAvatars: Boolean = false, timelineMediaPreviewValue: MediaPreviewValue = MediaPreviewValue.On, setTimelineMediaPreviewAction: AsyncAction = AsyncAction.Uninitialized, setHideInviteAvatarsAction: AsyncAction = AsyncAction.Uninitialized, @@ -40,9 +40,11 @@ fun aAdvancedSettingsState( isSharePresenceEnabled = isSharePresenceEnabled, doesCompressMedia = doesCompressMedia, theme = theme, - hideInviteAvatars = hideInviteAvatars, - timelineMediaPreviewValue = timelineMediaPreviewValue, - setTimelineMediaPreviewAction = setTimelineMediaPreviewAction, - setHideInviteAvatarsAction = setHideInviteAvatarsAction, + 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 924f178b32..c92f50bd2e 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 @@ -133,11 +133,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.setHideInviteAvatarsAction.isLoading() + enabled = !state.mediaPreviewConfigState.setHideInviteAvatarsAction.isLoading() ) ListSectionHeader( title = stringResource(R.string.screen_advanced_settings_show_media_timeline_title), @@ -153,27 +153,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.setTimelineMediaPreviewAction.isLoading() + 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.setTimelineMediaPreviewAction.isLoading() + 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.setTimelineMediaPreviewAction.isLoading() + 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 index c503ba49a2..715938b93b 100644 --- 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 @@ -7,7 +7,7 @@ package io.element.android.features.preferences.impl.advanced -import androidx.compose.runtime.State +import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.architecture.AsyncAction @@ -21,27 +21,29 @@ 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.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject -interface MediaPreviewConfigStateStore { - val hideInviteAvatars: State - val timelineMediaPreviewValue: State - val setHideInviteAvatarsAction: State> - val setTimelineMediaPreviewAction: State> +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, boundType = MediaPreviewConfigStateStore::class) +@ContributesBinding(SessionScope::class) @SingleIn(SessionScope::class) class DefaultMediaPreviewConfigStateStore @Inject constructor( @SessionCoroutineScope @@ -49,19 +51,19 @@ class DefaultMediaPreviewConfigStateStore @Inject constructor( private val mediaPreviewService: MediaPreviewService, private val snackbarDispatcher: SnackbarDispatcher, ) : MediaPreviewConfigStateStore { - override val hideInviteAvatars = mutableStateOf(false) - override val timelineMediaPreviewValue = mutableStateOf(MediaPreviewValue.On) - override val setHideInviteAvatarsAction = mutableStateOf>(AsyncAction.Uninitialized) - override val setTimelineMediaPreviewAction = mutableStateOf>(AsyncAction.Uninitialized) + 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.getMediaPreviewConfigFlow().shareIn(sessionCoroutineScope, SharingStarted.Eagerly) - val hideInviteAvatarsFlow = configFlow.mapNotNull { it?.hideInviteAvatar }.distinctUntilChanged() - val timelineMediaPreviewFlow = configFlow.mapNotNull { it?.mediaPreviewValue }.distinctUntilChanged() + val configFlow = mediaPreviewService.mediaPreviewConfigFlow + val hideInviteAvatarsFlow = configFlow.map { it.hideInviteAvatar }.distinctUntilChanged() + val timelineMediaPreviewFlow = configFlow.map { it.mediaPreviewValue }.distinctUntilChanged() hideInviteAvatarsFlow .onEach { - Timber.d("Hide invi@te avatars changed to $it") + Timber.d("Hide invite avatars changed to $it") hideInviteAvatars.value = it } .launchIn(sessionCoroutineScope) @@ -74,6 +76,16 @@ class DefaultMediaPreviewConfigStateStore @Inject constructor( .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 { Timber.d("Setting hide invite avatars to $hide") @@ -106,4 +118,3 @@ class DefaultMediaPreviewConfigStateStore @Inject constructor( } } } - 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 de841f3f6d..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,14 +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.matrix.api.MatrixClient -import io.element.android.libraries.matrix.api.media.MediaPreviewConfig +import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.media.MediaPreviewValue -import io.element.android.libraries.matrix.test.FakeMatrixClient 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.flow.MutableStateFlow +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -38,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) } } } @@ -128,56 +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 mediaPreviewConfigFlow = MutableStateFlow(null) - val presenter = createAdvancedSettingsPresenter( - matrixClient = FakeMatrixClient( - mediaPreviewConfigFlow = mediaPreviewConfigFlow - ) + 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(), - matrixClient: MatrixClient = FakeMatrixClient(), + mediaPreviewConfigStateStore: MediaPreviewConfigStateStore = FakeMediaPreviewConfigStateStore(), ) = AdvancedSettingsPresenter( appPreferencesStore = appPreferencesStore, sessionPreferencesStore = sessionPreferencesStore, - matrixClient = matrixClient, + 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/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 9e8199cd80..59ff6bc379 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -37,6 +37,7 @@ 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.core.coroutine.mapState 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 @@ -120,8 +121,11 @@ class RoomListPresenter @Inject constructor( // 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) } 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 81aa28be6b..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 @@ -8,7 +8,6 @@ package io.element.android.libraries.matrix.api import io.element.android.libraries.core.data.tryOrNull -import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.MatrixPatterns import io.element.android.libraries.matrix.api.core.ProgressCallback @@ -20,9 +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.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.notification.NotificationService import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -44,7 +41,6 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.withContext import java.util.Optional interface MatrixClient { @@ -175,7 +171,6 @@ interface MatrixClient { * 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/media/MediaPreviewConfig.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/media/MediaPreviewConfig.kt index 5c964ca15e..66a53b3ad3 100644 --- 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 @@ -13,4 +13,14 @@ package io.element.android.libraries.matrix.api.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 index 19cbe9cf2a..dffa2d25e4 100644 --- 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 @@ -7,7 +7,7 @@ package io.element.android.libraries.matrix.api.media -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow interface MediaPreviewService { /** @@ -19,24 +19,17 @@ interface MediaPreviewService { * Will emit the media preview config known by the client. * This will emit a new value when received from sync. */ - fun getMediaPreviewConfigFlow(): Flow - - /** - * Get the media preview display policy from the cache. This value is updated through sync. - */ - suspend fun getMediaPreviewValue(): MediaPreviewValue? - - /** - * Get the invite avatars display policy from the cache. This value is updated through sync. - */ - suspend fun getHideInviteAvatars(): Boolean + 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/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 1e9d703b28..d71db05a02 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,9 +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.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.notification.NotificationService import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -111,7 +109,6 @@ import org.matrix.rustcomponents.sdk.AuthDataPasswordDetails import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.ClientException import org.matrix.rustcomponents.sdk.IgnoredUsersListener -import org.matrix.rustcomponents.sdk.InviteAvatars import org.matrix.rustcomponents.sdk.NotificationProcessSetup import org.matrix.rustcomponents.sdk.PowerLevels import org.matrix.rustcomponents.sdk.RoomInfoListener @@ -220,6 +217,7 @@ class RustMatrixClient( ) private val mediaPreviewService = RustMediaPreviewService( + sessionCoroutineScope = sessionCoroutineScope, innerClient = innerClient, sessionDispatcher = sessionDispatcher, ) @@ -694,8 +692,6 @@ class RustMatrixClient( 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/media/RustMediaPreviewService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaPreviewService.kt index a2ab6c8bb9..c18f85712f 100644 --- 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 @@ -13,7 +13,10 @@ 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.flow.Flow +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 @@ -22,27 +25,27 @@ 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 fun getMediaPreviewConfigFlow(): Flow = innerClient.getMediaPreviewConfigFlow() - - override suspend fun getMediaPreviewValue(): MediaPreviewValue? = innerClient.getMediaPreviewDisplayPolicy()?.into() - override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = withContext(sessionDispatcher) { runCatchingExceptions { innerClient.setMediaPreviewDisplayPolicy(mediaPreviewValue.into()) } } - override suspend fun getHideInviteAvatars(): Boolean = innerClient.getInviteAvatarsDisplayPolicy() == InviteAvatars.OFF - override suspend fun setHideInviteAvatars(hide: Boolean): Result = withContext(sessionDispatcher) { runCatchingExceptions { val inviteAvatars = if (hide) InviteAvatars.OFF else InviteAvatars.ON @@ -61,7 +64,9 @@ private fun RustMediaPreviewConfig.into(): MediaPreviewConfig { private fun Client.getMediaPreviewConfigFlow() = mxCallbackFlow { subscribeToMediaPreviewConfig(object : MediaPreviewConfigListener { override fun onChange(mediaPreviewConfig: RustMediaPreviewConfig?) { - trySend(mediaPreviewConfig?.into()) + if (mediaPreviewConfig != null) { + trySend(mediaPreviewConfig.into()) + } } }) } @@ -81,4 +86,3 @@ private fun MediaPreviews.into(): MediaPreviewValue { MediaPreviews.PRIVATE -> MediaPreviewValue.Private } } - 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 11b95a647e..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 @@ -17,8 +17,6 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters import io.element.android.libraries.matrix.api.encryption.EncryptionService -import io.element.android.libraries.matrix.api.media.MediaPreviewConfig -import io.element.android.libraries.matrix.api.media.MediaPreviewValue 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 @@ -96,7 +94,6 @@ class FakeMatrixClient( private val canReportRoomLambda: () -> Boolean = { false }, private val isLivekitRtcSupportedLambda: () -> Boolean = { false }, override val ignoredUsersFlow: StateFlow> = MutableStateFlow(persistentListOf()), - ) : MatrixClient { var setDisplayNameCalled: Boolean = false private set @@ -246,7 +243,6 @@ class FakeMatrixClient( return RoomMembershipObserver() } - // Mocks fun givenCreateRoomResult(result: Result) { 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 index 7e41b03e41..d8e9114817 100644 --- 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 @@ -12,34 +12,19 @@ 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.Flow -import kotlinx.coroutines.flow.flowOf +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 mediaPreviewConfigFlow: Flow = flowOf(null), - private val getMediaPreviewValue: ()-> MediaPreviewValue? = { null }, - private val getHideInviteAvatars: () -> Boolean = { false }, private val setMediaPreviewValueResult: (MediaPreviewValue) -> Result = { lambdaError() }, private val setHideInviteAvatarsResult: (Boolean) -> Result = { lambdaError() }, -): MediaPreviewService { - +) : MediaPreviewService { override suspend fun fetchMediaPreviewConfig(): Result = simulateLongTask { fetchMediaPreviewConfigResult() } - override fun getMediaPreviewConfigFlow(): Flow { - return mediaPreviewConfigFlow - } - - override suspend fun getMediaPreviewValue(): MediaPreviewValue? = simulateLongTask { - getMediaPreviewValue.invoke() - } - - override suspend fun getHideInviteAvatars(): Boolean = simulateLongTask { - getHideInviteAvatars.invoke() - } - override suspend fun setMediaPreviewValue(mediaPreviewValue: MediaPreviewValue): Result = simulateLongTask { setMediaPreviewValueResult(mediaPreviewValue) } 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 59a074c99b..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,9 +22,13 @@ interface AppPreferencesStore { suspend fun setTheme(theme: String) fun getThemeFlow(): 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) 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 dd2f7eb760..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 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 cb3c0a78f0..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 From 7fb6eeb398a25e10be5cbf21e4d1b249a317ee08 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 30 Jun 2025 21:54:17 +0200 Subject: [PATCH 116/156] change (media preview config) : clean code --- .../android/features/home/impl/roomlist/RoomListPresenter.kt | 2 -- .../preferences/impl/store/DefaultAppPreferencesStore.kt | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt index 444ddb7a86..45e4dd4238 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt @@ -36,8 +36,6 @@ import io.element.android.features.leaveroom.api.LeaveRoomState import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.mapState -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.fullscreenintent.api.FullScreenIntentPermissionsState 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 1ea7c1f874..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,12 +85,14 @@ class DefaultAppPreferencesStore @Inject constructor( } } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") override fun getHideInviteAvatarsFlow(): Flow { return store.data.map { prefs -> prefs[hideInviteAvatarsKey] } } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") override suspend fun setHideInviteAvatars(hide: Boolean?) { store.edit { prefs -> if (hide != null) { @@ -101,6 +103,7 @@ class DefaultAppPreferencesStore @Inject constructor( } } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") override suspend fun setTimelineMediaPreviewValue(mediaPreviewValue: MediaPreviewValue?) { store.edit { prefs -> if (mediaPreviewValue != null) { @@ -111,6 +114,7 @@ class DefaultAppPreferencesStore @Inject constructor( } } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") override fun getTimelineMediaPreviewValueFlow(): Flow { return store.data.map { prefs -> prefs[timelineMediaPreviewValueKey]?.let { MediaPreviewValue.valueOf(it) } From b9b3418d3125f0e4e6703f667aeaaea5de37bf51 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Tue, 1 Jul 2025 07:14:32 +0000 Subject: [PATCH 117/156] Update screenshots --- ...preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png | 3 +++ ...preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_6_en.png | 3 +++ ...references.impl.advanced_AdvancedSettingsViewLight_7_en.png | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_en.png 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 From 967e9cad85764025577707e5e5c2cf871d23d1f9 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 1 Jul 2025 11:22:03 +0200 Subject: [PATCH 118/156] change (media preview config) : address review remarks --- .../appnav/loggedin/MediaPreviewConfigMigration.kt | 2 +- .../preferences/impl/advanced/AdvancedSettingsView.kt | 11 ++++------- .../impl/advanced/MediaPreviewConfigStateStore.kt | 6 ++++-- .../matrix/impl/media/RustMediaPreviewService.kt | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) 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 index 54299acc74..d9ed15318a 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigration.kt @@ -52,7 +52,7 @@ class MediaPreviewConfigMigration @Inject constructor( } } .onFailure { - Timber.d("Couldn't perform migration, failed to fetch media preview config.") + Timber.e(it, "Couldn't perform migration, failed to fetch media preview config.") } } } 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 c92f50bd2e..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,6 @@ package io.element.android.features.preferences.impl.advanced -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -143,12 +142,10 @@ private fun ModerationAndSafety( title = stringResource(R.string.screen_advanced_settings_show_media_timeline_title), hasDivider = false, description = { - Row { - ListSupportingText( - text = stringResource(R.string.screen_advanced_settings_show_media_timeline_subtitle), - contentPadding = ListSupportingTextDefaults.Padding.None, - ) - } + ListSupportingText( + text = stringResource(R.string.screen_advanced_settings_show_media_timeline_subtitle), + contentPadding = ListSupportingTextDefaults.Padding.None, + ) } ) ListItem( 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 index 715938b93b..49f199ec3f 100644 --- 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 @@ -88,8 +88,9 @@ class DefaultMediaPreviewConfigStateStore @Inject constructor( override fun setHideInviteAvatars(hide: Boolean) { sessionCoroutineScope.launch { - Timber.d("Setting hide invite avatars to $hide") val prevHideInviteAvatars = hideInviteAvatars.value + if (prevHideInviteAvatars == hide) return@launch + Timber.d("Setting hide invite avatars to $hide") hideInviteAvatars.value = hide runUpdatingState(setHideInviteAvatarsAction) { mediaPreviewService @@ -104,8 +105,9 @@ class DefaultMediaPreviewConfigStateStore @Inject constructor( override fun setTimelineMediaPreviewValue(value: MediaPreviewValue) { sessionCoroutineScope.launch { - Timber.d("Setting timeline media preview value to $value") val prevTimelineMediaPreviewValue = timelineMediaPreviewValue.value + if (prevTimelineMediaPreviewValue == value) return@launch + Timber.d("Setting timeline media preview value to $value") timelineMediaPreviewValue.value = value runUpdatingState(setTimelineMediaPreviewAction) { 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 index c18f85712f..e4e9bc07bd 100644 --- 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 @@ -56,7 +56,7 @@ class RustMediaPreviewService( private fun RustMediaPreviewConfig.into(): MediaPreviewConfig { return MediaPreviewConfig( - mediaPreviewValue = this@into.mediaPreviews.into(), + mediaPreviewValue = mediaPreviews.into(), hideInviteAvatar = inviteAvatars == InviteAvatars.OFF ) } From 65be166b717ba9a98dbca0739179f253d6a683b3 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 1 Jul 2025 12:58:24 +0200 Subject: [PATCH 119/156] change (media preview config) : fix warning on deprecated method --- .../libraries/preferences/test/InMemoryAppPreferencesStore.kt | 4 ++++ 1 file changed, 4 insertions(+) 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 b474ec63ea..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 @@ -55,18 +55,22 @@ class InMemoryAppPreferencesStore( return theme } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") override fun getHideInviteAvatarsFlow(): Flow { return hideInviteAvatars } + @Deprecated("Use MediaPreviewService instead. Kept only for migration.") 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 } From 03d6f59623106c4ff9c47504488da0ea6605f0ec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jul 2025 15:35:25 +0200 Subject: [PATCH 120/156] SDK 25.7.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 34fdbbcb9f..8b0a9ca619 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -172,7 +172,7 @@ 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.25" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.7.1" 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" } From 3db4492944190491682eec6733609a5a917a6dff Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jul 2025 15:36:31 +0200 Subject: [PATCH 121/156] Remove dead code. --- .../impl/call/ElementWellKnownParser.kt | 28 ------------------- .../impl/call/FakeElementWellKnownParser.kt | 18 ------------ 2 files changed, 46 deletions(-) delete mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/call/ElementWellKnownParser.kt delete mode 100644 libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/call/FakeElementWellKnownParser.kt 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/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 - } -} From 94d528dae85a3e69948582cb79089b2b56181b81 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jul 2025 15:59:11 +0200 Subject: [PATCH 122/156] Suppress deprecation issue. --- .../android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt | 2 ++ 1 file changed, 2 insertions(+) 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 index e6a17b440f..459abc64d4 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/MediaPreviewConfigMigrationTest.kt @@ -5,6 +5,8 @@ * 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 From 53a694bc696c38cc54cb97a8ff9579f624f2d262 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Jul 2025 15:59:27 +0200 Subject: [PATCH 123/156] Fix compilation issue. --- .../matrix/impl/fixtures/factories/NotificationItem.kt | 2 ++ 1 file changed, 2 insertions(+) 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 797958e151..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,6 +48,7 @@ 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, @@ -56,6 +57,7 @@ fun aRustNotificationRoomInfo( displayName = displayName, avatarUrl = avatarUrl, canonicalAlias = canonicalAlias, + topic = topic, joinedMembersCount = joinedMembersCount, isEncrypted = isEncrypted, isDirect = isDirect, From 68b54af2b5838551160eae7cd47b87faf38a643c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:25:07 +0000 Subject: [PATCH 124/156] Update haze to v1.6.6 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f128a5b393..b5898a8c14 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,7 +44,7 @@ appyx = "1.7.1" sqldelight = "2.1.0" wysiwyg = "2.38.4" telephoto = "0.16.0" -haze = "1.6.4" +haze = "1.6.6" # Dependency analysis dependencyAnalysis = "2.19.0" From 6840dd4be7b772e12291ab943f245c76e4b3b93c Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 1 Jul 2025 18:44:53 +0200 Subject: [PATCH 125/156] deps (lint) : update lint version to align with android gradle plugin --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c9789f9dff..eafefba3e6 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.11.0 # Enable test fixture for all modules by default android.experimental.enableTestFixtures=true From 3e02350b1d58a3c76f84876730497c75e9c07795 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Jul 2025 08:31:52 +0000 Subject: [PATCH 126/156] Update kotlin --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3668aa2938..ee087f202e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,9 +4,9 @@ [versions] # Project android_gradle_plugin = "8.11.0" -kotlin = "2.1.21" +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 @@ -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-0.6.x-compat" +serialization_json = "1.9.0" #other detekt = "1.23.8" From d7405c6c03e9d23b3d9549e66af29968db0793cb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:54:06 +0200 Subject: [PATCH 127/156] Update dependency io.element.android:element-call-embedded to v0.13.0 (#4969) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3668aa2938..65d97c4f6f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -213,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.0" # Auto services google_autoservice = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } From d15c190185008297bab930cbc6aef3f780b33981 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:01:20 +0200 Subject: [PATCH 128/156] Fix warning about freeCompilerArgs deprecation. --- libraries/maplibre-compose/build.gradle.kts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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() + } } } From 0a2a6361b60b96e51df64c562e4c303e0054c9cf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:18:40 +0200 Subject: [PATCH 129/156] Fix compilation warning for annotations --- build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) 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") } } } From 1abe101b06e2fdd562d6739f438c700039aec10b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:21:15 +0200 Subject: [PATCH 130/156] Fix compilation error. toEpochDays() now returns a Long. --- .../android/libraries/dateformatter/impl/DateFormatterDay.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 { From a0cd5c8cf44710d0e2f5b2b2cf7b9e6e8af10c64 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:22:31 +0200 Subject: [PATCH 131/156] Kotlin compiler 2.2.0 --- .idea/kotlinc.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From a810b38bd43931fe099bec8c28e88ff6843d4e30 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:23:06 +0200 Subject: [PATCH 132/156] ExperimentalTime OptIn is now needed. --- .../android/libraries/dateformatter/impl/DateFormatters.kt | 2 ++ 1 file changed, 2 insertions(+) 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..3728749317 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 @@ -20,6 +20,7 @@ import java.time.Period import java.util.Locale import javax.inject.Inject import kotlin.math.absoluteValue +import kotlin.time.ExperimentalTime @SingleIn(AppScope::class) class DateFormatters @Inject constructor( @@ -67,6 +68,7 @@ class DateFormatters @Inject constructor( return dateTimeFormatters.dateWithFullFormatNoYearFormatter.format(localDateTime.toJavaLocalDateTime()) } + @OptIn(ExperimentalTime::class) internal fun formatDate( dateToFormat: LocalDateTime, currentDate: LocalDateTime, From 7f98e5c48a667a4d13d59f11ed57cd73da2d9926 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:29:17 +0200 Subject: [PATCH 133/156] Fix deprecation and add OptIn on Clock and Instant --- .../android/libraries/dateformatter/impl/DateFormatters.kt | 3 ++- .../libraries/dateformatter/impl/LocalDateTimeProvider.kt | 6 ++++-- .../libraries/dateformatter/impl/di/DateFormatterModule.kt | 4 +++- .../impl/previews/DateFormatterModeViewPreview.kt | 5 ++++- .../libraries/dateformatter/impl/previews/Factory.kt | 4 +++- .../libraries/dateformatter/impl/previews/PreviewClock.kt | 6 ++++-- .../dateformatter/impl/DefaultDateFormatterFrTest.kt | 4 +++- .../dateformatter/impl/DefaultDateFormatterTest.kt | 4 +++- .../element/android/libraries/dateformatter/impl/Factory.kt | 4 +++- .../android/libraries/dateformatter/impl/FakeClock.kt | 6 ++++-- 10 files changed, 33 insertions(+), 13 deletions(-) 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 3728749317..91ce539cee 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,8 +19,10 @@ import java.time.Period import java.util.Locale import javax.inject.Inject import kotlin.math.absoluteValue +import kotlin.time.Clock import kotlin.time.ExperimentalTime +@OptIn(ExperimentalTime::class) @SingleIn(AppScope::class) class DateFormatters @Inject constructor( localeChangeObserver: LocaleChangeObserver, 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..175da2ef9c 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,12 +7,14 @@ 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.ExperimentalTime +import kotlin.time.Instant +@OptIn(ExperimentalTime::class) class LocalDateTimeProvider @Inject constructor( private val clock: Clock, private val timezoneProvider: TimezoneProvider, 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..8decb527e2 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,10 +12,12 @@ 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 +import kotlin.time.ExperimentalTime +@OptIn(ExperimentalTime::class) @Module @ContributesTo(AppScope::class) object DateFormatterModule { 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..8b34e51e3f 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 @@ -5,6 +5,8 @@ * Please see LICENSE files in the repository root for full details. */ +@file:OptIn(ExperimentalTime::class) + package io.element.android.libraries.dateformatter.impl.previews import androidx.compose.foundation.layout.Column @@ -28,7 +30,8 @@ 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.ExperimentalTime +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..23f3d8733a 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,13 +16,15 @@ 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.ExperimentalTime +import kotlin.time.Instant /** * Create DefaultDateFormatter and set current time to the provided date. */ +@OptIn(ExperimentalTime::class) fun createFormatter( context: Context, currentDate: String, 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..5b9c26287e 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,9 +7,11 @@ package io.element.android.libraries.dateformatter.impl.previews -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant +import kotlin.time.Clock +import kotlin.time.ExperimentalTime +import kotlin.time.Instant +@OptIn(ExperimentalTime::class) class PreviewClock : Clock { private var instant: Instant = Instant.fromEpochMilliseconds(0) 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 7300b0d4ef..4955dadcaf 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 @@ -11,11 +11,13 @@ 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.ExperimentalTime +import kotlin.time.Instant +@OptIn(ExperimentalTime::class) @RunWith(AndroidJUnit4::class) @Config(qualifiers = "fr", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterFrTest { 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 25cda55654..c059675907 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 @@ -11,11 +11,13 @@ 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.ExperimentalTime +import kotlin.time.Instant +@OptIn(ExperimentalTime::class) @RunWith(AndroidJUnit4::class) @Config(qualifiers = "en", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterTest { 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..d3fd71a4b4 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,13 +8,15 @@ 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.ExperimentalTime +import kotlin.time.Instant /** * Create DefaultDateFormatter and set current time to the provided date. */ +@OptIn(ExperimentalTime::class) fun createFormatter(currentDate: String): DefaultDateFormatter { val clock = FakeClock().apply { givenInstant(Instant.parse(currentDate)) } val localDateTimeProvider = LocalDateTimeProvider(clock) { TimeZone.UTC } 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..fb26bda5bb 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,9 +7,11 @@ package io.element.android.libraries.dateformatter.impl -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant +import kotlin.time.Clock +import kotlin.time.ExperimentalTime +import kotlin.time.Instant +@OptIn(ExperimentalTime::class) class FakeClock : Clock { private var instant: Instant = Instant.fromEpochMilliseconds(0) From ffa371975887f38a3aca65a3bd9b8b22b0446018 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 12:32:08 +0200 Subject: [PATCH 134/156] Upgrade lint version to 8.12.0-alpha07 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index eafefba3e6..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 +android.experimental.lint.version=8.12.0-alpha07 # Enable test fixture for all modules by default android.experimental.enableTestFixtures=true From 9c88e806defd3989e20ca92c2f335185812b4010 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 13:23:17 +0200 Subject: [PATCH 135/156] Improve test coverage of SendActionState --- .../impl/attachments/SendActionStateTest.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt 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) + } +} From ab51ddda1c3e928680af1f10f163259274f10e2a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 13:29:22 +0200 Subject: [PATCH 136/156] Improve test coverage of PinnedMessagesBannerState --- .../features/messages/impl/MessagesView.kt | 2 +- .../banner/PinnedMessagesBannerState.kt | 39 +++++++++---------- .../pinned/banner/PinnedMessagesBannerView.kt | 2 +- .../PinnedMessagesBannerPresenterTest.kt | 5 ++- 4 files changed, 23 insertions(+), 25 deletions(-) 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 debea82cf0..dff12448bf 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 @@ -391,7 +391,7 @@ private fun MessagesViewContent( Box { val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior( - pinnedMessagesCount = state.pinnedMessagesBannerState.pinnedMessagesCount(), + pinnedMessagesCount = (state.pinnedMessagesBannerState as? PinnedMessagesBannerState.Visible)?.pinnedMessagesCount() ?: 0, ) TimelineView( state = state.timelineState, 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..244ade3a5a 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,30 @@ 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 + 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 +41,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/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) From 55e16fae6390b551db514d2c637d77e9b6fe0c49 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 13:45:03 +0200 Subject: [PATCH 137/156] It seems that we can use datetime 0.7.0 Doc is at https://github.com/Kotlin/kotlinx-datetime?tab=readme-ov-file#deprecation-of-instant --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ee087f202e..74ae0a6d53 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,7 +33,7 @@ accompanist = "0.37.3" test_core = "1.6.1" # Jetbrain -datetime = "0.7.0-0.6.x-compat" +datetime = "0.7.0" serialization_json = "1.9.0" #other From 0029d13417a138345c31cc316f21a907af001f5d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 14:28:13 +0200 Subject: [PATCH 138/156] `Visible` must be annotated with `Immutable` --- .../messages/impl/pinned/banner/PinnedMessagesBannerState.kt | 1 + 1 file changed, 1 insertion(+) 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 244ade3a5a..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 @@ -16,6 +16,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @Immutable sealed interface PinnedMessagesBannerState { data object Hidden : PinnedMessagesBannerState + @Immutable sealed interface Visible : PinnedMessagesBannerState { fun pinnedMessagesCount() = when (this) { is Loading -> expectedPinnedMessagesCount From 8053200a095322c30906ad94769379129a7c86fa Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 14:43:01 +0200 Subject: [PATCH 139/156] Compose 2025.06.01 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 65d97c4f6f..eaeb30f2f1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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 From 91864776785be0eab33b22895903b7ec09aa41f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Jul 2025 16:58:39 +0200 Subject: [PATCH 140/156] Update dependency org.matrix.rustcomponents:sdk-android to v25.7.2 (#4967) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 65d97c4f6f..97e51f0b38 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -173,7 +173,7 @@ 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.7.1" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.7.2" 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" } From 182909dd4a1de81eb44f443a11f6ab7c44fed320 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Jul 2025 18:00:25 +0200 Subject: [PATCH 141/156] OptIn to ExperimentalTime for the whole module. --- libraries/dateformatter/impl/build.gradle.kts | 8 ++++++++ .../libraries/dateformatter/impl/DateFormatters.kt | 3 --- .../libraries/dateformatter/impl/LocalDateTimeProvider.kt | 2 -- .../dateformatter/impl/di/DateFormatterModule.kt | 2 -- .../impl/previews/DateFormatterModeViewPreview.kt | 3 --- .../libraries/dateformatter/impl/previews/Factory.kt | 2 -- .../libraries/dateformatter/impl/previews/PreviewClock.kt | 2 -- .../dateformatter/impl/DefaultDateFormatterFrTest.kt | 2 -- .../dateformatter/impl/DefaultDateFormatterTest.kt | 2 -- .../android/libraries/dateformatter/impl/Factory.kt | 2 -- .../android/libraries/dateformatter/impl/FakeClock.kt | 2 -- 11 files changed, 8 insertions(+), 22 deletions(-) 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/DateFormatters.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt index 91ce539cee..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 @@ -20,9 +20,7 @@ import java.util.Locale import javax.inject.Inject import kotlin.math.absoluteValue import kotlin.time.Clock -import kotlin.time.ExperimentalTime -@OptIn(ExperimentalTime::class) @SingleIn(AppScope::class) class DateFormatters @Inject constructor( localeChangeObserver: LocaleChangeObserver, @@ -69,7 +67,6 @@ class DateFormatters @Inject constructor( return dateTimeFormatters.dateWithFullFormatNoYearFormatter.format(localDateTime.toJavaLocalDateTime()) } - @OptIn(ExperimentalTime::class) internal fun formatDate( dateToFormat: LocalDateTime, currentDate: LocalDateTime, 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 175da2ef9c..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 @@ -11,10 +11,8 @@ import kotlinx.datetime.LocalDateTime import kotlinx.datetime.toLocalDateTime import javax.inject.Inject import kotlin.time.Clock -import kotlin.time.ExperimentalTime import kotlin.time.Instant -@OptIn(ExperimentalTime::class) class LocalDateTimeProvider @Inject constructor( private val clock: Clock, private val timezoneProvider: TimezoneProvider, 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 8decb527e2..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 @@ -15,9 +15,7 @@ import io.element.android.libraries.di.AppScope import kotlinx.datetime.TimeZone import java.util.Locale import kotlin.time.Clock -import kotlin.time.ExperimentalTime -@OptIn(ExperimentalTime::class) @Module @ContributesTo(AppScope::class) object DateFormatterModule { 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 8b34e51e3f..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 @@ -5,8 +5,6 @@ * Please see LICENSE files in the repository root for full details. */ -@file:OptIn(ExperimentalTime::class) - package io.element.android.libraries.dateformatter.impl.previews import androidx.compose.foundation.layout.Column @@ -30,7 +28,6 @@ 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 kotlin.time.ExperimentalTime import kotlin.time.Instant @Preview 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 23f3d8733a..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 @@ -18,13 +18,11 @@ import io.element.android.libraries.dateformatter.impl.DefaultDateFormatterDay import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider import kotlinx.datetime.TimeZone import java.util.Locale -import kotlin.time.ExperimentalTime import kotlin.time.Instant /** * Create DefaultDateFormatter and set current time to the provided date. */ -@OptIn(ExperimentalTime::class) fun createFormatter( context: Context, currentDate: String, 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 5b9c26287e..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 @@ -8,10 +8,8 @@ package io.element.android.libraries.dateformatter.impl.previews import kotlin.time.Clock -import kotlin.time.ExperimentalTime import kotlin.time.Instant -@OptIn(ExperimentalTime::class) class PreviewClock : Clock { private var instant: Instant = Instant.fromEpochMilliseconds(0) 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 4955dadcaf..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 @@ -14,10 +14,8 @@ import io.element.android.libraries.dateformatter.api.DateFormatterMode import org.junit.Test import org.junit.runner.RunWith import org.robolectric.annotation.Config -import kotlin.time.ExperimentalTime import kotlin.time.Instant -@OptIn(ExperimentalTime::class) @RunWith(AndroidJUnit4::class) @Config(qualifiers = "fr", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterFrTest { 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 c059675907..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 @@ -14,10 +14,8 @@ import io.element.android.libraries.dateformatter.api.DateFormatterMode import org.junit.Test import org.junit.runner.RunWith import org.robolectric.annotation.Config -import kotlin.time.ExperimentalTime import kotlin.time.Instant -@OptIn(ExperimentalTime::class) @RunWith(AndroidJUnit4::class) @Config(qualifiers = "en", sdk = [Build.VERSION_CODES.TIRAMISU]) class DefaultDateFormatterTest { 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 d3fd71a4b4..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 @@ -10,13 +10,11 @@ package io.element.android.libraries.dateformatter.impl import io.element.android.tests.testutils.InstrumentationStringProvider import kotlinx.datetime.TimeZone import java.util.Locale -import kotlin.time.ExperimentalTime import kotlin.time.Instant /** * Create DefaultDateFormatter and set current time to the provided date. */ -@OptIn(ExperimentalTime::class) fun createFormatter(currentDate: String): DefaultDateFormatter { val clock = FakeClock().apply { givenInstant(Instant.parse(currentDate)) } val localDateTimeProvider = LocalDateTimeProvider(clock) { TimeZone.UTC } 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 fb26bda5bb..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 @@ -8,10 +8,8 @@ package io.element.android.libraries.dateformatter.impl import kotlin.time.Clock -import kotlin.time.ExperimentalTime import kotlin.time.Instant -@OptIn(ExperimentalTime::class) class FakeClock : Clock { private var instant: Instant = Instant.fromEpochMilliseconds(0) From e608ac09939f89d92ccd26b2211fbc9ccec0f106 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 3 Jul 2025 17:19:43 +0200 Subject: [PATCH 142/156] [a11y] Ensure that the focus is not lost when the send button state change. --- .../libraries/textcomposer/TextComposer.kt | 63 +++++++++++++++++-- .../textcomposer/components/SendButton.kt | 9 +-- .../components/VoiceMessageRecorderButton.kt | 8 +-- .../src/main/res/values/localazy.xml | 4 +- 4 files changed, 67 insertions(+), 17 deletions(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 47216d7e88..91e36de12c 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -39,7 +40,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.SemanticsPropertyReceiver +import androidx.compose.ui.semantics.clearAndSetSemantics +import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.hideFromAccessibility +import androidx.compose.ui.semantics.onClick import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter @@ -280,6 +285,13 @@ fun TextComposer( else -> sendButton } + val endButtonA11y = endButtonA11y( + composerMode = composerMode, + voiceMessageState = voiceMessageState, + enableVoiceMessages = enableVoiceMessages, + canSendMessage = canSendMessage, + ) + val voiceRecording = @Composable { when (voiceMessageState) { is VoiceMessageState.Preview -> @@ -323,6 +335,7 @@ fun TextComposer( ) }, textFormatting = textFormattingOptions, + endButtonA11y = endButtonA11y, sendButton = sendButton, ) } else { @@ -334,6 +347,7 @@ fun TextComposer( composerOptionsButton = composerOptionsButton, textInput = textInput, endButton = sendOrRecordButton, + endButtonA11y = endButtonA11y, voiceRecording = voiceRecording, voiceDeleteButton = voiceDeleteButton, ) @@ -359,6 +373,40 @@ fun TextComposer( } } +@ReadOnlyComposable +@Composable +private fun endButtonA11y( + composerMode: MessageComposerMode, + voiceMessageState: VoiceMessageState, + enableVoiceMessages: Boolean, + canSendMessage: Boolean, +): (SemanticsPropertyReceiver) -> Unit { + val a11ySendButtonDescription = stringResource( + id = when { + enableVoiceMessages && !canSendMessage -> + when (voiceMessageState) { + VoiceMessageState.Idle, + is VoiceMessageState.Recording -> if (voiceMessageState is VoiceMessageState.Recording) { + CommonStrings.a11y_voice_message_stop_recording + } else { + CommonStrings.a11y_voice_message_record + } + is VoiceMessageState.Preview -> when (voiceMessageState.isSending) { + true -> CommonStrings.common_sending + false -> CommonStrings.action_send_voice_message + } + } + composerMode.isEditing -> CommonStrings.action_send_edited_message + else -> CommonStrings.action_send_message + } + ) + val endButtonA11y: (SemanticsPropertyReceiver.() -> Unit) = { + contentDescription = a11ySendButtonDescription + onClick(null, null) + } + return endButtonA11y +} + @Composable private fun StandardLayout( voiceMessageState: VoiceMessageState, @@ -369,6 +417,7 @@ private fun StandardLayout( voiceRecording: @Composable () -> Unit, voiceDeleteButton: @Composable () -> Unit, endButton: @Composable () -> Unit, + endButtonA11y: (SemanticsPropertyReceiver.() -> Unit), modifier: Modifier = Modifier, ) { Column(modifier = modifier) { @@ -416,7 +465,8 @@ private fun StandardLayout( Box( Modifier .padding(bottom = 5.dp, top = 5.dp, end = 6.dp, start = 6.dp) - .size(48.dp), + .size(48.dp) + .clearAndSetSemantics(endButtonA11y), contentAlignment = Alignment.Center, ) { endButton() @@ -454,6 +504,7 @@ private fun TextFormattingLayout( dismissTextFormattingButton: @Composable () -> Unit, textFormatting: @Composable () -> Unit, sendButton: @Composable () -> Unit, + endButtonA11y: (SemanticsPropertyReceiver.() -> Unit), modifier: Modifier = Modifier ) { Column( @@ -485,10 +536,12 @@ private fun TextFormattingLayout( textFormatting() } Box( - modifier = Modifier.padding( - start = 14.dp, - end = 6.dp - ) + modifier = Modifier + .padding( + start = 14.dp, + end = 6.dp, + ) + .clearAndSetSemantics(endButtonA11y) ) { sendButton() } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt index aeeda86269..55e4350fb2 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt @@ -21,7 +21,6 @@ import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.LinearGradientShader import androidx.compose.ui.graphics.ShaderBrush -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons @@ -32,7 +31,6 @@ import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import io.element.android.libraries.textcomposer.model.MessageComposerMode -import io.element.android.libraries.ui.strings.CommonStrings /** * Send button for the message composer. @@ -60,10 +58,6 @@ internal fun SendButton( composerMode.isEditing -> 0.dp else -> 2.dp } - val contentDescription = when { - composerMode.isEditing -> stringResource(CommonStrings.action_edit) - else -> stringResource(CommonStrings.action_send) - } Box( modifier = Modifier .clip(CircleShape) @@ -81,7 +75,8 @@ internal fun SendButton( .padding(start = iconStartPadding) .align(Alignment.Center), imageVector = iconVector, - contentDescription = contentDescription, + // Note: accessibility is managed in TextComposer. + contentDescription = null, tint = if (canSendMessage) { if (ElementTheme.colors.isLight) { ElementTheme.colors.iconOnSolidPrimary diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecorderButton.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecorderButton.kt index 03965566e5..3a92dfbeb0 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecorderButton.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/VoiceMessageRecorderButton.kt @@ -16,7 +16,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons @@ -26,7 +25,6 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.utils.CommonDrawables import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent -import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun VoiceMessageRecorderButton( @@ -70,7 +68,8 @@ private fun StartButton( Icon( modifier = Modifier.size(24.dp), imageVector = CompoundIcons.MicOn(), - contentDescription = stringResource(CommonStrings.a11y_voice_message_record), + // Note: accessibility is managed in TextComposer. + contentDescription = null, tint = ElementTheme.colors.iconSecondary, ) } @@ -95,7 +94,8 @@ private fun StopButton( Icon( modifier = Modifier.size(24.dp), resourceId = CommonDrawables.ic_stop, - contentDescription = stringResource(CommonStrings.a11y_voice_message_stop_recording), + // Note: accessibility is managed in TextComposer. + contentDescription = null, tint = ElementTheme.colors.iconOnSolidPrimary, ) } diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 41e87f83c5..f57bcef62d 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -12,7 +12,7 @@ "Jump to bottom" "Mentions only" "Muted" - "Other user avatar" + "Other user\'s avatar" "Page %1$d" "Pause" "Voice message, duration: %1$s, current position: %2$s" @@ -125,7 +125,9 @@ "Save" "Search" "Send" + "Send edited message" "Send message" + "Send voice message" "Share" "Share link" "Show" From 76cefec8c8d2477ff3865242095b2975ee9c5835 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 3 Jul 2025 17:47:37 +0200 Subject: [PATCH 143/156] Update dependency org.matrix.rustcomponents:sdk-android to v25.7.3 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 842c033c83..4ef6ade0fa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -173,7 +173,7 @@ 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.7.2" +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" } From db3c5df63c5fb70ab15b9a510c41b0b611d1671b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:48:51 +0000 Subject: [PATCH 144/156] Update dependency io.element.android:element-call-embedded to v0.13.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 842c033c83..c795cad155 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -213,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.13.0" +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" } From ef8d57dff874cd6255d854545a0a37899af55691 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 3 Jul 2025 17:47:17 +0200 Subject: [PATCH 145/156] [a11y] Use built-in onClickLabel parameter. --- .../impl/actionlist/ActionListView.kt | 13 ++-------- .../components/MessagesReactionButton.kt | 24 +++++-------------- .../roomdetails/impl/RoomDetailsView.kt | 10 ++++---- .../shared/UserProfileHeaderSection.kt | 10 ++++---- .../components/avatar/DmAvatars.kt | 14 ++++++----- .../designsystem/modifiers/Clickable.kt | 17 ------------- 6 files changed, 28 insertions(+), 60 deletions(-) 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 aec3b8219e..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 @@ -454,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/timeline/components/MessagesReactionButton.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt index b0026fb449..e80367daee 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 @@ -85,15 +84,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 +97,12 @@ 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 + ) + }, onLongClick = onLongClick ) // Inner border, to highlight when selected @@ -115,14 +111,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/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 c60a78dd22..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 @@ -58,7 +58,6 @@ import io.element.android.libraries.designsystem.components.button.MainActionBut 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.PreferenceSwitch -import io.element.android.libraries.designsystem.modifiers.a11yClickLabel import io.element.android.libraries.designsystem.modifiers.niceClickable import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight @@ -401,7 +400,6 @@ private fun RoomHeaderSection( .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - val actionView = stringResource(CommonStrings.action_view) Avatar( avatarData = AvatarData(roomId.value, roomName, avatarUrl, AvatarSize.RoomHeader), avatarType = AvatarType.Room( @@ -412,9 +410,13 @@ private fun RoomHeaderSection( ), 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) - .a11yClickLabel(avatarUrl?.let { actionView }) ) TitleAndSubtitle( title = roomName, 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 47bb9cbdc5..c4de75e40b 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 @@ -31,7 +31,6 @@ 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.a11yClickLabel 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,16 +60,19 @@ fun UserProfileHeaderSection( .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - val actionView = stringResource(CommonStrings.action_view) 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) - .a11yClickLabel(avatarUrl?.let { actionView }) ) Spacer(modifier = Modifier.height(24.dp)) if (userName != null) { 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 56071de747..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 @@ -26,7 +26,6 @@ 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.modifiers.a11yClickLabel import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.text.toPx @@ -52,7 +51,6 @@ fun DmAvatars( val boxSizePx = boxSize.toPx() val otherAvatarRadius = otherUserAvatarData.size.dp.toPx() / 2 val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl - val actionView = stringResource(CommonStrings.action_view) Box( modifier = modifier.size(boxSize), ) { @@ -84,10 +82,12 @@ fun DmAvatars( ) } .clip(CircleShape) - .clickable(enabled = userAvatarData.url != null) { + .clickable( + enabled = userAvatarData.url != null, + onClickLabel = stringResource(CommonStrings.action_view), + ) { userAvatarData.url?.let { openAvatarPreview(it) } } - .a11yClickLabel(userAvatarData.url?.let { actionView }) ) // Draw other user avatar Avatar( @@ -97,11 +97,13 @@ fun DmAvatars( 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) - .a11yClickLabel(otherUserAvatarData.url?.let { actionView }) ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt index 753ad952a0..5789a4525d 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/modifiers/Clickable.kt @@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.semantics.onClick -import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = this.then( @@ -31,18 +29,3 @@ fun Modifier.niceClickable( .clickable { onClick() } .padding(horizontal = 4.dp) } - -fun Modifier.a11yClickLabel( - label: String?, -): Modifier = then( - if (label != null) { - Modifier.semantics { - onClick( - label = label, - action = null, - ) - } - } else { - Modifier - } -) From 5d81a0264bf5ca82c1df0cb2922cbffe5ffbc469 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 09:33:56 +0200 Subject: [PATCH 146/156] [a11y] Add long click label --- .../home/impl/components/RoomSummaryRow.kt | 1 + .../components/MessageStateEventContainer.kt | 3 +++ .../components/MessagesReactionButton.kt | 2 ++ .../components/TimelineItemCallNotifyView.kt | 7 ++++++- .../impl/timeline/components/TimelineItemRow.kt | 17 +++++++++-------- .../components/event/TimelineItemStickerView.kt | 12 +++++++++++- .../impl/gallery/ui/AudioItemView.kt | 8 +++++++- .../mediaviewer/impl/gallery/ui/FileItemView.kt | 8 +++++++- .../impl/gallery/ui/ImageItemView.kt | 8 +++++++- .../impl/gallery/ui/VideoItemView.kt | 8 +++++++- .../impl/gallery/ui/VoiceItemView.kt | 6 +++++- .../ui-strings/src/main/res/values/localazy.xml | 1 + 12 files changed, 66 insertions(+), 15 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt index 0baa0e66d9..e5a85a7442 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt @@ -173,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() } ) 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 e80367daee..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 @@ -51,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 @@ -103,6 +104,7 @@ fun MessagesReactionButton( userAlreadyReacted = content.isHighlighted ) }, + onLongClickLabel = stringResource(CommonStrings.action_open_context_menu), onLongClick = onLongClick ) // Inner border, to highlight when selected 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 e4aee2febd..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 @@ -51,7 +51,12 @@ 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, 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..6cd369d84e 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,17 @@ 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/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/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/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index f57bcef62d..270e862300 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -101,6 +101,7 @@ "No" "Not now" "OK" + "Open context menu" "Settings" "Open with" "Pin" From f3eb0e69ccb4e7ce3d9804600b2b0bb89f32c242 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 09:43:30 +0200 Subject: [PATCH 147/156] Fix wrong TopAppBar usage --- .../SearchAccountProviderView.kt | 2 +- .../android/tests/konsist/KonsistImportTest.kt | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) 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/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" + } + } } From 70aa31df0050e4329e143b2a8e29309081d64c85 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 10:32:51 +0200 Subject: [PATCH 148/156] [a11y] Ensure that heading() is applied to all screen titles. --- .../impl/addpeople/AddPeopleView.kt | 10 +-- .../impl/configureroom/ConfigureRoomView.kt | 8 +-- .../impl/root/CreateRoomRootView.kt | 8 +-- .../logout/impl/AccountDeactivationView.kt | 8 +-- .../home/impl/components/RoomListTopBar.kt | 9 ++- .../declineandblock/DeclineAndBlockView.kt | 9 +-- .../features/joinroom/impl/JoinRoomView.kt | 8 ++- .../impl/list/KnockRequestsListView.kt | 8 +-- .../impl/details/DependenciesDetailsView.kt | 3 +- .../impl/list/DependencyLicensesListView.kt | 2 +- .../location/impl/send/SendLocationView.kt | 9 +-- .../location/impl/show/ShowLocationView.kt | 9 +-- .../createaccount/CreateAccountView.kt | 8 +-- .../features/messages/impl/MessagesView.kt | 13 +++- .../pinned/list/PinnedMessagesListView.kt | 9 +-- .../messages/impl/report/ReportMessageView.kt | 8 +-- .../impl/timeline/debug/EventDebugInfoView.kt | 8 +-- .../poll/impl/create/CreatePollView.kt | 13 +--- .../poll/impl/history/PollHistoryView.kt | 8 +-- .../impl/blockedusers/BlockedUsersView.kt | 10 +-- .../user/editprofile/EditUserProfileView.kt | 8 +-- .../reportroom/impl/ReportRoomView.kt | 31 ++++---- .../impl/edit/RoomDetailsEditView.kt | 10 +-- .../impl/invite/RoomInviteMembersView.kt | 8 +-- .../impl/members/RoomMemberListView.kt | 8 +-- .../RoomNotificationSettingsView.kt | 9 +-- ...UserDefinedRoomNotificationSettingsView.kt | 6 +- .../changeroles/ChangeRolesView.kt | 15 ++-- .../permissions/ChangeRoomPermissionsView.kt | 4 +- .../SecurityAndPrivacyView.kt | 8 +-- .../editroomaddress/EditRoomAddressView.kt | 10 +-- .../impl/root/RoomDirectoryView.kt | 8 +-- .../shared/UserProfileHeaderSection.kt | 8 ++- .../viewfolder/impl/file/ViewFileView.kt | 10 +-- .../viewfolder/impl/folder/ViewFolderView.kt | 8 +-- .../molecules/IconTitleSubtitleMolecule.kt | 7 +- .../components/preferences/PreferencePage.kt | 5 ++ .../theme/components/TopAppBar.kt | 72 +++++++++++++++++++ .../impl/gallery/MediaGalleryView.kt | 5 ++ .../impl/viewer/MediaViewerView.kt | 8 +++ .../roomselect/impl/RoomSelectView.kt | 12 +--- .../impl/history/PushHistoryView.kt | 11 +-- 42 files changed, 180 insertions(+), 259 deletions(-) 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 f68f434707..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 @@ -48,7 +48,6 @@ 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 @@ -189,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( 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/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/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt index ae1d708933..8071dead3d 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListTopBar.kt @@ -34,6 +34,8 @@ 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 @@ -197,7 +199,12 @@ private fun DefaultRoomListTopBar( scrolledContainerColor = Color.Transparent, ), title = { - Text(text = title) + Text( + modifier = Modifier.semantics { + heading() + }, + text = title, + ) }, navigationIcon = { NavigationIcon( 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/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 7f51773c45..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 @@ -577,7 +579,11 @@ private fun JoinRoomTopBar( 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/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 7e79203f31..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 @@ -62,7 +62,6 @@ import io.element.android.libraries.designsystem.components.dialogs.Confirmation 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 @@ -479,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/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/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/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 dff12448bf..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 @@ -39,6 +39,8 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.RectangleShape 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 @@ -184,7 +186,10 @@ fun MessagesView( val expandableState = rememberExpandableBottomSheetLayoutState() ExpandableBottomSheetLayout( - modifier = modifier.fillMaxSize().imePadding().systemBarsPadding(), + modifier = modifier + .fillMaxSize() + .imePadding() + .systemBarsPadding(), content = { Scaffold( contentWindowInsets = WindowInsets.statusBars, @@ -556,7 +561,11 @@ private fun RoomAvatarAndNameRow( ), ) 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/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/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/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/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/user/editprofile/EditUserProfileView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt index dc03b593c7..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 @@ -37,7 +37,6 @@ 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 @@ -68,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( 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/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 b77ea44001..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,7 +29,6 @@ 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 @@ -39,9 +38,7 @@ 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 @@ -69,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( 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/changeroles/ChangeRolesView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/changeroles/ChangeRolesView.kt index 2b1ee08f66..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 @@ -56,7 +56,6 @@ import io.element.android.libraries.designsystem.components.dialogs.Confirmation 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 @@ -96,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) }) 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 d8eb707927..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 @@ -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) }) }, 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/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 5c6383ba3b..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 @@ -44,7 +44,6 @@ 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 @@ -91,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), ) } 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 c4de75e40b..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 @@ -77,7 +79,11 @@ fun UserProfileHeaderSection( 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/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/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/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/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/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/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/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt index f9a95ac4b8..7d90629a50 100644 --- a/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt +++ b/libraries/roomselect/impl/src/main/kotlin/io/element/android/libraries/roomselect/impl/RoomSelectView.kt @@ -38,7 +38,6 @@ 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.HorizontalDivider import io.element.android.libraries.designsystem.theme.components.RadioButton import io.element.android.libraries.designsystem.theme.components.Scaffold @@ -95,14 +94,9 @@ fun RoomSelectView( modifier = modifier, topBar = { TopAppBar( - title = { - Text( - text = when (state.mode) { - RoomSelectMode.Forward -> stringResource(CommonStrings.common_forward_message) - RoomSelectMode.Share -> stringResource(CommonStrings.common_send_to) - }, - style = ElementTheme.typography.aliasScreenTitle - ) + titleStr = when (state.mode) { + RoomSelectMode.Forward -> stringResource(CommonStrings.common_forward_message) + RoomSelectMode.Share -> stringResource(CommonStrings.common_send_to) }, navigationIcon = { BackButton(onClick = { onBackButton(state) }) diff --git a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt index 36340518cb..2cd2e6dc20 100644 --- a/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt +++ b/libraries/troubleshoot/impl/src/main/kotlin/io/element/android/libraries/troubleshoot/impl/history/PushHistoryView.kt @@ -30,7 +30,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier 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 import io.element.android.compound.theme.ElementTheme @@ -41,7 +40,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.DropdownMenu import io.element.android.libraries.designsystem.theme.components.DropdownMenuItem import io.element.android.libraries.designsystem.theme.components.Icon @@ -78,14 +76,7 @@ fun PushHistoryView( navigationIcon = { BackButton(onClick = onBackClick) }, - title = { - Text( - text = stringResource(R.string.screen_push_history_title), - style = ElementTheme.typography.aliasScreenTitle, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - }, + titleStr = stringResource(R.string.screen_push_history_title), actions = { IconButton(onClick = { showMenu = !showMenu }) { Icon( From 2ba54105d2be83e45bd44880d08dbe108c045c18 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 12:16:05 +0200 Subject: [PATCH 149/156] [a11y] Add heading() to date separators. --- .../components/virtual/TimelineItemDaySeparatorView.kt | 6 ++++++ .../libraries/mediaviewer/impl/gallery/ui/DateItemView.kt | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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..f8581bb637 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/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, From 0b3def201258ad699dffddd0e38718afa5211df4 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Fri, 4 Jul 2025 10:28:37 +0000 Subject: [PATCH 150/156] Update screenshots --- ...licenses.impl.details_DependenciesDetailsView_Day_0_en.png | 4 ++-- ...censes.impl.details_DependenciesDetailsView_Night_0_en.png | 4 ++-- ...licenses.impl.list_DependencyLicensesListView_Day_0_en.png | 4 ++-- ...licenses.impl.list_DependencyLicensesListView_Day_1_en.png | 4 ++-- ...licenses.impl.list_DependencyLicensesListView_Day_2_en.png | 4 ++-- ...licenses.impl.list_DependencyLicensesListView_Day_3_en.png | 4 ++-- ...censes.impl.list_DependencyLicensesListView_Night_0_en.png | 4 ++-- ...censes.impl.list_DependencyLicensesListView_Night_1_en.png | 4 ++-- ...censes.impl.list_DependencyLicensesListView_Night_2_en.png | 4 ++-- ...censes.impl.list_DependencyLicensesListView_Night_3_en.png | 4 ++-- ...sages.impl.pinned.list_PinnedMessagesListView_Day_0_en.png | 4 ++-- ...sages.impl.pinned.list_PinnedMessagesListView_Day_1_en.png | 4 ++-- ...sages.impl.pinned.list_PinnedMessagesListView_Day_2_en.png | 4 ++-- ...sages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png | 4 ++-- ...ges.impl.pinned.list_PinnedMessagesListView_Night_0_en.png | 4 ++-- ...ges.impl.pinned.list_PinnedMessagesListView_Night_1_en.png | 4 ++-- ...ges.impl.pinned.list_PinnedMessagesListView_Night_2_en.png | 4 ++-- ...ges.impl.pinned.list_PinnedMessagesListView_Night_3_en.png | 4 ++-- ...tings_UserDefinedRoomNotificationSettingsView_Day_0_en.png | 4 ++-- ...ngs_UserDefinedRoomNotificationSettingsView_Night_0_en.png | 4 ++-- ...designsystem.theme.components_TopAppBarStr_App_Bars_en.png | 3 +++ 21 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_TopAppBarStr_App_Bars_en.png 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.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.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/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 From 283dd4bd33f3767aa64506394b68b1abc802da5c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 12:41:24 +0200 Subject: [PATCH 151/156] Format code. --- .../impl/timeline/components/event/TimelineItemStickerView.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 6cd369d84e..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 @@ -72,7 +72,8 @@ fun TimelineItemStickerView( .combinedClickable( onClick = onContentClick, onLongClick = onLongClick, - onLongClickLabel = stringResource(CommonStrings.action_open_context_menu), ) + onLongClickLabel = stringResource(CommonStrings.action_open_context_menu), + ) } else { Modifier } From 8910487e960526b785e824ae3fe8e656619a4ddf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 12:42:45 +0200 Subject: [PATCH 152/156] Fix issue with modifier. --- .../timeline/components/virtual/TimelineItemDaySeparatorView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f8581bb637..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 @@ -38,7 +38,7 @@ internal fun TimelineItemDaySeparatorView( contentAlignment = Alignment.Center, ) { Text( - modifier = modifier + modifier = Modifier .semantics { heading() }, From 1f426da8ace2922c74a4afc4177a702d16972d41 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 4 Jul 2025 14:35:36 +0200 Subject: [PATCH 153/156] misc (tracing) : add new TraceLogPack.Notification --- .../android/libraries/matrix/api/tracing/TraceLogPack.kt | 3 +++ .../libraries/matrix/impl/tracing/TraceLogPacksMapping.kt | 1 + 2 files changed, 4 insertions(+) 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/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 { From d9ede0544c0fd788e0ad6732ca1bd3ffa41b3092 Mon Sep 17 00:00:00 2001 From: ElementBot <110224175+ElementBot@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:37:59 +0200 Subject: [PATCH 154/156] Sync Strings from Localazy (#4983) Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com> --- .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 2 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-cy/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 1 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../main/res/values-pt-rBR/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 1 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-cy/translations.xml | 5 + .../src/main/res/values-da/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-fa/translations.xml | 1 + .../src/main/res/values-in/translations.xml | 5 + .../src/main/res/values-it/translations.xml | 5 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 9 + .../src/main/res/values-it/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 14 + .../src/main/res/values-fa/translations.xml | 6 + .../src/main/res/values-fa/translations.xml | 11 + .../src/main/res/values-cy/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-in/translations.xml | 10 +- .../src/main/res/values-it/translations.xml | 10 +- .../main/res/values-pt-rBR/translations.xml | 8 + .../src/main/res/values-fa/translations.xml | 1 + .../src/main/res/values-cy/translations.xml | 6 + .../src/main/res/values-da/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 14 + .../src/main/res/values-fa/translations.xml | 6 + .../src/main/res/values-in/translations.xml | 12 + .../src/main/res/values-it/translations.xml | 14 + .../main/res/values-pt-rBR/translations.xml | 14 + .../src/main/res/values-cy/translations.xml | 4 + .../src/main/res/values-de/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 7 + .../src/main/res/values-it/translations.xml | 8 + .../main/res/values-pt-rBR/translations.xml | 8 + .../src/main/res/values-cy/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 1 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../main/res/values-pt-rBR/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 2 +- .../src/main/res/values-fa/translations.xml | 2 + .../src/main/res/values-in/translations.xml | 9 + .../src/main/res/values-it/translations.xml | 6 + .../src/main/res/values-fa/translations.xml | 1 + .../src/main/res/values-cy/translations.xml | 1 + .../src/main/res/values-da/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../main/res/values-pt-rBR/translations.xml | 1 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-it/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 12 + .../src/main/res/values-in/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-it/translations.xml | 8 + .../main/res/values-pt-rBR/translations.xml | 5 + .../src/main/res/values-pt/translations.xml | 2 +- .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fa/translations.xml | 2 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-fa/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 8 + .../src/main/res/values-fa/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 4 + .../src/main/res/values-it/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 3 + .../src/main/res/values-in/translations.xml | 2 + .../src/main/res/values-fa/translations.xml | 3 + .../src/main/res/values-cy/translations.xml | 2 +- .../src/main/res/values-da/translations.xml | 1 + .../src/main/res/values-de/translations.xml | 1 + .../src/main/res/values-fa/translations.xml | 20 + .../src/main/res/values-in/translations.xml | 2 + .../src/main/res/values-it/translations.xml | 2 + .../main/res/values-pt-rBR/translations.xml | 1 + .../src/main/res/values-cy/translations.xml | 4 + .../src/main/res/values-da/translations.xml | 2 +- .../src/main/res/values-de/translations.xml | 5 + .../src/main/res/values-in/translations.xml | 8 +- .../src/main/res/values-it/translations.xml | 6 +- .../main/res/values-pt-rBR/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../src/main/res/values-cy/translations.xml | 19 + .../src/main/res/values-da/translations.xml | 7 + .../src/main/res/values-de/translations.xml | 28 +- .../src/main/res/values-fa/translations.xml | 7 + .../src/main/res/values-fr/translations.xml | 8 + .../src/main/res/values-in/translations.xml | 54 + .../src/main/res/values-it/translations.xml | 31 + .../main/res/values-pt-rBR/translations.xml | 20 +- .../src/main/res/values-pt/translations.xml | 10 +- .../src/main/res/values-uk/translations.xml | 6 + ...l.ui_InvalidAudioDeviceDialog_Day_0_de.png | 4 +- ...nts_BatteryOptimizationBanner_Day_0_de.png | 3 + ...pl.components_RoomSummaryRow_Day_34_de.png | 3 + ...ListDeclineInviteMenuContent_Day_0_de.png} | 0 ...mListModalBottomSheetContent_Day_0_de.png} | 0 ...mListModalBottomSheetContent_Day_1_de.png} | 0 ...mListModalBottomSheetContent_Day_2_de.png} | 0 ... features.home.impl_HomeView_Day_0_de.png} | 0 ...features.home.impl_HomeView_Day_10_de.png} | 0 ...features.home.impl_HomeView_Day_13_de.png} | 0 .../features.home.impl_HomeView_Day_14_de.png | 3 + ... features.home.impl_HomeView_Day_1_de.png} | 0 ... features.home.impl_HomeView_Day_2_de.png} | 0 .../features.home.impl_HomeView_Day_3_de.png | 3 + .../features.home.impl_HomeView_Day_5_de.png | 3 + ... features.home.impl_HomeView_Day_6_de.png} | 0 ... features.home.impl_HomeView_Day_7_de.png} | 0 ... features.home.impl_HomeView_Day_8_de.png} | 0 ... features.home.impl_HomeView_Day_9_de.png} | 0 ...tures.home.impl_RoomListView_Day_11_de.png | 3 - ...cline_AcceptDeclineInviteView_Day_4_de.png | 4 +- ...TimelineItemRoomBeginningView_Day_0_de.png | 4 +- ....components_MessageShieldView_Day_0_de.png | 4 +- ...ts_TimelineItemCallNotifyView_Day_0_de.png | 4 +- ...s.messages.impl_MessagesView_Day_14_de.png | 4 +- ...advanced_AdvancedSettingsViewDark_6_de.png | 3 + ...advanced_AdvancedSettingsViewDark_7_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_6_de.png | 3 + ...dvanced_AdvancedSettingsViewLight_7_de.png | 3 + ...veloper_DeveloperSettingsView_Day_0_de.png | 4 +- ...veloper_DeveloperSettingsView_Day_1_de.png | 4 +- ...veloper_DeveloperSettingsView_Day_2_de.png | 4 +- screenshots/html/data.js | 1673 +++++++++-------- 138 files changed, 1485 insertions(+), 869 deletions(-) create mode 100644 features/leaveroom/api/src/main/res/values-fa/translations.xml create mode 100644 features/poll/api/src/main/res/values-cy/translations.xml create mode 100644 features/poll/api/src/main/res/values-de/translations.xml create mode 100644 features/poll/api/src/main/res/values-in/translations.xml create mode 100644 features/poll/api/src/main/res/values-it/translations.xml create mode 100644 features/poll/api/src/main/res/values-pt-rBR/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-in/translations.xml create mode 100644 features/reportroom/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/androidutils/src/main/res/values-fa/translations.xml create mode 100644 screenshots/de/features.home.impl.components_BatteryOptimizationBanner_Day_0_de.png create mode 100644 screenshots/de/features.home.impl.components_RoomSummaryRow_Day_34_de.png rename screenshots/de/{features.home.impl_RoomListDeclineInviteMenuContent_Day_0_de.png => features.home.impl.roomlist_RoomListDeclineInviteMenuContent_Day_0_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListModalBottomSheetContent_Day_0_de.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_0_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListModalBottomSheetContent_Day_1_de.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_1_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListModalBottomSheetContent_Day_2_de.png => features.home.impl.roomlist_RoomListModalBottomSheetContent_Day_2_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_0_de.png => features.home.impl_HomeView_Day_0_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_7_de.png => features.home.impl_HomeView_Day_10_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_10_de.png => features.home.impl_HomeView_Day_13_de.png} (100%) create mode 100644 screenshots/de/features.home.impl_HomeView_Day_14_de.png rename screenshots/de/{features.home.impl_RoomListView_Day_2_de.png => features.home.impl_HomeView_Day_1_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_1_de.png => features.home.impl_HomeView_Day_2_de.png} (100%) create mode 100644 screenshots/de/features.home.impl_HomeView_Day_3_de.png create mode 100644 screenshots/de/features.home.impl_HomeView_Day_5_de.png rename screenshots/de/{features.home.impl_RoomListView_Day_3_de.png => features.home.impl_HomeView_Day_6_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_4_de.png => features.home.impl_HomeView_Day_7_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_5_de.png => features.home.impl_HomeView_Day_8_de.png} (100%) rename screenshots/de/{features.home.impl_RoomListView_Day_6_de.png => features.home.impl_HomeView_Day_9_de.png} (100%) delete mode 100644 screenshots/de/features.home.impl_RoomListView_Day_11_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_6_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewDark_7_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_6_de.png create mode 100644 screenshots/de/features.preferences.impl.advanced_AdvancedSettingsViewLight_7_de.png 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/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-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/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-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-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/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/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/home/impl/src/main/res/values-cy/translations.xml b/features/home/impl/src/main/res/values-cy/translations.xml index 7d779e0904..9b44b0fc3f 100644 --- a/features/home/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 index fe0ed70a9d..ae32f7ab66 100644 --- a/features/home/impl/src/main/res/values-da/translations.xml +++ b/features/home/impl/src/main/res/values-da/translations.xml @@ -21,6 +21,7 @@ "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" diff --git a/features/home/impl/src/main/res/values-de/translations.xml b/features/home/impl/src/main/res/values-de/translations.xml index bd09aad06d..7f2613809c 100644 --- a/features/home/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/home/impl/src/main/res/values-fa/translations.xml b/features/home/impl/src/main/res/values-fa/translations.xml index f2b8757107..ef436cbe90 100644 --- a/features/home/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/home/impl/src/main/res/values-in/translations.xml b/features/home/impl/src/main/res/values-in/translations.xml index 2b390790e1..b3e16b4c25 100644 --- a/features/home/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/home/impl/src/main/res/values-it/translations.xml b/features/home/impl/src/main/res/values-it/translations.xml index 981fb27d96..88ff0eb3be 100644 --- a/features/home/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/home/impl/src/main/res/values-pt-rBR/translations.xml b/features/home/impl/src/main/res/values-pt-rBR/translations.xml index 01b75db869..871a2bcc5c 100644 --- a/features/home/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/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/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/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/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/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 index e996117378..cefd0b75a4 100644 --- a/features/login/impl/src/main/res/values-da/translations.xml +++ b/features/login/impl/src/main/res/values-da/translations.xml @@ -34,6 +34,7 @@ "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" 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-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-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/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/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 index 1498428e98..a249db99f3 100644 --- a/features/messages/impl/src/main/res/values-da/translations.xml +++ b/features/messages/impl/src/main/res/values-da/translations.xml @@ -46,6 +46,7 @@ "Du reagerede med %1$s" "Vis mindre" "Vis mere" + "Vis oversigt over reaktioner" "Ny" "%1$d rumændring" 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-fa/translations.xml b/features/messages/impl/src/main/res/values-fa/translations.xml index f25bc49b7c..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,7 @@ "سفر و مکان‌ها" "نمادها" "انسداد کاربر" + "اگر می‌خواهید همه پیام‌های فعلی و آینده را از این کاربر را پنهان کنید، علامت بزنید" "این پیام به مدیر سرور خانگی شما گزارش خواهد شد. آنها قادر به خواندن پیام های رمزگذاری شده نخواهند بود." "دلیل گزارش این محتوا" "دوربین" @@ -19,6 +20,7 @@ "مکان" "نظرسنجی" "قالب‌بندی متن" + "تاریخچه پیام درحال حاضر دردسترس نیست." "می‌خواهید دوباره دعوتش کنید؟" "در این گپ تنهایید" "آگاهی به تمام اتاق" @@ -34,5 +36,9 @@ "نمایش کم‌تر" "نمایش بیش‌تر" "جدید" + + "%1$dتغییر اتاق" + "%1$dتغییر اتاق" + "%1$s و %2$s" 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-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/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-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-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/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-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-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/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-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/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 index fe0e94fd57..47ee436e8b 100644 --- a/features/rageshake/impl/src/main/res/values-da/translations.xml +++ b/features/rageshake/impl/src/main/res/values-da/translations.xml @@ -10,6 +10,7 @@ "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?" 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-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-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-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/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-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/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/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-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-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/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/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/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/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/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/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/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/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 index 7888c16f7c..facfc0eb3e 100644 --- a/libraries/push/impl/src/main/res/values-da/translations.xml +++ b/libraries/push/impl/src/main/res/values-da/translations.xml @@ -13,6 +13,7 @@ "%d notifikation" "%d notifikationer" + "Du har nye beskeder." "📹 Indgående opkald" "** Kunne ikke sende - åbn venligst rummet" "Deltag" 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 a1e2553034..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,6 +13,7 @@ "%d Mitteilung" "%d Mitteilungen" + "Du hast neue Nachrichten." "Eingehender Anruf" "** Fehler beim Senden - bitte Raum öffnen" "Beitreten" 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-in/translations.xml b/libraries/push/impl/src/main/res/values-in/translations.xml index 58ac1a0028..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,6 +11,7 @@ "%d pemberitahuan" + "Anda memiliki pesan baru." "📹 Panggilan masuk" "** Gagal mengirim — silakan buka ruangan" "Gabung" @@ -56,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 73130fc8d5..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,6 +13,7 @@ "%d notifica" "%d notifiche" + "Hai nuovi messaggi." "📹 Chiamata in arrivo" "** Invio fallito - si prega di aprire la stanza" "Entra" @@ -63,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-pt-rBR/translations.xml b/libraries/push/impl/src/main/res/values-pt-rBR/translations.xml index e0e51b76a1..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,6 +13,7 @@ "%d notificação" "%d notificações" + "Você tem mensagens novas." "📹 Chamada recebida" "** Falha ao enviar - por favor, abra a sala" "Entrar" diff --git a/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml b/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml index 5090069bc3..497766cc1e 100644 --- a/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-cy/translations.xml @@ -10,8 +10,12 @@ "Neges heb ei hamgryptio…" "Creu dolen" "Golygu dolen" + "%1$s, cyflwr: %2$s" "Gosod fformat trwm" "Gosod fformat italig" + "analluogwyd" + "i ffwrdd" + "ymlaen" "Gosod fformat llinell trwodd" "Gosod fformat tanlinellu" "Toglo\'r modd sgrin lawn" diff --git a/libraries/textcomposer/impl/src/main/res/values-da/translations.xml b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml index c1b8bc6780..dca3d5d11e 100644 --- a/libraries/textcomposer/impl/src/main/res/values-da/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-da/translations.xml @@ -2,7 +2,7 @@ "Tilføj vedhæftet fil" "Slå punktopstilling til/fra" - "Luk formateringsindstillinger" + "Annullér og luk tekstformatering" "Slå kodeblok til/fra" "Tilføj en billedtekst" "Krypteret besked…" diff --git a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml index 90b37c584e..b12e7e6080 100644 --- a/libraries/textcomposer/impl/src/main/res/values-de/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-de/translations.xml @@ -2,6 +2,7 @@ "Anhang hinzufügen" "Aufzählungsliste umschalten" + "Textformatierung abbrechen und schließen" "Codeblock umschalten" "Bildunterschrift hinzufügen" "Verschlüsselte Nachricht…" @@ -9,8 +10,12 @@ "Unverschlüsselte Nachricht" "Einen Link erstellen" "Link bearbeiten" + "%1$s, Zustand: %2$s" "Fettes Format anwenden" "Kursives Format anwenden" + "deaktiviert" + "aus" + "ein" "Text durchstreichen" "Unterstreichungsformat anwenden" "Vollbildmodus umschalten" diff --git a/libraries/textcomposer/impl/src/main/res/values-in/translations.xml b/libraries/textcomposer/impl/src/main/res/values-in/translations.xml index df7d6992e2..8646be898b 100644 --- a/libraries/textcomposer/impl/src/main/res/values-in/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-in/translations.xml @@ -2,14 +2,20 @@ "Tambahkan lampiran" "Alihkan daftar poin" - "Tutup opsi pemformatan" + "Batalkan dan tutup pemformatan teks" "Alihkan blok kode" "Keterangan opsional…" + "Pesan terenkripsi…" "Kirim pesan…" + "Pesan tidak terenkripsi…" "Buat tautan" "Sunting tautan" + "%1$s, keadaan: %2$s" "Terapkan format tebal" "Terapkan format miring" + "dinonaktifkan" + "mati" + "nyala" "Terapkan format coret" "Terapkan format garis bawah" "Alihkan mode layar penuh" diff --git a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml index ca7018aaa7..79d0bebc54 100644 --- a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml @@ -2,7 +2,7 @@ "Aggiungi allegato" "Attiva/disattiva l\'elenco puntato" - "Chiudi le opzioni di formattazione" + "Annullare e chiudere la formattazione del testo" "Attiva/disattiva il blocco di codice" "Aggiungi una didascalia" "Messaggio cifrato…" @@ -10,8 +10,12 @@ "Messaggio non cifrato…" "Crea un collegamento" "Modifica collegamento" + "%1$s stato: %2$s" "Applica il formato grassetto" "Applicare il formato corsivo" + "disabilitato" + "Disattivato" + "Attivo" "Applica il formato barrato" "Applicare il formato di sottolineatura" "Attiva/disattiva la modalità a schermo intero" diff --git a/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml index 3ad1ed5a10..81fc469301 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pt-rBR/translations.xml @@ -10,8 +10,12 @@ "Mensagem não criptografada…" "Criar um link" "Editar link" + "%1$s, estado: %2$s" "Aplicar negrito" "Aplicar formato itálico" + "desativado" + "desligado" + "ligado" "Aplicar formato tachado" "Aplicar sublinhado" "Alternar o modo de tela cheia" diff --git a/libraries/troubleshoot/impl/src/main/res/values-in/translations.xml b/libraries/troubleshoot/impl/src/main/res/values-in/translations.xml index 9863fa60e8..a2a6039f74 100644 --- a/libraries/troubleshoot/impl/src/main/res/values-in/translations.xml +++ b/libraries/troubleshoot/impl/src/main/res/values-in/translations.xml @@ -1,5 +1,6 @@ + "Riwayat dorongan" "Jalankan tes" "Jalankan tes lagi" "Beberapa tes gagal. Silakan periksa detailnya." diff --git a/libraries/troubleshoot/impl/src/main/res/values-it/translations.xml b/libraries/troubleshoot/impl/src/main/res/values-it/translations.xml index 4c359a8140..946915fe69 100644 --- a/libraries/troubleshoot/impl/src/main/res/values-it/translations.xml +++ b/libraries/troubleshoot/impl/src/main/res/values-it/translations.xml @@ -1,5 +1,6 @@ + "Cronologia push" "Esegui i test" "Esegui nuovamente i test" "Alcuni test sono falliti. Si prega di controllare i dettagli." 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 8047acb810..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" @@ -36,14 +38,19 @@ "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 index 14b637216f..bad79e2d16 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -1,5 +1,6 @@ + "Tilføj reaktion: %1$s" "Avatar" "Slet" @@ -28,10 +29,12 @@ "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." @@ -329,6 +332,7 @@ Er du sikker på, at du vil fortsætte?" "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." @@ -377,6 +381,9 @@ Er du sikker på, at du vil fortsætte?" "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…" 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 7fc09c9d53..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" @@ -28,14 +30,19 @@ "Gelesen von %1$s" "Tippe, um alle anzuzeigen" "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-fa/translations.xml b/libraries/ui-strings/src/main/res/values-fa/translations.xml index 4701ff08f7..9ea728cbfa 100644 --- a/libraries/ui-strings/src/main/res/values-fa/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml @@ -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-fr/translations.xml b/libraries/ui-strings/src/main/res/values-fr/translations.xml index 8266d8ce0a..d1d1177534 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -12,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" @@ -30,15 +31,18 @@ "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" @@ -97,6 +101,7 @@ "Non" "Pas maintenant" "OK" + "Ouvrir le menu contextuel" "Ouvrir les paramètres" "Ouvrir avec" "Épingler" @@ -121,7 +126,9 @@ "Enregistrer" "Rechercher" "Envoyer" + "Envoyer un message modifié" "Envoyer un message" + "Envoyer un message vocal" "Partager" "Partager le lien" "Afficher" @@ -137,6 +144,7 @@ "Appuyez pour afficher les options" "Essayer à nouveau" "Désépingler" + "Voir" "Voir dans la discussion" "Afficher la source" "Oui" 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 05387a00a3..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" @@ -23,12 +28,19 @@ "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 52df6ff9ec..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" @@ -25,11 +29,14 @@ "Visualizzato da %1$s" "Tocca per mostrare tutti" "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-pt-rBR/translations.xml b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml index 5e617e1c3e..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" @@ -28,10 +29,12 @@ "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 aed2fa6f04..9027b51547 100644 --- a/libraries/ui-strings/src/main/res/values-pt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml @@ -31,7 +31,7 @@ "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" @@ -62,7 +62,7 @@ "Criar uma sala" "Desativar" "Desativar conta" - "Rejeitar" + "Recusar" "Recusar e bloquear" "Eliminar sondagem" "Desativar" @@ -75,7 +75,7 @@ "Ativar" "Fim da sondagem" "Inserir PIN" - "Esqueceu-se da senha?" + "Esqueceu-se da palavra-passe?" "Reencaminhar" "Voltar" "Ignorar" @@ -89,7 +89,7 @@ "Sair" "Sair da conversa" "Sair da sala" - "Carrega mais" + "Carregar mais" "Gerir conta" "Gerir dispositivos" "Enviar mensagem" @@ -97,7 +97,7 @@ "Não" "Agora não" "OK" - "Configurações" + "Definições" "Abrir com" "Afixar" "Resposta rápida" 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 b4b1b5578d..b57f560076 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -148,6 +148,7 @@ "Політика прийнятного використання" "Додавання підпису" "Додаткові налаштування" + "зображення" "Аналітика" "Тема" "Аудіо" @@ -247,6 +248,11 @@ "Причина" "Ключ відновлення" "Оновлення…" + + "%1$d відповідь" + "%1$d відповіді" + "%1$d відповідей" + "Відповідь %1$s" "Повідомити про ваду" "Повідомити про проблему" 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.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.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.home.impl_RoomListView_Day_0_de.png rename to screenshots/de/features.home.impl_HomeView_Day_0_de.png diff --git a/screenshots/de/features.home.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.home.impl_RoomListView_Day_7_de.png rename to screenshots/de/features.home.impl_HomeView_Day_10_de.png diff --git a/screenshots/de/features.home.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.home.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.home.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.home.impl_RoomListView_Day_2_de.png rename to screenshots/de/features.home.impl_HomeView_Day_1_de.png diff --git a/screenshots/de/features.home.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.home.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.home.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.home.impl_RoomListView_Day_3_de.png rename to screenshots/de/features.home.impl_HomeView_Day_6_de.png diff --git a/screenshots/de/features.home.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.home.impl_RoomListView_Day_4_de.png rename to screenshots/de/features.home.impl_HomeView_Day_7_de.png diff --git a/screenshots/de/features.home.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.home.impl_RoomListView_Day_5_de.png rename to screenshots/de/features.home.impl_HomeView_Day_8_de.png diff --git a/screenshots/de/features.home.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.home.impl_RoomListView_Day_6_de.png rename to screenshots/de/features.home.impl_HomeView_Day_9_de.png diff --git a/screenshots/de/features.home.impl_RoomListView_Day_11_de.png b/screenshots/de/features.home.impl_RoomListView_Day_11_de.png deleted file mode 100644 index 8ea198ec99..0000000000 --- a/screenshots/de/features.home.impl_RoomListView_Day_11_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540b721270f65172ff2c231ebf5a83c8c17716f655780adb19549cbb368db675 -size 101728 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 5ee5f5866f..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:00f553a66eb9afb952a35387e6988ca2e56f396dc2b329ec08172122a13661d4 -size 20743 +oid sha256:97b6da2622c7491563081068c1cbe673b468d8306642c0abfc8f9a8d995c489f +size 22162 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 e5c06e8e2f..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:eb4cb0382f0da7e276049900e18af9aa4e3dfa3b85eb58cc234696efe5b712c8 -size 49826 +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 870e9837ad..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:93f8eebe5be37e8ee6ba1dd59e3780f7bc96ec94b3b76aa5e3c7d98344e55e36 -size 55948 +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 index 75d959028f..720695a5cd 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16dadbf00de495615b692187852e0d2e12a749f9ef5bf652b8cfe5d8c5a90d8c -size 63369 +oid sha256:a117fd360262156cef595eabfaee2648cdb185678527d9a0aec602160b7823f4 +size 64801 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/html/data.js b/screenshots/html/data.js index c2fa336194..9006dd4020 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,71 +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",20266,], +["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",20266,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_2_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_2_en",20266,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_3_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_3_en",20266,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_4_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_4_en",20266,], -["features.invite.impl.acceptdecline_AcceptDeclineInviteView_Day_5_en","features.invite.impl.acceptdecline_AcceptDeclineInviteView_Night_5_en",20269,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20266,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20266,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20266,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20266,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20266,], -["features.login.impl.accountprovider_AccountProviderOtherView_Day_0_en","features.login.impl.accountprovider_AccountProviderOtherView_Night_0_en",20266,], +["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",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20266,], +["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",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20266,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20266,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20266,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20266,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20266,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_0_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_1_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_2_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_3_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_4_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewDark_5_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_0_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_1_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_2_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_3_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_4_en","",20266,], -["features.preferences.impl.advanced_AdvancedSettingsViewLight_5_en","",20266,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20266,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20266,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20266,], -["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20266,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20266,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20266,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20266,], +["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",20266,], +["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",20266,], +["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",20266,], +["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",20266,], +["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",20266,], +["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,], @@ -75,18 +79,18 @@ 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","",20266,], +["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","",20266,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20266,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20266,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20266,], +["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","",20266,], +["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",20266,], +["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,], @@ -193,16 +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",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",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20266,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20266,], +["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,], @@ -213,138 +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",20266,], -["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20266,], -["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20266,], -["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20266,], -["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20266,], +["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",20266,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20266,], +["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_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",20266,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20266,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20266,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20266,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20266,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_1_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_1_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20266,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20266,], +["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",20266,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20266,], -["features.login.impl.changeserver_ChangeServerView_Day_3_en","features.login.impl.changeserver_ChangeServerView_Night_3_en",20266,], +["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","",20266,], +["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",20266,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_1_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_1_en",20266,], -["features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Day_2_en","features.login.impl.screens.chooseaccountprovider_ChooseAccountProviderView_Night_2_en",20266,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20266,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20266,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20266,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20266,], +["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",20266,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20266,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20266,], +["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,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20266,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20266,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20266,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20266,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20266,], -["features.home.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.home.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20269,], +["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",20266,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20266,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20266,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20266,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20266,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20266,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20266,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20266,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20266,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20266,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20266,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20266,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20266,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20266,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20266,], -["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20266,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20266,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20266,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20266,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20266,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20266,], +["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","",20266,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20266,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_0_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_0_en",20266,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_1_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_1_en",20266,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_2_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_2_en",20266,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_3_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_3_en",20266,], -["features.invite.impl.declineandblock_DeclineAndBlockView_Day_4_en","features.invite.impl.declineandblock_DeclineAndBlockView_Night_4_en",20266,], +["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",20266,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20266,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20266,], +["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",20266,], -["features.home.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.home.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20269,], -["features.home.impl.components_DefaultRoomListTopBar_Day_0_en","features.home.impl.components_DefaultRoomListTopBar_Night_0_en",20269,], +["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",20266,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20266,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20266,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20266,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20266,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20266,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20266,], +["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,18 +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",20266,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20266,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20266,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20266,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20266,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20266,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20266,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20266,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20266,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20266,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20266,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_1_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_1_en",20269,], +["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,], @@ -378,9 +382,9 @@ 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","",20266,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20266,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20266,], +["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,], @@ -399,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",20266,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20266,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20266,], +["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",20266,], -["features.home.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.home.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20269,], +["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,], @@ -432,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",20266,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20266,], +["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,], @@ -441,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",20266,], +["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",20266,], +["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",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20266,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20266,], +["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",20266,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20266,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20266,], +["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",20266,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20266,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20266,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20266,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20266,], +["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",20266,], -["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20266,], -["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20266,], -["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20266,], -["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20266,], -["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20266,], +["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",20266,], +["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,], @@ -574,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",20266,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20266,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20266,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20266,], +["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",20266,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20266,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20266,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20266,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20266,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20266,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20266,], -["features.logout.impl_LogoutView_Day_10_en","features.logout.impl_LogoutView_Night_10_en",20266,], -["features.logout.impl_LogoutView_Day_11_en","features.logout.impl_LogoutView_Night_11_en",20266,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20266,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20266,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20266,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20266,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20266,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20266,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20266,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20266,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20266,], +["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",20266,], +["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,], @@ -611,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",20266,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20266,], +["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",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20266,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20266,], +["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,], @@ -634,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","",20266,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20266,], +["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","",20266,], +["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","",20266,], +["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,], @@ -653,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",20266,], +["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,], @@ -662,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",20266,], +["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,], @@ -670,26 +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",20266,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20266,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20266,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20266,], -["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20266,], -["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20266,], -["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20266,], -["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20266,], -["features.messages.impl_MessagesView_Day_14_en","features.messages.impl_MessagesView_Night_14_en",20269,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20266,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20266,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20266,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20266,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20266,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20266,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20266,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20266,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20266,], +["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",20266,], +["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,], @@ -699,43 +718,43 @@ export const screenshots = [ ["libraries.designsystem.components.list_MutipleSelectionListItemSelected_Multiple_selection_List_item_-_selection_in_supporting_text_List_items_en","",0,], ["libraries.designsystem.components.list_MutipleSelectionListItem_Multiple_selection_List_item_-_no_selection_List_items_en","",0,], ["libraries.designsystem.theme.components_NavigationBar_App_Bars_en","",0,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20266,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20266,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20266,], +["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",20266,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_1_en","features.login.impl.screens.onboarding_OnBoardingView_Night_1_en",20266,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_2_en","features.login.impl.screens.onboarding_OnBoardingView_Night_2_en",20266,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_3_en","features.login.impl.screens.onboarding_OnBoardingView_Night_3_en",20266,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_4_en","features.login.impl.screens.onboarding_OnBoardingView_Night_4_en",20266,], -["features.login.impl.screens.onboarding_OnBoardingView_Day_5_en","features.login.impl.screens.onboarding_OnBoardingView_Night_5_en",20266,], +["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",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_10_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_10_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_11_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_11_en",20266,], +["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",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_2_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_2_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_3_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_3_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_4_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_4_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_5_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_5_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_6_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_6_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_7_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_7_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_8_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_8_en",20266,], -["features.verifysession.impl.outgoing_OutgoingVerificationView_Day_9_en","features.verifysession.impl.outgoing_OutgoingVerificationView_Night_9_en",20266,], +["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,], @@ -749,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",20266,], -["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20266,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20266,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20266,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20266,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20266,], +["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",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20266,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20266,], +["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",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20266,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20266,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20266,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20266,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20266,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20266,], +["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",20266,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20266,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20266,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20266,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20266,], +["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",20266,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20266,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20266,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20266,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20266,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20266,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20266,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20266,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20266,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20266,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20266,], +["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,], @@ -821,218 +840,206 @@ 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","",20266,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20266,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20266,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20266,], +["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","",20266,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20266,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20266,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20266,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20266,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20266,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_0_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_0_en",20266,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_1_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_1_en",20266,], -["libraries.troubleshoot.impl.history_PushHistoryView_Day_2_en","libraries.troubleshoot.impl.history_PushHistoryView_Night_2_en",20266,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20266,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20266,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20266,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20266,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20266,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20266,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20266,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20266,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20266,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20266,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_4_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_4_en",20266,], +["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",20266,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20266,], +["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",20266,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20266,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20266,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20266,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20266,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20266,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20266,], +["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",20266,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20266,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20266,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20266,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20266,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20266,], -["features.reportroom.impl_ReportRoomView_Day_0_en","features.reportroom.impl_ReportRoomView_Night_0_en",20266,], -["features.reportroom.impl_ReportRoomView_Day_1_en","features.reportroom.impl_ReportRoomView_Night_1_en",20266,], -["features.reportroom.impl_ReportRoomView_Day_2_en","features.reportroom.impl_ReportRoomView_Night_2_en",20266,], -["features.reportroom.impl_ReportRoomView_Day_3_en","features.reportroom.impl_ReportRoomView_Night_3_en",20266,], -["features.reportroom.impl_ReportRoomView_Day_4_en","features.reportroom.impl_ReportRoomView_Night_4_en",20266,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20266,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20266,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20266,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20266,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20266,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20266,], +["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",20266,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20266,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20266,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20266,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20266,], +["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",20266,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20266,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_19_en","",20269,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20266,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20266,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20266,], -["features.roomdetails.impl_RoomDetails_0_en","",20266,], -["features.roomdetails.impl_RoomDetails_10_en","",20266,], -["features.roomdetails.impl_RoomDetails_11_en","",20266,], -["features.roomdetails.impl_RoomDetails_12_en","",20266,], -["features.roomdetails.impl_RoomDetails_13_en","",20266,], -["features.roomdetails.impl_RoomDetails_14_en","",20266,], -["features.roomdetails.impl_RoomDetails_15_en","",20266,], -["features.roomdetails.impl_RoomDetails_16_en","",20266,], -["features.roomdetails.impl_RoomDetails_17_en","",20266,], -["features.roomdetails.impl_RoomDetails_18_en","",20266,], -["features.roomdetails.impl_RoomDetails_19_en","",20269,], -["features.roomdetails.impl_RoomDetails_1_en","",20266,], -["features.roomdetails.impl_RoomDetails_2_en","",20266,], -["features.roomdetails.impl_RoomDetails_3_en","",20266,], -["features.roomdetails.impl_RoomDetails_4_en","",20266,], -["features.roomdetails.impl_RoomDetails_5_en","",20266,], -["features.roomdetails.impl_RoomDetails_6_en","",20266,], -["features.roomdetails.impl_RoomDetails_7_en","",20266,], -["features.roomdetails.impl_RoomDetails_8_en","",20266,], -["features.roomdetails.impl_RoomDetails_9_en","",20266,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20266,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20266,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20266,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20266,], -["features.home.impl.components_RoomListContentView_Day_0_en","features.home.impl.components_RoomListContentView_Night_0_en",20269,], -["features.home.impl.components_RoomListContentView_Day_1_en","features.home.impl.components_RoomListContentView_Night_1_en",20269,], +["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",20269,], -["features.home.impl.components_RoomListContentView_Day_4_en","features.home.impl.components_RoomListContentView_Night_4_en",20269,], -["features.home.impl_RoomListDeclineInviteMenuContent_Day_0_en","features.home.impl_RoomListDeclineInviteMenuContent_Night_0_en",20269,], -["features.home.impl.filters_RoomListFiltersView_Day_0_en","features.home.impl.filters_RoomListFiltersView_Night_0_en",20269,], -["features.home.impl.filters_RoomListFiltersView_Day_1_en","features.home.impl.filters_RoomListFiltersView_Night_1_en",20269,], -["features.home.impl_RoomListModalBottomSheetContent_Day_0_en","features.home.impl_RoomListModalBottomSheetContent_Night_0_en",20269,], -["features.home.impl_RoomListModalBottomSheetContent_Day_1_en","features.home.impl_RoomListModalBottomSheetContent_Night_1_en",20269,], -["features.home.impl_RoomListModalBottomSheetContent_Day_2_en","features.home.impl_RoomListModalBottomSheetContent_Night_2_en",20269,], +["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",20269,], -["features.home.impl_RoomListView_Day_0_en","features.home.impl_RoomListView_Night_0_en",20269,], -["features.home.impl_RoomListView_Day_10_en","features.home.impl_RoomListView_Night_10_en",20269,], -["features.home.impl_RoomListView_Day_11_en","features.home.impl_RoomListView_Night_11_en",20269,], -["features.home.impl_RoomListView_Day_1_en","features.home.impl_RoomListView_Night_1_en",20269,], -["features.home.impl_RoomListView_Day_2_en","features.home.impl_RoomListView_Night_2_en",20269,], -["features.home.impl_RoomListView_Day_3_en","features.home.impl_RoomListView_Night_3_en",20269,], -["features.home.impl_RoomListView_Day_4_en","features.home.impl_RoomListView_Night_4_en",20269,], -["features.home.impl_RoomListView_Day_5_en","features.home.impl_RoomListView_Night_5_en",20269,], -["features.home.impl_RoomListView_Day_6_en","features.home.impl_RoomListView_Night_6_en",20269,], -["features.home.impl_RoomListView_Day_7_en","features.home.impl_RoomListView_Night_7_en",20269,], -["features.home.impl_RoomListView_Day_8_en","features.home.impl_RoomListView_Night_8_en",0,], -["features.home.impl_RoomListView_Day_9_en","features.home.impl_RoomListView_Night_9_en",0,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20266,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20266,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20266,], +["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",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20266,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_4_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_4_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_6_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_6_en",20266,], -["features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en","features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en",20266,], +["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",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20266,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20266,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20266,], +["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,], @@ -1055,13 +1062,13 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_26_en","features.home.impl.components_RoomSummaryRow_Night_26_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_27_en","features.home.impl.components_RoomSummaryRow_Night_27_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_28_en","features.home.impl.components_RoomSummaryRow_Night_28_en",0,], -["features.home.impl.components_RoomSummaryRow_Day_29_en","features.home.impl.components_RoomSummaryRow_Night_29_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_2_en","features.home.impl.components_RoomSummaryRow_Night_2_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_30_en","features.home.impl.components_RoomSummaryRow_Night_30_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_31_en","features.home.impl.components_RoomSummaryRow_Night_31_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_32_en","features.home.impl.components_RoomSummaryRow_Night_32_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_33_en","features.home.impl.components_RoomSummaryRow_Night_33_en",20269,], -["features.home.impl.components_RoomSummaryRow_Day_34_en","features.home.impl.components_RoomSummaryRow_Night_34_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,], @@ -1069,77 +1076,77 @@ export const screenshots = [ ["features.home.impl.components_RoomSummaryRow_Day_7_en","features.home.impl.components_RoomSummaryRow_Night_7_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_8_en","features.home.impl.components_RoomSummaryRow_Night_8_en",0,], ["features.home.impl.components_RoomSummaryRow_Day_9_en","features.home.impl.components_RoomSummaryRow_Night_9_en",0,], -["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20266,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20266,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20266,], +["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",20266,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20266,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20266,], +["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","",20266,], +["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","",20266,], -["features.createroom.impl.components_SearchSingleUserResultItem_en","",20266,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20266,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20266,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20266,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20266,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20266,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20266,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20266,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20266,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20266,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20266,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20266,], +["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,], @@ -1147,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",20266,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20266,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20266,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20266,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20266,], +["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,], @@ -1161,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",20266,], -["features.home.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.home.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20269,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20266,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20266,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20266,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20266,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20266,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20266,], +["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",20266,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20266,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20266,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20266,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20266,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20266,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20266,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20266,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20266,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20266,], +["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,], @@ -1190,7 +1197,7 @@ 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",20266,], +["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,], @@ -1200,61 +1207,61 @@ export const screenshots = [ ["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",20266,], +["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",20266,], +["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",20266,], +["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",20266,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20266,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20266,], -["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20266,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20266,], -["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20266,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20266,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20266,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20266,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20266,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20266,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20266,], -["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20266,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20266,], -["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20266,], +["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",20266,], -["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20266,], +["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,], @@ -1266,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","",20266,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20266,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20266,], +["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",20266,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20266,], +["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,], @@ -1283,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",20266,], +["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",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20266,], +["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,], @@ -1302,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",20266,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20266,], +["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",20266,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20266,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20266,], +["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",20266,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20266,], +["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,], @@ -1322,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",20266,], +["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",20266,], +["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","",20266,], +["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",20266,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20266,], +["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",20266,], +["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",20266,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20266,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20266,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20266,], +["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",20266,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20266,], +["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",20266,], +["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,], @@ -1364,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",20266,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20266,], +["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,], @@ -1380,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",20266,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20266,], +["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,], @@ -1404,74 +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",20266,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20266,], +["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",20266,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20266,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20266,], +["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",20266,], +["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",20266,], +["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",20266,], +["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",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20266,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20266,], +["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",20266,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20266,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20266,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20266,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20266,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20266,], +["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","",20266,], +["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.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",20266,], -["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20266,], -["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20266,], -["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20266,], +["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",20266,], +["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",20266,], +["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",20266,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20266,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20266,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20266,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20266,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20266,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20266,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20266,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20266,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20266,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20266,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20266,], +["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,], @@ -1479,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",20266,], +["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,], @@ -1498,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",20266,], +["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,], ]; From 5e73e0b9d0f58c735871b02f7fc1703ff1e907f3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 16:49:23 +0200 Subject: [PATCH 155/156] Setting version for the release 25.07.0 --- plugins/src/main/kotlin/Versions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index 5c9bd64c83..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 From 622be772d6ad600b29378a7f3427c35c89fb2c2b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Jul 2025 16:50:15 +0200 Subject: [PATCH 156/156] Adding fastlane file for version 25.07.0 --- fastlane/metadata/android/en-US/changelogs/202507000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/202507000.txt 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