From 7fd4126c96c257c50dd320a5ff5c11f6ff960b11 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:45:02 +0000 Subject: [PATCH 01/54] fix(deps): update dependency androidx.compose:compose-bom to v2025.03.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 166e46db53..ba22ab6c1a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ media3 = "1.5.1" camera = "1.4.1" # Compose -compose_bom = "2025.03.00" +compose_bom = "2025.03.01" composecompiler = "1.5.15" # Coroutines From 3c1deff79ce6d0508830715364ac13e727e46753 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 27 Mar 2025 11:25:04 +0100 Subject: [PATCH 02/54] Element config (#4471) * Add handy extension "VariantDimension.buildConfigFieldStr" * Update configuration for MapTiler. * Update configuration for Sentry. * Build AnalyticsConfig depending on analytics configuration. * Configure analytics policy url. * Add handy extension "VariantDimension.buildConfigFieldBoolean" * Configure legal urls. * Add a way to disable rageshake / reporting bugs. * Update screenshots * Quality * Fix test * Use `ifBlank` extension * Add missing configuration for PostHog * Update configuration for Rageshake. * Add build log. * Disable crash detection if rageshake feature is not available. Disabled twice. * Hide link to analytics policy if the link is missing. * Fix test when run in enterprise context. * Use RageshakeFeatureAvailability where appropriate. * Rename file. * Move some classes to their correct module. * Update screenshots --------- Co-authored-by: ElementBot --- .../element/android/x/ElementXApplication.kt | 6 ++- appconfig/build.gradle.kts | 34 ++++++++++++++ .../android/appconfig/AnalyticsConfig.kt | 2 +- .../android/appconfig/RageshakeConfig.kt | 10 +++- .../AnalyticsPreferencesStateProvider.kt | 13 ++++-- .../preferences/AnalyticsPreferencesView.kt | 14 +++--- .../analytics/impl/AnalyticsOptInPresenter.kt | 2 + .../analytics/impl/AnalyticsOptInState.kt | 1 + .../impl/AnalyticsOptInStateProvider.kt | 6 ++- .../analytics/impl/AnalyticsOptInView.kt | 40 ++++++++-------- .../AnalyticsPreferencesPresenterTest.kt | 3 +- features/location/api/build.gradle.kts | 24 ++++++---- .../features/location/api/StaticMapView.kt | 2 +- .../location/api/internal/MapTilerConfig.kt | 21 --------- .../internal/MapTilerStaticMapUrlBuilder.kt | 14 +++--- .../MapTilerTileServerStyleUriBuilder.kt | 14 +++--- .../api/internal/StaticMapUrlBuilder.kt | 4 +- .../api/internal/TileServerStyleUriBuilder.kt | 7 +-- .../MapTilerStaticMapUrlBuilderTest.kt | 26 ++++++----- .../MapTilerTileServerStyleUriBuilderTest.kt | 5 +- features/location/impl/build.gradle.kts | 1 - .../location/impl/DefaultLocationService.kt | 9 ++-- .../impl/DefaultLocationServiceTest.kt | 25 ++-------- features/onboarding/impl/build.gradle.kts | 1 + .../onboarding/impl/OnBoardingPresenter.kt | 5 ++ .../onboarding/impl/OnBoardingState.kt | 1 + .../impl/OnBoardingStateProvider.kt | 7 ++- .../onboarding/impl/OnBoardingView.kt | 20 ++++---- .../impl/OnBoardingPresenterTest.kt | 16 +++++++ .../onboarding/impl/OnboardingViewTest.kt | 18 +++++++- features/preferences/impl/build.gradle.kts | 21 +++++++++ .../preferences/impl/about/ElementLegal.kt | 7 +-- .../impl/root/PreferencesRootPresenter.kt | 4 ++ .../impl/root/PreferencesRootState.kt | 1 + .../impl/root/PreferencesRootStateProvider.kt | 1 + .../impl/root/PreferencesRootView.kt | 12 +++-- .../impl/root/PreferencesRootPresenterTest.kt | 20 ++++++++ .../api/RageshakeFeatureAvailability.kt | 12 +++++ .../preferences/RageshakePreferencesState.kt | 1 + .../RageshakePreferencesStateProvider.kt | 21 ++++++--- .../preferences/RageshakePreferencesView.kt | 46 ++++++++++--------- .../DefaultRageshakeFeatureAvailability.kt | 22 +++++++++ .../impl/bugreport/BugReportPresenter.kt | 4 +- .../rageshake/impl}/crash/CrashDataStore.kt | 2 +- .../crash/DefaultCrashDetectionPresenter.kt | 16 +++++-- .../impl/crash/PreferencesCrashDataStore.kt | 1 - .../DefaultRageshakeDetectionPresenter.kt | 7 +-- .../DefaultRageshakePreferencesPresenter.kt | 9 +++- .../impl/rageshake/DefaultRageShake.kt | 1 - .../PreferencesRageshakeDataStore.kt | 1 - .../rageshake/impl}/rageshake/RageShake.kt | 2 +- .../impl}/rageshake/RageshakeDataStore.kt | 2 +- .../impl/reporter/DefaultBugReporter.kt | 4 +- .../screenshot/DefaultScreenshotHolder.kt | 1 - .../impl}/screenshot/ScreenshotHolder.kt | 2 +- .../impl/bugreport/BugReportPresenterTest.kt | 12 ++--- .../impl}/crash/FakeCrashDataStore.kt | 3 +- .../crash/ui/CrashDetectionPresenterTest.kt | 20 +++++++- .../RageshakeDetectionPresenterTest.kt | 11 +++-- .../RageshakePreferencesPresenterTest.kt | 18 +++++--- .../impl}/rageshake/FakeRageShake.kt | 4 +- .../impl}/rageshake/FakeRageshakeDataStore.kt | 3 +- .../impl/reporter/DefaultBugReporterTest.kt | 7 +-- .../DefaultBugReporterUrlProviderTest.kt | 6 ++- .../impl}/screenshot/FakeScreenshotHolder.kt | 3 +- features/roomlist/impl/build.gradle.kts | 1 + .../roomlist/impl/RoomListPresenter.kt | 4 ++ .../features/roomlist/impl/RoomListState.kt | 1 + .../roomlist/impl/RoomListStateProvider.kt | 2 + .../features/roomlist/impl/RoomListView.kt | 1 + .../impl/components/RoomListTopBar.kt | 7 ++- .../roomlist/impl/RoomListPresenterTest.kt | 6 +++ plugins/src/main/kotlin/ModulesConfig.kt | 28 +++++++++-- .../src/main/kotlin/config/BuildTimeConfig.kt | 14 ++++++ .../extension/VariantDimensionExtension.kt | 32 +++++++++++++ .../posthog/build.gradle.kts | 18 ++++++++ .../posthog/PostHogFactory.kt | 4 +- .../posthog/PosthogEndpointConfig.kt | 4 +- .../posthog/PosthogEndpointConfigProvider.kt | 38 ++++++++++----- .../sentry/build.gradle.kts | 14 ++++-- .../sentry/SentryAnalyticsProvider.kt | 4 +- ...nces_AnalyticsPreferencesView_Day_1_en.png | 3 ++ ...es_AnalyticsPreferencesView_Night_1_en.png | 3 ++ ...ytics.impl_AnalyticsOptInView_Day_1_en.png | 3 ++ ...ics.impl_AnalyticsOptInView_Night_1_en.png | 3 ++ ...nboarding.impl_OnBoardingView_Day_0_en.png | 4 +- ...nboarding.impl_OnBoardingView_Day_1_en.png | 4 +- ...nboarding.impl_OnBoardingView_Day_2_en.png | 4 +- ...nboarding.impl_OnBoardingView_Day_3_en.png | 4 +- ...nboarding.impl_OnBoardingView_Day_4_en.png | 3 ++ ...oarding.impl_OnBoardingView_Night_0_en.png | 4 +- ...oarding.impl_OnBoardingView_Night_1_en.png | 4 +- ...oarding.impl_OnBoardingView_Night_2_en.png | 4 +- ...oarding.impl_OnBoardingView_Night_3_en.png | 4 +- ...oarding.impl_OnBoardingView_Night_4_en.png | 3 ++ 95 files changed, 613 insertions(+), 273 deletions(-) delete mode 100644 features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerConfig.kt create mode 100644 features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/RageshakeFeatureAvailability.kt create mode 100644 features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailability.kt rename features/rageshake/{api/src/main/kotlin/io/element/android/features/rageshake/api => impl/src/main/kotlin/io/element/android/features/rageshake/impl}/crash/CrashDataStore.kt (88%) rename features/rageshake/{api/src/main/kotlin/io/element/android/features/rageshake/api => impl/src/main/kotlin/io/element/android/features/rageshake/impl}/rageshake/RageShake.kt (91%) rename features/rageshake/{api/src/main/kotlin/io/element/android/features/rageshake/api => impl/src/main/kotlin/io/element/android/features/rageshake/impl}/rageshake/RageshakeDataStore.kt (88%) rename features/rageshake/{api/src/main/kotlin/io/element/android/features/rageshake/api => impl/src/main/kotlin/io/element/android/features/rageshake/impl}/screenshot/ScreenshotHolder.kt (84%) rename features/rageshake/{test/src/main/kotlin/io/element/android/features/rageshake/test => impl/src/test/kotlin/io/element/android/features/rageshake/impl}/crash/FakeCrashDataStore.kt (88%) rename features/rageshake/{test/src/main/kotlin/io/element/android/features/rageshake/test => impl/src/test/kotlin/io/element/android/features/rageshake/impl}/rageshake/FakeRageShake.kt (84%) rename features/rageshake/{test/src/main/kotlin/io/element/android/features/rageshake/test => impl/src/test/kotlin/io/element/android/features/rageshake/impl}/rageshake/FakeRageshakeDataStore.kt (87%) rename features/rageshake/{test/src/main/kotlin/io/element/android/features/rageshake/test => impl/src/test/kotlin/io/element/android/features/rageshake/impl}/screenshot/FakeScreenshotHolder.kt (78%) create mode 100644 plugins/src/main/kotlin/extension/VariantDimensionExtension.kt create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_1_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_4_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_4_en.png diff --git a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt index a4bfe0c60d..30bef76339 100644 --- a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt +++ b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt @@ -9,6 +9,8 @@ package io.element.android.x import android.app.Application import androidx.startup.AppInitializer +import io.element.android.appconfig.RageshakeConfig +import io.element.android.appconfig.isEnabled import io.element.android.features.cachecleaner.api.CacheCleanerInitializer import io.element.android.libraries.di.DaggerComponentOwner import io.element.android.x.di.AppComponent @@ -23,7 +25,9 @@ class ElementXApplication : Application(), DaggerComponentOwner { override fun onCreate() { super.onCreate() AppInitializer.getInstance(this).apply { - initializeComponent(CrashInitializer::class.java) + if (RageshakeConfig.isEnabled) { + initializeComponent(CrashInitializer::class.java) + } initializeComponent(PlatformInitializer::class.java) initializeComponent(CacheCleanerInitializer::class.java) } diff --git a/appconfig/build.gradle.kts b/appconfig/build.gradle.kts index 99c7e1defa..15b8bd51ba 100644 --- a/appconfig/build.gradle.kts +++ b/appconfig/build.gradle.kts @@ -1,3 +1,6 @@ +import config.BuildTimeConfig +import extension.buildConfigFieldStr + /* * Copyright 2022-2024 New Vector Ltd. * @@ -10,6 +13,37 @@ plugins { android { namespace = "io.element.android.appconfig" + + buildFeatures { + buildConfig = true + } + + defaultConfig { + buildConfigFieldStr( + name = "URL_POLICY", + value = if (isEnterpriseBuild) { + BuildTimeConfig.URL_POLICY ?: "" + } else { + "https://element.io/cookie-policy" + }, + ) + buildConfigFieldStr( + name = "BUG_REPORT_URL", + value = if (isEnterpriseBuild) { + BuildTimeConfig.BUG_REPORT_URL ?: "" + } else { + "https://riot.im/bugreports/submit" + }, + ) + buildConfigFieldStr( + name = "BUG_REPORT_APP_NAME", + value = if (isEnterpriseBuild) { + BuildTimeConfig.BUG_REPORT_APP_NAME ?: "" + } else { + "element-x-android" + }, + ) + } } dependencies { diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt index 4b213db637..346fce4725 100644 --- a/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/AnalyticsConfig.kt @@ -8,5 +8,5 @@ package io.element.android.appconfig object AnalyticsConfig { - const val POLICY_LINK = "https://element.io/cookie-policy" + const val POLICY_LINK = BuildConfig.URL_POLICY } diff --git a/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt b/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt index 47d94cc497..8c836bc8a2 100644 --- a/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt +++ b/appconfig/src/main/kotlin/io/element/android/appconfig/RageshakeConfig.kt @@ -11,17 +11,23 @@ object RageshakeConfig { /** * The URL to submit bug reports to. */ - const val BUG_REPORT_URL = "https://riot.im/bugreports/submit" + const val BUG_REPORT_URL = BuildConfig.BUG_REPORT_URL /** * As per https://github.com/matrix-org/rageshake: * Identifier for the application (eg 'riot-web'). * Should correspond to a mapping configured in the configuration file for github issue reporting to work. */ - const val BUG_REPORT_APP_NAME = "element-x-android" + const val BUG_REPORT_APP_NAME = BuildConfig.BUG_REPORT_APP_NAME /** * The maximum size of the upload request. Default value is just below CloudFlare's max request size. */ const val MAX_LOG_UPLOAD_SIZE = 50 * 1024 * 1024L } + +/** + * Whether the rageshake feature is enabled. + */ +val RageshakeConfig.isEnabled: Boolean + get() = BUG_REPORT_URL.isNotEmpty() && BUG_REPORT_APP_NAME.isNotEmpty() diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt index 8e62bdd305..647b205722 100644 --- a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesStateProvider.kt @@ -13,12 +13,17 @@ open class AnalyticsPreferencesStateProvider : PreviewParameterProvider get() = sequenceOf( aAnalyticsPreferencesState().copy(isEnabled = true), + aAnalyticsPreferencesState().copy(isEnabled = true, policyUrl = ""), ) } -fun aAnalyticsPreferencesState() = AnalyticsPreferencesState( - applicationName = "Element X", - isEnabled = false, - policyUrl = "https://element.io", +fun aAnalyticsPreferencesState( + applicationName: String = "Element X", + isEnabled: Boolean = false, + policyUrl: String = "https://element.io", +) = AnalyticsPreferencesState( + applicationName = applicationName, + isEnabled = isEnabled, + policyUrl = policyUrl, eventSink = {} ) diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt index 2e7ee47736..70461f22d3 100644 --- a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt @@ -36,11 +36,6 @@ fun AnalyticsPreferencesView( id = R.string.screen_analytics_settings_help_us_improve, state.applicationName ) - val linkText = buildAnnotatedStringWithStyledPart( - R.string.screen_analytics_settings_read_terms, - R.string.screen_analytics_settings_read_terms_content_link, - tagAndLink = LINK_TAG to state.policyUrl, - ) Column(modifier) { ListItem( headlineContent = { @@ -57,7 +52,14 @@ fun AnalyticsPreferencesView( onEnabledChanged(!state.isEnabled) } ) - ListSupportingText(annotatedString = linkText) + if (state.policyUrl.isNotEmpty()) { + val linkText = buildAnnotatedStringWithStyledPart( + R.string.screen_analytics_settings_read_terms, + R.string.screen_analytics_settings_read_terms_content_link, + tagAndLink = LINK_TAG to state.policyUrl, + ) + ListSupportingText(annotatedString = linkText) + } } } diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenter.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenter.kt index d545d00951..39b99a9257 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenter.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenter.kt @@ -9,6 +9,7 @@ package io.element.android.features.analytics.impl import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope +import io.element.android.appconfig.AnalyticsConfig import io.element.android.features.analytics.api.AnalyticsOptInEvents import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta @@ -36,6 +37,7 @@ class AnalyticsOptInPresenter @Inject constructor( return AnalyticsOptInState( applicationName = buildMeta.applicationName, + hasPolicyLink = AnalyticsConfig.POLICY_LINK.isNotEmpty(), eventSink = ::handleEvents ) } diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInState.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInState.kt index d7e99e56c1..a0913bdb4f 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInState.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInState.kt @@ -11,5 +11,6 @@ import io.element.android.features.analytics.api.AnalyticsOptInEvents data class AnalyticsOptInState( val applicationName: String, + val hasPolicyLink: Boolean, val eventSink: (AnalyticsOptInEvents) -> Unit ) diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt index c159b738a7..e6917c237e 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInStateProvider.kt @@ -14,10 +14,14 @@ open class AnalyticsOptInStateProvider @Inject constructor() : PreviewParameterP override val values: Sequence get() = sequenceOf( aAnalyticsOptInState(), + aAnalyticsOptInState(hasPolicyLink = false), ) } -fun aAnalyticsOptInState() = AnalyticsOptInState( +fun aAnalyticsOptInState( + hasPolicyLink: Boolean = true, +) = AnalyticsOptInState( applicationName = "Element X", + hasPolicyLink = hasPolicyLink, eventSink = {} ) diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt index 3e8b9d98f9..a6ae754944 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt @@ -95,25 +95,27 @@ private fun AnalyticsOptInHeader( subtitle = stringResource(id = R.string.screen_analytics_prompt_help_us_improve), iconStyle = BigIcon.Style.Default(CompoundIcons.Chart()) ) - val text = buildAnnotatedStringWithStyledPart( - R.string.screen_analytics_prompt_read_terms, - R.string.screen_analytics_prompt_read_terms_content_link, - color = Color.Unspecified, - underline = false, - bold = true, - tagAndLink = LINK_TAG to AnalyticsConfig.POLICY_LINK, - ) - ClickableLinkText( - annotatedString = text, - onClick = { onClickTerms() }, - modifier = Modifier - .padding(8.dp), - style = ElementTheme.typography.fontBodyMdRegular - .copy( - color = ElementTheme.colors.textSecondary, - textAlign = TextAlign.Center, - ) - ) + if (state.hasPolicyLink) { + val text = buildAnnotatedStringWithStyledPart( + R.string.screen_analytics_prompt_read_terms, + R.string.screen_analytics_prompt_read_terms_content_link, + color = Color.Unspecified, + underline = false, + bold = true, + tagAndLink = LINK_TAG to AnalyticsConfig.POLICY_LINK, + ) + ClickableLinkText( + annotatedString = text, + onClick = { onClickTerms() }, + modifier = Modifier + .padding(8.dp), + style = ElementTheme.typography.fontBodyMdRegular + .copy( + color = ElementTheme.colors.textSecondary, + textAlign = TextAlign.Center, + ) + ) + } } } diff --git a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt index 30b64eb8ab..8ba915f03c 100644 --- a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt +++ b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenterTest.kt @@ -11,6 +11,7 @@ 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.appconfig.AnalyticsConfig import io.element.android.features.analytics.api.AnalyticsOptInEvents import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.services.analytics.test.FakeAnalyticsService @@ -35,7 +36,7 @@ class AnalyticsPreferencesPresenterTest { skipItems(1) val initialState = awaitItem() assertThat(initialState.isEnabled).isTrue() - assertThat(initialState.policyUrl).isNotEmpty() + assertThat(initialState.policyUrl).isEqualTo(AnalyticsConfig.POLICY_LINK) } } diff --git a/features/location/api/build.gradle.kts b/features/location/api/build.gradle.kts index 909a3c978a..d299887165 100644 --- a/features/location/api/build.gradle.kts +++ b/features/location/api/build.gradle.kts @@ -6,6 +6,7 @@ */ import config.BuildTimeConfig +import extension.buildConfigFieldStr import extension.readLocalProperty plugins { @@ -16,10 +17,17 @@ plugins { android { namespace = "io.element.android.features.location.api" + buildFeatures { + buildConfig = true + } + defaultConfig { - resValue( - type = "string", - name = "maptiler_api_key", + buildConfigFieldStr( + name = "MAPTILER_BASE_URL", + value = BuildTimeConfig.SERVICES_MAPTILER_BASE_URL ?: "https://api.maptiler.com/maps" + ) + buildConfigFieldStr( + name = "MAPTILER_API_KEY", value = if (isEnterpriseBuild) { BuildTimeConfig.SERVICES_MAPTILER_APIKEY } else { @@ -28,9 +36,8 @@ android { } ?: "" ) - resValue( - type = "string", - name = "maptiler_light_map_id", + buildConfigFieldStr( + name = "MAPTILER_LIGHT_MAP_ID", value = if (isEnterpriseBuild) { BuildTimeConfig.SERVICES_MAPTILER_LIGHT_MAPID } else { @@ -40,9 +47,8 @@ android { // fall back to maptiler's default light map. ?: "basic-v2" ) - resValue( - type = "string", - name = "maptiler_dark_map_id", + buildConfigFieldStr( + name = "MAPTILER_DARK_MAP_ID", value = if (isEnterpriseBuild) { BuildTimeConfig.SERVICES_MAPTILER_DARK_MAPID } else { diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/StaticMapView.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/StaticMapView.kt index e80386a9c5..382a65ae47 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/StaticMapView.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/StaticMapView.kt @@ -57,7 +57,7 @@ fun StaticMapView( ) { val context = LocalContext.current var retryHash by remember { mutableIntStateOf(0) } - val builder = remember { StaticMapUrlBuilder(context) } + val builder = remember { StaticMapUrlBuilder() } val painter = rememberAsyncImagePainter( model = if (constraints.isZero) { // Avoid building a URL if any of the size constraints is zero (else it will thrown an exception). diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerConfig.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerConfig.kt deleted file mode 100644 index 9580280d74..0000000000 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerConfig.kt +++ /dev/null @@ -1,21 +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. - */ - -package io.element.android.features.location.api.internal - -import android.content.Context -import io.element.android.features.location.api.R - -internal const val MAPTILER_BASE_URL = "https://api.maptiler.com/maps" - -internal fun Context.mapId(darkMode: Boolean) = when (darkMode) { - true -> getString(R.string.maptiler_dark_map_id) - false -> getString(R.string.maptiler_light_map_id) -} - -internal val Context.apiKey: String - get() = getString(R.string.maptiler_api_key) diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilder.kt index 20c0466e13..eb8d0ea1b7 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilder.kt @@ -7,7 +7,7 @@ package io.element.android.features.location.api.internal -import android.content.Context +import io.element.android.features.location.api.BuildConfig import kotlin.math.roundToInt /** @@ -16,14 +16,16 @@ import kotlin.math.roundToInt * https://docs.maptiler.com/cloud/api/static-maps/ */ internal class MapTilerStaticMapUrlBuilder( + private val baseUrl: String, private val apiKey: String, private val lightMapId: String, private val darkMapId: String, ) : StaticMapUrlBuilder { - constructor(context: Context) : this( - apiKey = context.apiKey, - lightMapId = context.mapId(darkMode = false), - darkMapId = context.mapId(darkMode = true), + constructor() : this( + baseUrl = BuildConfig.MAPTILER_BASE_URL.removeSuffix("/"), + apiKey = BuildConfig.MAPTILER_API_KEY, + lightMapId = BuildConfig.MAPTILER_LIGHT_MAP_ID, + darkMapId = BuildConfig.MAPTILER_DARK_MAP_ID, ) override fun build( @@ -55,7 +57,7 @@ internal class MapTilerStaticMapUrlBuilder( // image smaller than the available space in pixels. // The resulting image will have to be scaled to fit the available space in order // to keep the perceived content size constant at the expense of sharpness. - return "$MAPTILER_BASE_URL/$mapId/static/$lon,$lat,$finalZoom/${finalWidth}x${finalHeight}$scale.webp?key=$apiKey&attribution=bottomleft" + return "$baseUrl/$mapId/static/$lon,$lat,$finalZoom/${finalWidth}x${finalHeight}$scale.webp?key=$apiKey&attribution=bottomleft" } override fun isServiceAvailable() = apiKey.isNotEmpty() diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilder.kt index 3146d589e4..db75b5e30a 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilder.kt @@ -9,21 +9,23 @@ package io.element.android.features.location.api.internal -import android.content.Context +import io.element.android.features.location.api.BuildConfig internal class MapTilerTileServerStyleUriBuilder( + private val baseUrl: String, private val apiKey: String, private val lightMapId: String, private val darkMapId: String, ) : TileServerStyleUriBuilder { - constructor(context: Context) : this( - apiKey = context.apiKey, - lightMapId = context.mapId(darkMode = false), - darkMapId = context.mapId(darkMode = true), + constructor() : this( + baseUrl = BuildConfig.MAPTILER_BASE_URL.removeSuffix("/"), + apiKey = BuildConfig.MAPTILER_API_KEY, + lightMapId = BuildConfig.MAPTILER_LIGHT_MAP_ID, + darkMapId = BuildConfig.MAPTILER_DARK_MAP_ID, ) override fun build(darkMode: Boolean): String { val mapId = if (darkMode) darkMapId else lightMapId - return "$MAPTILER_BASE_URL/$mapId/style.json?key=$apiKey" + return "$baseUrl/$mapId/style.json?key=$apiKey" } } diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapUrlBuilder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapUrlBuilder.kt index e52205c2f3..533ecf8d2d 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapUrlBuilder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapUrlBuilder.kt @@ -7,8 +7,6 @@ package io.element.android.features.location.api.internal -import android.content.Context - /** * Builds an URL for a 3rd party service provider static maps API. */ @@ -26,4 +24,4 @@ interface StaticMapUrlBuilder { fun isServiceAvailable(): Boolean } -fun StaticMapUrlBuilder(context: Context): StaticMapUrlBuilder = MapTilerStaticMapUrlBuilder(context = context) +fun StaticMapUrlBuilder(): StaticMapUrlBuilder = MapTilerStaticMapUrlBuilder() diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/TileServerStyleUriBuilder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/TileServerStyleUriBuilder.kt index 4d93a8d8bb..051b2448d4 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/TileServerStyleUriBuilder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/TileServerStyleUriBuilder.kt @@ -7,10 +7,8 @@ package io.element.android.features.location.api.internal -import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext import io.element.android.compound.theme.ElementTheme /** @@ -24,7 +22,7 @@ interface TileServerStyleUriBuilder { ): String } -fun TileServerStyleUriBuilder(context: Context): TileServerStyleUriBuilder = MapTilerTileServerStyleUriBuilder(context = context) +fun TileServerStyleUriBuilder(): TileServerStyleUriBuilder = MapTilerTileServerStyleUriBuilder() /** * Provides and remembers a style URI for a MapLibre compatible tile server. @@ -33,9 +31,8 @@ fun TileServerStyleUriBuilder(context: Context): TileServerStyleUriBuilder = Map */ @Composable fun rememberTileStyleUrl(): String { - val context = LocalContext.current val darkMode = !ElementTheme.isLightTheme return remember(darkMode) { - TileServerStyleUriBuilder(context).build(darkMode) + TileServerStyleUriBuilder().build(darkMode) } } diff --git a/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilderTest.kt b/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilderTest.kt index b74cebf1e7..ba44426a70 100644 --- a/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilderTest.kt +++ b/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerStaticMapUrlBuilderTest.kt @@ -12,6 +12,7 @@ import org.junit.Test class MapTilerStaticMapUrlBuilderTest { private val builder = MapTilerStaticMapUrlBuilder( + baseUrl = "https://base.url", apiKey = "anApiKey", lightMapId = "aLightMapId", darkMapId = "aDarkMapId", @@ -25,6 +26,7 @@ class MapTilerStaticMapUrlBuilderTest { @Test fun `isServiceAvailable returns false if api key is empty`() { val builderWithoutKey = MapTilerStaticMapUrlBuilder( + baseUrl = "https://base.url", apiKey = "", lightMapId = "aLightMapId", darkMapId = "aDarkMapId", @@ -44,7 +46,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 600, density = 1f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/800x600.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/800x600.webp?key=anApiKey&attribution=bottomleft") } @Test @@ -59,7 +61,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 900, density = 1.5f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/800x600.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/800x600.webp?key=anApiKey&attribution=bottomleft") } @Test @@ -74,7 +76,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 1200, density = 2f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/800x600@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/800x600@2x.webp?key=anApiKey&attribution=bottomleft") } @Test @@ -89,7 +91,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 1800, density = 3f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/800x600@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/800x600@2x.webp?key=anApiKey&attribution=bottomleft") } @Test @@ -104,7 +106,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 2048, density = 1f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/2048x1024.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/2048x1024.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -116,7 +118,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 4096, density = 1f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/1024x2048.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/1024x2048.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -128,7 +130,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 2048, density = 2f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/1024x512@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/1024x512@2x.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -140,7 +142,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 4096, density = 2f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/512x1024@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/512x1024@2x.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -152,7 +154,7 @@ class MapTilerStaticMapUrlBuilderTest { height = Int.MAX_VALUE, density = 2f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/1024x1024@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/1024x1024@2x.webp?key=anApiKey&attribution=bottomleft") } @Test @@ -167,7 +169,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 0, density = 1f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/0x0.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/0x0.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -179,7 +181,7 @@ class MapTilerStaticMapUrlBuilderTest { height = 0, density = 2f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/0x0@2x.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/0x0@2x.webp?key=anApiKey&attribution=bottomleft") assertThat( builder.build( @@ -191,6 +193,6 @@ class MapTilerStaticMapUrlBuilderTest { height = Int.MIN_VALUE, density = 1f, ) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/static/-4.56,1.23,7.8/0x0.webp?key=anApiKey&attribution=bottomleft") + ).isEqualTo("https://base.url/aLightMapId/static/-4.56,1.23,7.8/0x0.webp?key=anApiKey&attribution=bottomleft") } } diff --git a/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilderTest.kt b/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilderTest.kt index f65c044540..dc53765836 100644 --- a/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilderTest.kt +++ b/features/location/api/src/test/kotlin/io/element/android/features/location/api/internal/MapTilerTileServerStyleUriBuilderTest.kt @@ -12,6 +12,7 @@ import org.junit.Test class MapTilerTileServerStyleUriBuilderTest { private val builder = MapTilerTileServerStyleUriBuilder( + baseUrl = "https://base.url", apiKey = "anApiKey", lightMapId = "aLightMapId", darkMapId = "aDarkMapId", @@ -21,13 +22,13 @@ class MapTilerTileServerStyleUriBuilderTest { fun `light map uri`() { assertThat( builder.build(darkMode = false) - ).isEqualTo("https://api.maptiler.com/maps/aLightMapId/style.json?key=anApiKey") + ).isEqualTo("https://base.url/aLightMapId/style.json?key=anApiKey") } @Test fun `dark map uri`() { assertThat( builder.build(darkMode = true) - ).isEqualTo("https://api.maptiler.com/maps/aDarkMapId/style.json?key=anApiKey") + ).isEqualTo("https://base.url/aDarkMapId/style.json?key=anApiKey") } } diff --git a/features/location/impl/build.gradle.kts b/features/location/impl/build.gradle.kts index 8a47e77b1a..4c62bdff1a 100644 --- a/features/location/impl/build.gradle.kts +++ b/features/location/impl/build.gradle.kts @@ -49,7 +49,6 @@ dependencies { testImplementation(projects.libraries.testtags) testImplementation(projects.services.analytics.test) testImplementation(projects.features.messages.test) - testImplementation(projects.services.toolbox.test) testImplementation(projects.tests.testutils) testImplementation(libs.androidx.compose.ui.test.junit) testReleaseImplementation(libs.androidx.compose.ui.test.manifest) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/DefaultLocationService.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/DefaultLocationService.kt index 1a9359b301..e662ef8115 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/DefaultLocationService.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/DefaultLocationService.kt @@ -8,17 +8,14 @@ package io.element.android.features.location.impl import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.location.api.BuildConfig import io.element.android.features.location.api.LocationService -import io.element.android.features.location.api.R import io.element.android.libraries.di.AppScope -import io.element.android.services.toolbox.api.strings.StringProvider import javax.inject.Inject @ContributesBinding(AppScope::class) -class DefaultLocationService @Inject constructor( - private val stringProvider: StringProvider, -) : LocationService { +class DefaultLocationService @Inject constructor() : LocationService { override fun isServiceAvailable(): Boolean { - return stringProvider.getString(R.string.maptiler_api_key).isNotEmpty() + return BuildConfig.MAPTILER_API_KEY.isNotEmpty() } } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/DefaultLocationServiceTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/DefaultLocationServiceTest.kt index 213ce52ac5..fd687dd938 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/DefaultLocationServiceTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/DefaultLocationServiceTest.kt @@ -8,30 +8,15 @@ package io.element.android.features.location.impl import com.google.common.truth.Truth.assertThat -import io.element.android.features.location.api.R -import io.element.android.services.toolbox.test.strings.FakeStringProvider +import io.element.android.features.location.api.BuildConfig import org.junit.Test class DefaultLocationServiceTest { @Test - fun `if apiKey is empty, isServiceAvailable should return false`() { - val fakeStringProvider = FakeStringProvider( - defaultResult = "" + fun `isServiceAvailable should return value depending on BuildConfig MAPTILER_API_KEY`() { + val locationService = DefaultLocationService() + assertThat(locationService.isServiceAvailable()).isEqualTo( + BuildConfig.MAPTILER_API_KEY.isNotEmpty() ) - val locationService = DefaultLocationService( - stringProvider = fakeStringProvider, - ) - assertThat(locationService.isServiceAvailable()).isFalse() - assertThat(fakeStringProvider.lastResIdParam).isEqualTo(R.string.maptiler_api_key) - } - - @Test - fun `if apiKey is not empty, isServiceAvailable should return true`() { - val locationService = DefaultLocationService( - stringProvider = FakeStringProvider( - defaultResult = "aKey" - ) - ) - assertThat(locationService.isServiceAvailable()).isTrue() } } diff --git a/features/onboarding/impl/build.gradle.kts b/features/onboarding/impl/build.gradle.kts index 13e37e0a54..c59cd5684b 100644 --- a/features/onboarding/impl/build.gradle.kts +++ b/features/onboarding/impl/build.gradle.kts @@ -26,6 +26,7 @@ setupAnvil() dependencies { implementation(projects.appconfig) + implementation(projects.features.rageshake.api) implementation(projects.libraries.core) implementation(projects.libraries.androidutils) implementation(projects.libraries.architecture) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt index 8d33f60393..481ad6edc6 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt @@ -10,7 +10,9 @@ package io.element.android.features.onboarding.impl import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember import io.element.android.appconfig.OnBoardingConfig +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.featureflag.api.FeatureFlagService @@ -24,16 +26,19 @@ import javax.inject.Inject class OnBoardingPresenter @Inject constructor( private val buildMeta: BuildMeta, private val featureFlagService: FeatureFlagService, + private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, ) : Presenter { @Composable override fun present(): OnBoardingState { val canLoginWithQrCode by produceState(initialValue = false) { value = featureFlagService.isFeatureEnabled(FeatureFlags.QrCodeLogin) } + val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() } return OnBoardingState( productionApplicationName = buildMeta.productionApplicationName, canLoginWithQrCode = canLoginWithQrCode, canCreateAccount = OnBoardingConfig.CAN_CREATE_ACCOUNT, + canReportBug = canReportBug, ) } } diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt index 6ffb80c2bd..3a5afb741c 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt @@ -11,4 +11,5 @@ data class OnBoardingState( val productionApplicationName: String, val canLoginWithQrCode: Boolean, val canCreateAccount: Boolean, + val canReportBug: Boolean, ) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt index 25dc697782..d65b6aa2bf 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt @@ -16,15 +16,18 @@ open class OnBoardingStateProvider : PreviewParameterProvider { anOnBoardingState(canLoginWithQrCode = true), anOnBoardingState(canCreateAccount = true), anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true), + anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true, canReportBug = true), ) } fun anOnBoardingState( productionApplicationName: String = "Element", canLoginWithQrCode: Boolean = false, - canCreateAccount: Boolean = false + canCreateAccount: Boolean = false, + canReportBug: Boolean = false, ) = OnBoardingState( productionApplicationName = productionApplicationName, canLoginWithQrCode = canLoginWithQrCode, - canCreateAccount = canCreateAccount + canCreateAccount = canCreateAccount, + canReportBug = canReportBug, ) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt index 95a8e2618d..44ab2d84a5 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt @@ -144,8 +144,8 @@ private fun OnBoardingButtons( text = stringResource(id = signInButtonStringRes), onClick = onSignIn, modifier = Modifier - .fillMaxWidth() - .testTag(TestTags.onBoardingSignIn) + .fillMaxWidth() + .testTag(TestTags.onBoardingSignIn) ) if (state.canCreateAccount) { TextButton( @@ -155,15 +155,17 @@ private fun OnBoardingButtons( .fillMaxWidth() ) } - // Add a report problem text button. Use a Text since we need a special theme here. - Text( - modifier = Modifier + if (state.canReportBug) { + // 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), - text = stringResource(id = CommonStrings.common_report_a_problem), - style = ElementTheme.typography.fontBodySmRegular, - color = ElementTheme.colors.textSecondary, - ) + text = stringResource(id = CommonStrings.common_report_a_problem), + style = ElementTheme.typography.fontBodySmRegular, + color = ElementTheme.colors.textSecondary, + ) + } } } diff --git a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt index e98fbff3db..b692d291b5 100644 --- a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt +++ b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenterTest.kt @@ -16,6 +16,7 @@ import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.test import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -38,6 +39,7 @@ class OnBoardingPresenterTest { val presenter = OnBoardingPresenter( buildMeta = buildMeta, featureFlagService = featureFlagService, + rageshakeFeatureAvailability = { true }, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -46,7 +48,21 @@ class OnBoardingPresenterTest { assertThat(initialState.canLoginWithQrCode).isFalse() assertThat(initialState.productionApplicationName).isEqualTo("B") assertThat(initialState.canCreateAccount).isEqualTo(OnBoardingConfig.CAN_CREATE_ACCOUNT) + assertThat(initialState.canReportBug).isTrue() assertThat(awaitItem().canLoginWithQrCode).isTrue() } } + + @Test + fun `present - rageshake not available`() = runTest { + val presenter = OnBoardingPresenter( + buildMeta = aBuildMeta(), + featureFlagService = FakeFeatureFlagService(), + rageshakeFeatureAvailability = { false }, + ) + presenter.test { + skipItems(1) + assertThat(awaitItem().canReportBug).isFalse() + } + } } diff --git a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnboardingViewTest.kt b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnboardingViewTest.kt index 25cb075697..955bbea1f1 100644 --- a/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnboardingViewTest.kt +++ b/features/onboarding/impl/src/test/kotlin/io/element/android/features/onboarding/impl/OnboardingViewTest.kt @@ -10,6 +10,7 @@ package io.element.android.features.onboarding.impl import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText import androidx.test.ext.junit.runners.AndroidJUnit4 import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.tests.testutils.EnsureNeverCalled @@ -76,13 +77,28 @@ class OnboardingViewTest { fun `clicking on report a problem calls the sign in callback`() { ensureCalledOnce { callback -> rule.setOnboardingView( - state = anOnBoardingState(), + state = anOnBoardingState( + canReportBug = true, + ), onReportProblem = callback, ) + val text = rule.activity.getString(CommonStrings.common_report_a_problem) + rule.onNodeWithText(text).assertExists() rule.clickOn(CommonStrings.common_report_a_problem) } } + @Test + fun `cannot report a problem when the feature is disabled`() { + rule.setOnboardingView( + state = anOnBoardingState( + canReportBug = false, + ), + ) + val text = rule.activity.getString(CommonStrings.common_report_a_problem) + rule.onNodeWithText(text).assertDoesNotExist() + } + private fun AndroidComposeTestRule.setOnboardingView( state: OnBoardingState, onSignInWithQrCode: () -> Unit = EnsureNeverCalled(), diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index bbe96ecb80..c1f32affa3 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -1,3 +1,5 @@ +import config.BuildTimeConfig +import extension.buildConfigFieldStr import extension.setupAnvil /* @@ -19,6 +21,25 @@ android { isIncludeAndroidResources = true } } + + buildFeatures { + buildConfig = true + } + + defaultConfig { + buildConfigFieldStr( + name = "URL_COPYRIGHT", + value = BuildTimeConfig.URL_COPYRIGHT ?: "https://element.io/copyright", + ) + buildConfigFieldStr( + name = "URL_ACCEPTABLE_USE", + value = BuildTimeConfig.URL_ACCEPTABLE_USE ?: "https://element.io/acceptable-use-policy-terms", + ) + buildConfigFieldStr( + name = "URL_PRIVACY", + value = BuildTimeConfig.URL_PRIVACY ?: "https://element.io/privacy", + ) + } } setupAnvil() diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/ElementLegal.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/ElementLegal.kt index a94e1637ba..a5de31f05d 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/ElementLegal.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/about/ElementLegal.kt @@ -8,11 +8,12 @@ package io.element.android.features.preferences.impl.about import androidx.annotation.StringRes +import io.element.android.features.preferences.impl.BuildConfig import io.element.android.libraries.ui.strings.CommonStrings -private const val COPYRIGHT_URL = "https://element.io/copyright" -private const val USE_POLICY_URL = "https://element.io/acceptable-use-policy-terms" -private const val PRIVACY_URL = "https://element.io/privacy" +private const val COPYRIGHT_URL = BuildConfig.URL_COPYRIGHT +private const val USE_POLICY_URL = BuildConfig.URL_ACCEPTABLE_USE +private const val PRIVACY_URL = BuildConfig.URL_PRIVACY sealed class ElementLegal( @StringRes val titleRes: Int, 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 ae5267de0f..15a55f41ca 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 @@ -18,6 +18,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider +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 @@ -44,6 +45,7 @@ class PreferencesRootPresenter @Inject constructor( private val indicatorService: IndicatorService, private val directLogoutPresenter: Presenter, private val showDeveloperSettingsProvider: ShowDeveloperSettingsProvider, + private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, ) : Presenter { @Composable override fun present(): PreferencesRootState { @@ -79,6 +81,7 @@ class PreferencesRootPresenter @Inject constructor( var canDeactivateAccount by remember { mutableStateOf(false) } + val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() } LaunchedEffect(Unit) { canDeactivateAccount = matrixClient.canDeactivateAccount() } @@ -114,6 +117,7 @@ class PreferencesRootPresenter @Inject constructor( accountManagementUrl = accountManagementUrl.value, devicesManagementUrl = devicesManagementUrl.value, showAnalyticsSettings = hasAnalyticsProviders, + canReportBug = canReportBug, showDeveloperSettings = showDeveloperSettings, canDeactivateAccount = canDeactivateAccount, showNotificationSettings = showNotificationSettings.value, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt index 9a16e6f65b..2e5cb4fa14 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt @@ -20,6 +20,7 @@ data class PreferencesRootState( val showSecureBackupBadge: Boolean, val accountManagementUrl: String?, val devicesManagementUrl: String?, + val canReportBug: Boolean, val showAnalyticsSettings: Boolean, val showDeveloperSettings: Boolean, val canDeactivateAccount: Boolean, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt index e4ca550777..43307e9988 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt @@ -25,6 +25,7 @@ fun aPreferencesRootState( accountManagementUrl = "aUrl", devicesManagementUrl = "anOtherUrl", showAnalyticsSettings = true, + canReportBug = true, showDeveloperSettings = true, showNotificationSettings = true, showLockScreenSettings = true, 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 236d659f33..b63919cd26 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 @@ -202,11 +202,13 @@ private fun ColumnScope.GeneralSection( leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Info())), onClick = onOpenAbout, ) - ListItem( - headlineContent = { Text(stringResource(id = CommonStrings.common_report_a_problem)) }, - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ChatProblem())), - onClick = onOpenRageShake - ) + if (state.canReportBug) { + ListItem( + headlineContent = { Text(stringResource(id = CommonStrings.common_report_a_problem)) }, + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ChatProblem())), + onClick = onOpenRageShake + ) + } if (state.showAnalyticsSettings) { ListItem( headlineContent = { Text(stringResource(id = CommonStrings.common_analytics)) }, diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt index 72ae8bdb10..8075a43485 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt @@ -13,6 +13,7 @@ import app.cash.turbine.ReceiveTurbine import com.google.common.truth.Truth.assertThat import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -78,6 +79,7 @@ class PreferencesRootPresenterTest { assertThat(loadedState.showLockScreenSettings).isTrue() assertThat(loadedState.showNotificationSettings).isTrue() assertThat(loadedState.canDeactivateAccount).isTrue() + assertThat(loadedState.canReportBug).isTrue() assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState()) assertThat(loadedState.snackbarMessage).isNull() skipItems(1) @@ -92,6 +94,22 @@ class PreferencesRootPresenterTest { } } + @Test + fun `present - cannot report bug`() = runTest { + val matrixClient = FakeMatrixClient( + canDeactivateAccountResult = { true }, + accountManagementUrlResult = { Result.success("") }, + ) + createPresenter( + matrixClient = matrixClient, + rageshakeFeatureAvailability = { false }, + ).test { + val initialState = awaitItem() + assertThat(initialState.canReportBug).isFalse() + skipItems(1) + } + } + @Test fun `present - can deactivate account is false if the Matrix client say so`() = runTest { createPresenter( @@ -146,6 +164,7 @@ class PreferencesRootPresenterTest { matrixClient: FakeMatrixClient = FakeMatrixClient(), sessionVerificationService: FakeSessionVerificationService = FakeSessionVerificationService(), showDeveloperSettingsProvider: ShowDeveloperSettingsProvider = ShowDeveloperSettingsProvider(aBuildMeta(BuildType.DEBUG)), + rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true }, ) = PreferencesRootPresenter( matrixClient = matrixClient, sessionVerificationService = sessionVerificationService, @@ -159,5 +178,6 @@ class PreferencesRootPresenterTest { ), directLogoutPresenter = { aDirectLogoutState() }, showDeveloperSettingsProvider = showDeveloperSettingsProvider, + rageshakeFeatureAvailability = rageshakeFeatureAvailability, ) } diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/RageshakeFeatureAvailability.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/RageshakeFeatureAvailability.kt new file mode 100644 index 0000000000..34e740d4ab --- /dev/null +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/RageshakeFeatureAvailability.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.rageshake.api + +fun interface RageshakeFeatureAvailability { + fun isAvailable(): Boolean +} diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesState.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesState.kt index 9207d5ff38..40a9d0282b 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesState.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesState.kt @@ -8,6 +8,7 @@ package io.element.android.features.rageshake.api.preferences data class RageshakePreferencesState( + val isFeatureEnabled: Boolean, val isEnabled: Boolean, val isSupported: Boolean, val sensitivity: Float, diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesStateProvider.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesStateProvider.kt index d18123cd8d..a98c75a02a 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesStateProvider.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesStateProvider.kt @@ -12,14 +12,21 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider open class RageshakePreferencesStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( - aRageshakePreferencesState().copy(isEnabled = true, isSupported = true, sensitivity = 0.5f), - aRageshakePreferencesState().copy(isEnabled = true, isSupported = false, sensitivity = 0.5f), + aRageshakePreferencesState(isEnabled = true, isSupported = true, sensitivity = 0.5f), + aRageshakePreferencesState(isEnabled = true, isSupported = false, sensitivity = 0.5f), ) } -fun aRageshakePreferencesState() = RageshakePreferencesState( - isEnabled = false, - isSupported = true, - sensitivity = 0.3f, - eventSink = {} +fun aRageshakePreferencesState( + isFeatureEnabled: Boolean = true, + isEnabled: Boolean = false, + isSupported: Boolean = true, + sensitivity: Float = 0.3f, + eventSink: (RageshakePreferencesEvents) -> Unit = {} +) = RageshakePreferencesState( + isFeatureEnabled = isFeatureEnabled, + isEnabled = isEnabled, + isSupported = isSupported, + sensitivity = sensitivity, + eventSink = eventSink, ) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt index 0841e097ba..86f1c05247 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt @@ -36,28 +36,30 @@ fun RageshakePreferencesView( } Column(modifier = modifier) { - PreferenceCategory(title = stringResource(id = R.string.settings_rageshake)) { - if (state.isSupported) { - PreferenceSwitch( - title = stringResource(id = CommonStrings.preference_rageshake), - isChecked = state.isEnabled, - onCheckedChange = ::onEnabledChanged - ) - PreferenceSlide( - title = stringResource(id = R.string.settings_rageshake_detection_threshold), - // summary = stringResource(id = CommonStrings.settings_rageshake_detection_threshold_summary), - value = state.sensitivity, - enabled = state.isEnabled, - // 5 possible values - steps are in ]0, 1[ - steps = 3, - onValueChange = ::onSensitivityChanged - ) - } else { - ListItem( - headlineContent = { - Text("Rageshaking is not supported by your device") - }, - ) + if (state.isFeatureEnabled) { + PreferenceCategory(title = stringResource(id = R.string.settings_rageshake)) { + if (state.isSupported) { + PreferenceSwitch( + title = stringResource(id = CommonStrings.preference_rageshake), + isChecked = state.isEnabled, + onCheckedChange = ::onEnabledChanged + ) + PreferenceSlide( + title = stringResource(id = R.string.settings_rageshake_detection_threshold), + // summary = stringResource(id = CommonStrings.settings_rageshake_detection_threshold_summary), + value = state.sensitivity, + enabled = state.isEnabled, + // 5 possible values - steps are in ]0, 1[ + steps = 3, + onValueChange = ::onSensitivityChanged + ) + } else { + ListItem( + headlineContent = { + Text("Rageshaking is not supported by your device") + }, + ) + } } } } diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailability.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailability.kt new file mode 100644 index 0000000000..5f7548e9ec --- /dev/null +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/DefaultRageshakeFeatureAvailability.kt @@ -0,0 +1,22 @@ +/* + * 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.rageshake.impl + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.appconfig.RageshakeConfig +import io.element.android.appconfig.isEnabled +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class DefaultRageshakeFeatureAvailability @Inject constructor() : RageshakeFeatureAvailability { + override fun isAvailable(): Boolean { + return RageshakeConfig.isEnabled + } +} diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt index 88bba32f23..294fc194d5 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt @@ -16,10 +16,10 @@ import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable -import io.element.android.features.rageshake.api.crash.CrashDataStore import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.features.rageshake.api.reporter.BugReporterListener -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder +import io.element.android.features.rageshake.impl.crash.CrashDataStore +import io.element.android.features.rageshake.impl.screenshot.ScreenshotHolder import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import kotlinx.coroutines.CoroutineScope diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/CrashDataStore.kt similarity index 88% rename from features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDataStore.kt rename to features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/CrashDataStore.kt index 5a13f44a0a..3d6df9a424 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/CrashDataStore.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.api.crash +package io.element.android.features.rageshake.impl.crash import kotlinx.coroutines.flow.Flow diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt index 749ba4255c..fffb87722a 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/DefaultCrashDetectionPresenter.kt @@ -9,15 +9,17 @@ package io.element.android.features.rageshake.impl.crash import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.rageshake.api.crash.CrashDataStore +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.features.rageshake.api.crash.CrashDetectionEvents import io.element.android.features.rageshake.api.crash.CrashDetectionPresenter import io.element.android.features.rageshake.api.crash.CrashDetectionState import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.AppScope import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import javax.inject.Inject @@ -25,12 +27,18 @@ import javax.inject.Inject class DefaultCrashDetectionPresenter @Inject constructor( private val buildMeta: BuildMeta, private val crashDataStore: CrashDataStore, -) : - CrashDetectionPresenter { + private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, +) : CrashDetectionPresenter { @Composable override fun present(): CrashDetectionState { val localCoroutineScope = rememberCoroutineScope() - val crashDetected = crashDataStore.appHasCrashed().collectAsState(initial = false) + val crashDetected = remember { + if (rageshakeFeatureAvailability.isAvailable()) { + crashDataStore.appHasCrashed() + } else { + flowOf(false) + } + }.collectAsState(false) fun handleEvents(event: CrashDetectionEvents) { when (event) { diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt index 2cdea62b1a..0b86bb4ef0 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/crash/PreferencesCrashDataStore.kt @@ -15,7 +15,6 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.rageshake.api.crash.CrashDataStore import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/detection/DefaultRageshakeDetectionPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/detection/DefaultRageshakeDetectionPresenter.kt index 29785d34fe..1a8aed7051 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/detection/DefaultRageshakeDetectionPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/detection/DefaultRageshakeDetectionPresenter.kt @@ -20,9 +20,9 @@ import io.element.android.features.rageshake.api.detection.RageshakeDetectionPre import io.element.android.features.rageshake.api.detection.RageshakeDetectionState import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents import io.element.android.features.rageshake.api.preferences.RageshakePreferencesPresenter -import io.element.android.features.rageshake.api.rageshake.RageShake import io.element.android.features.rageshake.api.screenshot.ImageResult -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder +import io.element.android.features.rageshake.impl.rageshake.RageShake +import io.element.android.features.rageshake.impl.screenshot.ScreenshotHolder import io.element.android.libraries.di.AppScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -75,7 +75,8 @@ class DefaultRageshakeDetectionPresenter @Inject constructor( LaunchedEffect(preferencesState.sensitivity) { rageShake.setSensitivity(preferencesState.sensitivity) } - val shouldStart = preferencesState.isEnabled && + val shouldStart = preferencesState.isFeatureEnabled && + preferencesState.isEnabled && preferencesState.isSupported && isStarted.value && !takeScreenshot.value && diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt index e129bed8d5..ba883b50a9 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt @@ -11,14 +11,16 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents import io.element.android.features.rageshake.api.preferences.RageshakePreferencesPresenter import io.element.android.features.rageshake.api.preferences.RageshakePreferencesState -import io.element.android.features.rageshake.api.rageshake.RageShake -import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore +import io.element.android.features.rageshake.impl.rageshake.RageShake +import io.element.android.features.rageshake.impl.rageshake.RageshakeDataStore import io.element.android.libraries.di.AppScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -28,6 +30,7 @@ import javax.inject.Inject class DefaultRageshakePreferencesPresenter @Inject constructor( private val rageshake: RageShake, private val rageshakeDataStore: RageshakeDataStore, + private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, ) : RageshakePreferencesPresenter { @Composable override fun present(): RageshakePreferencesState { @@ -35,6 +38,7 @@ class DefaultRageshakePreferencesPresenter @Inject constructor( val isSupported: MutableState = rememberSaveable { mutableStateOf(rageshake.isAvailable()) } + val isFeatureAvailable = remember { rageshakeFeatureAvailability.isAvailable() } val isEnabled = rageshakeDataStore .isEnabled() .collectAsState(initial = false) @@ -51,6 +55,7 @@ class DefaultRageshakePreferencesPresenter @Inject constructor( } return RageshakePreferencesState( + isFeatureEnabled = isFeatureAvailable, isEnabled = isEnabled.value, isSupported = isSupported.value, sensitivity = sensitivity.value, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/DefaultRageShake.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/DefaultRageShake.kt index 21c5fffdb7..651b71c079 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/DefaultRageShake.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/DefaultRageShake.kt @@ -13,7 +13,6 @@ import android.hardware.SensorManager import androidx.core.content.getSystemService import com.squareup.anvil.annotations.ContributesBinding import com.squareup.seismic.ShakeDetector -import io.element.android.features.rageshake.api.rageshake.RageShake import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt index f9379de16d..9d7171b8a0 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/PreferencesRageshakeDataStore.kt @@ -15,7 +15,6 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.floatPreferencesKey import androidx.datastore.preferences.preferencesDataStore import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageShake.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageShake.kt similarity index 91% rename from features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageShake.kt rename to features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageShake.kt index 548d11a41d..d75d5e5666 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageShake.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageShake.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.api.rageshake +package io.element.android.features.rageshake.impl.rageshake interface RageShake { /** diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageshakeDataStore.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageshakeDataStore.kt similarity index 88% rename from features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageshakeDataStore.kt rename to features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageshakeDataStore.kt index a59c3670d8..f13419bfb2 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/rageshake/RageshakeDataStore.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/rageshake/RageshakeDataStore.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.api.rageshake +package io.element.android.features.rageshake.impl.rageshake import kotlinx.coroutines.flow.Flow diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt index 4ec8500417..36ece91408 100755 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt @@ -13,10 +13,10 @@ import androidx.core.net.toFile import androidx.core.net.toUri import com.squareup.anvil.annotations.ContributesBinding import io.element.android.appconfig.RageshakeConfig -import io.element.android.features.rageshake.api.crash.CrashDataStore import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.features.rageshake.api.reporter.BugReporterListener -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder +import io.element.android.features.rageshake.impl.crash.CrashDataStore +import io.element.android.features.rageshake.impl.screenshot.ScreenshotHolder import io.element.android.libraries.androidutils.file.compressFile import io.element.android.libraries.androidutils.file.safeDelete import io.element.android.libraries.core.coroutine.CoroutineDispatchers diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/DefaultScreenshotHolder.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/DefaultScreenshotHolder.kt index 270c5628b3..dd3674ab26 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/DefaultScreenshotHolder.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/DefaultScreenshotHolder.kt @@ -11,7 +11,6 @@ import android.content.Context import android.graphics.Bitmap import androidx.core.net.toUri import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder import io.element.android.libraries.androidutils.bitmap.writeBitmap import io.element.android.libraries.androidutils.file.safeDelete import io.element.android.libraries.di.AppScope diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/screenshot/ScreenshotHolder.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/ScreenshotHolder.kt similarity index 84% rename from features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/screenshot/ScreenshotHolder.kt rename to features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/ScreenshotHolder.kt index 9a7e64da59..c746a573d3 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/screenshot/ScreenshotHolder.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/screenshot/ScreenshotHolder.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.api.screenshot +package io.element.android.features.rageshake.impl.screenshot import android.graphics.Bitmap diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt index cae6f6e500..027e2fb38c 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenterTest.kt @@ -11,13 +11,13 @@ 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.rageshake.api.crash.CrashDataStore import io.element.android.features.rageshake.api.reporter.BugReporter -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder -import io.element.android.features.rageshake.test.crash.A_CRASH_DATA -import io.element.android.features.rageshake.test.crash.FakeCrashDataStore -import io.element.android.features.rageshake.test.screenshot.A_SCREENSHOT_URI -import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder +import io.element.android.features.rageshake.impl.crash.A_CRASH_DATA +import io.element.android.features.rageshake.impl.crash.CrashDataStore +import io.element.android.features.rageshake.impl.crash.FakeCrashDataStore +import io.element.android.features.rageshake.impl.screenshot.A_SCREENSHOT_URI +import io.element.android.features.rageshake.impl.screenshot.FakeScreenshotHolder +import io.element.android.features.rageshake.impl.screenshot.ScreenshotHolder import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.test.A_FAILURE_REASON import io.element.android.tests.testutils.WarmUpRule diff --git a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/crash/FakeCrashDataStore.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/FakeCrashDataStore.kt similarity index 88% rename from features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/crash/FakeCrashDataStore.kt rename to features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/FakeCrashDataStore.kt index 145e582dec..1a89a52bf7 100644 --- a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/crash/FakeCrashDataStore.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/FakeCrashDataStore.kt @@ -5,9 +5,8 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.test.crash +package io.element.android.features.rageshake.impl.crash -import io.element.android.features.rageshake.api.crash.CrashDataStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt index a5fa6671d7..92dfbb02a2 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/crash/ui/CrashDetectionPresenterTest.kt @@ -12,9 +12,9 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.rageshake.api.crash.CrashDetectionEvents +import io.element.android.features.rageshake.impl.crash.A_CRASH_DATA import io.element.android.features.rageshake.impl.crash.DefaultCrashDetectionPresenter -import io.element.android.features.rageshake.test.crash.A_CRASH_DATA -import io.element.android.features.rageshake.test.crash.FakeCrashDataStore +import io.element.android.features.rageshake.impl.crash.FakeCrashDataStore import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.tests.testutils.WarmUpRule @@ -51,6 +51,20 @@ class CrashDetectionPresenterTest { } } + @Test + fun `present - initial state crash is ignored if the feature is not available`() = runTest { + val presenter = createPresenter( + FakeCrashDataStore(appHasCrashed = true), + isFeatureAvailable = false, + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.crashDetected).isFalse() + } + } + @Test fun `present - reset app has crashed`() = runTest { val presenter = createPresenter( @@ -86,8 +100,10 @@ class CrashDetectionPresenterTest { private fun createPresenter( crashDataStore: FakeCrashDataStore = FakeCrashDataStore(), buildMeta: BuildMeta = aBuildMeta(), + isFeatureAvailable: Boolean = true, ) = DefaultCrashDetectionPresenter( buildMeta = buildMeta, crashDataStore = crashDataStore, + rageshakeFeatureAvailability = { isFeatureAvailable }, ) } diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/detection/RageshakeDetectionPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/detection/RageshakeDetectionPresenterTest.kt index 5aa9679b8c..6f433a78d7 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/detection/RageshakeDetectionPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/detection/RageshakeDetectionPresenterTest.kt @@ -15,9 +15,9 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents import io.element.android.features.rageshake.api.screenshot.ImageResult import io.element.android.features.rageshake.impl.preferences.DefaultRageshakePreferencesPresenter -import io.element.android.features.rageshake.test.rageshake.FakeRageShake -import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore -import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder +import io.element.android.features.rageshake.impl.rageshake.FakeRageShake +import io.element.android.features.rageshake.impl.rageshake.FakeRageshakeDataStore +import io.element.android.features.rageshake.impl.screenshot.FakeScreenshotHolder import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.tests.testutils.WarmUpRule import io.mockk.mockk @@ -52,6 +52,7 @@ class RageshakeDetectionPresenterTest { preferencesPresenter = DefaultRageshakePreferencesPresenter( rageshake = rageshake, rageshakeDataStore = rageshakeDataStore, + rageshakeFeatureAvailability = { true }, ) ) moleculeFlow(RecompositionMode.Immediate) { @@ -76,6 +77,7 @@ class RageshakeDetectionPresenterTest { preferencesPresenter = DefaultRageshakePreferencesPresenter( rageshake = rageshake, rageshakeDataStore = rageshakeDataStore, + rageshakeFeatureAvailability = { true }, ) ) moleculeFlow(RecompositionMode.Immediate) { @@ -101,6 +103,7 @@ class RageshakeDetectionPresenterTest { preferencesPresenter = DefaultRageshakePreferencesPresenter( rageshake = rageshake, rageshakeDataStore = rageshakeDataStore, + rageshakeFeatureAvailability = { true }, ) ) moleculeFlow(RecompositionMode.Immediate) { @@ -135,6 +138,7 @@ class RageshakeDetectionPresenterTest { preferencesPresenter = DefaultRageshakePreferencesPresenter( rageshake = rageshake, rageshakeDataStore = rageshakeDataStore, + rageshakeFeatureAvailability = { true }, ) ) moleculeFlow(RecompositionMode.Immediate) { @@ -169,6 +173,7 @@ class RageshakeDetectionPresenterTest { preferencesPresenter = DefaultRageshakePreferencesPresenter( rageshake = rageshake, rageshakeDataStore = rageshakeDataStore, + rageshakeFeatureAvailability = { true }, ) ) moleculeFlow(RecompositionMode.Immediate) { diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/preferences/RageshakePreferencesPresenterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/preferences/RageshakePreferencesPresenterTest.kt index 796545c859..ba68345440 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/preferences/RageshakePreferencesPresenterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/preferences/RageshakePreferencesPresenterTest.kt @@ -12,9 +12,9 @@ import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents -import io.element.android.features.rageshake.test.rageshake.A_SENSITIVITY -import io.element.android.features.rageshake.test.rageshake.FakeRageShake -import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore +import io.element.android.features.rageshake.impl.rageshake.A_SENSITIVITY +import io.element.android.features.rageshake.impl.rageshake.FakeRageShake +import io.element.android.features.rageshake.impl.rageshake.FakeRageshakeDataStore import io.element.android.tests.testutils.WarmUpRule import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -28,7 +28,8 @@ class RageshakePreferencesPresenterTest { fun `present - initial state available`() = runTest { val presenter = DefaultRageshakePreferencesPresenter( FakeRageShake(isAvailableValue = true), - FakeRageshakeDataStore(isEnabled = true) + FakeRageshakeDataStore(isEnabled = true), + rageshakeFeatureAvailability = { true }, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -44,7 +45,8 @@ class RageshakePreferencesPresenterTest { fun `present - initial state not available`() = runTest { val presenter = DefaultRageshakePreferencesPresenter( FakeRageShake(isAvailableValue = false), - FakeRageshakeDataStore(isEnabled = true) + FakeRageshakeDataStore(isEnabled = true), + rageshakeFeatureAvailability = { true }, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -60,7 +62,8 @@ class RageshakePreferencesPresenterTest { fun `present - enable and disable`() = runTest { val presenter = DefaultRageshakePreferencesPresenter( FakeRageShake(isAvailableValue = true), - FakeRageshakeDataStore(isEnabled = true) + FakeRageshakeDataStore(isEnabled = true), + rageshakeFeatureAvailability = { true }, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() @@ -79,7 +82,8 @@ class RageshakePreferencesPresenterTest { fun `present - set sensitivity`() = runTest { val presenter = DefaultRageshakePreferencesPresenter( FakeRageShake(isAvailableValue = true), - FakeRageshakeDataStore(isEnabled = true) + FakeRageshakeDataStore(isEnabled = true), + rageshakeFeatureAvailability = { true }, ) moleculeFlow(RecompositionMode.Immediate) { presenter.present() diff --git a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageShake.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageShake.kt similarity index 84% rename from features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageShake.kt rename to features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageShake.kt index 1e3ac96770..b35bde295a 100644 --- a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageShake.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageShake.kt @@ -5,9 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.test.rageshake - -import io.element.android.features.rageshake.api.rageshake.RageShake +package io.element.android.features.rageshake.impl.rageshake class FakeRageShake( private var isAvailableValue: Boolean = true diff --git a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageshakeDataStore.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageshakeDataStore.kt similarity index 87% rename from features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageshakeDataStore.kt rename to features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageshakeDataStore.kt index b8fcc22d23..ec67ed13c0 100644 --- a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/rageshake/FakeRageshakeDataStore.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/rageshake/FakeRageshakeDataStore.kt @@ -5,9 +5,8 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.test.rageshake +package io.element.android.features.rageshake.impl.rageshake -import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt index b38c52e6ef..e73c7863b4 100755 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt @@ -8,9 +8,10 @@ package io.element.android.features.rageshake.impl.reporter import com.google.common.truth.Truth.assertThat +import io.element.android.appconfig.RageshakeConfig import io.element.android.features.rageshake.api.reporter.BugReporterListener -import io.element.android.features.rageshake.test.crash.FakeCrashDataStore -import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder +import io.element.android.features.rageshake.impl.crash.FakeCrashDataStore +import io.element.android.features.rageshake.impl.screenshot.FakeScreenshotHolder import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClientProvider import io.element.android.libraries.matrix.test.FakeSdkMetadata @@ -138,7 +139,7 @@ class DefaultBugReporterTest { val foundValues = collectValuesFromFormData(request) - assertThat(foundValues["app"]).isEqualTo("element-x-android") + assertThat(foundValues["app"]).isEqualTo(RageshakeConfig.BUG_REPORT_APP_NAME) assertThat(foundValues["can_contact"]).isEqualTo("true") assertThat(foundValues["device_id"]).isEqualTo("ABCDEFGH") assertThat(foundValues["sdk_sha"]).isEqualTo("123456789") diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProviderTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProviderTest.kt index 415440b164..71563892dc 100644 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProviderTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterUrlProviderTest.kt @@ -16,7 +16,9 @@ class DefaultBugReporterUrlProviderTest { @Test fun `test DefaultBugReporterUrlProvider`() { val sut = DefaultBugReporterUrlProvider() - val result = sut.provide() - assertThat(result).isEqualTo(RageshakeConfig.BUG_REPORT_URL.toHttpUrl()) + if (RageshakeConfig.BUG_REPORT_URL.isNotEmpty()) { + val result = sut.provide() + assertThat(result).isEqualTo(RageshakeConfig.BUG_REPORT_URL.toHttpUrl()) + } } } diff --git a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/screenshot/FakeScreenshotHolder.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/screenshot/FakeScreenshotHolder.kt similarity index 78% rename from features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/screenshot/FakeScreenshotHolder.kt rename to features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/screenshot/FakeScreenshotHolder.kt index 3f7d83f1c2..8e37da1910 100644 --- a/features/rageshake/test/src/main/kotlin/io/element/android/features/rageshake/test/screenshot/FakeScreenshotHolder.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/screenshot/FakeScreenshotHolder.kt @@ -5,10 +5,9 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.rageshake.test.screenshot +package io.element.android.features.rageshake.impl.screenshot import android.graphics.Bitmap -import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder const val A_SCREENSHOT_URI = "file://content/uri" diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index a39971b415..87f683d847 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(projects.features.networkmonitor.api) implementation(projects.features.logout.api) implementation(projects.features.leaveroom.api) + implementation(projects.features.rageshake.api) implementation(projects.services.analytics.api) implementation(libs.androidx.datastore.preferences) api(projects.features.roomlist.api) 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 f3e7daf4d7..a9be28e6ae 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 @@ -30,6 +30,7 @@ import io.element.android.features.invite.api.response.InviteData import io.element.android.features.leaveroom.api.LeaveRoomEvent 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.model.RoomListRoomSummary @@ -91,6 +92,7 @@ class RoomListPresenter @Inject constructor( private val notificationCleaner: NotificationCleaner, private val logoutPresenter: Presenter, private val appPreferencesStore: AppPreferencesStore, + private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, ) : Presenter { private val encryptionService: EncryptionService = client.encryptionService() @@ -103,6 +105,7 @@ class RoomListPresenter @Inject constructor( val filtersState = filtersPresenter.present() val searchState = searchPresenter.present() val acceptDeclineInviteState = acceptDeclineInvitePresenter.present() + val canReportBug = remember { rageshakeFeatureAvailability.isAvailable() } LaunchedEffect(Unit) { roomListDataSource.launchIn(this) @@ -163,6 +166,7 @@ class RoomListPresenter @Inject constructor( contextMenu = contextMenu.value, leaveRoomState = leaveRoomState, filtersState = filtersState, + canReportBug = canReportBug, searchState = searchState, contentState = contentState, acceptDeclineInviteState = acceptDeclineInviteState, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index 07994ef8cb..4ee15b7fab 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -29,6 +29,7 @@ data class RoomListState( val contextMenu: ContextMenu, val leaveRoomState: LeaveRoomState, val filtersState: RoomListFiltersState, + val canReportBug: Boolean, val searchState: RoomListSearchState, val contentState: RoomListContentState, val acceptDeclineInviteState: AcceptDeclineInviteState, 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 4c21d797f1..6b075db9df 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 @@ -57,6 +57,7 @@ internal fun aRoomListState( leaveRoomState: LeaveRoomState = aLeaveRoomState(), searchState: RoomListSearchState = aRoomListSearchState(), filtersState: RoomListFiltersState = aRoomListFiltersState(), + canReportBug: Boolean = true, contentState: RoomListContentState = aRoomsContentState(), acceptDeclineInviteState: AcceptDeclineInviteState = anAcceptDeclineInviteState(), directLogoutState: DirectLogoutState = aDirectLogoutState(), @@ -69,6 +70,7 @@ internal fun aRoomListState( contextMenu = contextMenu, leaveRoomState = leaveRoomState, filtersState = filtersState, + canReportBug = canReportBug, searchState = searchState, contentState = contentState, acceptDeclineInviteState = acceptDeclineInviteState, diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 8a5ade09d2..64ec1f8406 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -127,6 +127,7 @@ private fun RoomListScaffold( displayMenuItems = state.displayActions, displayFilters = state.displayFilters, filtersState = state.filtersState, + canReportBug = state.canReportBug, ) }, content = { padding -> 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 a0e9078530..1f4c86f579 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 @@ -85,6 +85,7 @@ fun RoomListTopBar( displayMenuItems: Boolean, displayFilters: Boolean, filtersState: RoomListFiltersState, + canReportBug: Boolean, modifier: Modifier = Modifier, ) { DefaultRoomListTopBar( @@ -98,6 +99,7 @@ fun RoomListTopBar( displayMenuItems = displayMenuItems, displayFilters = displayFilters, filtersState = filtersState, + canReportBug = canReportBug, modifier = modifier, ) } @@ -115,6 +117,7 @@ private fun DefaultRoomListTopBar( displayMenuItems: Boolean, displayFilters: Boolean, filtersState: RoomListFiltersState, + canReportBug: Boolean, modifier: Modifier = Modifier, ) { // We need this to manually clip the top app bar in preview mode @@ -239,7 +242,7 @@ private fun DefaultRoomListTopBar( } ) } - if (RoomListConfig.SHOW_REPORT_PROBLEM_MENU_ITEM) { + if (RoomListConfig.SHOW_REPORT_PROBLEM_MENU_ITEM && canReportBug) { DropdownMenuItem( onClick = { showMenu = false @@ -319,6 +322,7 @@ internal fun DefaultRoomListTopBarPreview() = ElementPreview { displayMenuItems = true, displayFilters = true, filtersState = aRoomListFiltersState(), + canReportBug = true, onMenuActionClick = {}, ) } @@ -337,6 +341,7 @@ internal fun DefaultRoomListTopBarWithIndicatorPreview() = ElementPreview { displayMenuItems = true, displayFilters = true, filtersState = aRoomListFiltersState(), + canReportBug = true, onMenuActionClick = {}, ) } 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 a48d63cad8..5043b78b10 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 @@ -19,6 +19,7 @@ import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomState import io.element.android.features.leaveroom.api.aLeaveRoomState import io.element.android.features.logout.api.direct.aDirectLogoutState +import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.features.roomlist.impl.datasource.RoomListDataSource import io.element.android.features.roomlist.impl.datasource.aRoomListRoomSummaryFactory import io.element.android.features.roomlist.impl.filters.RoomListFiltersState @@ -105,12 +106,14 @@ class RoomListPresenterTest { 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) @@ -135,6 +138,7 @@ class RoomListPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.showAvatarIndicator).isTrue() + assertThat(initialState.canReportBug).isTrue() sessionVerificationService.emitNeedsSessionVerification(false) encryptionService.emitBackupState(BackupState.ENABLED) val finalState = awaitItem() @@ -675,6 +679,7 @@ class RoomListPresenterTest { acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() }, notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(), + rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true }, ) = RoomListPresenter( client = client, syncService = syncService, @@ -705,6 +710,7 @@ class RoomListPresenterTest { notificationCleaner = notificationCleaner, logoutPresenter = { aDirectLogoutState() }, appPreferencesStore = appPreferencesStore, + rageshakeFeatureAvailability = rageshakeFeatureAvailability, ) } diff --git a/plugins/src/main/kotlin/ModulesConfig.kt b/plugins/src/main/kotlin/ModulesConfig.kt index 323fbcf9ab..7575728c96 100644 --- a/plugins/src/main/kotlin/ModulesConfig.kt +++ b/plugins/src/main/kotlin/ModulesConfig.kt @@ -6,6 +6,7 @@ */ import config.AnalyticsConfig +import config.BuildTimeConfig import config.PushProvidersConfig object ModulesConfig { @@ -14,8 +15,27 @@ object ModulesConfig { includeUnifiedPush = true, ) - val analyticsConfig: AnalyticsConfig = AnalyticsConfig.Enabled( - withPosthog = true, - withSentry = true, - ) + val analyticsConfig: AnalyticsConfig = if (isEnterpriseBuild) { + // Is Posthog configuration available? + val withPosthog = BuildTimeConfig.SERVICES_POSTHOG_APIKEY.isNullOrEmpty().not() && + BuildTimeConfig.SERVICES_POSTHOG_HOST.isNullOrEmpty().not() + // Is Sentry configuration available? + val withSentry = BuildTimeConfig.SERVICES_SENTRY_DSN.isNullOrEmpty().not() + if (withPosthog || withSentry) { + println("Analytics enabled with Posthog: $withPosthog, Sentry: $withSentry") + AnalyticsConfig.Enabled( + withPosthog = withPosthog, + withSentry = withSentry, + ) + } else { + println("Analytics disabled") + AnalyticsConfig.Disabled + } + } else { + println("Analytics enabled with Posthog and Sentry") + AnalyticsConfig.Enabled( + withPosthog = true, + withSentry = true, + ) + } } diff --git a/plugins/src/main/kotlin/config/BuildTimeConfig.kt b/plugins/src/main/kotlin/config/BuildTimeConfig.kt index bac0c94d0b..e1fd78c4bb 100644 --- a/plugins/src/main/kotlin/config/BuildTimeConfig.kt +++ b/plugins/src/main/kotlin/config/BuildTimeConfig.kt @@ -14,7 +14,21 @@ object BuildTimeConfig { const val GOOGLE_APP_ID_DEBUG = "1:912726360885:android:def0a4e454042e9b00427c" const val GOOGLE_APP_ID_NIGHTLY = "1:912726360885:android:e17435e0beb0303000427c" + val METADATA_HOST: String? = null + val URL_WEBSITE: String? = null + val URL_LOGO: String? = null + val URL_COPYRIGHT: String? = null + val URL_ACCEPTABLE_USE: String? = null + val URL_PRIVACY: String? = null + val URL_POLICY: String? = null + val SUPPORT_EMAIL_ADDRESS: String? = null + val SERVICES_MAPTILER_BASE_URL: String? = null val SERVICES_MAPTILER_APIKEY: String? = null val SERVICES_MAPTILER_LIGHT_MAPID: String? = null val SERVICES_MAPTILER_DARK_MAPID: String? = null + val SERVICES_POSTHOG_HOST: String? = null + val SERVICES_POSTHOG_APIKEY: String? = null + val SERVICES_SENTRY_DSN: String? = null + val BUG_REPORT_URL: String? = null + val BUG_REPORT_APP_NAME: String? = null } diff --git a/plugins/src/main/kotlin/extension/VariantDimensionExtension.kt b/plugins/src/main/kotlin/extension/VariantDimensionExtension.kt new file mode 100644 index 0000000000..a7589f02a9 --- /dev/null +++ b/plugins/src/main/kotlin/extension/VariantDimensionExtension.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 extension + +import com.android.build.api.dsl.VariantDimension + +fun VariantDimension.buildConfigFieldStr( + name: String, + value: String, +) { + buildConfigField( + type = "String", + name = name, + value = "\"$value\"" + ) +} + +fun VariantDimension.buildConfigFieldBoolean( + name: String, + value: Boolean, +) { + buildConfigField( + type = "boolean", + name = name, + value = value.toString() + ) +} diff --git a/services/analyticsproviders/posthog/build.gradle.kts b/services/analyticsproviders/posthog/build.gradle.kts index fb59fb842e..01e6dbc836 100644 --- a/services/analyticsproviders/posthog/build.gradle.kts +++ b/services/analyticsproviders/posthog/build.gradle.kts @@ -1,3 +1,5 @@ +import config.BuildTimeConfig +import extension.buildConfigFieldStr import extension.setupAnvil /* @@ -12,6 +14,21 @@ plugins { android { namespace = "io.element.android.services.analyticsproviders.posthog" + + buildFeatures { + buildConfig = true + } + + defaultConfig { + buildConfigFieldStr( + name = "POSTHOG_HOST", + value = BuildTimeConfig.SERVICES_POSTHOG_HOST.takeIf { isEnterpriseBuild } ?: "" + ) + buildConfigFieldStr( + name = "POSTHOG_APIKEY", + value = BuildTimeConfig.SERVICES_POSTHOG_APIKEY.takeIf { isEnterpriseBuild } ?: "" + ) + } } setupAnvil() @@ -21,6 +38,7 @@ dependencies { implementation(libs.posthog) { exclude("com.android.support", "support-annotations") } + implementation(projects.features.enterprise.api) implementation(projects.libraries.core) implementation(projects.libraries.di) implementation(projects.services.analyticsproviders.api) diff --git a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PostHogFactory.kt b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PostHogFactory.kt index 2e87236741..af450cfc84 100644 --- a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PostHogFactory.kt +++ b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PostHogFactory.kt @@ -11,7 +11,6 @@ import android.content.Context import com.posthog.PostHogInterface import com.posthog.android.PostHogAndroid import com.posthog.android.PostHogAndroidConfig -import io.element.android.libraries.core.extensions.isElement import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.ApplicationContext import javax.inject.Inject @@ -22,8 +21,7 @@ class PostHogFactory @Inject constructor( private val posthogEndpointConfigProvider: PosthogEndpointConfigProvider, ) { fun createPosthog(): PostHogInterface? { - if (!buildMeta.isElement()) return null - val endpoint = posthogEndpointConfigProvider.provide() + val endpoint = posthogEndpointConfigProvider.provide() ?: return null return PostHogAndroid.with( context, PostHogAndroidConfig( diff --git a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfig.kt b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfig.kt index c699950f7e..6d14ab6b14 100644 --- a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfig.kt +++ b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfig.kt @@ -10,4 +10,6 @@ package io.element.android.services.analyticsproviders.posthog data class PosthogEndpointConfig( val host: String, val apiKey: String, -) +) { + val isValid = host.isNotBlank() && apiKey.isNotBlank() +} diff --git a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfigProvider.kt b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfigProvider.kt index 2a4b80a542..da35d661e5 100644 --- a/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfigProvider.kt +++ b/services/analyticsproviders/posthog/src/main/kotlin/io/element/android/services/analyticsproviders/posthog/PosthogEndpointConfigProvider.kt @@ -7,24 +7,40 @@ package io.element.android.services.analyticsproviders.posthog +import io.element.android.features.enterprise.api.EnterpriseService +import io.element.android.libraries.core.extensions.isElement import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildType import javax.inject.Inject class PosthogEndpointConfigProvider @Inject constructor( private val buildMeta: BuildMeta, + private val enterpriseService: EnterpriseService, ) { - fun provide(): PosthogEndpointConfig { - return when (buildMeta.buildType) { - BuildType.RELEASE -> PosthogEndpointConfig( - host = "https://posthog.element.io", - apiKey = "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", - ) - BuildType.NIGHTLY, - BuildType.DEBUG -> PosthogEndpointConfig( - host = "https://posthog.element.dev", - apiKey = "phc_VtA1L35nw3aeAtHIx1ayrGdzGkss7k1xINeXcoIQzXN", - ) + fun provide(): PosthogEndpointConfig? { + return if (enterpriseService.isEnterpriseBuild) { + PosthogEndpointConfig( + host = BuildConfig.POSTHOG_HOST, + apiKey = BuildConfig.POSTHOG_APIKEY, + ).takeIf { + // Note that if the config is invalid, this module will not be included in the build. + // So the configuration should be always valid. + it.isValid + } + } else if (buildMeta.isElement()) { + when (buildMeta.buildType) { + BuildType.RELEASE -> PosthogEndpointConfig( + host = "https://posthog.element.io", + apiKey = "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", + ) + BuildType.NIGHTLY, + BuildType.DEBUG -> PosthogEndpointConfig( + host = "https://posthog.element.dev", + apiKey = "phc_VtA1L35nw3aeAtHIx1ayrGdzGkss7k1xINeXcoIQzXN", + ) + } + } else { + null } } } diff --git a/services/analyticsproviders/sentry/build.gradle.kts b/services/analyticsproviders/sentry/build.gradle.kts index e144cb67ea..1b1c351712 100644 --- a/services/analyticsproviders/sentry/build.gradle.kts +++ b/services/analyticsproviders/sentry/build.gradle.kts @@ -1,3 +1,5 @@ +import config.BuildTimeConfig +import extension.buildConfigFieldStr import extension.readLocalProperty import extension.setupAnvil @@ -19,13 +21,15 @@ android { } defaultConfig { - buildConfigField( - type = "String", + buildConfigFieldStr( name = "SENTRY_DSN", - value = (System.getenv("ELEMENT_ANDROID_SENTRY_DSN") - ?: readLocalProperty("services.analyticsproviders.sentry.dsn") + value = if (isEnterpriseBuild) { + BuildTimeConfig.SERVICES_SENTRY_DSN + } else { + System.getenv("ELEMENT_ANDROID_SENTRY_DSN") + ?: readLocalProperty("services.analyticsproviders.sentry.dsn") + } ?: "" - ).let { "\"$it\"" } ) } } diff --git a/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsProvider.kt b/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsProvider.kt index ede40e3051..654d54f56b 100644 --- a/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsProvider.kt +++ b/services/analyticsproviders/sentry/src/main/kotlin/io/element/android/services/analyticsproviders/sentry/SentryAnalyticsProvider.kt @@ -41,9 +41,7 @@ class SentryAnalyticsProvider @Inject constructor( Timber.tag(analyticsTag.value).d("Initializing Sentry") if (Sentry.isEnabled()) return - val dsn = if (SentryConfig.DSN.isNotBlank()) { - SentryConfig.DSN - } else { + val dsn = SentryConfig.DSN.ifBlank { Timber.w("No Sentry DSN provided, Sentry will not be initialized") return } diff --git a/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en.png new file mode 100644 index 0000000000..76a832569b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6241486ded79ef2c079dcc45a0fe97bf01db66c05712ec7f74db035d76a91b5 +size 18115 diff --git a/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en.png new file mode 100644 index 0000000000..af54ab708a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ca4b3953ec0c460052305d9cfa5c0b1db2a97e8d9a27b483e8b5d15d873d32c +size 17500 diff --git a/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_1_en.png new file mode 100644 index 0000000000..4ca3de0a14 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Day_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:232fcbe898588450577fca29090873626c2df7cc4afba91a87d3956d29f0afbc +size 81150 diff --git a/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_1_en.png new file mode 100644 index 0000000000..c3a8af5c2d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.analytics.impl_AnalyticsOptInView_Night_1_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26f4a151850c4c21ed57d0a1d36ea72aece585ed5ec6d54303edbeaa91d06df9 +size 73959 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_0_en.png index 51d29f8292..679efc4aaf 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ce6f663ca845a54b4e1aca55f1405e00d29084a95b6a61721e5136efe30f7fc -size 311755 +oid sha256:0ab623f806fc90bef41beccc5d5f444a882e6634cdadecbbc341e10369bbcfdb +size 315380 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_1_en.png index 52b4aa94c8..4275f3eac1 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7b714d78970f7bfc32c0bb8a226b2896681134a6eb329c871c0270511e8e81f -size 306543 +oid sha256:b73088b5af32e47d18d6961fe5622411f5342388d8a0d78c8f3fb5e27213146a +size 315116 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_2_en.png index a303b4946f..69d4181bbe 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:563c2a20cbf651c88e85dfba98c02fa60197b298ee621b5b4b1bdc4af51a456e -size 310172 +oid sha256:24735f133066c55c6d88b7f9930ad983cca431611c7e6833ca5a4d657eeb14a5 +size 313116 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_3_en.png index 5adfb27ab3..03edadc7be 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:171e41e96dbb6495c667a57047cf66e5059a19b8dba7d56e799113cd5a8690e4 -size 304775 +oid sha256:1d02a7ff9ff40f73d8c72b9378e10ba1f6580524cbdefcf290066b8047fdc33c +size 307633 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_4_en.png new file mode 100644 index 0000000000..5adfb27ab3 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Day_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:171e41e96dbb6495c667a57047cf66e5059a19b8dba7d56e799113cd5a8690e4 +size 304775 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_0_en.png index 3e65f22a15..f087a418d1 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e41a284f2eedb0c7158079f059e05f8f505436ba91a82194faaff459bb30e4b4 -size 392983 +oid sha256:f5ac9f2f168b895e8262181f789b0fe2ad2c97b1296a50c1453879438bfe436a +size 395942 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_1_en.png index 0f4c0c9b0d..8ff0422506 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12691cbb9890570cb2081921224b13529e256feff1171d24e77cae11afc676e8 -size 380258 +oid sha256:f7c1c7d34935986d01113069c25849fc860133de582fe94ee63f2e28b181e87f +size 397378 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_2_en.png index a167708560..1597b13f0a 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f2c6932790cd4bbdff4dd07a728290aeb2eca47811c0b3d220e17aed5e8e34e -size 383588 +oid sha256:a11f8383fc481255fb3fa6f1a5475d23c13c0460c33b04bc190cf3b5931893a3 +size 395108 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_3_en.png index 89393180f4..fb78588841 100644 --- a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee7b3e5bb14da106ecedbe4827cded220d7222b68837c3c63ae3dfacd66ec2f2 -size 365133 +oid sha256:36424ccefbbbd35201800dbcbb743a2d22aa6fe7a606054fc3acf8b98aead272 +size 381588 diff --git a/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_4_en.png new file mode 100644 index 0000000000..89393180f4 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.onboarding.impl_OnBoardingView_Night_4_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee7b3e5bb14da106ecedbe4827cded220d7222b68837c3c63ae3dfacd66ec2f2 +size 365133 From 931f2fbfe8d1a72b9a9ca91ef7ef9c58611a06f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Thu, 27 Mar 2025 12:05:24 +0100 Subject: [PATCH 03/54] Changelog for version 25.03.4 --- CHANGES.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index c3a966e77f..b9fefeaad8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,21 @@ +Changes in Element X v25.03.4 +============================= + + + +## What's Changed +### 🙌 Improvements +* Change : composer suggestions by @ganfra in https://github.com/element-hq/element-x-android/pull/4485 +### 🧱 Build +* Fix flaky incoming verification tests by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4479 +### Dependency upgrades +* fix(deps): update dagger to v2.56.1 by @renovate in https://github.com/element-hq/element-x-android/pull/4472 +* fix(deps): update dependencyanalysis to v2.13.2 by @renovate in https://github.com/element-hq/element-x-android/pull/4473 +* Upgrade embedded EC version to `v0.9.0-rc.4` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/4489 + + +**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v25.03.3...v25.03.4 + Changes in Element X v25.03.3 ============================= From aa8607aec4dd8b27cddd510c8e527fa62daebf38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 12:11:42 +0100 Subject: [PATCH 04/54] fix(deps): update camera to v1.4.2 (#4483) 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 a293b34b65..5d0e5b9acc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ constraintlayout_compose = "1.1.1" lifecycle = "2.8.7" activity = "1.10.1" media3 = "1.5.1" -camera = "1.4.1" +camera = "1.4.2" # Compose compose_bom = "2025.03.00" From 6123650f3e2d21e617887969550d76103099f3a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 12:12:12 +0100 Subject: [PATCH 05/54] fix(deps): update dependency org.maplibre.gl:android-sdk to v11.8.5 (#4487) 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 5d0e5b9acc..3bf9cfe0d7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -188,7 +188,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.8.4" +maplibre = "org.maplibre.gl:android-sdk:11.8.5" 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.1.0" From 28ee1f8b02bc2a0f69214a00242a84240635c18f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 27 Mar 2025 12:58:44 +0100 Subject: [PATCH 06/54] Check if Manifest.permission.REQUEST_INSTALL_PACKAGES is in the manifest before invoking `canRequestPackageInstalls`. (#4490) --- .../impl/local/AndroidLocalMediaActions.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActions.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActions.kt index 8750647d97..56af3ca2c8 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActions.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/AndroidLocalMediaActions.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.mediaviewer.impl.local +import android.Manifest import android.app.Activity import android.content.ContentResolver import android.content.ContentValues @@ -26,6 +27,7 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext import androidx.core.content.FileProvider +import androidx.core.content.PermissionChecker import androidx.core.net.toFile import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.androidutils.system.startInstallFromSourceIntent @@ -119,7 +121,14 @@ class AndroidLocalMediaActions @Inject constructor( when (localMedia.info.mimeType) { MimeTypes.Apk -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (activityContext?.packageManager?.canRequestPackageInstalls() == false) { + if (PermissionChecker.checkPermission( + context, + Manifest.permission.REQUEST_INSTALL_PACKAGES, + -1, + -1, + context.packageName + ) == PermissionChecker.PERMISSION_GRANTED && + activityContext?.packageManager?.canRequestPackageInstalls() == false) { pendingMedia = localMedia activityContext?.startInstallFromSourceIntent(apkInstallLauncher!!).let { } } else { From fa6c5e6a92f2b5863e34565b847a16a479021086 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Thu, 27 Mar 2025 14:09:47 +0100 Subject: [PATCH 07/54] Improve touch indicators for the user info UI in the timeline (#4482) * For the user info in the timeline items, display the ripple effects according to the bounds and shape of the user avatar and display name * Fix ripple in other screens too --- .../components/TimelineItemEventRow.kt | 37 +++++++++++++------ .../receipt/TimelineItemReadReceiptView.kt | 4 +- .../messages/impl/MessagesViewTest.kt | 28 ++++++++++++-- .../shared/UserProfileHeaderSection.kt | 3 ++ .../matrix/ui/components/InviteSenderView.kt | 4 +- .../android/libraries/testtags/TestTags.kt | 3 +- 6 files changed, 59 insertions(+), 20 deletions(-) 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 ae17f26898..1b0a4df559 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 @@ -23,8 +23,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -37,6 +37,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.platform.ViewConfiguration +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.contentDescription @@ -93,6 +94,7 @@ import io.element.android.libraries.matrix.ui.messages.reply.eventId import io.element.android.libraries.matrix.ui.messages.sender.SenderName import io.element.android.libraries.matrix.ui.messages.sender.SenderNameMode import io.element.android.libraries.testtags.TestTags +import io.element.android.libraries.testtags.testTag import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.wysiwyg.link.Link import kotlinx.coroutines.launch @@ -314,6 +316,7 @@ private fun TimelineItemEventRowContent( event.senderId, event.senderProfile, event.senderAvatar, + onUserDataClick, Modifier .constrainAs(sender) { top.linkTo(parent.top) @@ -321,13 +324,7 @@ private fun TimelineItemEventRowContent( start.linkTo(parent.start) } .padding(horizontal = 16.dp) - .zIndex(1f) - .clickable(onClick = onUserDataClick) - // This is redundant when using talkback - .clearAndSetSemantics { - invisibleToUser() - testTag = TestTags.timelineItemSenderInfo.value - } + .zIndex(1f), ) } @@ -425,13 +422,31 @@ private fun MessageSenderInformation( senderId: UserId, senderProfile: ProfileTimelineDetails, senderAvatar: AvatarData, + onClick: () -> Unit, modifier: Modifier = Modifier ) { val avatarColors = AvatarColorsProvider.provide(senderAvatar.id) - Row(modifier = modifier) { - Avatar(senderAvatar) - Spacer(modifier = Modifier.width(4.dp)) + Row( + modifier = modifier + // Add external clickable modifier with no indicator so the touch target is larger than just the display name + .clickable(onClick = onClick, enabled = true, interactionSource = remember { MutableInteractionSource() }, indication = null) + .clearAndSetSemantics { + invisibleToUser() + } + ) { + Avatar( + modifier = Modifier + .testTag(TestTags.timelineItemSenderAvatar) + .clip(CircleShape) + .clickable(onClick = onClick), + avatarData = senderAvatar, + ) SenderName( + modifier = Modifier + .testTag(TestTags.timelineItemSenderName) + .clip(RoundedCornerShape(6.dp)) + .clickable(onClick = onClick) + .padding(horizontal = 4.dp), senderId = senderId, senderProfile = senderProfile, senderNameMode = SenderNameMode.Timeline(avatarColors.foreground), 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 701dd93fc7..80d594d4d7 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 @@ -26,6 +26,7 @@ import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.testTag import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex @@ -42,7 +43,6 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.timeline.item.event.LocalEventSendState import io.element.android.libraries.testtags.TestTags -import io.element.android.libraries.testtags.testTag import io.element.android.libraries.ui.strings.CommonPlurals import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList @@ -60,7 +60,6 @@ fun TimelineItemReadReceiptView( ReadReceiptsAvatars( receipts = state.receipts, modifier = Modifier - .testTag(TestTags.messageReadReceipts) .clip(RoundedCornerShape(4.dp)) .clickable { onReadReceiptsClick() @@ -135,6 +134,7 @@ private fun ReadReceiptsAvatars( Row( modifier = modifier .clearAndSetSemantics { + testTag = TestTags.messageReadReceipts.value contentDescription = receiptDescription }, horizontalArrangement = Arrangement.spacedBy(4.dp - avatarStrokeSize), diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt index 9f46637948..5080013d27 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt @@ -104,7 +104,7 @@ class MessagesViewTest { state = state, onRoomDetailsClick = callback, ) - rule.onNodeWithText(state.roomName.dataOrNull().orEmpty()).performClick() + rule.onNodeWithText(state.roomName.dataOrNull().orEmpty(), useUnmergedTree = true).performClick() } } @@ -206,6 +206,7 @@ class MessagesViewTest { } @Test + @Config(qualifiers = "h1024dp") fun `clicking on a read receipt list emits the expected Event`() { val eventsRecorder = EventsRecorder() val state = aMessagesState( @@ -229,7 +230,7 @@ class MessagesViewTest { rule.setMessagesView( state = state, ) - rule.onNodeWithTag(TestTags.messageReadReceipts.value).performClick() + rule.onNodeWithTag(TestTags.messageReadReceipts.value, useUnmergedTree = true).performClick() eventsRecorder.assertSingle(ReadReceiptBottomSheetEvents.EventSelected(timelineItem)) } @@ -309,7 +310,7 @@ class MessagesViewTest { @Test @Config(qualifiers = "h1024dp") - fun `clicking on the sender of an Event invoke expected callback`() { + fun `clicking on the avatar of the sender of an Event invoke expected callback`() { val eventsRecorder = EventsRecorder(expectEvents = false) val state = aMessagesState( eventSink = eventsRecorder @@ -322,7 +323,26 @@ class MessagesViewTest { state = state, onUserDataClick = callback, ) - rule.onNodeWithTag(TestTags.timelineItemSenderInfo.value).performClick() + rule.onNodeWithTag(TestTags.timelineItemSenderAvatar.value, useUnmergedTree = true).performClick() + } + } + + @Test + @Config(qualifiers = "h1024dp") + fun `clicking on the display name of the sender of an Event invoke expected callback`() { + val eventsRecorder = EventsRecorder(expectEvents = false) + val state = aMessagesState( + eventSink = eventsRecorder + ) + val timelineItem = state.timelineState.timelineItems.first() + ensureCalledOnceWithParam( + param = (timelineItem as TimelineItem.Event).senderId + ) { callback -> + rule.setMessagesView( + state = state, + onUserDataClick = callback, + ) + rule.onNodeWithTag(TestTags.timelineItemSenderName.value, useUnmergedTree = true).performClick() } } 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 3df57b9eb0..2681d7bfdf 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 @@ -13,9 +13,11 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +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.draw.clipToBounds import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -58,6 +60,7 @@ fun UserProfileHeaderSection( Avatar( avatarData = AvatarData(userId.value, userName, avatarUrl, AvatarSize.UserHeader), modifier = Modifier + .clip(CircleShape) .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) } .testTag(TestTags.memberDetailAvatar) ) 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 008438305d..452f6ed5a2 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 @@ -34,8 +34,8 @@ fun InviteSenderView( modifier = modifier, ) { Box(modifier = Modifier.padding(vertical = 2.dp)) { - Avatar(avatarData = inviteSender.avatarData) - } + Avatar(avatarData = inviteSender.avatarData) + } Text( text = inviteSender.annotatedString(), style = ElementTheme.typography.fontBodyMdRegular, diff --git a/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt b/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt index 8ee03dd5ad..6363c6781b 100644 --- a/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt +++ b/libraries/testtags/src/main/kotlin/io/element/android/libraries/testtags/TestTags.kt @@ -105,7 +105,8 @@ object TestTags { /** * Timeline item. */ - val timelineItemSenderInfo = TestTag("timeline_item-sender_info") + val timelineItemSenderAvatar = TestTag("timeline_item-sender_avatar") + val timelineItemSenderName = TestTag("timeline_item-sender_name") /** * Search field. From 11eb5bf56fb5ff65ce92295c6cac383ae0a49093 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:29:58 +0100 Subject: [PATCH 08/54] fix(deps): update dependency com.posthog:posthog-android to v3.13.0 (#4469) 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 3bf9cfe0d7..d23d358ff8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -195,7 +195,7 @@ opusencoder = "io.element.android:opusencoder:1.1.0" zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics -posthog = "com.posthog:posthog-android:3.12.0" +posthog = "com.posthog:posthog-android:3.13.0" sentry = "io.sentry:sentry-android:8.5.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 058d8f297fb51ee6919185f47173432842081b71 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Thu, 27 Mar 2025 14:37:38 +0100 Subject: [PATCH 09/54] Limit the text length in the 'in reply to' preview (#4491) * Limit the text length in the 'in reply to' preview Otherwise, very long texts with no line breaks can cause a Compose crash --- .../DefaultMessageSummaryFormatter.kt | 10 ++++------ .../core/extensions/BasicExtensions.kt | 19 +++++++++++++++++++ .../matrix/ui/messages/reply/InReplyToView.kt | 7 +++++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt index 1f44d3dd1f..8a05770942 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/DefaultMessageSummaryFormatter.kt @@ -26,6 +26,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVoiceContent +import io.element.android.libraries.core.extensions.toSafeLength import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.RoomScope import io.element.android.libraries.ui.strings.CommonStrings @@ -35,11 +36,6 @@ import javax.inject.Inject class DefaultMessageSummaryFormatter @Inject constructor( @ApplicationContext private val context: Context, ) : MessageSummaryFormatter { - companion object { - // Max characters to display in the summary message. This works around https://github.com/element-hq/element-x-android/issues/2105 - private const val MAX_SAFE_LENGTH = 500 - } - override fun format(event: TimelineItem.Event): String { return when (event.content) { is TimelineItemTextBasedContent -> event.content.plainText @@ -58,6 +54,8 @@ class DefaultMessageSummaryFormatter @Inject constructor( is TimelineItemAudioContent -> context.getString(CommonStrings.common_audio) is TimelineItemLegacyCallInviteContent -> context.getString(CommonStrings.common_unsupported_call) is TimelineItemCallNotifyContent -> context.getString(CommonStrings.common_call_started) - }.take(MAX_SAFE_LENGTH) + } + // Truncate the message to a safe length to avoid crashes in Compose + .toSafeLength() } } diff --git a/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt b/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt index 48dbcade47..abd6e10d1f 100644 --- a/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt +++ b/libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt @@ -98,3 +98,22 @@ fun String.ensureEndsLeftToRight() = if (containsRtLOverride()) "$this$LTR_OVERR fun String.containsRtLOverride() = contains(RTL_OVERRIDE_CHAR) fun String.filterDirectionOverrides() = filterNot { it == RTL_OVERRIDE_CHAR || it == LTR_OVERRIDE_CHAR } + +/** + * This works around https://github.com/element-hq/element-x-android/issues/2105. + * @param maxLength Max characters to retrieve. Defaults to `500`. + * @param ellipsize Whether to add an ellipsis (`…`) char at the end or not. Defaults to `false`. + * @return The string truncated to [maxLength] characters, with an optional ellipsis if larger. + */ +fun String.toSafeLength( + maxLength: Int = 500, + ellipsize: Boolean = false, +): String { + return if (ellipsize) { + ellipsize(maxLength) + } else if (length > maxLength) { + take(maxLength) + } else { + this + } +} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToView.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToView.kt index 3fb4ddd74a..d3135d9fd8 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToView.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/reply/InReplyToView.kt @@ -31,6 +31,7 @@ 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.core.extensions.toSafeLength import io.element.android.libraries.designsystem.atomic.atoms.PlaceholderAtom import io.element.android.libraries.designsystem.icons.CompoundDrawables import io.element.android.libraries.designsystem.preview.ElementPreview @@ -152,8 +153,10 @@ private fun ReplyToContentText(metadata: InReplyToMetadata?) { val text = when (metadata) { InReplyToMetadata.Redacted -> stringResource(id = CommonStrings.common_message_removed) InReplyToMetadata.UnableToDecrypt -> stringResource(id = CommonStrings.common_waiting_for_decryption_key) - is InReplyToMetadata.Text -> metadata.text - is InReplyToMetadata.Thumbnail -> metadata.text + // Add a limit to the text length to avoid a crash in Compose + is InReplyToMetadata.Text -> metadata.text.toSafeLength() + // Add a limit to the text length to avoid a crash in Compose + is InReplyToMetadata.Thumbnail -> metadata.text.toSafeLength() null -> "" } val iconResourceId = when (metadata) { From 9f52075a66039e2be9a76c54e7144ad86b4df33c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 27 Mar 2025 21:08:15 +0100 Subject: [PATCH 10/54] Remove nightly_enterprise.yml. (#4492) --- .github/workflows/nightly_enterprise.yml | 53 ------------------------ 1 file changed, 53 deletions(-) delete mode 100644 .github/workflows/nightly_enterprise.yml diff --git a/.github/workflows/nightly_enterprise.yml b/.github/workflows/nightly_enterprise.yml deleted file mode 100644 index 5e02c68240..0000000000 --- a/.github/workflows/nightly_enterprise.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Build and release Enterprise nightly application - -on: - workflow_dispatch: - schedule: - # Every nights at 4 - - cron: "0 4 * * *" - -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - nightly: - name: Build and publish Enterprise nightly bundle to Firebase - runs-on: ubuntu-latest - if: ${{ github.repository == 'element-hq/element-x-android' }} - steps: - - uses: actions/checkout@v4 - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@v0.9.1 - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Build and upload Nightly application - run: | - ./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - ELEMENT_ANDROID_SENTRY_DSN: ${{ secrets.ELEMENT_ANDROID_SENTRY_DSN }} - ELEMENT_CALL_SENTRY_DSN: ${{ secrets.ELEMENT_CALL_SENTRY_DSN }} - ELEMENT_CALL_POSTHOG_API_HOST: ${{ secrets.ELEMENT_CALL_POSTHOG_API_HOST }} - ELEMENT_CALL_POSTHOG_API_KEY: ${{ secrets.ELEMENT_CALL_POSTHOG_API_KEY }} - ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} - ELEMENT_ANDROID_NIGHTLY_KEYID: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYID }} - ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD }} - ELEMENT_ANDROID_NIGHTLY_STOREPASSWORD: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_STOREPASSWORD }} - FIREBASE_TOKEN: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_FIREBASE_TOKEN }} - - name: Additionally upload Nightly APK to browserstack for testing - continue-on-error: true # don't block anything by this upload failing (for now) - run: | - curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_PASSWORD" -X POST "https://api-cloud.browserstack.com/app-automate/upload" -F "file=@app/build/outputs/apk/gplay/nightly/app-gplay-universal-nightly.apk" -F "custom_id=element-x-android-nightly" - env: - BROWSERSTACK_USERNAME: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_USERNAME }} - BROWSERSTACK_PASSWORD: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_ACCESS_KEY }} From c98a8c30a96ad80203721ac4d3e8bd43ae7dcc2a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:16:16 +0100 Subject: [PATCH 11/54] fix(deps): update dependencyanalysis to v2.13.3 (#4493) 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 5ba3b77959..88e849adb6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ wysiwyg = "2.38.3" telephoto = "0.15.1" # Dependency analysis -dependencyAnalysis = "2.13.2" +dependencyAnalysis = "2.13.3" # DI dagger = "2.56.1" From 97bd7b7479590f5c896d8b7c5381e743f777dcff Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 28 Mar 2025 11:20:32 +0100 Subject: [PATCH 12/54] Change (mention span) : rework and add more cases (#4476) * change(mention span) : improve truncation logic * change(mention span) : fix theme switching * change(mention span) : start to pillify permalinks * change(mention span) : use permalink directly * change(mention span) : start improving mention type * change(mention span) : use the appropriate MentionSpanProvider methods * change(mention span) : introduce MentionSpanFormatter * change(mention span) : introduce MentionSpanUpdater * change(mention span) : Improve RoomNameCaches * change(mention span) : remove useless param on HtmlConverterProvider * change(mention span) : fix some remaining issues on the composer * change(mention span) : remove pillifiedBody * change(mention span) : fix some issues with pillification * change(mention span) : fix getMentionsSpans * change(mention span) : make sure all tests passes * change(mention span) : remove the coroutine from the caches and a MentionSpanFormatterTest * change(mention span) : add more tests on pillification * change(mention span) : clean up * Update screenshots * change(mention span) : remove unexpected print * change(mention span) : remove default values in constructor of TimelineTextBasedContent classes * Update screenshots --------- Co-authored-by: ElementBot --- .../appnav/intent/IntentResolverTest.kt | 2 +- .../api/timeline/HtmlConverterProvider.kt | 3 +- .../messages/impl/MessagesFlowNode.kt | 35 ++- .../messages/impl/MessagesPresenter.kt | 2 +- .../preview/AttachmentsPreviewView.kt | 1 + .../MessageComposerPresenter.kt | 33 ++- .../messagecomposer/MessageComposerState.kt | 1 + .../MessageComposerStateProvider.kt | 1 + .../messagecomposer/MessageComposerView.kt | 1 + .../timeline/DefaultHtmlConverterProvider.kt | 27 ++- .../TimelineItemEventRowTimestampPreview.kt | 2 +- .../components/event/TimelineItemTextView.kt | 54 +---- .../TimelineItemContentMessageFactory.kt | 27 ++- .../model/event/TimelineItemEmoteContent.kt | 5 +- .../event/TimelineItemEventContentProvider.kt | 42 ++-- .../model/event/TimelineItemNoticeContent.kt | 5 +- .../event/TimelineItemTextBasedContent.kt | 8 +- .../model/event/TimelineItemTextContent.kt | 5 +- .../impl/utils/TextPillificationHelper.kt | 90 ++++--- .../actionlist/ActionListPresenterTest.kt | 26 +- .../impl/fixtures/MessageEventFixtures.kt | 2 +- .../MessageComposerPresenterTest.kt | 11 +- .../DefaultHtmlConverterProviderTest.kt | 16 +- .../components/event/TimelineTextViewTest.kt | 109 +++++---- .../TimelineItemContentMessageFactoryTest.kt | 19 +- .../DefaultTextPillificationHelperTest.kt | 223 +++++++++++++----- .../impl/utils/FakeMentionSpanFormatter.kt | 19 ++ .../impl/utils/FakeTextPillificationHelper.kt | 6 +- .../timeline/FakeHtmlConverterProvider.kt | 3 +- .../test/permalink/FakePermalinkParser.kt | 4 +- .../ui/messages/RoomMemberProfilesCache.kt | 16 +- .../matrix/ui/messages/RoomNamesCache.kt | 42 ++++ .../libraries/textcomposer/TextComposer.kt | 4 +- .../components/markdown/MarkdownTextInput.kt | 10 +- .../textcomposer/mentions/MentionSpan.kt | 190 +++++++++------ .../mentions/MentionSpanFormatter.kt | 75 ++++++ .../mentions/MentionSpanProvider.kt | 130 +++++++--- .../textcomposer/mentions/MentionSpanTheme.kt | 102 ++++---- .../mentions/MentionSpanUpdater.kt | 67 ++++++ .../model/MarkdownTextEditorState.kt | 51 ++-- .../markdown/MarkdownTextInputTest.kt | 7 +- .../IntentionalMentionSpanProviderTest.kt | 17 +- .../impl/mentions/MentionSpanFormatterTest.kt | 135 +++++++++++ .../mentions/MentionSpanProviderFixture.kt | 32 +++ .../impl/model/MarkdownTextEditorStateTest.kt | 54 +---- ...ser.mentions_MentionSpanTheme_Day_0_en.png | 4 +- ...r.mentions_MentionSpanTheme_Night_0_en.png | 4 +- tools/detekt/detekt.yml | 2 +- 48 files changed, 1156 insertions(+), 568 deletions(-) create mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeMentionSpanFormatter.kt create mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomNamesCache.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanFormatter.kt create mode 100644 libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanUpdater.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanFormatterTest.kt create mode 100644 libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanProviderFixture.kt diff --git a/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt index 8640fb03c8..0d79b5847a 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt @@ -241,7 +241,7 @@ class IntentResolverTest { } private fun createIntentResolver( - permalinkParserResult: () -> PermalinkData = { lambdaError() } + permalinkParserResult: (String) -> PermalinkData = { lambdaError() } ): IntentResolver { return IntentResolver( deeplinkParser = DeeplinkParser(), diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/HtmlConverterProvider.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/HtmlConverterProvider.kt index 5071613e58..607283792f 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/HtmlConverterProvider.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/timeline/HtmlConverterProvider.kt @@ -8,12 +8,11 @@ package io.element.android.features.messages.api.timeline import androidx.compose.runtime.Composable -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.wysiwyg.utils.HtmlConverter interface HtmlConverterProvider { @Composable - fun Update(currentUserId: UserId) + fun Update() fun provide(): HtmlConverter } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 09bc3a287f..6feaa23b62 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -57,6 +57,7 @@ import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.overlay.Overlay import io.element.android.libraries.architecture.overlay.operation.hide import io.element.android.libraries.architecture.overlay.operation.show +import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.dateformatter.api.DateFormatter import io.element.android.libraries.dateformatter.api.DateFormatterMode import io.element.android.libraries.dateformatter.api.toHumanReadableDuration @@ -73,17 +74,19 @@ import io.element.android.libraries.matrix.api.room.alias.matches import io.element.android.libraries.matrix.api.room.joinedRoomMembers import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo -import io.element.android.libraries.matrix.ui.messages.LocalRoomMemberProfilesCache import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache +import io.element.android.libraries.matrix.ui.messages.RoomNamesCache import io.element.android.libraries.mediaviewer.api.MediaInfo import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint -import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanUpdater import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.MentionSpanUpdater import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize @ContributesNode(RoomScope::class) @@ -100,11 +103,14 @@ class MessagesFlowNode @AssistedInject constructor( private val locationService: LocationService, private val room: MatrixRoom, private val roomMemberProfilesCache: RoomMemberProfilesCache, + private val roomNamesCache: RoomNamesCache, + private val mentionSpanUpdater: MentionSpanUpdater, private val mentionSpanTheme: MentionSpanTheme, private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider, private val timelineController: TimelineController, private val knockRequestsListEntryPoint: KnockRequestsListEntryPoint, private val dateFormatter: DateFormatter, + private val coroutineDispatchers: CoroutineDispatchers, ) : BaseFlowNode( backstack = BackStack( initialElement = plugins.filterIsInstance().first().initialTarget.toNavTarget(), @@ -172,13 +178,29 @@ class MessagesFlowNode @AssistedInject constructor( timelineController.close() } ) + setupCacheUpdaters() + + pinnedEventsTimelineProvider.launchIn(lifecycleScope) + } + + private fun setupCacheUpdaters() { room.membersStateFlow .onEach { membersState -> - roomMemberProfilesCache.replace(membersState.joinedRoomMembers()) + withContext(coroutineDispatchers.computation) { + roomMemberProfilesCache.replace(membersState.joinedRoomMembers()) + } } .launchIn(lifecycleScope) - pinnedEventsTimelineProvider.launchIn(lifecycleScope) + matrixClient.roomListService + .allRooms + .summaries + .onEach { + withContext(coroutineDispatchers.computation) { + roomNamesCache.replace(it) + } + } + .launchIn(lifecycleScope) } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -465,10 +487,9 @@ class MessagesFlowNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { - mentionSpanTheme.updateStyles(currentUserId = room.sessionId) + mentionSpanTheme.updateStyles() CompositionLocalProvider( - LocalRoomMemberProfilesCache provides roomMemberProfilesCache, - LocalMentionSpanTheme provides mentionSpanTheme, + LocalMentionSpanUpdater provides mentionSpanUpdater ) { BackstackWithOverlayBox(modifier) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 405bc2c536..4541e267fc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -128,7 +128,7 @@ class MessagesPresenter @AssistedInject constructor( @Composable override fun present(): MessagesState { - htmlConverterProvider.Update(currentUserId = room.sessionId) + htmlConverterProvider.Update() val roomInfo by room.roomInfoFlow.collectAsState() val localCoroutineScope = rememberCoroutineScope() diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt index ca9faddfee..8b66fd9e62 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt @@ -196,6 +196,7 @@ private fun AttachmentsPreviewBottomActions( onDeleteVoiceMessage = {}, onReceiveSuggestion = {}, resolveMentionDisplay = { _, _ -> TextDisplay.Plain }, + resolveAtRoomMentionDisplay = { TextDisplay.Plain }, onError = {}, onTyping = {}, onSelectRichContent = {}, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 8489139bb1..73057b1a51 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -47,7 +47,6 @@ import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder -import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.MatrixRoom @@ -56,7 +55,6 @@ import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType import io.element.android.libraries.matrix.api.room.isDm import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId -import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.mediapickers.api.PickerProvider @@ -65,7 +63,6 @@ import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.preferences.api.store.SessionPreferencesStore -import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanTheme import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.model.MarkdownTextEditorState @@ -119,7 +116,6 @@ class MessageComposerPresenter @AssistedInject constructor( private val draftService: ComposerDraftService, private val mentionSpanProvider: MentionSpanProvider, private val pillificationHelper: TextPillificationHelper, - private val roomMemberProfilesCache: RoomMemberProfilesCache, private val suggestionsProcessor: SuggestionsProcessor, ) : Presenter { @AssistedFactory @@ -331,7 +327,6 @@ class MessageComposerPresenter @AssistedInject constructor( markdownTextEditorState.insertSuggestion( resolvedSuggestion = event.resolvedSuggestion, mentionSpanProvider = mentionSpanProvider, - permalinkBuilder = permalinkBuilder, ) suggestionSearchTrigger.value = null } @@ -344,23 +339,24 @@ class MessageComposerPresenter @AssistedInject constructor( } } - val mentionSpanTheme = LocalMentionSpanTheme.current - val resolveMentionDisplay = remember(mentionSpanTheme) { + val resolveMentionDisplay = remember { { text: String, url: String -> - val permalinkData = permalinkParser.parse(url) - if (permalinkData is PermalinkData.UserLink) { - val displayNameOrId = roomMemberProfilesCache.getDisplayName(permalinkData.userId) ?: permalinkData.userId.value - val mentionSpan = mentionSpanProvider.getMentionSpanFor(displayNameOrId, url) - mentionSpan.update(mentionSpanTheme) + val mentionSpan = mentionSpanProvider.getMentionSpanFor(text, url) + if (mentionSpan != null) { TextDisplay.Custom(mentionSpan) } else { - val mentionSpan = mentionSpanProvider.getMentionSpanFor(text, url) - mentionSpan.update(mentionSpanTheme) - TextDisplay.Custom(mentionSpan) + TextDisplay.Plain } } } + val resolveAtRoomMentionDisplay = remember { + { + val mentionSpan = mentionSpanProvider.createEveryoneMentionSpan() + TextDisplay.Custom(mentionSpan) + } + } + return MessageComposerState( textEditorState = textEditorState, isFullScreen = isFullScreen.value, @@ -371,6 +367,7 @@ class MessageComposerPresenter @AssistedInject constructor( canCreatePoll = canCreatePoll.value, suggestions = suggestions.toPersistentList(), resolveMentionDisplay = resolveMentionDisplay, + resolveAtRoomMentionDisplay = resolveAtRoomMentionDisplay, eventSink = { handleEvents(it) }, ) } @@ -640,8 +637,8 @@ class MessageComposerPresenter @AssistedInject constructor( analyticsService.captureInteraction(Interaction.Name.MobileRoomComposerFormattingEnabled) } else { val markdown = richTextEditorState.messageMarkdown - val pilliefiedMarkdown = pillificationHelper.pillify(markdown) - markdownTextEditorState.text.update(pilliefiedMarkdown, true) + val markdownWithMentions = pillificationHelper.pillify(markdown, false) + markdownTextEditorState.text.update(markdownWithMentions, true) // Give some time for the focus of the previous editor to be cleared delay(100) markdownTextEditorState.requestFocusAction() @@ -709,7 +706,7 @@ class MessageComposerPresenter @AssistedInject constructor( if (content.isEmpty()) { markdownTextEditorState.selection = IntRange.EMPTY } - val pillifiedContent = pillificationHelper.pillify(content) + val pillifiedContent = pillificationHelper.pillify(content, false) markdownTextEditorState.text.update(pillifiedContent, true) if (requestFocus) { markdownTextEditorState.requestFocusAction() diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt index d86ba8d98c..1f1f80b203 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt @@ -25,5 +25,6 @@ data class MessageComposerState( val canCreatePoll: Boolean, val suggestions: ImmutableList, val resolveMentionDisplay: (String, String) -> TextDisplay, + val resolveAtRoomMentionDisplay: () -> TextDisplay, val eventSink: (MessageComposerEvents) -> Unit, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt index c0ea895618..590cfd20cf 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt @@ -43,5 +43,6 @@ fun aMessageComposerState( canCreatePoll = canCreatePoll, suggestions = suggestions, resolveMentionDisplay = { _, _ -> TextDisplay.Plain }, + resolveAtRoomMentionDisplay = { TextDisplay.Plain }, eventSink = eventSink, ) 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 bfb51f4a87..42c68255e8 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 @@ -113,6 +113,7 @@ internal fun MessageComposerView( onDeleteVoiceMessage = onDeleteVoiceMessage, onReceiveSuggestion = ::onSuggestionReceived, resolveMentionDisplay = state.resolveMentionDisplay, + resolveAtRoomMentionDisplay = state.resolveAtRoomMentionDisplay, onError = ::onError, onTyping = ::onTyping, onSelectRichContent = ::sendUri, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProvider.kt index 8cdf5a1626..78e763fcc2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProvider.kt @@ -16,11 +16,9 @@ import androidx.compose.ui.platform.LocalInspectionMode import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.messages.api.timeline.HtmlConverterProvider import io.element.android.libraries.core.bool.orFalse -import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle -import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanTheme import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.wysiwyg.compose.StyledHtmlConverter import io.element.android.wysiwyg.display.MentionDisplayHandler @@ -29,42 +27,45 @@ import io.element.android.wysiwyg.utils.HtmlConverter import uniffi.wysiwyg_composer.newMentionDetector import javax.inject.Inject -@ContributesBinding(SessionScope::class) -@SingleIn(SessionScope::class) +@ContributesBinding(RoomScope::class) +@SingleIn(RoomScope::class) class DefaultHtmlConverterProvider @Inject constructor( private val mentionSpanProvider: MentionSpanProvider, ) : HtmlConverterProvider { private val htmlConverter: MutableState = mutableStateOf(null) @Composable - override fun Update(currentUserId: UserId) { + override fun Update() { val isInEditMode = LocalInspectionMode.current val mentionDetector = remember(isInEditMode) { if (isInEditMode) null else newMentionDetector() } val editorStyle = ElementRichTextEditorStyle.textStyle() - val mentionSpanTheme = LocalMentionSpanTheme.current val context = LocalContext.current - htmlConverter.value = remember(editorStyle, mentionSpanTheme) { + htmlConverter.value = remember(editorStyle) { StyledHtmlConverter( context = context, mentionDisplayHandler = object : MentionDisplayHandler { override fun resolveAtRoomMentionDisplay(): TextDisplay { - val mentionSpan = mentionSpanProvider.getMentionSpanFor(text = "@room", url = "#") - mentionSpan.update(mentionSpanTheme) + val mentionSpan = mentionSpanProvider.createEveryoneMentionSpan() return TextDisplay.Custom(mentionSpan) } override fun resolveMentionDisplay(text: String, url: String): TextDisplay { val mentionSpan = mentionSpanProvider.getMentionSpanFor(text, url) - mentionSpan.update(mentionSpanTheme) - return TextDisplay.Custom(mentionSpan) + return if (mentionSpan != null) { + TextDisplay.Custom(mentionSpan) + } else { + TextDisplay.Plain + } } }, isEditor = false, - isMention = { _, url -> mentionDetector?.isMention(url).orFalse() } + isMention = { _, url -> + mentionDetector?.isMention(url).orFalse() + } ).apply { configureWith(editorStyle) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowTimestampPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowTimestampPreview.kt index 8933538b8a..0555670e46 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowTimestampPreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowTimestampPreview.kt @@ -32,7 +32,7 @@ internal fun TimelineItemEventRowTimestampPreview( event = event.copy( content = event.content.copy( body = str, - pillifiedBody = str, + formattedBody = str, ), reactionsState = aTimelineItemReactions(count = 0), ), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt index aed72254c6..a4a7cff9cb 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt @@ -14,9 +14,6 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalTextStyle import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -32,14 +29,8 @@ import io.element.android.features.messages.impl.utils.containsOnlyEmojis import io.element.android.libraries.androidutils.text.LinkifyHelper import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.messages.LocalRoomMemberProfilesCache -import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle -import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanTheme -import io.element.android.libraries.textcomposer.mentions.MentionSpan -import io.element.android.libraries.textcomposer.mentions.getMentionSpans -import io.element.android.libraries.textcomposer.mentions.updateMentionStyles +import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanUpdater import io.element.android.wysiwyg.compose.EditorStyledText import io.element.android.wysiwyg.link.Link @@ -51,7 +42,7 @@ fun TimelineItemTextView( modifier: Modifier = Modifier, onContentLayoutChange: (ContentAvoidingLayoutData) -> Unit = {}, ) { - val emojiOnly = (content.formattedBody == null || content.formattedBody.toString() == content.body) && + val emojiOnly = content.formattedBody.toString() == content.body && content.body.replace(" ", "").containsOnlyEmojis() val textStyle = when { emojiOnly -> ElementTheme.typography.fontHeadingXlRegular @@ -61,10 +52,10 @@ fun TimelineItemTextView( LocalContentColor provides ElementTheme.colors.textPrimary, LocalTextStyle provides textStyle ) { - val body = getTextWithResolvedMentions(content) + val text = getTextWithResolvedMentions(content) Box(modifier.semantics { contentDescription = content.plainText }) { EditorStyledText( - text = body, + text = text, onLinkClickedListener = onLinkClick, onLinkLongClickedListener = onLinkLongClick, style = ElementRichTextEditorStyle.textStyle(), @@ -78,36 +69,9 @@ fun TimelineItemTextView( @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @Composable internal fun getTextWithResolvedMentions(content: TimelineItemTextBasedContent): CharSequence { - val userProfileCache = LocalRoomMemberProfilesCache.current - val lastCacheUpdate by userProfileCache.lastCacheUpdate.collectAsState() - val mentionSpanTheme = LocalMentionSpanTheme.current - val formattedBody = content.formattedBody ?: content.pillifiedBody - val textWithMentions = remember(formattedBody, mentionSpanTheme, lastCacheUpdate) { - updateMentionSpans(formattedBody, userProfileCache) - mentionSpanTheme.updateMentionStyles(formattedBody) - formattedBody - } - return SpannableString(textWithMentions) -} - -private fun updateMentionSpans(text: CharSequence, cache: RoomMemberProfilesCache): Boolean { - var changedContents = false - for (mentionSpan in text.getMentionSpans()) { - when (mentionSpan.type) { - MentionSpan.Type.USER -> { - val displayName = cache.getDisplayName(UserId(mentionSpan.rawValue)) ?: mentionSpan.rawValue - if (mentionSpan.text != displayName) { - changedContents = true - mentionSpan.text = displayName - } - } - // There's no need to do anything for `@room` pills - MentionSpan.Type.EVERYONE -> Unit - // Nothing yet for room mentions - MentionSpan.Type.ROOM -> Unit - } - } - return changedContents + val mentionSpanUpdater = LocalMentionSpanUpdater.current + val bodyWithResolvedMentions = mentionSpanUpdater.rememberMentionSpans(content.formattedBody) + return SpannableString(bodyWithResolvedMentions) } @PreviewsDayNight @@ -126,7 +90,7 @@ internal fun TimelineItemTextViewPreview( @Composable internal fun TimelineItemTextViewWithLinkifiedUrlPreview() = ElementPreview { val content = aTimelineItemTextContent( - pillifiedBody = LinkifyHelper.linkify("The link should end after the first '?' (url: github.com/element-hq/element-x-android/README?)?.") + formattedBody = LinkifyHelper.linkify("The link should end after the first '?' (url: github.com/element-hq/element-x-android/README?)?.") ) TimelineItemTextView( content = content, @@ -139,7 +103,7 @@ internal fun TimelineItemTextViewWithLinkifiedUrlPreview() = ElementPreview { @Composable internal fun TimelineItemTextViewWithLinkifiedUrlAndNestedParenthesisPreview() = ElementPreview { val content = aTimelineItemTextContent( - pillifiedBody = LinkifyHelper.linkify("The link should end after the '(ME)' ((url: github.com/element-hq/element-x-android/READ(ME)))!") + formattedBody = LinkifyHelper.linkify("The link should end after the '(ME)' ((url: github.com/element-hq/element-x-android/READ(ME)))!") ) TimelineItemTextView( content = content, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt index d7d267ce48..f3b54dae53 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactory.kt @@ -69,13 +69,16 @@ class TimelineItemContentMessageFactory @Inject constructor( return when (val messageType = content.type) { is EmoteMessageType -> { val emoteBody = "* $senderDisambiguatedDisplayName ${messageType.body.trimEnd()}" + val formattedBody = parseHtml(messageType.formatted, prefix = "* $senderDisambiguatedDisplayName") ?: textPillificationHelper.pillify( + emoteBody + ).safeLinkify() TimelineItemEmoteContent( body = emoteBody, htmlDocument = messageType.formatted?.toHtmlDocument( permalinkParser = permalinkParser, prefix = "* $senderDisambiguatedDisplayName", ), - formattedBody = parseHtml(messageType.formatted, prefix = "* $senderDisambiguatedDisplayName") ?: emoteBody.withLinks(), + formattedBody = formattedBody, isEdited = content.isEdited, ) } @@ -123,10 +126,8 @@ class TimelineItemContentMessageFactory @Inject constructor( val body = messageType.body.trimEnd() TimelineItemTextContent( body = body, - pillifiedBody = textPillificationHelper.pillify(body), htmlDocument = null, - plainText = body, - formattedBody = null, + formattedBody = body, isEdited = content.isEdited, ) } else { @@ -219,20 +220,26 @@ class TimelineItemContentMessageFactory @Inject constructor( } is NoticeMessageType -> { val body = messageType.body.trimEnd() + val formattedBody = parseHtml(messageType.formatted) ?: textPillificationHelper.pillify( + body + ).safeLinkify() + val htmlDocument = messageType.formatted?.toHtmlDocument(permalinkParser = permalinkParser) TimelineItemNoticeContent( body = body, - htmlDocument = messageType.formatted?.toHtmlDocument(permalinkParser = permalinkParser), - formattedBody = parseHtml(messageType.formatted) ?: body.withLinks(), + htmlDocument = htmlDocument, + formattedBody = formattedBody, isEdited = content.isEdited, ) } is TextMessageType -> { val body = messageType.body.trimEnd() + val formattedBody = parseHtml(messageType.formatted) ?: textPillificationHelper.pillify( + body + ).safeLinkify() TimelineItemTextContent( body = body, - pillifiedBody = textPillificationHelper.pillify(body).safeLinkify(), htmlDocument = messageType.formatted?.toHtmlDocument(permalinkParser = permalinkParser), - formattedBody = parseHtml(messageType.formatted) ?: body.withLinks(), + formattedBody = formattedBody, isEdited = content.isEdited, ) } @@ -240,9 +247,8 @@ class TimelineItemContentMessageFactory @Inject constructor( val body = messageType.body.trimEnd() TimelineItemTextContent( body = body, - pillifiedBody = textPillificationHelper.pillify(body), htmlDocument = null, - formattedBody = body.withLinks(), + formattedBody = textPillificationHelper.pillify(body).safeLinkify(), isEdited = content.isEdited, ) } @@ -263,6 +269,7 @@ class TimelineItemContentMessageFactory @Inject constructor( if (formattedBody == null || formattedBody.format != MessageFormat.HTML) return null val result = htmlConverterProvider.provide() .fromHtmlToSpans(formattedBody.body.trimEnd()) + .let { textPillificationHelper.pillify(it) } .safeLinkify() return if (prefix != null) { buildSpannedString { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEmoteContent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEmoteContent.kt index 82cd5a3f39..dc04e5b269 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEmoteContent.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEmoteContent.kt @@ -12,11 +12,10 @@ import org.jsoup.nodes.Document data class TimelineItemEmoteContent( override val body: String, - override val pillifiedBody: CharSequence = body, override val htmlDocument: Document?, - override val plainText: String = htmlDocument?.toPlainText() ?: body, - override val formattedBody: CharSequence?, + override val formattedBody: CharSequence, override val isEdited: Boolean, ) : TimelineItemTextBasedContent { override val type: String = "TimelineItemEmoteContent" + override val plainText: String = htmlDocument?.toPlainText() ?: body } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContentProvider.kt index 09484ac7e3..36c32222be 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEventContentProvider.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.core.text.buildSpannedString import androidx.core.text.inSpans import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent +import org.jsoup.nodes.Document class TimelineItemEventContentProvider : PreviewParameterProvider { override val values = sequenceOf( @@ -58,35 +59,46 @@ class TimelineItemTextBasedContentProvider : PreviewParameterProvider { - val mentionSpanExists = spannable.getSpans(match.start, match.end).isNotEmpty() - if (!mentionSpanExists) { - val userId = UserId(match.value) - val permalink = permalinkBuilder.permalinkForUser(userId).getOrNull() ?: continue - val mentionSpan = mentionSpanProvider.getMentionSpanFor(match.value, permalink) - roomMemberProfilesCache.getDisplayName(userId)?.let { mentionSpan.text = it } - spannable.replace(match.start, match.end, "@ ") - spannable.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + val userId = UserId(match.value) + val mentionSpan = mentionSpanProvider.createUserMentionSpan(userId) + text.replace(match.start, match.end, "@ ") + text.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + permalinkBuilder.permalinkForUser(userId).getOrNull()?.also { permalink -> + // Also add a URLSpan in case of raw user id so it can be clicked + val urlSpan = URLSpan(permalink) + text.setSpan(urlSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } } MatrixPatternType.ROOM_ALIAS -> { - val mentionSpanExists = spannable.getSpans(match.start, match.end).isNotEmpty() - if (!mentionSpanExists) { - val permalink = permalinkBuilder.permalinkForRoomAlias(RoomAlias(match.value)).getOrNull() ?: continue - val mentionSpan = mentionSpanProvider.getMentionSpanFor(match.value, permalink) - spannable.replace(match.start, match.end, "@ ") - spannable.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + val roomAlias = RoomAlias(match.value) + val mentionSpan = mentionSpanProvider.createRoomMentionSpan(roomAlias.toRoomIdOrAlias()) + text.replace(match.start, match.end, "@ ") + text.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + permalinkBuilder.permalinkForRoomAlias(roomAlias).getOrNull()?.also { permalink -> + // Also add a URLSpan in case of raw room alias so it can be clicked + val urlSpan = URLSpan(permalink) + text.setSpan(urlSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } } MatrixPatternType.AT_ROOM -> { - val mentionSpanExists = spannable.getSpans(match.start, match.end).isNotEmpty() - if (!mentionSpanExists) { - val mentionSpan = mentionSpanProvider.getMentionSpanFor("@room", "") - spannable.replace(match.start, match.end, "@ ") - spannable.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - } + val mentionSpan = mentionSpanProvider.createEveryoneMentionSpan() + text.replace(match.start, match.end, "@ ") + text.setSpan(mentionSpan, match.start, match.start + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } else -> Unit } } - return spannable + } + + private fun pillifyPermalinks(text: SpannableStringBuilder) { + for (match in Patterns.WEB_URL.toRegex().findAll(text)) { + val start = match.range.first + val end = match.range.last + 1 + if (!text.canPillify(start, end)) continue + val url = text.substring(match.range) + val mentionSpan = mentionSpanProvider.getMentionSpanFor(match.value, url) + if (mentionSpan != null) { + text.setSpan(mentionSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + } + } + } + + private fun Spanned.canPillify(start: Int, end: Int): Boolean { + if (getMentionSpans(start, end).isNotEmpty()) return false + if (getSpans(start, end).isNotEmpty()) return false + if (getSpans(start, end).isNotEmpty()) return false + return true } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt index 8a5b388f72..e5e6ff5ea2 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt @@ -153,7 +153,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = false, isEditable = false, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -201,7 +201,7 @@ class ActionListPresenterTest { isMine = false, isEditable = false, isThreaded = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -248,7 +248,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = false, isEditable = false, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -296,7 +296,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = false, isEditable = false, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -344,7 +344,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = false, isEditable = false, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -391,7 +391,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -439,7 +439,7 @@ class ActionListPresenterTest { val messageEvent = aMessageEvent( isMine = true, isThreaded = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -486,7 +486,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -804,7 +804,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -852,7 +852,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -907,7 +907,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) initialState.eventSink.invoke( ActionListEvents.ComputeForMessage( @@ -956,7 +956,7 @@ class ActionListPresenterTest { val initialState = awaitItem() val messageEvent = aMessageEvent( isMine = true, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null) + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE) ) val redactedEvent = aMessageEvent( isMine = true, @@ -1006,7 +1006,7 @@ class ActionListPresenterTest { eventId = null, isMine = true, canBeRepliedTo = false, - content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = null), + content = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, isEdited = false, formattedBody = A_MESSAGE), ) initialState.eventSink.invoke( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt index c52f01949d..a8dbab2cf2 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/MessageEventFixtures.kt @@ -38,7 +38,7 @@ internal fun aMessageEvent( isMine: Boolean = true, isEditable: Boolean = true, canBeRepliedTo: Boolean = true, - content: TimelineItemEventContent = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, formattedBody = null, isEdited = false), + content: TimelineItemEventContent = TimelineItemTextContent(body = A_MESSAGE, htmlDocument = null, formattedBody = A_MESSAGE, isEdited = false), inReplyTo: InReplyToDetails? = null, isThreaded: Boolean = false, sendState: LocalEventSendState = LocalEventSendState.Sent(AN_EVENT_ID), diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt index 8328624bf6..2f80c52369 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt @@ -27,6 +27,7 @@ import io.element.android.features.messages.impl.draft.ComposerDraftService import io.element.android.features.messages.impl.draft.FakeComposerDraftService import io.element.android.features.messages.impl.messagecomposer.suggestions.SuggestionsProcessor import io.element.android.features.messages.impl.timeline.TimelineController +import io.element.android.features.messages.impl.utils.FakeMentionSpanFormatter import io.element.android.features.messages.impl.utils.FakeTextPillificationHelper import io.element.android.features.messages.impl.utils.TextPillificationHelper import io.element.android.libraries.core.mimetype.MimeTypes @@ -67,7 +68,6 @@ import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.matrix.test.room.aRoomMember import io.element.android.libraries.matrix.test.timeline.FakeTimeline -import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.mediapickers.api.PickerProvider import io.element.android.libraries.mediapickers.test.FakePickerProvider @@ -82,6 +82,7 @@ import io.element.android.libraries.permissions.test.FakePermissionsPresenterFac import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import io.element.android.libraries.preferences.test.InMemorySessionPreferencesStore import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.Suggestion @@ -1535,8 +1536,11 @@ class MessageComposerPresenterTest { permissionPresenter: PermissionsPresenter = FakePermissionsPresenter(), permalinkBuilder: PermalinkBuilder = FakePermalinkBuilder(), permalinkParser: PermalinkParser = FakePermalinkParser(), - mentionSpanProvider: MentionSpanProvider = MentionSpanProvider(permalinkParser), - roomMemberProfilesCache: RoomMemberProfilesCache = RoomMemberProfilesCache(), + mentionSpanProvider: MentionSpanProvider = MentionSpanProvider( + permalinkParser = permalinkParser, + mentionSpanFormatter = FakeMentionSpanFormatter(), + mentionSpanTheme = MentionSpanTheme(A_USER_ID) + ), textPillificationHelper: TextPillificationHelper = FakeTextPillificationHelper(), isRichTextEditorEnabled: Boolean = true, draftService: ComposerDraftService = FakeComposerDraftService(), @@ -1562,7 +1566,6 @@ class MessageComposerPresenterTest { draftService = draftService, mentionSpanProvider = mentionSpanProvider, pillificationHelper = textPillificationHelper, - roomMemberProfilesCache = roomMemberProfilesCache, suggestionsProcessor = SuggestionsProcessor(), ).apply { isTesting = true diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProviderTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProviderTest.kt index 2f4740dfc9..a5f3417d5d 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProviderTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/DefaultHtmlConverterProviderTest.kt @@ -11,9 +11,11 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.junit4.createComposeRule import com.google.common.truth.Truth.assertThat +import io.element.android.features.messages.impl.utils.FakeMentionSpanFormatter import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,10 +25,16 @@ import org.robolectric.RobolectricTestRunner class DefaultHtmlConverterProviderTest { @get:Rule val composeTestRule = createComposeRule() + private val provider = DefaultHtmlConverterProvider( + mentionSpanProvider = MentionSpanProvider( + permalinkParser = FakePermalinkParser(), + mentionSpanFormatter = FakeMentionSpanFormatter(), + mentionSpanTheme = MentionSpanTheme(A_USER_ID) + ) + ) + @Test fun `calling provide without calling Update first should throw an exception`() { - val provider = DefaultHtmlConverterProvider(mentionSpanProvider = MentionSpanProvider(FakePermalinkParser())) - val exception = runCatching { provider.provide() }.exceptionOrNull() assertThat(exception).isInstanceOf(IllegalStateException::class.java) @@ -34,13 +42,11 @@ class DefaultHtmlConverterProviderTest { @Test fun `calling provide after calling Update first should return an HtmlConverter`() { - val provider = DefaultHtmlConverterProvider(mentionSpanProvider = MentionSpanProvider(FakePermalinkParser())) composeTestRule.setContent { CompositionLocalProvider(LocalInspectionMode provides true) { - provider.Update(currentUserId = A_USER_ID) + provider.Update() } } - val htmlConverter = runCatching { provider.provide() }.getOrNull() assertThat(htmlConverter).isNotNull() diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineTextViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineTextViewTest.kt index fd081ac489..ee52aff578 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineTextViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineTextViewTest.kt @@ -8,6 +8,7 @@ package io.element.android.features.messages.impl.timeline.components.event import android.text.SpannableString +import android.text.SpannedString import androidx.activity.ComponentActivity import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.test.junit4.AndroidComposeTestRule @@ -18,16 +19,22 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextContent +import io.element.android.features.messages.impl.utils.FakeMentionSpanFormatter +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias 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_USER_ID -import io.element.android.libraries.matrix.test.A_USER_ID_2 -import io.element.android.libraries.matrix.test.A_USER_NAME -import io.element.android.libraries.matrix.test.room.aRoomMember -import io.element.android.libraries.matrix.ui.messages.LocalRoomMemberProfilesCache import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache +import io.element.android.libraries.matrix.ui.messages.RoomNamesCache +import io.element.android.libraries.textcomposer.mentions.DefaultMentionSpanUpdater +import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanUpdater import io.element.android.libraries.textcomposer.mentions.MentionSpan +import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.MentionSpanUpdater +import io.element.android.libraries.textcomposer.mentions.MentionType import io.element.android.libraries.textcomposer.mentions.getMentionSpans +import io.element.android.tests.testutils.lambda.assert +import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.wysiwyg.view.spans.CustomMentionSpan import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.test.runTest @@ -40,101 +47,100 @@ import org.junit.runner.RunWith class TimelineTextViewTest { @get:Rule val rule = createAndroidComposeRule() + private val mentionSpanTheme = MentionSpanTheme(currentUserId = A_USER_ID) + private val formatLambda = lambdaRecorder { mentionType -> mentionType.toString() } + private val mentionSpanFormatter = FakeMentionSpanFormatter(formatLambda) + @Test fun `getTextWithResolvedMentions - does nothing for a non spannable CharSequence`() = runTest { val charSequence = "Hello @alice:example.com" - - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) + val mentionSpanUpdater = aMentionSpanUpdater() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(charSequence)) assertThat(result.getMentionSpans()).isEmpty() + assert(formatLambda).isNeverCalled() } @Test fun `getTextWithResolvedMentions - does nothing if there are no mentions`() = runTest { val charSequence = SpannableString("Hello @alice:example.com") - - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) + val mentionSpanUpdater = aMentionSpanUpdater() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(charSequence)) assertThat(result.getMentionSpans()).isEmpty() + assert(formatLambda).isNeverCalled() } @Test fun `getTextWithResolvedMentions - just returns the body if there is no formattedBody`() = runTest { val charSequence = "Hello @alice:example.com" - - val result = rule.getText(aTextContentWithFormattedBody(body = charSequence, formattedBody = null)) + val mentionSpanUpdater = aMentionSpanUpdater() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(body = charSequence, formattedBody = null)) assertThat(result.getMentionSpans()).isEmpty() assertThat(result.toString()).isEqualTo(charSequence) + assert(formatLambda).isNeverCalled() } @Test - fun `getTextWithResolvedMentions - with Room mention does nothing`() = runTest { + fun `getTextWithResolvedMentions - with Room mention format correctly`() = runTest { + val mentionType = MentionType.Room(roomIdOrAlias = A_ROOM_ID_2.toRoomIdOrAlias()) val charSequence = buildSpannedString { append("Hello ") - inSpans(aMentionSpan(rawValue = A_ROOM_ID_2.value, type = MentionSpan.Type.ROOM)) { + inSpans(MentionSpan(mentionType)) { append(A_ROOM_ID.value) } } + val mentionSpanUpdater = aMentionSpanUpdater() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(charSequence)) - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) - - assertThat(result.getMentionSpans().firstOrNull()?.text).isEmpty() + val expectedDisplayText = mentionType.toString() + assertThat(result.getMentionSpans().firstOrNull()?.displayText.toString()).isEqualTo(expectedDisplayText) assertThat(result).isEqualTo(charSequence) + assert(formatLambda).isCalledOnce() } @Test fun `getTextWithResolvedMentions - replaces MentionSpan's text`() = runTest { + val mentionType = MentionType.User(userId = A_USER_ID) val charSequence = buildSpannedString { append("Hello ") - inSpans(aMentionSpan(rawValue = A_USER_ID.value)) { + inSpans(MentionSpan(mentionType)) { append("@NotAlice") } } + val mentionSpanUpdater = aMentionSpanUpdater() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(charSequence)) - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) - - assertThat(result.getMentionSpans().firstOrNull()?.text).isEqualTo("alice") + val expectedDisplayText = mentionType.toString() + assertThat(result.getMentionSpans().firstOrNull()?.displayText.toString()).isEqualTo(expectedDisplayText) + assert(formatLambda).isCalledOnce() } @Test fun `getTextWithResolvedMentions - replaces MentionSpan's text inside CustomMentionSpan`() = runTest { + val mentionType = MentionType.User(userId = A_USER_ID) val charSequence = buildSpannedString { append("Hello ") - inSpans(CustomMentionSpan(aMentionSpan(rawValue = A_USER_ID.value))) { + inSpans(CustomMentionSpan(MentionSpan(mentionType))) { append("@NotAlice") } } - - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) - - assertThat(result.getMentionSpans().firstOrNull()?.text).isEqualTo("alice") - } - - @Test - fun `getTextWithResolvedMentions - replaces MentionSpan's text with user id if no display name is cached`() = runTest { - val charSequence = buildSpannedString { - append("Hello ") - inSpans(aMentionSpan(rawValue = A_USER_ID_2.value)) { - append("@NotAlice") - } - } - - val result = rule.getText(aTextContentWithFormattedBody(charSequence)) - - assertThat(result.getMentionSpans().firstOrNull()?.text).isEqualTo(A_USER_ID_2.value) + val mentionSpanUpdater = aMentionSpanUpdater() + val expectedDisplayText = mentionType.toString() + val result = rule.getText(mentionSpanUpdater, aTextContentWithFormattedBody(charSequence)) + assertThat(result.getMentionSpans().firstOrNull()?.displayText.toString()).isEqualTo(expectedDisplayText) + assert(formatLambda).isCalledOnce() } private suspend fun AndroidComposeTestRule.getText( + mentionSpanUpdater: MentionSpanUpdater, content: TimelineItemTextBasedContent, ): CharSequence { val completable = CompletableDeferred() setContent { - val roomMemberProfilesCache = RoomMemberProfilesCache().apply { - replace(listOf(aRoomMember(userId = A_USER_ID, displayName = A_USER_NAME))) - } CompositionLocalProvider( - LocalRoomMemberProfilesCache provides roomMemberProfilesCache, + LocalMentionSpanUpdater provides mentionSpanUpdater ) { completable.complete(getTextWithResolvedMentions(content = content)) } @@ -142,21 +148,20 @@ class TimelineTextViewTest { return completable.await() } - private fun aMentionSpan( - rawValue: String, - text: String = "", - type: MentionSpan.Type = MentionSpan.Type.USER - ) = MentionSpan( - text = text, - rawValue = rawValue, - type = type, - ) + private fun aMentionSpanUpdater(): MentionSpanUpdater { + return DefaultMentionSpanUpdater( + formatter = mentionSpanFormatter, + theme = mentionSpanTheme, + roomMemberProfilesCache = RoomMemberProfilesCache(), + roomNamesCache = RoomNamesCache(), + ) + } private fun aTextContentWithFormattedBody(formattedBody: CharSequence?, body: String = "") = TimelineItemTextContent( body = body, htmlDocument = null, - formattedBody = formattedBody, + formattedBody = formattedBody ?: SpannedString(body), isEdited = false ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt index 51f3f09268..c6c8c7c1e3 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentMessageFactoryTest.kt @@ -89,9 +89,8 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemTextContent( body = "body", htmlDocument = null, - plainText = "body", isEdited = false, - formattedBody = null, + formattedBody = SpannedString("body"), ) assertThat(result).isEqualTo(expected) } @@ -123,9 +122,8 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemTextContent( body = "body", htmlDocument = null, - plainText = "body", isEdited = false, - formattedBody = null, + formattedBody = "body", ) assertThat(result).isEqualTo(expected) } @@ -141,10 +139,8 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemTextContent( body = "body", htmlDocument = null, - plainText = "body", isEdited = false, - formattedBody = null, - pillifiedBody = SpannableString("body"), + formattedBody = SpannedString("body"), ) assertThat(result).isEqualTo(expected) } @@ -160,7 +156,6 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemTextContent( body = "https://www.example.org", htmlDocument = null, - plainText = "https://www.example.org", isEdited = false, formattedBody = buildSpannedString { inSpans(URLSpan("https://www.example.org")) { @@ -223,7 +218,7 @@ class TimelineItemContentMessageFactoryTest { senderDisambiguatedDisplayName = "Bob", eventId = AN_EVENT_ID, ) - assertThat((result as TimelineItemTextContent).formattedBody).isNull() + assertThat((result as TimelineItemTextContent).formattedBody).isEqualTo(SpannedString("body")) } @Test @@ -637,8 +632,7 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemNoticeContent( body = "body", htmlDocument = null, - plainText = "body", - formattedBody = null, + formattedBody = SpannedString("body"), isEdited = false, ) assertThat(result).isEqualTo(expected) @@ -671,8 +665,7 @@ class TimelineItemContentMessageFactoryTest { val expected = TimelineItemEmoteContent( body = "* Bob body", htmlDocument = null, - plainText = "* Bob body", - formattedBody = null, + formattedBody = SpannedString("* Bob body"), isEdited = false, ) assertThat(result).isEqualTo(expected) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultTextPillificationHelperTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultTextPillificationHelperTest.kt index 013ce22cc2..0d571a2459 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultTextPillificationHelperTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/DefaultTextPillificationHelperTest.kt @@ -10,17 +10,21 @@ package io.element.android.features.messages.impl.utils import android.net.Uri import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.core.EventId 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.core.UserId +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkBuilder import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser -import io.element.android.libraries.matrix.test.room.aRoomMember -import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache -import io.element.android.libraries.textcomposer.mentions.MentionSpan +import io.element.android.libraries.textcomposer.mentions.MentionSpanFormatter import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.MentionType import io.element.android.libraries.textcomposer.mentions.getMentionSpans import org.junit.Test import org.junit.runner.RunWith @@ -30,90 +34,201 @@ class DefaultTextPillificationHelperTest { @Test fun `pillify - adds pills for user ids`() { val text = "A @user:server.com" + val formatter = FakeMentionSpanFormatter() + val userId = UserId("@user:server.com") val helper = aTextPillificationHelper( - permalinkparser = FakePermalinkParser(result = { - PermalinkData.UserLink(UserId("@user:server.com")) + permalinkParser = FakePermalinkParser(result = { + PermalinkData.UserLink(userId) }), permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { Result.success("https://matrix.to/#/@user:server.com") }), + mentionSpanFormatter = formatter, ) val pillified = helper.pillify(text) val mentionSpans = pillified.getMentionSpans() assertThat(mentionSpans).hasSize(1) - val mentionSpan = mentionSpans.firstOrNull() - assertThat(mentionSpan?.type).isEqualTo(MentionSpan.Type.USER) - assertThat(mentionSpan?.rawValue).isEqualTo("@user:server.com") - assertThat(mentionSpan?.text).isEqualTo("@user:server.com") - } - - @Test - fun `pillify - uses the cached display name for user mentions`() { - val text = "A @user:server.com" - val helper = aTextPillificationHelper( - permalinkparser = FakePermalinkParser(result = { - PermalinkData.UserLink(UserId("@user:server.com")) - }), - permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { - Result.success("https://matrix.to/#/@user:server.com") - }), - roomMemberProfilesCache = RoomMemberProfilesCache().apply { - replace(listOf(aRoomMember(userId = UserId("@user:server.com"), displayName = "Alice"))) - }, - ) - val pillified = helper.pillify(text) - val mentionSpans = pillified.getMentionSpans() - assertThat(mentionSpans).hasSize(1) - val mentionSpan = mentionSpans.firstOrNull() - assertThat(mentionSpan?.type).isEqualTo(MentionSpan.Type.USER) - assertThat(mentionSpan?.rawValue).isEqualTo("@user:server.com") - assertThat(mentionSpan?.text).isEqualTo("Alice") + val mentionSpan = mentionSpans.first() + assertThat(mentionSpan.type).isInstanceOf(MentionType.User::class.java) + val userType = mentionSpan.type as MentionType.User + assertThat(userType.userId).isEqualTo(userId) + val formatted = formatter.formatDisplayText(MentionType.User(userId)) + assertThat(mentionSpan.displayText.toString()).isEqualTo(formatted) } @Test fun `pillify - adds pills for room aliases`() { val text = "A #room:server.com" + val roomAlias = RoomAlias("#room:server.com") + val formatter = FakeMentionSpanFormatter() val helper = aTextPillificationHelper( - permalinkparser = FakePermalinkParser(result = { - PermalinkData.RoomLink(RoomIdOrAlias.Alias(RoomAlias("#room:server.com"))) + permalinkParser = FakePermalinkParser(result = { + PermalinkData.RoomLink(RoomIdOrAlias.Alias(roomAlias)) }), permalinkBuilder = FakePermalinkBuilder(permalinkForRoomAliasLambda = { Result.success("https://matrix.to/#/#room:server.com") }), + mentionSpanFormatter = formatter, ) val pillified = helper.pillify(text) val mentionSpans = pillified.getMentionSpans() assertThat(mentionSpans).hasSize(1) - val mentionSpan = mentionSpans.firstOrNull() - assertThat(mentionSpan?.type).isEqualTo(MentionSpan.Type.ROOM) - assertThat(mentionSpan?.rawValue).isEqualTo("#room:server.com") - assertThat(mentionSpan?.text).isEqualTo("#room:server.com") + val mentionSpan = mentionSpans.first() + assertThat(mentionSpan.type).isInstanceOf(MentionType.Room::class.java) + val roomType = mentionSpan.type as MentionType.Room + assertThat(roomType.roomIdOrAlias).isEqualTo(roomAlias.toRoomIdOrAlias()) + val formatted = formatter.formatDisplayText(MentionType.Room(roomAlias.toRoomIdOrAlias())) + assertThat(mentionSpan.displayText.toString()).isEqualTo(formatted) } @Test fun `pillify - adds pills for @room mentions`() { val text = "An @room mention" - val helper = aTextPillificationHelper(permalinkparser = FakePermalinkParser(result = { - PermalinkData.FallbackLink(Uri.EMPTY) - })) + val formatter = FakeMentionSpanFormatter() + val helper = aTextPillificationHelper( + permalinkParser = FakePermalinkParser(result = { + PermalinkData.FallbackLink(Uri.EMPTY) + }), + mentionSpanFormatter = formatter, + ) val pillified = helper.pillify(text) val mentionSpans = pillified.getMentionSpans() assertThat(mentionSpans).hasSize(1) - val mentionSpan = mentionSpans.firstOrNull() - assertThat(mentionSpan?.type).isEqualTo(MentionSpan.Type.EVERYONE) - assertThat(mentionSpan?.rawValue).isEqualTo("@room") - assertThat(mentionSpan?.text).isEqualTo("@room") + val mentionSpan = mentionSpans.first() + assertThat(mentionSpan.type).isEqualTo(MentionType.Everyone) + val formatted = formatter.formatDisplayText(MentionType.Everyone) + assertThat(mentionSpan.displayText.toString()).isEqualTo(formatted) + } + + @Test + fun `pillify - adds pills for message permalinks`() { + val text = "Check this message: https://matrix.to/#/!roomid:server.com/$123" + val roomId = RoomId("!roomid:server.com") + val eventId = EventId("$123") + val formatter = FakeMentionSpanFormatter() + val helper = aTextPillificationHelper( + permalinkParser = FakePermalinkParser(result = { + PermalinkData.RoomLink( + roomIdOrAlias = RoomIdOrAlias.Id(roomId), + eventId = eventId + ) + }), + permalinkBuilder = FakePermalinkBuilder(), + mentionSpanFormatter = formatter, + ) + val pillified = helper.pillify(text) + val mentionSpans = pillified.getMentionSpans() + assertThat(mentionSpans).hasSize(1) + val mentionSpan = mentionSpans.first() + assertThat(mentionSpan.type).isInstanceOf(MentionType.Message::class.java) + val messageType = mentionSpan.type as MentionType.Message + assertThat(messageType.roomIdOrAlias).isEqualTo(roomId.toRoomIdOrAlias()) + assertThat(messageType.eventId).isEqualTo(eventId) + val formatted = formatter.formatDisplayText(MentionType.Message(roomId.toRoomIdOrAlias(), eventId)) + assertThat(mentionSpan.displayText.toString()).isEqualTo(formatted) + } + + @Test + fun `pillify - with pillifyPermalinks false does not add pills for permalinks`() { + val text = "Check this message: https://matrix.to/#/!roomid:server.com/$123" + val roomId = RoomId("!roomid:server.com") + val eventId = EventId("$123") + val formatter = FakeMentionSpanFormatter() + val helper = aTextPillificationHelper( + permalinkParser = FakePermalinkParser(result = { + PermalinkData.RoomLink( + roomIdOrAlias = RoomIdOrAlias.Id(roomId), + eventId = eventId + ) + }), + permalinkBuilder = FakePermalinkBuilder(), + mentionSpanFormatter = formatter, + ) + val pillified = helper.pillify(text, pillifyPermalinks = false) + val mentionSpans = pillified.getMentionSpans() + assertThat(mentionSpans).isEmpty() + } + + @Test + fun `pillify - with pillifyPermalinks false still adds pills for matrix patterns`() { + val text = "A @user:server.com mention and a permalink https://matrix.to/#/!roomid:server.com/$123" + val userId = UserId("@user:server.com") + val formatter = FakeMentionSpanFormatter() + val helper = aTextPillificationHelper( + permalinkParser = FakePermalinkParser(result = { + PermalinkData.UserLink(userId) + }), + permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { + Result.success("https://matrix.to/#/@user:server.com") + }), + mentionSpanFormatter = formatter, + ) + val pillified = helper.pillify(text, pillifyPermalinks = false) + val mentionSpans = pillified.getMentionSpans() + assertThat(mentionSpans).hasSize(1) + val mentionSpan = mentionSpans.first() + assertThat(mentionSpan.type).isInstanceOf(MentionType.User::class.java) + val userType = mentionSpan.type as MentionType.User + assertThat(userType.userId).isEqualTo(userId) + } + + @Test + fun `pillify - with pillifyPermalinks true adds pills for both matrix patterns and permalinks`() { + val text = "A @user:server.com mention and a permalink https://matrix.to/#/!roomid:server.com/$123" + val userId = UserId("@user:server.com") + val roomId = RoomId("!roomid:server.com") + val eventId = EventId("$123") + val formatter = FakeMentionSpanFormatter() + val permalinkParser = FakePermalinkParser(result = { url -> + if (url.contains("matrix.to")) { + PermalinkData.RoomLink( + roomIdOrAlias = RoomIdOrAlias.Id(roomId), + eventId = eventId + ) + } else { + PermalinkData.UserLink(userId) + } + }) + val helper = aTextPillificationHelper( + permalinkParser = permalinkParser, + permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { + Result.success("https://matrix.to/#/@user:server.com") + }), + mentionSpanFormatter = formatter, + ) + val pillified = helper.pillify(text, pillifyPermalinks = true) + val mentionSpans = pillified.getMentionSpans() + assertThat(mentionSpans).hasSize(2) + + // Check that we have both a user mention and a message mention + val types = mentionSpans.map { it.type::class.java } + assertThat(types).contains(MentionType.User::class.java) + assertThat(types).contains(MentionType.Message::class.java) + + // Verify the user mention + val userMention = mentionSpans.first { it.type is MentionType.User }.type as MentionType.User + assertThat(userMention.userId).isEqualTo(userId) + + // Verify the message mention + val messageMention = mentionSpans.first { it.type is MentionType.Message }.type as MentionType.Message + assertThat(messageMention.roomIdOrAlias).isEqualTo(roomId.toRoomIdOrAlias()) + assertThat(messageMention.eventId).isEqualTo(eventId) } private fun aTextPillificationHelper( - permalinkparser: PermalinkParser = FakePermalinkParser(), + permalinkParser: PermalinkParser = FakePermalinkParser(), permalinkBuilder: FakePermalinkBuilder = FakePermalinkBuilder(), - mentionSpanProvider: MentionSpanProvider = MentionSpanProvider(permalinkparser), - roomMemberProfilesCache: RoomMemberProfilesCache = RoomMemberProfilesCache(), - ) = DefaultTextPillificationHelper( - mentionSpanProvider = mentionSpanProvider, - permalinkBuilder = permalinkBuilder, - permalinkParser = permalinkparser, - roomMemberProfilesCache = roomMemberProfilesCache, - ) + mentionSpanFormatter: MentionSpanFormatter = FakeMentionSpanFormatter(), + ): TextPillificationHelper { + val mentionSpanProvider = MentionSpanProvider( + permalinkParser = permalinkParser, + mentionSpanFormatter = mentionSpanFormatter, + mentionSpanTheme = MentionSpanTheme(A_USER_ID), + ) + return DefaultTextPillificationHelper( + mentionSpanProvider = mentionSpanProvider, + permalinkBuilder = permalinkBuilder, + permalinkParser = permalinkParser, + ) + } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeMentionSpanFormatter.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeMentionSpanFormatter.kt new file mode 100644 index 0000000000..a8128bf622 --- /dev/null +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeMentionSpanFormatter.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.messages.impl.utils + +import io.element.android.libraries.textcomposer.mentions.MentionSpanFormatter +import io.element.android.libraries.textcomposer.mentions.MentionType + +class FakeMentionSpanFormatter( + private val formatLambda: (MentionType) -> CharSequence = { type -> type.toString() }, +) : MentionSpanFormatter { + override fun formatDisplayText(mentionType: MentionType): CharSequence { + return formatLambda(mentionType) + } +} diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeTextPillificationHelper.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeTextPillificationHelper.kt index d8c62bca40..bbc7c7a728 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeTextPillificationHelper.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/utils/FakeTextPillificationHelper.kt @@ -8,9 +8,9 @@ package io.element.android.features.messages.impl.utils class FakeTextPillificationHelper( - private val pillifyLambda: (CharSequence) -> CharSequence = { it } + private val pillifyLambda: (CharSequence, Boolean) -> CharSequence = { text, _ -> text } ) : TextPillificationHelper { - override fun pillify(text: CharSequence): CharSequence { - return pillifyLambda(text) + override fun pillify(text: CharSequence, pillifyPermalinks: Boolean): CharSequence { + return pillifyLambda(text, pillifyPermalinks) } } diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/FakeHtmlConverterProvider.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/FakeHtmlConverterProvider.kt index 38f10071e9..b9ea0d2416 100644 --- a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/FakeHtmlConverterProvider.kt +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/timeline/FakeHtmlConverterProvider.kt @@ -9,14 +9,13 @@ package io.element.android.features.messages.test.timeline import androidx.compose.runtime.Composable import io.element.android.features.messages.api.timeline.HtmlConverterProvider -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.wysiwyg.utils.HtmlConverter class FakeHtmlConverterProvider( private val transform: (String) -> CharSequence = { it }, ) : HtmlConverterProvider { @Composable - override fun Update(currentUserId: UserId) = Unit + override fun Update() = Unit override fun provide(): HtmlConverter { return object : HtmlConverter { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkParser.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkParser.kt index 487b898db3..c00ab8f113 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkParser.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkParser.kt @@ -12,13 +12,13 @@ import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.tests.testutils.lambda.lambdaError class FakePermalinkParser( - private var result: () -> PermalinkData = { lambdaError() } + private var result: (String) -> PermalinkData = { lambdaError() } ) : PermalinkParser { fun givenResult(result: PermalinkData) { this.result = { result } } override fun parse(uriString: String): PermalinkData { - return result() + return result(uriString) } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomMemberProfilesCache.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomMemberProfilesCache.kt index c71e5679cb..0c02a24a0e 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomMemberProfilesCache.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomMemberProfilesCache.kt @@ -7,32 +7,26 @@ package io.element.android.libraries.matrix.ui.messages -import androidx.compose.runtime.staticCompositionLocalOf import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.runningFold import javax.inject.Inject @SingleIn(RoomScope::class) class RoomMemberProfilesCache @Inject constructor() { private val cache = MutableStateFlow(mapOf()) + val updateFlow = cache.drop(1).runningFold(0) { acc, _ -> acc + 1 } - private val _lastCacheUpdate = MutableStateFlow(0L) - val lastCacheUpdate: StateFlow = _lastCacheUpdate - - fun replace(items: List) { + suspend fun replace(items: List) = coroutineScope { cache.value = items.associateBy { it.userId } - _lastCacheUpdate.tryEmit(_lastCacheUpdate.value + 1) } fun getDisplayName(userId: UserId): String? { return cache.value[userId]?.disambiguatedDisplayName } } - -val LocalRoomMemberProfilesCache = staticCompositionLocalOf { - RoomMemberProfilesCache() -} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomNamesCache.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomNamesCache.kt new file mode 100644 index 0000000000..598b7c28da --- /dev/null +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/messages/RoomNamesCache.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.ui.messages + +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import io.element.android.libraries.matrix.api.roomlist.RoomSummary +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.runningFold +import javax.inject.Inject + +@SingleIn(RoomScope::class) +class RoomNamesCache @Inject constructor() { + private val cache = MutableStateFlow(mapOf()) + val updateFlow = cache.drop(1).runningFold(0) { acc, _ -> acc + 1 } + + suspend fun replace(items: List) = coroutineScope { + val roomNamesByRoomIdOrAlias = LinkedHashMap(items.size * 2) + items + .forEach { summary -> + roomNamesByRoomIdOrAlias[summary.info.id.toRoomIdOrAlias()] = summary.info.name + val canonicalAlias = summary.info.canonicalAlias + if (canonicalAlias != null) { + roomNamesByRoomIdOrAlias[canonicalAlias.toRoomIdOrAlias()] = summary.info.name + } + } + cache.value = roomNamesByRoomIdOrAlias + } + + fun getDisplayName(roomIdOrAlias: RoomIdOrAlias): String? { + return cache.value[roomIdOrAlias] + } +} 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 1e74160e81..b2adb257d1 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 @@ -106,6 +106,7 @@ fun TextComposer( onReceiveSuggestion: (Suggestion?) -> Unit, onSelectRichContent: ((Uri) -> Unit)?, resolveMentionDisplay: (text: String, url: String) -> TextDisplay, + resolveAtRoomMentionDisplay: () -> TextDisplay, modifier: Modifier = Modifier, showTextFormatting: Boolean = false, subcomposing: Boolean = false, @@ -176,7 +177,7 @@ fun TextComposer( composerMode = composerMode, onResetComposerMode = onResetComposerMode, resolveMentionDisplay = resolveMentionDisplay, - resolveRoomMentionDisplay = { resolveMentionDisplay("@room", "#") }, + resolveRoomMentionDisplay = resolveAtRoomMentionDisplay, onError = onError, onTyping = onTyping, onSelectRichContent = onSelectRichContent, @@ -930,6 +931,7 @@ private fun ATextComposer( onTyping = {}, onReceiveSuggestion = {}, resolveMentionDisplay = { _, _ -> TextDisplay.Plain }, + resolveAtRoomMentionDisplay = { TextDisplay.Plain }, onSelectRichContent = null, ) } 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 ee0ec181ca..81b2aab287 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 @@ -30,9 +30,8 @@ import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle -import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.LocalMentionSpanUpdater import io.element.android.libraries.textcomposer.mentions.MentionSpan -import io.element.android.libraries.textcomposer.mentions.updateMentionStyles import io.element.android.libraries.textcomposer.model.MarkdownTextEditorState import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.SuggestionType @@ -75,7 +74,7 @@ fun MarkdownTextInput( } } - val mentionSpanTheme = LocalMentionSpanTheme.current + val mentionSpanUpdater = LocalMentionSpanUpdater.current AndroidView( modifier = Modifier @@ -124,10 +123,9 @@ fun MarkdownTextInput( }, update = { editText -> editText.applyStyleInCompose(richTextEditorStyle) - + val text = state.text.value() + mentionSpanUpdater.updateMentionSpans(text) if (state.text.needsDisplaying()) { - val text = state.text.value() - mentionSpanTheme.updateMentionStyles(text) editText.updateEditableText(text) if (canUpdateState) { state.text.update(editText.editableText, false) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt index 2f55b96c9f..76587d6e12 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt @@ -11,119 +11,153 @@ import android.graphics.Canvas import android.graphics.Paint import android.graphics.RectF import android.graphics.Typeface +import android.text.TextPaint +import android.text.TextUtils import android.text.style.ReplacementSpan import androidx.core.text.getSpans -import io.element.android.libraries.core.extensions.orEmpty +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.wysiwyg.view.spans.CustomMentionSpan -import kotlin.math.min import kotlin.math.roundToInt +/** + * A span that represents a mention (user, room, etc.) in text. + * @param type The type of mention this span represents. + */ class MentionSpan( - text: String, - val rawValue: String, - val type: Type, + val type: MentionType, ) : ReplacementSpan() { - companion object { - private const val MAX_LENGTH = 20 - } + private val backgroundPaint = Paint() + private val textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG) - var backgroundColor: Int = 0 - var textColor: Int = 0 - var startPadding: Int = 0 - var endPadding: Int = 0 - var typeface: Typeface = Typeface.DEFAULT + private var backgroundColor: Int = 0 + private var textColor: Int = 0 + private var startPadding: Int = 0 + private var endPadding: Int = 0 + private var typeface: Typeface = Typeface.DEFAULT - private var textWidth = 0 - private val backgroundPaint = Paint().apply { - isAntiAlias = true - color = backgroundColor - } + private var measuredTextWidth = 0 - var text: String = text - set(value) { - field = value - mentionText = getActualText(text) + // The formatted display text, will be set by the formatter + var displayText: CharSequence = "" + private set + + /** + * Updates the visual properties of this span. + */ + fun updateTheme(mentionSpanTheme: MentionSpanTheme) { + val isCurrentUser = when (type) { + is MentionType.User -> type.userId == mentionSpanTheme.currentUserId + else -> false } - private var mentionText: CharSequence = getActualText(text) - - fun update(mentionSpanTheme: MentionSpanTheme) { - val isCurrentUser = rawValue == mentionSpanTheme.currentUserId?.value backgroundColor = when (type) { - Type.USER -> if (isCurrentUser) mentionSpanTheme.currentUserBackgroundColor else mentionSpanTheme.otherBackgroundColor - Type.ROOM -> mentionSpanTheme.otherBackgroundColor - Type.EVERYONE -> mentionSpanTheme.currentUserBackgroundColor + is MentionType.User -> if (isCurrentUser) mentionSpanTheme.currentUserBackgroundColor else mentionSpanTheme.otherBackgroundColor + is MentionType.Everyone -> mentionSpanTheme.currentUserBackgroundColor + is MentionType.Room -> mentionSpanTheme.otherBackgroundColor + is MentionType.Message -> mentionSpanTheme.otherBackgroundColor } + textColor = when (type) { - Type.USER -> if (isCurrentUser) mentionSpanTheme.currentUserTextColor else mentionSpanTheme.otherTextColor - Type.ROOM -> mentionSpanTheme.otherTextColor - Type.EVERYONE -> mentionSpanTheme.currentUserTextColor + is MentionType.User -> if (isCurrentUser) mentionSpanTheme.currentUserTextColor else mentionSpanTheme.otherTextColor + is MentionType.Everyone -> mentionSpanTheme.currentUserTextColor + is MentionType.Room -> mentionSpanTheme.otherTextColor + is MentionType.Message -> mentionSpanTheme.otherTextColor } - backgroundPaint.color = backgroundColor + val (startPaddingPx, endPaddingPx) = mentionSpanTheme.paddingValuesPx.value startPadding = startPaddingPx endPadding = endPaddingPx typeface = mentionSpanTheme.typeface.value } - override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int { - paint.typeface = typeface - textWidth = paint.measureText(mentionText, 0, mentionText.length).roundToInt() - return textWidth + startPadding + endPadding + /** + * Updates the display text using a formatter. + */ + fun updateDisplayText(formatter: MentionSpanFormatter) { + displayText = formatter.formatDisplayText(type) } - override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) { + override fun getSize( + paint: Paint, + text: CharSequence?, + start: Int, + end: Int, + fm: Paint.FontMetricsInt? + ): Int { + textPaint.set(paint) + textPaint.typeface = typeface + // Measure the full text width without truncation + measuredTextWidth = textPaint.measureText(displayText, 0, displayText.length).roundToInt() + return measuredTextWidth + startPadding + endPadding + } + + override fun draw( + canvas: Canvas, + text: CharSequence?, + start: Int, + end: Int, + x: Float, + top: Int, + y: Int, + bottom: Int, + paint: Paint + ) { // Extra vertical space to add below the baseline (y). This helps us center the span vertically val extraVerticalSpace = y + paint.ascent() + paint.descent() - top - val rect = RectF(x, top.toFloat(), x + textWidth + startPadding + endPadding, y.toFloat() + extraVerticalSpace) + val availableWidth = (canvas.width - x).coerceAtLeast(0f) + val measuredWidth = measuredTextWidth + startPadding + endPadding + val pillWidth = minOf(availableWidth, measuredWidth.toFloat()) + + backgroundPaint.color = backgroundColor + val rect = RectF(x, top.toFloat(), x + pillWidth, y.toFloat() + extraVerticalSpace) val radius = rect.height() / 2 canvas.drawRoundRect(rect, radius, radius, backgroundPaint) - paint.color = textColor - paint.typeface = typeface - canvas.drawText(mentionText, 0, mentionText.length, x + startPadding, y.toFloat(), paint) - } - private fun getActualText(text: String): CharSequence { - return buildString { - val mentionText = text.orEmpty() - when (type) { - Type.USER -> { - if (text.firstOrNull() != '@') { - append("@") - } - } - Type.ROOM -> { - if (text.firstOrNull() != '#') { - append("#") - } - } - Type.EVERYONE -> Unit - } - append(mentionText.substring(0, min(mentionText.length, MAX_LENGTH))) - if (mentionText.length > MAX_LENGTH) { - append("…") - } + textPaint.set(paint) + textPaint.color = textColor + textPaint.typeface = typeface + + val availableWidthForText = availableWidth - startPadding - endPadding + val textToDraw = if (measuredTextWidth > availableWidthForText) { + TextUtils.ellipsize( + displayText, + textPaint, + availableWidthForText, + TextUtils.TruncateAt.END + ) + } else { + displayText } - } - - enum class Type { - USER, - ROOM, - EVERYONE, + canvas.drawText(textToDraw, 0, textToDraw.length, x + startPadding, y.toFloat(), textPaint) } } -fun CharSequence.getMentionSpans(): List { +/** + * Sealed interface representing different types of mentions. + */ +sealed interface MentionType { + data class User(val userId: UserId) : MentionType + data class Room(val roomIdOrAlias: RoomIdOrAlias) : MentionType + data class Message(val roomIdOrAlias: RoomIdOrAlias, val eventId: EventId) : MentionType + data object Everyone : MentionType +} + +/** + * Extension function to get all MentionSpans from a CharSequence. + */ +fun CharSequence.getMentionSpans(start: Int = 0, end: Int = length): List { return if (this is android.text.Spanned) { - val customMentionSpans = getSpans() - if (customMentionSpans.isNotEmpty()) { - // If we have custom mention spans created by the RTE, we need to extract the provided spans and filter them - customMentionSpans.map { it.providedSpan }.filterIsInstance() - } else { - // Otherwise try to get the spans directly - getSpans().toList() - } + // If we have custom mention spans created by the RTE, we need to extract the provided spans and filter them + val customMentionSpans = getSpans(start, end) + .map { it.providedSpan } + .filterIsInstance() + // Collect all direct mention spans + val directMentionSpans = getSpans(start, end) + // Return the union of both + customMentionSpans + directMentionSpans } else { emptyList() } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanFormatter.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanFormatter.kt new file mode 100644 index 0000000000..f4b5f96bf4 --- /dev/null +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanFormatter.kt @@ -0,0 +1,75 @@ +/* + * 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.textcomposer.mentions + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache +import io.element.android.libraries.matrix.ui.messages.RoomNamesCache +import javax.inject.Inject + +private const val EVERYONE_DISPLAY_TEXT = "@room" +private const val BUBBLE_ICON = "\uD83D\uDCAC" // 💬 + +interface MentionSpanFormatter { + fun formatDisplayText(mentionType: MentionType): CharSequence +} + +/** + * Formatter for MentionSpan display text. + * This class is responsible for formatting the display text of a MentionSpan + * based on its MentionType and context. + */ +@ContributesBinding(RoomScope::class) +class DefaultMentionSpanFormatter @Inject constructor( + private val roomMemberProfilesCache: RoomMemberProfilesCache, + private val roomNamesCache: RoomNamesCache, +) : MentionSpanFormatter { + /** + * Format the display text for a mention span. + * + * @param mentionType The type of mention + * @return The formatted display text + */ + override fun formatDisplayText(mentionType: MentionType): CharSequence { + return when (mentionType) { + is MentionType.User -> formatUserMention(mentionType.userId) + is MentionType.Room -> formatRoomMention(mentionType.roomIdOrAlias) + is MentionType.Message -> formatMessageMention(mentionType.roomIdOrAlias) + is MentionType.Everyone -> EVERYONE_DISPLAY_TEXT + } + } + + private fun formatUserMention(userId: UserId): String { + // Try to get the display name from cache, fallback to userId + val displayName = roomMemberProfilesCache.getDisplayName(userId) + return if (displayName != null) { + "@$displayName" + } else { + userId.value + } + } + + private fun formatRoomMention(roomIdOrAlias: RoomIdOrAlias): String { + val displayName = roomNamesCache.getDisplayName(roomIdOrAlias) + return if (displayName != null) { + "#$displayName" + } else { + roomIdOrAlias.identifier + } + } + + private fun formatMessageMention( + roomIdOrAlias: RoomIdOrAlias, + ): String { + val roomMention = formatRoomMention(roomIdOrAlias) + return "$BUBBLE_ICON > $roomMention" + } +} diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt index 63197ffb9c..a233897254 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanProvider.kt @@ -7,46 +7,118 @@ package io.element.android.libraries.textcomposer.mentions -import androidx.compose.runtime.Stable +import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser import javax.inject.Inject -@Stable +private const val EVERYONE_MENTION_TEXT = "@room" + +/** + * Provider for [MentionSpan]s. + */ open class MentionSpanProvider @Inject constructor( private val permalinkParser: PermalinkParser, + private val mentionSpanFormatter: MentionSpanFormatter, + private val mentionSpanTheme: MentionSpanTheme, ) { - fun getMentionSpanFor(text: String, url: String): MentionSpan { + /** + * Creates a mention span from a text and URL. + * + * @param text The text associated with the mention + * @param url The URL associated with the mention + * @return A mention span if the URL can be parsed as a permalink, null otherwise + */ + fun getMentionSpanFor(text: String, url: String): MentionSpan? { val permalinkData = permalinkParser.parse(url) - return when { - permalinkData is PermalinkData.UserLink -> { - MentionSpan( - text = text, - rawValue = permalinkData.userId.toString(), - type = MentionSpan.Type.USER, - ) + return getMentionSpanFor(text, permalinkData) + } + + /** + * Creates a mention span from a text and permalink data. + * + * @param text The text associated with the mention + * @param permalinkData The permalink data associated with the mention + * @return A mention span based on the permalink data, null if the permalink data is not supported + */ + private fun getMentionSpanFor(text: String, permalinkData: PermalinkData): MentionSpan? { + return when (permalinkData) { + is PermalinkData.UserLink -> { + createUserMentionSpan(permalinkData.userId) } - text == "@room" && permalinkData is PermalinkData.FallbackLink -> { - MentionSpan( - text = text, - rawValue = "@room", - type = MentionSpan.Type.EVERYONE, - ) + is PermalinkData.RoomLink -> { + val eventId = permalinkData.eventId + if (eventId != null) { + createMessageMentionSpan(permalinkData.roomIdOrAlias, eventId) + } else { + createRoomMentionSpan(permalinkData.roomIdOrAlias) + } } - permalinkData is PermalinkData.RoomLink -> { - MentionSpan( - text = text, - rawValue = permalinkData.roomIdOrAlias.identifier, - type = MentionSpan.Type.ROOM, - ) - } - else -> { - MentionSpan( - text = text, - rawValue = text, - type = MentionSpan.Type.ROOM, - ) + is PermalinkData.FallbackLink -> { + if (text == EVERYONE_MENTION_TEXT) { + createEveryoneMentionSpan() + } else { + null + } } + else -> null + } + } + + /** + * Create a mention span for a user mention. + * + * @param userId The user ID + * @return A mention span for the user + */ + fun createUserMentionSpan(userId: UserId): MentionSpan { + return MentionSpan(type = MentionType.User(userId = userId)).apply { + updateDisplayText(mentionSpanFormatter) + updateTheme(mentionSpanTheme) + } + } + + /** + * Create a mention span for a room mention. + * + * @param roomIdOrAlias The room ID or alias + * @return A mention span for the room + */ + fun createRoomMentionSpan(roomIdOrAlias: RoomIdOrAlias): MentionSpan { + return MentionSpan(MentionType.Room(roomIdOrAlias)).apply { + updateDisplayText(mentionSpanFormatter) + updateTheme(mentionSpanTheme) + } + } + + /** + * Create a mention span for a message mention. + * + * @param roomIdOrAlias The room ID or alias where the message is located + * @param eventId The event ID of the message + * @return A mention span for the message + */ + fun createMessageMentionSpan( + roomIdOrAlias: RoomIdOrAlias, + eventId: EventId, + ): MentionSpan { + return MentionSpan(type = MentionType.Message(roomIdOrAlias, eventId)).apply { + updateTheme(mentionSpanTheme) + updateDisplayText(mentionSpanFormatter) + } + } + + /** + * Create a mention span for @room (everyone). + * + * @return A mention span for @room + */ + fun createEveryoneMentionSpan(): MentionSpan { + return MentionSpan(type = MentionType.Everyone).apply { + updateTheme(mentionSpanTheme) + updateDisplayText(mentionSpanFormatter) } } } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanTheme.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanTheme.kt index b81fb45b32..edd5cfe9dd 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanTheme.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanTheme.kt @@ -15,11 +15,9 @@ import android.view.ViewGroup import android.widget.TextView import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.Stable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection @@ -34,6 +32,9 @@ import io.element.android.libraries.designsystem.theme.currentUserMentionPillBac import io.element.android.libraries.designsystem.theme.currentUserMentionPillText import io.element.android.libraries.designsystem.theme.mentionPillBackground import io.element.android.libraries.designsystem.theme.mentionPillText +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias @@ -45,13 +46,14 @@ import javax.inject.Inject /** * Theme used for mention spans. * To make this work, you need to: - * 1. Provide [LocalMentionSpanTheme] in a composable that wraps the ones where you want to use mentions. - * 2. Call [MentionSpanTheme.updateStyles] with the current [UserId] so the colors and sizes are computed. - * 3. Use either [MentionSpanTheme.updateMentionStyles] or [MentionSpan.update] to update the styles of the mention spans. + * 1. Call [MentionSpanTheme.updateStyles] so the colors and sizes are computed. + * 2. Use either [MentionSpanTheme.updateMentionStyles] or [MentionSpan.updateTheme] to update the styles of the mention spans. */ @Stable -class MentionSpanTheme @Inject constructor() { - internal var currentUserId: UserId? = null +@SingleIn(SessionScope::class) +class MentionSpanTheme(val currentUserId: UserId) { + @Inject constructor(matrixClient: MatrixClient) : this(matrixClient.sessionId) + internal var currentUserTextColor: Int = 0 internal var currentUserBackgroundColor: Int = Color.WHITE internal var otherTextColor: Int = 0 @@ -66,8 +68,7 @@ class MentionSpanTheme @Inject constructor() { */ @Suppress("ComposableNaming") @Composable - fun updateStyles(currentUserId: UserId) { - this.currentUserId = currentUserId + fun updateStyles() { currentUserTextColor = ElementTheme.colors.currentUserMentionPillText.toArgb() currentUserBackgroundColor = ElementTheme.colors.currentUserMentionPillBackground.toArgb() otherTextColor = ElementTheme.colors.mentionPillText.toArgb() @@ -93,24 +94,28 @@ fun MentionSpanTheme.updateMentionStyles(charSequence: CharSequence) { val spanned = charSequence as? Spanned ?: return val mentionSpans = spanned.getMentionSpans() for (span in mentionSpans) { - span.update(this) + span.updateTheme(this) } } -/** - * Composition local containing the current [MentionSpanTheme]. - */ -val LocalMentionSpanTheme = staticCompositionLocalOf { - MentionSpanTheme() -} - - @PreviewsDayNight - @Composable - internal fun MentionSpanThemePreview() { +@PreviewsDayNight +@Composable +internal fun MentionSpanThemePreview() { ElementPreview { - val mentionSpanTheme = remember { MentionSpanTheme() } + val mentionSpanTheme = remember { MentionSpanTheme(UserId("@me:matrix.org")) } val provider = remember { MentionSpanProvider( + mentionSpanTheme = mentionSpanTheme, + mentionSpanFormatter = object : MentionSpanFormatter { + override fun formatDisplayText(mentionType: MentionType): CharSequence { + return when (mentionType) { + is MentionType.User -> mentionType.userId.value + is MentionType.Room -> mentionType.roomIdOrAlias.identifier + is MentionType.Message -> "\uD83D\uDCAC️ > ${mentionType.roomIdOrAlias.identifier}" + is MentionType.Everyone -> "@room" + } + } + }, permalinkParser = object : PermalinkParser { override fun parse(uriString: String): PermalinkData { return when (uriString) { @@ -133,36 +138,31 @@ val LocalMentionSpanTheme = staticCompositionLocalOf { fun mentionSpanMe() = provider.getMentionSpanFor("mention", "https://matrix.to/#/@me:matrix.org") fun mentionSpanOther() = provider.getMentionSpanFor("mention", "https://matrix.to/#/@other:matrix.org") fun mentionSpanRoom() = provider.getMentionSpanFor("room:matrix.org", "https://matrix.to/#/#room:matrix.org") - fun mentionSpanEveryone() = provider.getMentionSpanFor("@room", "@room") - mentionSpanTheme.updateStyles(currentUserId = UserId("@me:matrix.org")) + fun mentionSpanEveryone() = provider.createEveryoneMentionSpan() + mentionSpanTheme.updateStyles() - CompositionLocalProvider( - LocalMentionSpanTheme provides mentionSpanTheme - ) { - AndroidView(factory = { context -> - TextView(context).apply { - includeFontPadding = false - layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) - text = buildSpannedString { - append("This is a ") - append("@mention", mentionSpanMe(), 0) - append(" to the current user and this is a ") - append("@mention", mentionSpanOther(), 0) - append(" to other user. This is for everyone in the ") - append("@room", mentionSpanEveryone(), 0) - append(". This one is for a link to another room: ") - append("#room:matrix.org", mentionSpanRoom(), 0) - append("\n\n") - append("This ") - append("mention", mentionSpanMe(), 0) - append(" didn't have an '@' and it was automatically added, same as this ") - append("room:matrix.org", mentionSpanRoom(), 0) - append(" one, which had no leading '#'.") - } - mentionSpanTheme.updateMentionStyles(text) - setTextColor(textColor) + AndroidView(factory = { context -> + TextView(context).apply { + includeFontPadding = false + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + text = buildSpannedString { + append("This is a ") + append("@mention", mentionSpanMe(), 0) + append(" to the current user and this is a ") + append("@mention", mentionSpanOther(), 0) + append(" to other user. This is for everyone in the ") + append("@room", mentionSpanEveryone(), 0) + append(". This one is for a link to another room: ") + append("#room:matrix.org", mentionSpanRoom(), 0) + append("\n\n") + append("This ") + append("mention", mentionSpanMe(), 0) + append(" didn't have an '@' and it was automatically added, same as this ") + append("room:matrix.org", mentionSpanRoom(), 0) + append(" one, which had no leading '#'.") } - }) - } + setTextColor(textColor) + } + }) } - } +} diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanUpdater.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanUpdater.kt new file mode 100644 index 0000000000..94d74a72e3 --- /dev/null +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpanUpdater.kt @@ -0,0 +1,67 @@ +/* + * 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.textcomposer.mentions + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.staticCompositionLocalOf +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache +import io.element.android.libraries.matrix.ui.messages.RoomNamesCache +import javax.inject.Inject + +interface MentionSpanUpdater { + fun updateMentionSpans(text: CharSequence): CharSequence + + @Composable + fun rememberMentionSpans(text: CharSequence): CharSequence +} + +@ContributesBinding(RoomScope::class) +class DefaultMentionSpanUpdater @Inject constructor( + private val formatter: MentionSpanFormatter, + private val theme: MentionSpanTheme, + private val roomMemberProfilesCache: RoomMemberProfilesCache, + private val roomNamesCache: RoomNamesCache, +) : MentionSpanUpdater { + @Composable + override fun rememberMentionSpans(text: CharSequence): CharSequence { + val isLightTheme = ElementTheme.isLightTheme + val roomInfoCacheUpdate by roomNamesCache.updateFlow.collectAsState(0) + val roomMemberProfilesCacheUpdate by roomMemberProfilesCache.updateFlow.collectAsState(0) + return remember(text, roomInfoCacheUpdate, roomMemberProfilesCacheUpdate, isLightTheme) { + updateMentionSpans(text) + text + } + } + + override fun updateMentionSpans(text: CharSequence): CharSequence { + for (mentionSpan in text.getMentionSpans()) { + mentionSpan.updateTheme(theme) + mentionSpan.updateDisplayText(formatter) + } + return text + } +} + +private object NoOpMentionSpanUpdater : MentionSpanUpdater { + override fun updateMentionSpans(text: CharSequence): CharSequence { + return text + } + + @Composable + override fun rememberMentionSpans(text: CharSequence): CharSequence { + return text + } +} + +val LocalMentionSpanUpdater = staticCompositionLocalOf { NoOpMentionSpanUpdater } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt index 543fe093d4..8ee7696e2b 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt @@ -21,14 +21,13 @@ import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.SaverScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue -import androidx.core.text.getSpans -import io.element.android.libraries.matrix.api.core.RoomAlias -import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.textcomposer.components.markdown.StableCharSequence -import io.element.android.libraries.textcomposer.mentions.MentionSpan import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionType import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.mentions.getMentionSpans import kotlinx.parcelize.Parcelize @@ -48,39 +47,33 @@ class MarkdownTextEditorState( fun insertSuggestion( resolvedSuggestion: ResolvedSuggestion, mentionSpanProvider: MentionSpanProvider, - permalinkBuilder: PermalinkBuilder, ) { val suggestion = currentSuggestion ?: return when (resolvedSuggestion) { is ResolvedSuggestion.AtRoom -> { val currentText = SpannableStringBuilder(text.value()) - val replaceText = "@room" - val roomPill = mentionSpanProvider.getMentionSpanFor(replaceText, "") + val mentionSpan = mentionSpanProvider.createEveryoneMentionSpan() currentText.replace(suggestion.start, suggestion.end, "@ ") val end = suggestion.start + 1 - currentText.setSpan(roomPill, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + currentText.setSpan(mentionSpan, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) text.update(currentText, true) selection = IntRange(end + 1, end + 1) } is ResolvedSuggestion.Member -> { val currentText = SpannableStringBuilder(text.value()) - val text = resolvedSuggestion.roomMember.displayName?.prependIndent("@") ?: resolvedSuggestion.roomMember.userId.value - val link = permalinkBuilder.permalinkForUser(resolvedSuggestion.roomMember.userId).getOrNull() ?: return - val mentionPill = mentionSpanProvider.getMentionSpanFor(text, link) + val mentionSpan = mentionSpanProvider.createUserMentionSpan(resolvedSuggestion.roomMember.userId) currentText.replace(suggestion.start, suggestion.end, "@ ") val end = suggestion.start + 1 - currentText.setSpan(mentionPill, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + currentText.setSpan(mentionSpan, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) this.text.update(currentText, true) this.selection = IntRange(end + 1, end + 1) } is ResolvedSuggestion.Alias -> { val currentText = SpannableStringBuilder(text.value()) - val text = resolvedSuggestion.roomAlias.value - val link = permalinkBuilder.permalinkForRoomAlias(resolvedSuggestion.roomAlias).getOrNull() ?: return - val mentionPill = mentionSpanProvider.getMentionSpanFor(text, link) + val mentionSpan = mentionSpanProvider.createRoomMentionSpan(resolvedSuggestion.roomAlias.toRoomIdOrAlias()) currentText.replace(suggestion.start, suggestion.end, "# ") val end = suggestion.start + 1 - currentText.setSpan(mentionPill, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + currentText.setSpan(mentionSpan, suggestion.start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) this.text.update(currentText, true) this.selection = IntRange(end + 1, end + 1) } @@ -98,19 +91,23 @@ class MarkdownTextEditorState( val start = charSequence.getSpanStart(mention) val end = charSequence.getSpanEnd(mention) when (mention.type) { - MentionSpan.Type.USER -> { - permalinkBuilder.permalinkForUser(UserId(mention.rawValue)).getOrNull()?.let { link -> - replace(start, end, "[${mention.rawValue}]($link)") + is MentionType.User -> { + permalinkBuilder.permalinkForUser(mention.type.userId).getOrNull()?.let { link -> + replace(start, end, "[${mention.type.userId}]($link)") } } - MentionSpan.Type.EVERYONE -> { + is MentionType.Everyone -> { replace(start, end, "@room") } - MentionSpan.Type.ROOM -> { - permalinkBuilder.permalinkForRoomAlias(RoomAlias(mention.rawValue)).getOrNull()?.let { link -> - replace(start, end, "[${mention.text}]($link)") + is MentionType.Room -> { + val roomIdOrAlias = mention.type.roomIdOrAlias + if (roomIdOrAlias is RoomIdOrAlias.Alias) { + permalinkBuilder.permalinkForRoomAlias(roomIdOrAlias.roomAlias).getOrNull()?.let { link -> + replace(start, end, "[${roomIdOrAlias.roomAlias}]($link)") + } } } + else -> Unit } } } @@ -122,12 +119,12 @@ class MarkdownTextEditorState( fun getMentions(): List { val text = SpannableString(text.value()) - val mentionSpans = text.getSpans(0, text.length) + val mentionSpans = text.getMentionSpans() return mentionSpans.mapNotNull { mentionSpan -> when (mentionSpan.type) { - MentionSpan.Type.USER -> IntentionalMention.User(UserId(mentionSpan.rawValue)) - MentionSpan.Type.EVERYONE -> IntentionalMention.Room - MentionSpan.Type.ROOM -> null + is MentionType.User -> IntentionalMention.User(mentionSpan.type.userId) + is MentionType.Everyone -> IntentionalMention.Room + else -> null } } } 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 9fdc4e2246..1176cdadaa 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 @@ -16,14 +16,13 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat 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.FakePermalinkBuilder import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser import io.element.android.libraries.matrix.test.room.aRoomMember import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.textcomposer.ElementRichTextEditorStyle import io.element.android.libraries.textcomposer.components.markdown.MarkdownTextInput +import io.element.android.libraries.textcomposer.impl.mentions.aMentionSpanProvider import io.element.android.libraries.textcomposer.mentions.MentionSpan -import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.model.MarkdownTextEditorState import io.element.android.libraries.textcomposer.model.Suggestion @@ -146,7 +145,6 @@ class MarkdownTextInputTest { @Test fun `inserting a mention replaces the existing text with a span`() = runTest { val permalinkParser = FakePermalinkParser(result = { PermalinkData.UserLink(A_SESSION_ID) }) - val permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { Result.success("https://matrix.to/#/$A_SESSION_ID") }) val state = aMarkdownTextEditorState(initialText = "@", initialFocus = true) state.currentSuggestion = Suggestion(0, 1, SuggestionType.Mention, "") rule.setMarkdownTextInput(state = state) @@ -155,8 +153,7 @@ class MarkdownTextInputTest { editor = it.findEditor() state.insertSuggestion( ResolvedSuggestion.Member(roomMember = aRoomMember()), - MentionSpanProvider(permalinkParser = permalinkParser), - permalinkBuilder, + aMentionSpanProvider(permalinkParser), ) } rule.awaitIdle() diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/IntentionalMentionSpanProviderTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/IntentionalMentionSpanProviderTest.kt index 50ac074078..de4b9bc64a 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/IntentionalMentionSpanProviderTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/IntentionalMentionSpanProviderTest.kt @@ -14,8 +14,7 @@ import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser -import io.element.android.libraries.textcomposer.mentions.MentionSpan -import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionType import io.element.android.tests.testutils.WarmUpRule import org.junit.Rule import org.junit.Test @@ -28,22 +27,22 @@ class IntentionalMentionSpanProviderTest { val warmUpRule = WarmUpRule() private val permalinkParser = FakePermalinkParser() - private val mentionSpanProvider = MentionSpanProvider( - permalinkParser = permalinkParser, - ) + private val mentionSpanProvider = aMentionSpanProvider(permalinkParser) @Test fun `getting mention span for a user returns a MentionSpan of type USER`() { permalinkParser.givenResult(PermalinkData.UserLink(A_USER_ID)) val mentionSpan = mentionSpanProvider.getMentionSpanFor("@me:matrix.org", "https://matrix.to/#/${A_USER_ID.value}") - assertThat(mentionSpan.type).isEqualTo(MentionSpan.Type.USER) + assertThat(mentionSpan?.type).isInstanceOf(MentionType.User::class.java) + val userType = mentionSpan?.type as MentionType.User + assertThat(userType.userId).isEqualTo(A_USER_ID) } @Test fun `getting mention span for everyone in the room returns a MentionSpan of type EVERYONE`() { permalinkParser.givenResult(PermalinkData.FallbackLink(uri = Uri.EMPTY)) val mentionSpan = mentionSpanProvider.getMentionSpanFor("@room", "#") - assertThat(mentionSpan.type).isEqualTo(MentionSpan.Type.EVERYONE) + assertThat(mentionSpan?.type).isEqualTo(MentionType.Everyone) } @Test @@ -54,6 +53,8 @@ class IntentionalMentionSpanProviderTest { ) ) val mentionSpan = mentionSpanProvider.getMentionSpanFor("#room:matrix.org", "https://matrix.to/#/#room:matrix.org") - assertThat(mentionSpan.type).isEqualTo(MentionSpan.Type.ROOM) + assertThat(mentionSpan?.type).isInstanceOf(MentionType.Room::class.java) + val roomType = mentionSpan?.type as MentionType.Room + assertThat(roomType.roomIdOrAlias).isEqualTo(RoomAlias("#room:matrix.org").toRoomIdOrAlias()) } } diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanFormatterTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanFormatterTest.kt new file mode 100644 index 0000000000..2d0156a3df --- /dev/null +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanFormatterTest.kt @@ -0,0 +1,135 @@ +/* + * 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.textcomposer.impl.mentions + +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias +import io.element.android.libraries.matrix.test.AN_EVENT_ID +import io.element.android.libraries.matrix.test.A_ROOM_ALIAS +import io.element.android.libraries.matrix.test.A_ROOM_ID +import io.element.android.libraries.matrix.test.A_USER_ID +import io.element.android.libraries.matrix.test.room.aRoomMember +import io.element.android.libraries.matrix.test.room.aRoomSummary +import io.element.android.libraries.matrix.ui.messages.RoomMemberProfilesCache +import io.element.android.libraries.matrix.ui.messages.RoomNamesCache +import io.element.android.libraries.textcomposer.mentions.DefaultMentionSpanFormatter +import io.element.android.libraries.textcomposer.mentions.MentionType +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class MentionSpanFormatterTest { + private val roomMemberProfilesCache = RoomMemberProfilesCache() + private val roomNamesCache = RoomNamesCache() + private val formatter = DefaultMentionSpanFormatter( + roomMemberProfilesCache = roomMemberProfilesCache, + roomNamesCache = roomNamesCache, + ) + + @Test + fun `formatDisplayText - formats user mention with empty cache`() = runTest { + val userId = A_USER_ID + val mentionType = MentionType.User(userId) + val result = formatter.formatDisplayText(mentionType) + assertThat(result.toString()).isEqualTo(userId.value) + } + + @Test + fun `formatDisplayText - formats user mention with filled cache`() = runTest { + val userId = A_USER_ID + val roomMember = aRoomMember(userId, displayName = "alice") + roomMemberProfilesCache.replace(listOf(roomMember)) + val mentionType = MentionType.User(userId) + val result = formatter.formatDisplayText(mentionType) + assertThat(result.toString()).isEqualTo("@alice") + } + + @Test + fun `formatDisplayText - formats room mention with empty cache`() = runTest { + val roomAlias = A_ROOM_ALIAS + val mentionType = MentionType.Room(roomAlias.toRoomIdOrAlias()) + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo(roomAlias.value) + } + + @Test + fun `formatDisplayText - formats room mention with filled cache`() = runTest { + val roomAlias = A_ROOM_ALIAS + val roomSummary = aRoomSummary( + canonicalAlias = roomAlias, + name = "my room" + ) + roomNamesCache.replace(listOf(roomSummary)) + val mentionType = MentionType.Room(roomAlias.toRoomIdOrAlias()) + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo("#my room") + } + + @Test + fun `formatDisplayText - formats room mention with room id and empty cache`() = runTest { + val roomId = A_ROOM_ID + val mentionType = MentionType.Room(roomId.toRoomIdOrAlias()) + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo(roomId.value) + } + + @Test + fun `formatDisplayText - formats room mention with room id and filled cache`() = runTest { + val roomId = A_ROOM_ID + val roomSummary = aRoomSummary( + roomId = roomId, + name = "my room" + ) + roomNamesCache.replace(listOf(roomSummary)) + + val mentionType = MentionType.Room(roomId.toRoomIdOrAlias()) + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo("#my room") + } + + @Test + fun `formatDisplayText - formats message mention with empty cache`() = runTest { + val roomId = A_ROOM_ID + val mentionType = MentionType.Message(roomId.toRoomIdOrAlias(), eventId = AN_EVENT_ID) + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo("💬 > ${roomId.value}") + } + + @Test + fun `formatDisplayText - formats message mention with filled cache`() = runTest { + val roomId = A_ROOM_ID + val roomSummary = aRoomSummary( + roomId = roomId, + name = "my room" + ) + roomNamesCache.replace(listOf(roomSummary)) + + val mentionType = MentionType.Message(roomId.toRoomIdOrAlias(), eventId = AN_EVENT_ID) + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo("💬 > #my room") + } + + @Test + fun `formatDisplayText - formats everyone mention`() = runTest { + val mentionType = MentionType.Everyone + + val result = formatter.formatDisplayText(mentionType) + + assertThat(result.toString()).isEqualTo("@room") + } +} diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanProviderFixture.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanProviderFixture.kt new file mode 100644 index 0000000000..cc40a56bf4 --- /dev/null +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/mentions/MentionSpanProviderFixture.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.textcomposer.impl.mentions + +import io.element.android.libraries.matrix.api.permalink.PermalinkParser +import io.element.android.libraries.matrix.test.A_USER_ID +import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser +import io.element.android.libraries.textcomposer.mentions.MentionSpanFormatter +import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionSpanTheme +import io.element.android.libraries.textcomposer.mentions.MentionType + +fun aMentionSpanProvider( + permalinkParser: PermalinkParser = FakePermalinkParser(), + mentionSpanFormatter: MentionSpanFormatter = object : MentionSpanFormatter { + override fun formatDisplayText(mentionType: MentionType): CharSequence { + return mentionType.toString() + } + }, + mentionSpanTheme: MentionSpanTheme = MentionSpanTheme(A_USER_ID), +): MentionSpanProvider { + return MentionSpanProvider( + permalinkParser = permalinkParser, + mentionSpanFormatter = mentionSpanFormatter, + mentionSpanTheme = mentionSpanTheme, + ) +} diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt index 33156add6f..2c7905e2da 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/model/MarkdownTextEditorStateTest.kt @@ -12,6 +12,8 @@ import androidx.core.text.buildSpannedString import androidx.core.text.inSpans import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.matrix.api.core.RoomAlias +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.permalink.PermalinkData import io.element.android.libraries.matrix.api.room.IntentionalMention @@ -20,8 +22,9 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.permalink.FakePermalinkBuilder import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser import io.element.android.libraries.matrix.test.room.aRoomMember +import io.element.android.libraries.textcomposer.impl.mentions.aMentionSpanProvider import io.element.android.libraries.textcomposer.mentions.MentionSpan -import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider +import io.element.android.libraries.textcomposer.mentions.MentionType import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.SuggestionType @@ -35,9 +38,8 @@ class MarkdownTextEditorStateTest { fun `insertMention - room alias - getMentions return empty list`() { val state = aMarkdownTextEditorState(initialText = "Hello @", initialFocus = true) val suggestion = aRoomAliasSuggestion() - val permalinkBuilder = FakePermalinkBuilder() val mentionSpanProvider = aMentionSpanProvider() - state.insertSuggestion(suggestion, mentionSpanProvider, permalinkBuilder) + state.insertSuggestion(suggestion, mentionSpanProvider) assertThat(state.getMentions()).isEmpty() } @@ -48,9 +50,8 @@ class MarkdownTextEditorStateTest { } val suggestion = aRoomAliasSuggestion() val permalinkParser = FakePermalinkParser(result = { PermalinkData.RoomLink(A_ROOM_ALIAS.toRoomIdOrAlias()) }) - val permalinkBuilder = FakePermalinkBuilder(permalinkForRoomAliasLambda = { Result.failure(IllegalStateException("Failed")) }) val mentionSpanProvider = aMentionSpanProvider(permalinkParser = permalinkParser) - state.insertSuggestion(suggestion, mentionSpanProvider, permalinkBuilder) + state.insertSuggestion(suggestion, mentionSpanProvider) } @Test @@ -60,9 +61,8 @@ class MarkdownTextEditorStateTest { } val suggestion = aRoomAliasSuggestion() val permalinkParser = FakePermalinkParser(result = { PermalinkData.RoomLink(A_ROOM_ALIAS.toRoomIdOrAlias()) }) - val permalinkBuilder = FakePermalinkBuilder(permalinkForRoomAliasLambda = { Result.success("https://matrix.to/#/${A_ROOM_ALIAS.value}") }) val mentionSpanProvider = aMentionSpanProvider(permalinkParser = permalinkParser) - state.insertSuggestion(suggestion, mentionSpanProvider, permalinkBuilder) + state.insertSuggestion(suggestion, mentionSpanProvider) } @Test @@ -70,31 +70,11 @@ class MarkdownTextEditorStateTest { val state = aMarkdownTextEditorState(initialText = "Hello @", initialFocus = true) val member = aRoomMember() val mention = ResolvedSuggestion.Member(member) - val permalinkBuilder = FakePermalinkBuilder() val mentionSpanProvider = aMentionSpanProvider() - - state.insertSuggestion(mention, mentionSpanProvider, permalinkBuilder) - + state.insertSuggestion(mention, mentionSpanProvider) assertThat(state.getMentions()).isEmpty() } - @Test - fun `insertSuggestion - with member but failed PermalinkBuilder result`() { - val state = aMarkdownTextEditorState(initialText = "Hello @", initialFocus = true).apply { - currentSuggestion = Suggestion(start = 6, end = 7, type = SuggestionType.Mention, text = "") - } - val member = aRoomMember() - val mention = ResolvedSuggestion.Member(member) - val permalinkParser = FakePermalinkParser(result = { PermalinkData.UserLink(member.userId) }) - val permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { Result.failure(IllegalStateException("Failed")) }) - val mentionSpanProvider = aMentionSpanProvider(permalinkParser = permalinkParser) - - state.insertSuggestion(mention, mentionSpanProvider, permalinkBuilder) - - val mentions = state.getMentions() - assertThat(mentions).isEmpty() - } - @Test fun `insertSuggestion - with member`() { val state = aMarkdownTextEditorState(initialText = "Hello @", initialFocus = true).apply { @@ -103,10 +83,9 @@ class MarkdownTextEditorStateTest { val member = aRoomMember() val mention = ResolvedSuggestion.Member(member) val permalinkParser = FakePermalinkParser(result = { PermalinkData.UserLink(member.userId) }) - val permalinkBuilder = FakePermalinkBuilder(permalinkForUserLambda = { Result.success("https://matrix.to/#/${member.userId}") }) val mentionSpanProvider = aMentionSpanProvider(permalinkParser = permalinkParser) - state.insertSuggestion(mention, mentionSpanProvider, permalinkBuilder) + state.insertSuggestion(mention, mentionSpanProvider) val mentions = state.getMentions() assertThat(mentions).isNotEmpty() @@ -119,11 +98,10 @@ class MarkdownTextEditorStateTest { currentSuggestion = Suggestion(start = 6, end = 7, type = SuggestionType.Mention, text = "") } val mention = ResolvedSuggestion.AtRoom - val permalinkBuilder = FakePermalinkBuilder() val permalinkParser = FakePermalinkParser(result = { PermalinkData.FallbackLink(Uri.EMPTY, false) }) val mentionSpanProvider = aMentionSpanProvider(permalinkParser = permalinkParser) - state.insertSuggestion(mention, mentionSpanProvider, permalinkBuilder) + state.insertSuggestion(mention, mentionSpanProvider) val mentions = state.getMentions() assertThat(mentions).isNotEmpty() @@ -177,16 +155,10 @@ class MarkdownTextEditorStateTest { assertThat(mentions.lastOrNull()).isInstanceOf(IntentionalMention.Room::class.java) } - private fun aMentionSpanProvider( - permalinkParser: FakePermalinkParser = FakePermalinkParser(), - ): MentionSpanProvider { - return MentionSpanProvider(permalinkParser) - } - private fun aMarkdownTextWithMentions(): CharSequence { - val userMentionSpan = MentionSpan("@Alice", "@alice:matrix.org", MentionSpan.Type.USER) - val atRoomMentionSpan = MentionSpan("@room", "@room", MentionSpan.Type.EVERYONE) - val roomMentionSpan = MentionSpan("#room:domain.org", "#room:domain.org", MentionSpan.Type.ROOM) + val userMentionSpan = MentionSpan(MentionType.User(UserId("@alice:matrix.org"))) + val atRoomMentionSpan = MentionSpan(MentionType.Everyone) + val roomMentionSpan = MentionSpan(MentionType.Room(RoomAlias("#room:domain.org").toRoomIdOrAlias())) return buildSpannedString { append("Hello ") inSpans(userMentionSpan) { diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en.png index 5f6cb5caad..78aa5cff8d 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f541f0a05b49272ef3e379a9a629c71458b37435928338a3a58ac852b38eb803 -size 48802 +oid sha256:73a225eeb9c217ada941b5add96dd2f832fb33b702f86eae5e1f5ecbee5a4bb2 +size 51625 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en.png index 81f4997ffc..20eb03d5d4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer.mentions_MentionSpanTheme_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a542b3be557dddc3aba16bda8bb7db1bf0078e6bb3abcc42a11c723e8dba3504 -size 46683 +oid sha256:ab365d585b76ab0723c9998cc13f755640b7f086b99b55804a38e103b8d42416 +size 49440 diff --git a/tools/detekt/detekt.yml b/tools/detekt/detekt.yml index cd27b0be16..71187feced 100644 --- a/tools/detekt/detekt.yml +++ b/tools/detekt/detekt.yml @@ -227,7 +227,7 @@ Compose: - LocalMediaItemPresenterFactories - LocalTimelineItemPresenterFactories - LocalRoomMemberProfilesCache - - LocalMentionSpanTheme + - LocalMentionSpanUpdater - LocalAnalyticsService - LocalBuildMeta CompositionLocalNaming: From f3a64a1ba850d08a7c40b8ccf74f8877336416d6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 28 Mar 2025 12:58:10 +0100 Subject: [PATCH 13/54] Log tha packageId which is currently built. (#4494) --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0da59234da..7984675391 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -102,7 +102,7 @@ android { } val baseAppName = BuildTimeConfig.APPLICATION_NAME - logger.warnInBox("Building $baseAppName") + logger.warnInBox("Building ${defaultConfig.applicationId} ($baseAppName)") buildTypes { getByName("debug") { From cb6473e52555a44824d00df3e7571568a101d34f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:13:16 +0000 Subject: [PATCH 14/54] fix(deps): update media3 to v1.6.0 --- gradle/libs.versions.toml | 2 +- .../mediaviewer/impl/local/player/ExoPlayerForPreview.kt | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5d0e5b9acc..04de825c05 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ constraintlayout = "2.2.1" constraintlayout_compose = "1.1.1" lifecycle = "2.8.7" activity = "1.10.1" -media3 = "1.5.1" +media3 = "1.6.0" camera = "1.4.2" # Compose diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerForPreview.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerForPreview.kt index b89f6a324f..a098a53174 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerForPreview.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/ExoPlayerForPreview.kt @@ -187,10 +187,6 @@ class ExoPlayerForPreview( override fun setDeviceMuted(muted: Boolean) {} override fun setDeviceMuted(muted: Boolean, flags: Int) {} override fun setAudioAttributes(audioAttributes: AudioAttributes, handleAudioFocus: Boolean) {} - override fun getAudioComponent(): ExoPlayer.AudioComponent? = throw NotImplementedError() - override fun getVideoComponent(): ExoPlayer.VideoComponent? = throw NotImplementedError() - override fun getTextComponent(): ExoPlayer.TextComponent? = throw NotImplementedError() - override fun getDeviceComponent(): ExoPlayer.DeviceComponent? = throw NotImplementedError() override fun addAudioOffloadListener(listener: ExoPlayer.AudioOffloadListener) {} override fun removeAudioOffloadListener(listener: ExoPlayer.AudioOffloadListener) {} override fun getAnalyticsCollector(): AnalyticsCollector = throw NotImplementedError() From b7ff9a5310794f0f153d0de5a55adeb39f8ddaee Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 28 Mar 2025 14:50:37 +0100 Subject: [PATCH 15/54] Update screenshots (#4497) Co-authored-by: ElementBot --- ...rypto.identity_MessagesViewWithIdentityChange_Day_0_en.png | 4 ++-- ...rypto.identity_MessagesViewWithIdentityChange_Day_1_en.png | 4 ++-- ...rypto.identity_MessagesViewWithIdentityChange_Day_2_en.png | 4 ++-- ...pto.identity_MessagesViewWithIdentityChange_Night_0_en.png | 4 ++-- ...pto.identity_MessagesViewWithIdentityChange_Night_1_en.png | 4 ++-- ...pto.identity_MessagesViewWithIdentityChange_Night_2_en.png | 4 ++-- ...sages.impl.pinned.list_PinnedMessagesListView_Day_3_en.png | 4 ++-- ...ges.impl.pinned.list_PinnedMessagesListView_Night_3_en.png | 4 ++-- ....components_TimelineItemEventRowDisambiguated_Day_0_en.png | 4 ++-- ...omponents_TimelineItemEventRowDisambiguated_Night_0_en.png | 4 ++-- ...eline.components_TimelineItemEventRowLongSenderName_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_0_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_1_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_2_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_3_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_4_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_5_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_6_en.png | 4 ++-- ...line.components_TimelineItemEventRowTimestamp_Day_7_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_0_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_1_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_2_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_3_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_4_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_5_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_6_en.png | 4 ++-- ...ne.components_TimelineItemEventRowTimestamp_Night_7_en.png | 4 ++-- ...l.timeline.components_TimelineItemEventRowUtd_Day_0_en.png | 4 ++-- ...timeline.components_TimelineItemEventRowUtd_Night_0_en.png | 4 ++-- ...ponents_TimelineItemEventRowWithManyReactions_Day_0_en.png | 4 ++-- ...nents_TimelineItemEventRowWithManyReactions_Night_0_en.png | 4 ++-- ...imeline.components_TimelineItemEventRowWithRR_Day_0_en.png | 4 ++-- ...imeline.components_TimelineItemEventRowWithRR_Day_1_en.png | 4 ++-- ...imeline.components_TimelineItemEventRowWithRR_Day_2_en.png | 4 ++-- ...eline.components_TimelineItemEventRowWithRR_Night_0_en.png | 4 ++-- ...eline.components_TimelineItemEventRowWithRR_Night_1_en.png | 4 ++-- ...eline.components_TimelineItemEventRowWithRR_Night_2_en.png | 4 ++-- ...ents_TimelineItemEventRowWithReplyInformative_Day_0_en.png | 4 ++-- ...ents_TimelineItemEventRowWithReplyInformative_Day_1_en.png | 4 ++-- ...ts_TimelineItemEventRowWithReplyInformative_Night_0_en.png | 4 ++-- ...ts_TimelineItemEventRowWithReplyInformative_Night_1_en.png | 4 ++-- ...components_TimelineItemEventRowWithReplyOther_Day_0_en.png | 4 ++-- ...components_TimelineItemEventRowWithReplyOther_Day_1_en.png | 4 ++-- ...mponents_TimelineItemEventRowWithReplyOther_Night_0_en.png | 4 ++-- ...mponents_TimelineItemEventRowWithReplyOther_Night_1_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_0_en.png | 4 ++-- ...ine.components_TimelineItemEventRowWithReply_Day_10_en.png | 4 ++-- ...ine.components_TimelineItemEventRowWithReply_Day_11_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_1_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_2_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_3_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_4_en.png | 2 +- ...line.components_TimelineItemEventRowWithReply_Day_5_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_6_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_7_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_8_en.png | 4 ++-- ...line.components_TimelineItemEventRowWithReply_Day_9_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_0_en.png | 4 ++-- ...e.components_TimelineItemEventRowWithReply_Night_10_en.png | 4 ++-- ...e.components_TimelineItemEventRowWithReply_Night_11_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_1_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_2_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_3_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_4_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_5_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_6_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_7_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_8_en.png | 4 ++-- ...ne.components_TimelineItemEventRowWithReply_Night_9_en.png | 4 ++-- ...impl.timeline.components_TimelineItemEventRow_Day_0_en.png | 4 ++-- ...pl.timeline.components_TimelineItemEventRow_Night_0_en.png | 4 ++-- ...timeline.components_TimelineItemEventTimestampBelow_en.png | 4 ++-- ...sages.impl.timeline_TimelineViewMessageShield_Day_0_en.png | 4 ++-- ...ges.impl.timeline_TimelineViewMessageShield_Night_0_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_0_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_12_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_13_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_14_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_15_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_16_en.png | 4 ++-- ...features.messages.impl.timeline_TimelineView_Day_17_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_1_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_4_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_5_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_6_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_7_en.png | 4 ++-- .../features.messages.impl.timeline_TimelineView_Day_8_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_0_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_12_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_13_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_14_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_15_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_16_en.png | 4 ++-- ...atures.messages.impl.timeline_TimelineView_Night_17_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_1_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_4_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_5_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_6_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_7_en.png | 4 ++-- ...eatures.messages.impl.timeline_TimelineView_Night_8_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_0_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_10_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_11_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_12_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_13_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_1_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_3_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_4_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_5_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_6_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_7_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_8_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Day_9_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_0_en.png | 4 ++-- .../features.messages.impl_MessagesView_Night_10_en.png | 4 ++-- .../features.messages.impl_MessagesView_Night_11_en.png | 4 ++-- .../features.messages.impl_MessagesView_Night_12_en.png | 4 ++-- .../features.messages.impl_MessagesView_Night_13_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_1_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_3_en.png | 2 +- .../images/features.messages.impl_MessagesView_Night_4_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_5_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_6_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_7_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_8_en.png | 4 ++-- .../images/features.messages.impl_MessagesView_Night_9_en.png | 4 ++-- ...ProfileHeaderSectionWithVerificationViolation_Day_0_en.png | 4 ++-- ...ofileHeaderSectionWithVerificationViolation_Night_0_en.png | 4 ++-- ...s.userprofile.shared_UserProfileHeaderSection_Day_0_en.png | 4 ++-- ...userprofile.shared_UserProfileHeaderSection_Night_0_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_0_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_1_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_2_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_3_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_4_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_5_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_6_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_7_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_8_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_9_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_0_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_1_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_2_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_3_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_4_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_5_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_6_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_7_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_8_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_9_en.png | 4 ++-- 150 files changed, 298 insertions(+), 298 deletions(-) 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 e4e07f7992..b63cda070b 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:ec8ac8528bdb81076828f1b3a87b968ca41b21e59b6ac9c2b5c28db969a08952 -size 54998 +oid sha256:f1e9382ed4ffc09e206928c33c667cb150dffc830f6215e06c9dd5ea520de4a8 +size 54986 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 837307a6e9..a829e942df 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:61fb04355b0984f6a2b2cae6bb415936f9144993d988cea55c4db4f25efddb0c -size 63502 +oid sha256:955c4cce20c5e9f3457923ff76f22488445a891f145f0161cd0ec94c3da2bc55 +size 63485 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en.png index 4859bd03f0..c85914d89f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6bef590d2520c22e8fc4cab2a2f39917ebcfa95e403bf461f0eaebe21b459f57 -size 63906 +oid sha256:47a2a121c571b1b33f24f1e60d00937bdd2f327726487b4a63b269ce3cdec73f +size 63891 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 f3c3b76e87..92ed199400 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:0abcce8207b0f2ff7690e80a64a377eefa9aacb3a2c49ea7d22b452c117d6ce0 -size 55455 +oid sha256:d1cdf81418927c64c9cb3bc97828f251da3116f09841ec0bfa2164e321058d67 +size 55435 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 39903af680..6e52c8dd16 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:c82612aeb3d83ea4e619e0fbec4bffcbea4589d4af362028caef23346293beea -size 67399 +oid sha256:d568e0e6f80c6161ca33f51106268f5ef95e33bd21923c3dd734f8f67dd51609 +size 67392 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en.png index 1a8b108573..4f4c950f62 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b83f5593876ecfb9b94e648ca4ca95122e9a75ba6b660a2c529cea87c9d761f4 -size 66928 +oid sha256:5e09247630bfb3b01f581b347bf9a42e8bafa96de707187c5422bb19e8844d82 +size 66887 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 d9867a8626..f2f01538d4 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:f26c0bb0e010c6d44df2854537ef625712bfa4a6e3ba73960589fe7c811ce542 -size 42669 +oid sha256:622ce8af67b17db0b7f729422ccc311f14c258d900c469901e8ba646d42ad031 +size 42659 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 ec76394776..e2835a19a1 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:9ab7bda826642ec13184d7d5513924979e9b7534cad4a783f8d7a323be31b85a -size 41571 +oid sha256:29ddafc09a16e878cad38d5f1fbc8e18b9936f2ecb3b7dc188178f6a424ddd05 +size 41539 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en.png index 9401edfd5d..22c3782785 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6a1e901fdbfdbf5621ad6446dec6f83b922ffcac40c649981306037776a288a7 -size 169049 +oid sha256:a5bb21840d22553fc7db6252f294a2a05971205bac00506b44a6255e93ba1590 +size 169035 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en.png index ecf9f575fe..864e2992db 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowDisambiguated_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a5dcb2ba2bfa0560f69ef6c7dd6a9f34c2a864d502d9401626666f263931f8a1 -size 168173 +oid sha256:d0f667300929a4961a4ac20196a010d001b5eba035086196bfdeb067f4b74f4d +size 168152 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en.png index cf4d2e1da5..bbdd286574 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowLongSenderName_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85536b4f83b45d7688fdd367b9f8766a6febf55a35e033357116664f253ed7de -size 15779 +oid sha256:839f50a35d5e9f13051a233a4d4bb75cb5de245efd16937b856c6e05768165cd +size 15720 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en.png index 1e1d23d6cf..07bcfd74dd 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:928e775b4328cbcdfc8f8c13099fd6a53048deac7a876a0651a772dd854cd02d -size 28576 +oid sha256:cd8fe1751c30b5cbc6a9d31227da02b0eb647fed993134ecdfee360f68198410 +size 28544 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en.png index 7150b21f46..5b5bf2452e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:48be34a388856f526ab23f35203cc07939b6bdbfd5b9f3a4163117301411828a -size 31148 +oid sha256:f2ab83152164617d6a76f84fcb92bc6c16e102c58fb489bb504b3c914a326a20 +size 31111 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en.png index 248ed805a9..8a84354ddb 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3c8e90e16e566d2252f67ba727ac7b52dd77bbe139c06d365f298bc40bb531e -size 30263 +oid sha256:500cf2222f5f0d35a7773f42de8f547bd6a81e447dd5ca383ba3d0e3ee208c0e +size 30225 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en.png index 4c7f4dce27..863589bcc1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96ea6176a048b8d47637d96345e7d3f64cfa6f2c0942ee022dafeef080323f66 -size 32592 +oid sha256:afc37df583c55bd7ca8295da4dc6148bc5e8fdb01612b2563cdd8108151227ff +size 32541 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en.png index 37cb67763d..7f4ee2edb6 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e77fd59aa1658b10257b03df34b08120b001515b23ee476789327575588d29e4 -size 33966 +oid sha256:2e50ab664fe28a486af410bbd93074d8d42dfa578627285f8ad22496755f01c5 +size 33929 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en.png index 9678512c21..18f3b8cbc1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7a5a6750213db875928a93c8116618a0194df089658763e570effd7a288b51d -size 30706 +oid sha256:87f484e7ee64d776f4874883bdac7fc321a04af86e3a29bcc93a4ca2cf2e70aa +size 30666 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en.png index 15266c43a7..10cc5a767f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f941e6251118c39749ef6a7d2357c1feb0789c80bd0086e0faba89e35768c7a0 -size 30577 +oid sha256:a7ba63ae1a0d204db4318a0ec1041532e1b0ce2327908f37f494da04c5a5b975 +size 30533 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en.png index 5bcb370105..b647981436 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8cf8e9260385fdc03b2bb611a7c79af93190b7f6c9cfbb53d45afebd0590d08 -size 11279 +oid sha256:c87881859fcb3b3c08e4e583604ca455e2f178ea605362f255af8950d069095d +size 11267 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en.png index 4f781b50e2..12c46fb9d1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:658f03aa4e13b408243826ff0f1658e354a44402c3b39eabd229e5cf086201df -size 29136 +oid sha256:8b03dfd48c56e2d0bb108a147b2ee04cc66c165bce1da7c724e1ecb4ddb4d286 +size 29139 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en.png index c50e6fddb9..8c64ac2fa6 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2bbc4e17b8c1965df0dcc01fd7b95e5eb16589822d3212199cf6402d44a2496c -size 31814 +oid sha256:561714bc8011f7f56d89565f1e0e529ea3626aa5162da47058d4469f16af0641 +size 31742 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en.png index 0eabe29425..d91da94837 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1072540b8301f94898c031591bc34b3dbd80de0e297d08fe70ad6beaca4d796b -size 30581 +oid sha256:94e94d793eb718cccc535a58053d5b4dc2de3b65b007017a8c5647112c78cedb +size 30527 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en.png index ec53631cee..60aee97b69 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c9fb8c24b7259894d5feee5c82b0d0e43487ce32ec37208bb4adf451988351a -size 32895 +oid sha256:a9d8e84329989a02b19269f6294b209fb66c5f3f6a35de7f9a2eee6da517dcdf +size 32903 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en.png index afc9b879a9..ca990cae35 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b51df4b986ff3ffcd15d2eebbac571ac9591fede464429d7d4eddc459f4b63c -size 33905 +oid sha256:25d0849402abdc3639c8bef1da49daf4de20124f367b3e1e413b0dcbf53bbff7 +size 33863 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en.png index f5863c8d04..8d28ce67f5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a5bc7b480b31995f7828229b6cc70b12688552cd08ed2ffd35e66fca5539101 -size 31076 +oid sha256:ee7292caede2b69969c7f62bf025b3cff5b59ab99eceac51ff041e6fddea9389 +size 31082 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en.png index 868cfa4cba..37791be7d2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c51a2fde76e7df75648b352068500488eed55128177be165e560737d6b1735a4 -size 30893 +oid sha256:898ff20bd42490e66ece05e6b6435ae951b004b69b44855ce9c1f0b0ab06d635 +size 30894 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en.png index d576503af4..bcf06c96f2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf4558bdae3a8f6e04a3390e15194cef3faa7552f5c0fd772eb8b4a7b9954de2 -size 11234 +oid sha256:14bd470786ea2a00673adec49d674fd2e575512187056a7c3fd56bf7b4140841 +size 11204 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en.png index 46a429e910..02e8c70de9 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e22060e45416b2af1d660c4185e98087c915fa0a48a488797a3db0d5661744c -size 30285 +oid sha256:8fd4bb89758d8253aabbcfcee28d2b7962c97394fd2c9bd37bfda15dd8b59abe +size 30255 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en.png index b02e2c7895..f9c581a64e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6321ec6e70dd488fedf85f44659cc1a29f5fba74e7232ce3bf8b2ec376f9423 -size 29457 +oid sha256:6e6b5ee7f8475aa22f47ca7643f6cf93a2f170710859c22e1c71026fdc1721a5 +size 29445 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en.png index 272335c611..d9f727f261 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9a29a07c7336014004203fef64b0eb429fb29f4a03b9ea3df7386dfae384345 -size 80140 +oid sha256:dc29aa14fd015ea0a4a2783ff553c086b41c86757aae760b64451f78deca9d45 +size 80122 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en.png index a23340aa4b..d622d385b0 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0764beebe1397ea7382768f676f330c1ccbdf2f326199053c5165b41816d8650 -size 80523 +oid sha256:9adab952ced4b0c51b0e3a5eb8c6cc7c8c717d79dc77ae1eeef328119ebcd597 +size 80489 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en.png index 3647b9f040..3cd2696467 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8fc8a84a49d10311e340f42271618c8046d30430d7e246453d646488120e687b -size 25554 +oid sha256:7d46bea9b9177b9f9ce4e08d8a33fa0161662c1611d5ffcd2aeb8aae1d1ad441 +size 25553 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en.png index 2840251a80..197785a217 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b1999b03d5fb6d2bee51438dd7f4cb3f088ac4f9bc4f6378931ad5cd7166d0d4 -size 25020 +oid sha256:dc61b0fcd136cc1087dd0449d80930b86b2f8c8440b55b756450ec26829bd9ea +size 25015 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en.png index 5bfa10ac6d..f0dd1f8797 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1950690f0b07d0cdea54f486832e2c89ec7c633d745bc2849185d3e7f14bcf86 -size 29316 +oid sha256:2b1d4cecb06128bfc3de98a1a927515d2770220927bb11bb4be040c8ac365274 +size 29310 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en.png index afa0ff2a9d..3520dbd9ca 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73e30666a17ecb9fd9a1d9673e9fa96f3fc5457b6e8b13c27faae34ca7e507be -size 25111 +oid sha256:e56a10732744eca3e422be7c7509d2e107b0b93b657fba610812d3c351bfabbe +size 25088 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en.png index 77964f5f22..9b134ca9cc 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fd66c7ffe0afbdb4d2f89ebf9340ddccfed0418bc6d6cb4d98a9925e2d1a762 -size 24558 +oid sha256:55b22ee6757a6cafb99aa4f35601638dc3dac31c09b0369187379c78583b8e1d +size 24533 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en.png index 72a7a31c3e..a8795e631c 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithRR_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eeff40cf2e0457b210a784bd5f73303efaa3356ff650004c6de3b9dc9138c67 -size 29911 +oid sha256:25dfa78e2b466c3bb708c3a08dc02ec4428a9cb82fb4339b348eb1009cc46ffb +size 29875 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en.png index 71b8c10e02..04b0ea1b72 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aa52e189e42c448cd680f45fd8a20893be726feb2fa61f8ad8c2199712ecf431 -size 151398 +oid sha256:52839c50b1ebdf1a46e105045ae03b4ef2cf6a5e1e8cc842c2329e9da395eb81 +size 151404 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en.png index f7eed329d5..e4f63cc390 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1aa1a281092b29a8b0b4be292e11a46ae520e09783fcafb1a75c7912ec71878c -size 156896 +oid sha256:b420c048cb72dee9387bb1f8b32e0cda7d703569f67416d35c4f6e0cdfeef0c4 +size 156859 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en.png index 9635d7b007..66cb2b3a6c 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c72e79524b0f37dca8cca7863c5a5d5e3d77f7845bd65b5f7bdf8ef47121cc94 -size 151435 +oid sha256:226ee1a4d618dbfaa6a9fa693af46daaf25dc17fc7fad5190ea2b36473a3963d +size 151407 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en.png index 1965d77e3e..624b83fc6b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad1f8892740d499197491a7826f1bcbb0d762624519b5cb693487a458c86dbb8 -size 156552 +oid sha256:e9149ea40285c1633b59dc1e1c62a1ffb560bd3f4ce97361044e0be98d59e1e6 +size 156521 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en.png index fe302aa676..54d8ed81b6 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24d90b69aa2b3732a0fb775de48fc5e65de6bfe2070742d7e2bba12b527745c0 -size 142636 +oid sha256:93d324f26910b61eb576ad8c37fe4bfad79e93879d59f9f3017e7a8c0cef1cfd +size 142620 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en.png index a48730c8a2..5f923d3618 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:941f51630b9f3340ac375b8c187325b22c346378573fbc65144859025193eda2 -size 151650 +oid sha256:338261e41a91279114bf8ee6c5a3ff0c94320706ff3f0d405b17a1ef87eec088 +size 151649 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en.png index 24a2bcc0e8..f5f7cbf47a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66ab5535bb3d797997da1882e1969638e6d2accfdce2061f09d083e35fb2bbea -size 141958 +oid sha256:8c9c9e85f84e73951975825beeb355883da4a12f9cdbac0d247736e995857640 +size 141955 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en.png index 5145845083..f3ecb9df4c 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyOther_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e821cfffe6245425acd88c490c3a35ae8a9ef9f2751ad3e1e387d31c6702ac8f -size 150760 +oid sha256:62a3c3031385ac731b500fc7c8f6d16b58c7f2ca6e4b758b4edb635cc9e6933e +size 150720 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en.png index 87095f8b42..6689499dd2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:473aad560929e4c863a58a564574132b1cb60aa3e657a2f143d37db97360fc22 -size 156265 +oid sha256:d8c58a09e139e2a2fe9edc1b2bdea0cb399b1a5c1978a19aff2da86f2fd84eac +size 156247 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_10_en.png index 2103bacdcf..4e7207012f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77b8e7f4397137570ccb8050d0041fe528eb3a34133ce1c7457f3a028b34e6b3 -size 142215 +oid sha256:b7a791e9c8788632f03e30aba24af768953411dffabde644bea176cd4811bee5 +size 142208 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_11_en.png index e2d97b2d50..9293dc99b1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:413a50188e94cf2d804c7a90cf0c794c9e7723fd0018249a790a6fa931a7a28a -size 154292 +oid sha256:a5571483499c4acee1bf08dca534148159d6b521bceb51c306773593539639bf +size 154286 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en.png index 500e753b79..5d571bdb7a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73a339a0b4e5a552407abdd12a45bf9d3fde492c18aeefb08e77d15b04f37920 -size 163444 +oid sha256:e2f1da2796934102bf20655ebe9dd3ea95972399aa77faf13e550b80b3d320b1 +size 163435 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en.png index ba1c365c84..e40b3c2da8 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d452c2f1e21aa37099ef351755b770abbe2e641f9933f5b246b0918153333d4 -size 144974 +oid sha256:a4b8b6d80dd685efa4c627c6f48207040561c322dc93d355fe00793981ca88f3 +size 144964 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en.png index e0e04317dc..1efc0bcccc 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f5c37cb34374f3feab75e86c39a8aa476efeeb3b85348294fc41a680e70e56b -size 144192 +oid sha256:c0cf792b404583b855f7d09e1535eba11f597e3f4706e367dff00f608aae9029 +size 144176 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en.png index e31d919fb0..e4da1ad973 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac7adfc6578c399c6648f695c7f45b9156f8f5486be58c2c575c8eee30a749de +oid sha256:8ce2fcbc8fdc3b6799448c92919ef43b7fc749c2b3b9894bca18e16f8ccd5dd9 size 150903 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en.png index 45f1446d0e..805dbaff2a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d200afbce60c5502d4404d3f741b36f9f88c01e644466672eececa66bb17277c -size 142576 +oid sha256:c27a5471ba179e4dd66fdaaae1ec56ac2a86dbf01d62b16c448f5a0df2749519 +size 142566 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en.png index 41b04f5bc5..08354b0cae 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:035b6cb7a1878f6e8d8fd9087c69ddc2a35430e7f903aecca4d5e9e783653e30 -size 143373 +oid sha256:a8b4fce8e61026cf00536605f8898505cec9a974aaae1d5951fb79a30bbec95b +size 143360 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en.png index 40449b178a..ed957abb38 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d4c7d7352bc253cba98e7963abca47fbbabca3840de1c5262a0abb2a54cb38f -size 145192 +oid sha256:f0c129646f3fd0a78d6c747f575d98696330c82633b119c266c2eea081cb36e8 +size 145193 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en.png index d859cb2a4f..ba9f50c1cf 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f346340dbdbc929ddf2ace6ed94bab6b51f8a522b2462db961ca4026805c6a8 -size 151442 +oid sha256:0063fdc45a8ceb4530591b4e02008eb9b754cefd43adb8acac0e754860a46340 +size 151440 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en.png index e3ace67a98..29cca5a8ad 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d03e00b1103f211d889b7b416a2fb954ccaf25577742bd8d0d2bab81dbdc567b -size 142845 +oid sha256:e53a7ba5131d2174121e72f520a3e9c2aa4b5c389690d2d47cfe419f8ff4290a +size 142838 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en.png index e08a2850ff..138530aaf2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a2cf5970c363f1e04dcf10b13021a710f93b7c1544499fae4a458a3542dffac3 -size 156131 +oid sha256:ec6a17623cb93cdf165d78c58b06a9a643dff24ebd8cbfbb4bf33096942ad2c8 +size 156098 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_10_en.png index 2368d2578e..324dc7ecbc 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f74a52283d616bccaabfe95ebfc332ebb43e227cbff405070c4b20cd09cf3a5d -size 141989 +oid sha256:f04df3f019284faa05b6286852276de5b6d7a047cbdfded1303fdd744e7130df +size 141956 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_11_en.png index f37205999d..82f5d83b3f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81cbeefdd7a39e66232d244ce171320c2f31b19f23b36f4ad5b0f7fb71825c64 -size 154346 +oid sha256:8b5d2080791bab646a110e912e98e877347b5b5a601603161e93b7cb1c2f6dd3 +size 154322 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en.png index 4ba6dcd649..3fd5025675 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ccf01c26425a89cf3633eb3da28f255f4c5caf2d158ba370364b1800c5eab61 -size 162173 +oid sha256:cdd4ce216c2eb8e0e71509f95407fb832ab8923408ee0d2b7be0ba38abd696d1 +size 162129 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en.png index 3e78a54ec7..55d4ef365a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a31e9ff73e0faa07adf24f1b6f26b527d45bda1981eac7ad81bd1e5484b96a8 -size 144899 +oid sha256:37529421d63a9f7d97887145e91f9f0827574a5bdbe1eda2e085612b451774a3 +size 144878 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en.png index c39860160c..7359f1d853 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73b81643e2d85e81e001395c1439fef6f5813a6122bcc668a45880a0ba7d0548 -size 144181 +oid sha256:e01b74cf05faac0b4aabc7848f8780906750a83c2b3ee914bdd6e208c14bfac8 +size 144145 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en.png index ff10bc35cb..1f8482c849 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:287690a6799dfc57fe721f075172281bdb78bc03e315e7db8ff9720a80fd7cc5 -size 150854 +oid sha256:5ea2c5908d322bae326846ee7e3762a04affc6ff77842951515fc35379f8717f +size 150825 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en.png index 684475c1a7..ef5dc390c5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c94ebaca53436da29b6e40b9fef74f5dbaf9f225dcaddcfe76b4f69f76afbcf5 -size 142469 +oid sha256:5173c0ff87560f9ecb0d5ccbf52992a01a43f53a1665cf565e0c56fb702a07f6 +size 142448 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en.png index 0cbe47a50b..2bfc650bbe 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bea334b823553c48a781767952d98d1094ee12ded915abeb3c482b59b0b57b1 -size 143067 +oid sha256:cd65c0380b79e7adf032027b8e6aca43465e62bd349a893accbf6e1e3137d39a +size 143054 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en.png index a337569074..1a1168bc58 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b101259000fd210bfbf52f19884098af35508621cc3164bd253d71d58a41fd3f -size 145155 +oid sha256:cbaa6c97ca79422887365ef77267d78b04c835067873f85df6bead249dec58ee +size 145140 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en.png index 61cc6f7241..7d06290fac 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7020e4940f15e2d6f6640234d9fa750b2ec925eacaa056b38c1c52faed19350d -size 151365 +oid sha256:e9332fc228a959263cdc1acaa69a68092a0bd5f5cbc460c1581c775739d633f2 +size 151339 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en.png index 6304cfc827..dc3e4c115d 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09e1993041f35d8e0aa4848107cb2d568d4ed31f9bde45bfc4174e517d06bf88 -size 142602 +oid sha256:ad635c9076f5d15c37b914fbbffad4bfa4d26a2f13c390f852bb63371730bcbc +size 142574 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en.png index 30fc48cd91..6d5033605b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ce42095c640d50f242818eb3ce5c057f972cc28240918b1cc448f414157fe9f -size 184207 +oid sha256:59ad66398a4b4f7f5f63cda8c15d98a78aff40d2a168bc8fa7cc6df6ae1d823d +size 184170 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en.png index d6c3523f51..ab62d8803a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventRow_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:28196c87c21d65272148af11e134ae6abf7fdfc361cf43abfc90209ec785e335 -size 183568 +oid sha256:d06575021a862195747c35219515a4949a089d65c1c6282c864f2116e3800704 +size 183547 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en.png index e765b7dcd1..b86b025e1b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:214eb8ecb72e331e79637a28df9bff3938ff8b2dcb8f55ce8ffb248db2941763 -size 52425 +oid sha256:544f7bbee71640356001f0242487e5b10e8e69b4e1cc9d336d6ceb388ff97dc4 +size 52410 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en.png index 297aaff834..630f40e5be 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21961806f7a938791b5211f5f3c93a6da64e3668ccf887956c7dc73ef6701a9b -size 37393 +oid sha256:fc56f6c3203e71a98395f194b020f5a82030947a7bda56299a89adbe8df52486 +size 37383 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en.png index ef1dbb71e5..b2eccb99fe 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40dfdc9821c98db913757e45663f5da494bce02a0882a260cf365697c804c9a4 -size 35249 +oid sha256:b56ad84259529e985235a0e42589ea91544ffce1cea64d0022cb3b3c2c056316 +size 35257 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_0_en.png index fa6c9958e9..bf71b7fb25 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d98bf24d1bbc36422ad69a74e554a9f7441961077b8a07f1d8123905345db41 -size 50167 +oid sha256:bf3f23066d6466f799677dd139d92ff26aeccdc7ce20d1ea4a1fa2eddbc28ecc +size 50157 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_12_en.png index e3e7fb615e..6a52101412 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6ca0ac33e28cff8479880eadc8a72134203ce0451de2365127b7478835115bb -size 51641 +oid sha256:c242b43c5674dfbe72ad5399ec2a1094fb5d9c8d2ff5d627e49c6f51010fbdf2 +size 51631 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_13_en.png index 0bd1535480..276b7c713e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff442a3e3571f5ce0ceaba707882841ec2d13c45da05dfa361876705bc121f36 -size 63403 +oid sha256:9aef1a43f5478f4a8e2715211695d0dffbfdd823d8642244c4411eef06794bee +size 63393 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_14_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_14_en.png index fcf1f465cf..643f3ab3b6 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae4cf8e28e956d3b0707763bccf6e02d123459cd0a137f023f3e964f85bf6072 -size 48014 +oid sha256:117ffd9be0ee1c2ce742c1725f935662ddbbf060bf02a3d121f3b331f577eb03 +size 48007 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_15_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_15_en.png index b836e4bf29..d5247e1d68 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92e7ed569e467326fbc2a0e278663494a237cb3c2198fa543b48f0a8825abccd -size 64487 +oid sha256:986daeac63a5185195c9972fb6d6d64cccc1eec53855c755b88d8e4c364acceb +size 64484 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_16_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_16_en.png index 1def9b255c..c8788f93d5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1b1c78fb676f2f7bff622a874626154d1b65c826ee3f071dab0a0d78a9d25bca -size 55207 +oid sha256:4b9bfd23b94519ee37e26e5a6c99e7ec2ac1513cae6cfa8465c71856d1e8afce +size 55197 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_17_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_17_en.png index 69c034bb53..ba6aee9606 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d017482df08cddd32e0dca6a8fc72b5c92c20fd6a2087c4940bf57171faa4b7e -size 64235 +oid sha256:17fa1c2967b460d47e33dbbbc1f10085941d2861a619c9c4e09d0ad62a6a0e5c +size 64217 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_1_en.png index 1d9116096d..fa42cdf361 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:290d8f2a5b9977a674fe6d4c7059f4aac7ad76b0ce4d58ee1b1fe437551c8812 -size 71131 +oid sha256:30ea27e644a6ad86506cebaef9ba6d3558b30945ed57e80ddcbf6cd22896d408 +size 71126 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_4_en.png index 1773908a26..b8116a6486 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c186f2119f530e2c977a5c3ae896bb4bfabdea8b1af21e8fc1e11b5e1535e19c -size 70282 +oid sha256:8479ff3816b6d08e1b61f9326f525f55f40b6a542baedbfa5f5acbb5c766150e +size 70264 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_5_en.png index cbfdc44964..8181ec17f1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38ae00eabc393ea0b780cd9ec69828c4c63c0b29d249ba8b748d837022c214fb -size 85007 +oid sha256:4d9a77ed75ee8797ff6e76b19d8e873fdcb55b2c361094c875874403887803c1 +size 85027 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_6_en.png index 9cc34ef87f..312b715249 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06baade2dbfbcbf2413f25a5c8041e6bfd88a957781dc0d73a9dd264a1467a5f -size 73356 +oid sha256:4767b56c7df7009caa31e905cfa473edfce505b9171214987a0c2be8f76f0558 +size 73338 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_7_en.png index 8a40214c69..60aeb3f330 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c32edfec150a76a7c55b5beb8b1da3731df42e4c4ea7b4d4391066e28a191968 -size 103515 +oid sha256:bccefb7d0464ec26c54333804962362923da1cffb834a31b35ccf0460a6420ef +size 103533 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_8_en.png index 99d4002da7..26a4061020 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2e1505ac2d2b1a3a824d05016551ee544f3fde640443b8b95650b640c4a8939e -size 53111 +oid sha256:039d1a97453e7c74cc8e2c04ecad719b3dffa1cc023b611e8f6e909fc9d51090 +size 53106 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_0_en.png index 239afa198c..ac89f3d57b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea044803be4517bcfd9920bc2f7192f3346823fa1bf2757f168e0556b3fec9c6 -size 49207 +oid sha256:ec0671a85557e44cd629bc2c426601ac3cb25a0cb095ff2034d73ad0878b1344 +size 49225 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_12_en.png index 04c6f6c009..849cc3a077 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7e9f0d885e2d56955d4054f97f0a18bd8c947677f982091f0ab75b1b64840fa -size 50849 +oid sha256:349b482857cbe0a6b2d7787e177205d1d5d3f564b2b4a9f2f2e81c57b90c0e74 +size 50875 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_13_en.png index f0752ed4c7..2bb32b2a83 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:809988a1560c381fb910657d05f2e2e710a77c9545dcbe30657c1ab8df169c22 -size 61917 +oid sha256:c8221d98791f152488a3f53dc654157b006d465a7c9770c1f72884d0d82df723 +size 61878 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_14_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_14_en.png index 5460d50f9a..3d0bea0389 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f0452fd9541274543670bbb49d97319e481710d59e6ad67125d96ad8991f172 -size 47144 +oid sha256:5b754901c4b62950ae48537523aeabf734d49425eb13211075c424c4a54f28a5 +size 47162 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_15_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_15_en.png index aa888749f6..3f5a9b1922 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f664b1d17a081ad4c71c19a1510ed62d9c0d02a2cb261fbbe631be73e5e66c8a -size 62916 +oid sha256:e57025ec733a1513ec594e217519546e363b07df1cab7547d89aecd19f8c55f9 +size 62874 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_16_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_16_en.png index 69e820ccf7..eb7205c572 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdfe8f427cec521d02992d2fe00d34eb3520103b361523deaceacd50a402b959 -size 53919 +oid sha256:871ca03e59cecb80a0f587ae1b8de0e015e094d032bc0e09dd3bae135dde1b7a +size 53936 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_17_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_17_en.png index 5a1480e478..30d3526c3b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ee39a6785005f95d9ef3236af0efd95c99a61186b115e7cfe6305b4c8051d71 -size 64293 +oid sha256:0d380a9ad7b10dadc52f7b485f999ecd0b2b121494815eef6cb7dc6090273e76 +size 64309 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_1_en.png index 19a0e1fa9d..b8373406d2 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9a43633816c9dbd383bd95c7ee45b3f6feabc3b31a19b5bdd3b0bfc7e8694c5 -size 69358 +oid sha256:2039e099ff7fa3cc0fff14efaeac2049d5bf44196d95f652852030278d84d788 +size 69310 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_4_en.png index 84567cd635..3b61862e82 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82ce4919096f27d68be421b24926046b5ee740cc449a85b4ebdf8ab72dbf34a5 -size 68796 +oid sha256:41616d976daeb5528d013e20d6aff81f5ad8d505f9561fa02ac6395b6c03fb0d +size 68754 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_5_en.png index 65ae8ac61f..470080efac 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8deea1411eb0b21dc352338ce54e46206773067a9d3c46dc2ff6e78f25c6628e -size 82894 +oid sha256:2a33a913e668ca5e9cbf32cfd5ca6ce3b250e4de468763ca8cc52852f147574f +size 82873 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_6_en.png index c1770fa443..4d813dbb31 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9cec981969cfd44c916feadce445b3e7a8c642faa2895add3a9efd13048adc4b -size 72167 +oid sha256:d0959fb663ba273bb318671502767da57a1005a3123cb0383a4ff8879d6af5d3 +size 72120 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_7_en.png index 35e735cb4c..663f92bf7e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce5f4a48ca592b37844f874ff3eff6da8b966d7c11eb205c08ca5db1209b6d08 -size 101198 +oid sha256:410399234cd0a90f1371fbee9b7041607bef515643450945462b2f4e7f899a83 +size 101174 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_8_en.png index 2ecc108318..9682b0ee92 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7580ef7fcfaa3ab091e41ee949e01fb69bf8be346028dd01deab54fd234f4705 -size 52760 +oid sha256:a1255723686d5fde13b2c93f8d2a61ba8a42d92d41c50a5ff39b3fc1fd4edbb9 +size 52725 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_0_en.png index ad7f676d40..33bbf7d3d5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce99545c68b2d7f7f026216c33aa0f34597c0f5e371e83c4d34e3051e810f6d4 -size 57425 +oid sha256:119a16be61f48adf4be664e2ac086006edca82c12b5955827a29b87088085e0e +size 57422 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_10_en.png index e15d4f51bf..80f277717b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ee0d3c122093afc601d73758400996e4d48e0193cd59c814c0cfd2cc6906070 -size 57450 +oid sha256:a099b2a5bf006c24489835aae46724637c7d2c3b08d1f47904bc0e0ed93b187b +size 57445 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png index 705c777dea..83ec1b08f4 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8839778513429751427a29508a5c650a8d21d88abba2c3e35c204cb871bc25c -size 60524 +oid sha256:4d03bfc50eb1d3624f1dcd14b9d1cb515fde906f1f3688501239330c91fe2aac +size 60516 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png index f29a0f1e53..381edbced8 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3387b50f6e1c50831f802140d125e633c028183a26527a67b2eeb11b17b94a0 -size 60224 +oid sha256:cc5bf16206197d8f79803b0a53bf9e9f329522855e3e594f775a2d9cf26f1739 +size 60219 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png index 4403008663..786b264f4e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc7b967eb01668be02cab6ce6f77994622e94cf7d44da0e6b5996d2348f43108 -size 60118 +oid sha256:b0f89334dbc8f8cb871f6649bcb5b869a8d25193376976cff6e33ad44c724b64 +size 60111 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_1_en.png index 38698e5432..852403d760 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:02c954978c5ddde433a96f5dd8d6cef067a558c798ad253e9034db275c5d62a2 -size 56591 +oid sha256:0555ba9f6b8f9110ab81ef0e94264ac6b2c43fbe15c9e196ece63f25f6021d47 +size 56581 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_3_en.png index 4a8bad0105..cb85490a19 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:410e8ca3c14ee859b82ca1b2776d60090e776a0c6fa217219932495e39cbf670 -size 59839 +oid sha256:388823a879ca9d7d7794bdb8fd03da91e4c47c03073e38e18039467832c99c5a +size 59831 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_4_en.png index 32caaf5bc1..9c67fa0694 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd21bcdeeca45af5e65c5a0c57751e55ce920c10cbb30b18f04912ab7d193fda -size 55232 +oid sha256:516a010d56f5cfd205b46de49b49d730ad2012fe574e08eb1e6746adf07ca373 +size 55224 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_5_en.png index 67dcaa672a..dbd685291f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdc5c945b52fc5f9797f385c1eca9a7382e539ca4444bb2b94ad899e2b84585f -size 55216 +oid sha256:62475d0e6b37cff42980135438faeccebe74bc110f517c12616351be8469c448 +size 55208 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 b27aa9e36d..1526024ad2 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:d2f01c4391461d28e99e2bf20af3bf48a1803d5c1d2cff537dd2c046f7c129d4 -size 54260 +oid sha256:390f7f3c699ecd843eb79adcefc64a66e6bbb6740dcd3bccf0f90c2f2b70e7e2 +size 54255 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_7_en.png index dbabf5540c..e70c83ec54 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d52d24702141a0592ea3bf2fb61a0db7c2cbe0355645164b22fee507c9aedc0f -size 58366 +oid sha256:c053c3df134ed9ee672bba25db0e730aad83a47454ba9e74981e8178e6cfb59e +size 58361 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_8_en.png index fa8fde5523..13e75e4e89 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e54a56a22751f18b1f496fbde24872185cddde502c99c7381737fb9a215fa223 -size 59004 +oid sha256:6d5db5c87b3b1a8f22a41a64ea39262e2469d805cf7b7fcc6d73622d1f8b052a +size 58999 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_9_en.png index cfc2b72c1f..fb7b1a6405 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15fe33b3c1d811213346b13aab230a9a52e0f173c8ea6b788cf3f692ceffb530 -size 48898 +oid sha256:91526175f646a959c58ea84a0479bb7ae7bf821684ae329201d8c1d5ec772e58 +size 48887 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_0_en.png index ceaf23f3ea..57388f1df1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8475bfc48d39dc3e553438cca9b1b088c9713774c5c16194694ef0546afacc4c -size 57060 +oid sha256:10ae9ff40ba2df95b741d516f31994bb1160df5c2b1407daa78aaa882e0db5c5 +size 57036 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_10_en.png index d2e8859001..ca4e901e9f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09ecd2bcc86a4b4571481d9414e6f467698f5f1882b05054444982bcfb0c91dc -size 57108 +oid sha256:cafaaeba38646ef92103d3ddfd7c3c26ffed1e2bf1586569d2194a3aabf4c183 +size 57088 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png index 642558be61..480716e90c 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0f729da85f30d33ba4bb096ea11966448c1d3816fc2f845dbece8be758fcd92 -size 59816 +oid sha256:cec8142f1f293d3e684ff7eb2002d05dca6ea959cb95dce327e8a4f5a78cf462 +size 59797 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png index 208d04a7b6..12c1955f6a 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a0a77633d8d2bfe5f29cd772525769e4dfa613518408db8dfe8a27cf680da9f -size 59715 +oid sha256:c55355ed7ab137016b21ec96a78ae954887d08a2843be9e5f6686015e0792c70 +size 59695 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png index 88affec893..aa243c0a3d 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7b1d184e7ef2e9324bd5e4b1e6b6e27521a9d9a50c12210b55594919670ee24 -size 59657 +oid sha256:b00a709eb1e8ed90d193d274ff1449840da856d782f07511698fa4cf1a105a19 +size 59640 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_1_en.png index 04e3a8e1c1..e149b92acd 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3023446a0e6f5c8460da144759e5e47819783f021dd88870b4335f5662077dc2 -size 55929 +oid sha256:c6c0840f6795a3b3e612c0848e2b54cbc977408fb5432074e7b5771d1bcf030e +size 55906 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_3_en.png index c408525d58..fd57712fe5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06dde04630aae068e327d053cfe918d92f99a2f72ec32d744f87846070ba362e +oid sha256:88d3b3855bd73c340619cc2ca14a19cacca304a3bd442a4c681f5dbfe248aa34 size 58950 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_4_en.png index 455893f4b9..29014feb9f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccc2b366606bd6bc2fb3454ea2eb10539b5687232b439ce425c8f7dce9e5d92e -size 51257 +oid sha256:4182c26a99a119fbf450bee488d92be31e291f259fb6d21f84f05d77324a1840 +size 51270 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_5_en.png index b3f12adb94..012203b274 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca2d3c21d271e87a508a0ee2867550cb59c9c3a76a8ea1aa17548e364039b75d -size 54821 +oid sha256:f4209f327f3a7cb3fbb0de25230604857e9d0e39b7ca0b2bec948656f08b2e08 +size 54804 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 6c6aa7e7f4..1a2a97e582 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:f8c63c180eee4972abb5a44f04cf7ec8e5b28a31ec9d1fcd9dd5fd0ce883404b -size 53773 +oid sha256:c6465d7f2e552193d51dd1701d6b4f5726cb616e35cdcd3e219ebf31c22941b9 +size 53750 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_7_en.png index 400fbd7552..2f0466a60f 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5577395ee585414360fcf8f9f2757ed693f9cdc1510d66758a23f7756df6f99d -size 54179 +oid sha256:b30bd082aee7c78292c602c5320ade7738c0909038717cd5f8004b08243a2b3e +size 54172 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_8_en.png index 3716d5cc03..7ace45e8e1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01622d32fa8a5478d64d0d613ebffed54b3a96192ef50b4a45506e48b7200d55 -size 58546 +oid sha256:c435641bf1e5f862499fc34247227200a28d47907e273c5f18331631d36fbd60 +size 58520 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_9_en.png index d46df8f4de..1f1a7f3ba8 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6e92b9bdadcda3ed66462f32519fee772a084dd9e331fb3138e1144d3921969 -size 44767 +oid sha256:1f87ac09baa02003c48bfd4b8c946e650afbd6a42347a1a85a205bce40cf094a +size 44783 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png index ee1a8435cf..46adaa89d9 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5de15498c2d1fd8b169867a4f51ba69a26cada9c66def933c434ab213d94c671 -size 22918 +oid sha256:5de23f1ff2742d0a29297be486b6944dd64a3906cbf0902358473ed91fe8b422 +size 22882 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png index 96d9bb6be6..0ae1afb0c3 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f83f3e237982ee599195423fd083d539f5b8a5bf608c63eac31654af6cfa6c2 -size 22836 +oid sha256:0365c048f02b698af5762c873a9e93ebe82712e7321d467c2f2bb1cbc105516b +size 22702 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png index 9625abff26..9d2dfee0e8 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8f47f89b71826b87e2f6b1de8a325710f67da4c342a2fed10a253546f3b4658 -size 15303 +oid sha256:ab8f38a4b9b0be906a39296f253286aeb03b6976d9918c0bc5867d5cb2b64f7d +size 15253 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png index 64841c0408..dcec11f43b 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c0bed8702030f9431a281c16cbf515821be63a49a5f25d7899eee2491f1804ca -size 15405 +oid sha256:586a299c444ceefb9d84336d8520fa083cbfb23c6c535425455deb780d6e454f +size 15277 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png index 7653b90703..f8f5af0664 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e395d9ca4fc6b2eb1ea9a8fd6e2ad34e7397d9f64cf39e05eed50a1bfffabd7 -size 24186 +oid sha256:b2f56793a5859517f951d4b595023e44983a2ecb574cbe5408f72655969b5ee1 +size 24085 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png index 9f82a024d9..5d1451f662 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:87cb4255c8346796a226cdfc2afb67641a3b27c2c1a15629a07c3293fcad5131 -size 22078 +oid sha256:cc74b230023d824504a5ce250e0abc4d9e93fd3d692902568b76248442fbc599 +size 21988 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png index 359cca7a84..9145f70274 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e9d94a7be97f1953a119a933084cadacd7dc6a049b334ec74e85a5bfe1bdc65 -size 24291 +oid sha256:b89fd42f16b90496e182f78e25254ebcd963b1eff706d3e821b869277fd5a51c +size 24189 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png index c07abc7b58..817ecc3560 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba80787576dd893f90fcdc83021e47abbde4ae2bcaaca2c167178ba7c2be3886 -size 36481 +oid sha256:19e7fa4a5c2f61cc878798d73ae12e6b7c47694c55698b383cba7c296b110a5d +size 36448 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png index c85a2d454c..553aec17b1 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a2278fd516dff3a5c86702f09d5621e8b3bb3de1df702b5036fa114975e4d85 -size 27844 +oid sha256:666b6910502871fd340571cb6503b0e056454849411abebd667c2189d6891758 +size 27808 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png index 9d8367f230..d078159df0 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d4a1c91d475f54974a3c1dd8748522995fccaa03236b35f1bcf9f94ac24ce14 -size 22500 +oid sha256:af9da2f03f67ab130babec49617cf919c116ab6a2ec8ea9545b44bdd6a299e45 +size 22414 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png index ca9fcec377..623e88860b 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a465e6254ae595d62a335914414ad2f33b76736f529d1e188f3d0e0d57268f65 -size 23015 +oid sha256:4dcf82f9aa2ce550dff4bf0dc4b2786b52434641f61687a73dcba99c9421efa1 +size 22974 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png index 3c27d5ab57..8ee163709a 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef88b209eb93fb6b4e5aa411c4cdcb9ff1aa49bd44f11c2271a4d758482b145a -size 25181 +oid sha256:941b691799b124e724c350ff11d7cbd67be75859938fcb91c59e1f88216d8ee4 +size 25074 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png index 8543427ea2..191c4ba0bf 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2d2af5b466c79a8ab9243308dfc036c81c4c6e32a1ff4479702835a9259fcd1 -size 34961 +oid sha256:ea7b82e4b8df9e11e14a7be70368640ce04dd74319814a2ad99663901bebf9ba +size 34904 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png index c69bac7acf..0e67124f43 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de2bee81e394ff032fac35d5391e38459ec8ecddb0036f34878b7239ad22d1af -size 31744 +oid sha256:76b688c758b4485634a5b5e8b350982aec21dac454cc9af68920d80c44cf8143 +size 31647 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png index 572f9e52e5..14cc9719ed 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6894ddb5662e7da82e5ee42fb0c9eb30afd87e15e415ba42be218ebab434d53a -size 23531 +oid sha256:86169e0e7694b00d1c6f924775377470f54b3cb343844c6bdd060ca0c499b8ae +size 23452 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png index 1acafc94c6..e09867ca42 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f393f620cc11b7aec7bf52f7efc5a5872ed07a14e7fbf2149b16171dbb2b03e -size 21463 +oid sha256:758b5c1df83fb5b241396268a73b019b28d0616e5f37bd501c42400683ffd583 +size 21384 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png index 4e6aeaef61..c19cd50098 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63f75139c00eb5da98254c176fc8b4ed291cbb3c1b2581b869071cd6b435439d -size 23374 +oid sha256:064b9d499901d7780672159784a84c8674e4cac8562c26e3b883bf504fb57102 +size 23295 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png index 4d0032fc29..3128baba4a 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce136a49edadeaadc229ec485b27bf2d4ae20601e948bca46c632a4035b90130 -size 33697 +oid sha256:dcffa0153086f13d3c306813b308021e9c737915284aa1bc6e6528d1c1d20e10 +size 33619 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png index 22aeb8dc7a..7263187524 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:580fc1fe77975e83cf83fe582c2f3f4aa7003cf302e7dadcd6bb97c04cbbf148 -size 25517 +oid sha256:61aa562bfeeb701f22520827cc57a3019744e1036128e2c7486cada54a7f403f +size 25435 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png index e5a8848f0f..d768ce89c7 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9bad99fce2875f6ac00fee3d09434c501964519ae6bb2a6ae24864e496cfc25d -size 21886 +oid sha256:3fd9cc072584a210d41ae55c1c5c02d011b4c1afe94802ca4e8f807cdab069ec +size 21804 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png index 4351039557..6b47c5752c 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4b48c3e2c5e06a612473e252ba52eead6efd741b7ea21fdb778ec9ed5952a2a2 -size 21181 +oid sha256:8d889f6a0aa62800b92d2b259a1661e9d599ea9df0156a8ca1b55d859fe37a6c +size 21098 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png index 2c7ce358ee..e349270718 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:201c3f2385059321f7500ca8d559bb973a51aeb56fd417e943be496ae55d0869 -size 24370 +oid sha256:b482ea511c9a60a35785ab480e6a495f5f45b0e7c96e72c95fbec08ec2824f48 +size 24289 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png index c7762a331d..8e0f1c8094 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c2938cbc17fb7fbd45f5b455a76e18a5ed812e779d622add70bdf84c46f17c93 -size 33487 +oid sha256:76825478ae3c24522f197c2040467338a1fafb596b46596f8a6bc299808d72b6 +size 33450 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png index e4598d092f..19e7038d2e 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ecba6c23a84b90af5fac2b5146d93c16a31c0f2237032bfd77744c62b50b2856 -size 30677 +oid sha256:cd81d819a37f2f5d4217ffeecb98bc7ca4c2a07ff043e8fc12a9f17682358044 +size 30601 From a0b4e7388bcf760f3454c5d1694c9c2d2813e8c2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 28 Mar 2025 15:53:10 +0100 Subject: [PATCH 16/54] Update store description. (#4496) --- .../android/en-US/full_description.txt | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index f3708552d3..d0b9479886 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,38 +1,28 @@ -Element X brings you both sovereign & seamless collaboration built on Matrix. +Freedom to communicate on your own terms -The collaboration capabilities include chat & video calls with the modern set of features such as: - • public & private channels - • room moderation & access control - • replies, reactions, polls, read receipts, pinned messages, etc. - • simultaneous chat & calls (picture in picture) - • decentralized & federated communication across organizations +For individuals and communities - private communication between family, friends, hobby groups, clubs, etc. -All this comes in a secure & sovereign fashion without compromising responsiveness or overall usability of the app: - • enterprise-grade single sign-on - • easy & secure login & device verification via QR-code - • end to end encryption & zero trust - • protection against MITM & other cyber attacks +Element X gives you fast, secure and private instant messaging and video calls built on Matrix, the open standard for real-time communication. This is a free and open-source app maintained at https://github.com/element-hq/element-x-android. -If you’re a new user, use the new Element X app from the start. Compared to the current Element app you will get: - • greatly enhanced performance, sleek user interface and overall better user experience - • enterprise-grade support for single sign-on (OIDC) - • QR-code based login & device verification - • natively integrated Element Call for video calls - • continuous improvements, bug fixes and new features +Stay in touch with friends, family and communities with: + • Real time messaging & video calls + • Public rooms for open group communication + • Private rooms for closed group communication + • Rich messaging features: emoji reactions, replies, polls, pinned messages and more. + • Video calling while browsing messages. + • Interoperability with other Matrix-based apps such as FluffyChat, Cinny and many more. -If you’re an existing user, using the current Element app - check out the new Element X and start planning your transition. The current Element app will be phased out and will only get critical security updates. +Privacy-first +Unlike some other messengers from Big Tech companies, we don’t mine your data or monitor your communications. -Own your data -Matrix-based, Element X lets you self-host your data or choose from any free public server (the default is matrix.org, but there are plenty of others to choose from). However you host, you have ownership; it’s your data. You’re not the product. You’re in control. +Own your conversations +Choose where to host your data - from any public server (the largest free server is matrix.org, but there are plenty of others to choose from) to creating your own personal server and hosting it on your own domain. This ability to choose a server is a large part of what differentiates us from other real time communication apps. However you host, you have ownership; it’s your data. You’re not the product. You’re in control. -Interoperate natively -Enjoy the freedom of the Matrix open standard! You have native interoperability with any other Matrix-based app. So just like email, it doesn't matter if your friends, partners or customers are on a different Matrix-based app - you can still connect. +Communicate in real time, all the time +Use Element everywhere. Stay in touch wherever you are with fully synchronised message history across all your devices, including on the web at https://app.element.io -Encrypt your data -Enjoy your right to private conversations - free from data mining, ads and all the rest of it - and stay secure. Only the people in your conversation can read your messages. - -Chat across multiple devices -Stay in touch wherever you are with fully synchronized message history across all your devices, even those running Element legacy app, and on the web at https://app.element.io +Element X is our next-generation app +If you’re using the original Element app, it’s time to try Element X! It’s faster, easier to use, and more powerful than the original app. It’s better in every way and we’re adding new features all the time. The application requires the android.permission.REQUEST_INSTALL_PACKAGES permission to enable the installation of applications received as attachments, ensuring seamless and convenient access to new software within the app. From fe5aab6588ecdcf9354a3bfbd9e97c1b31175a8f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:26:28 +0100 Subject: [PATCH 17/54] fix(deps): update dependency io.element.android:element-call-embedded to v0.9.0 (#4498) 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 d1c58aacc1..c2b9ce0f7b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -212,7 +212,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.9.0-rc.4" +element_call_embedded = "io.element.android:element-call-embedded:0.9.0" # Auto services google_autoservice = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } From d75b249bd7fc49166052dc98a8ece3b039228eb1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 28 Mar 2025 16:54:16 +0100 Subject: [PATCH 18/54] Use handy buildConfigFieldStr. (#4501) --- app/build.gradle.kts | 13 ++++++------ features/call/impl/build.gradle.kts | 31 ++++++++++------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7984675391..107f9431f2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,6 +20,7 @@ import extension.allEnterpriseImpl import extension.allFeaturesImpl import extension.allLibrariesImpl import extension.allServicesImpl +import extension.buildConfigFieldStr import extension.koverDependencies import extension.locales import extension.setupAnvil @@ -170,13 +171,13 @@ android { create("gplay") { dimension = "store" isDefault = true - buildConfigField("String", "SHORT_FLAVOR_DESCRIPTION", "\"G\"") - buildConfigField("String", "FLAVOR_DESCRIPTION", "\"GooglePlay\"") + buildConfigFieldStr("SHORT_FLAVOR_DESCRIPTION", "G") + buildConfigFieldStr("FLAVOR_DESCRIPTION", "GooglePlay") } create("fdroid") { dimension = "store" - buildConfigField("String", "SHORT_FLAVOR_DESCRIPTION", "\"F\"") - buildConfigField("String", "FLAVOR_DESCRIPTION", "\"FDroid\"") + buildConfigFieldStr("SHORT_FLAVOR_DESCRIPTION", "F") + buildConfigFieldStr("FLAVOR_DESCRIPTION", "FDroid") } } } @@ -291,8 +292,8 @@ tasks.withType().configureEach { outputs.upToDateWhen { false } val gitRevision = providers.of(GitRevisionValueSource::class.java) {}.get() val gitBranchName = providers.of(GitBranchNameValueSource::class.java) {}.get() - android.defaultConfig.buildConfigField("String", "GIT_REVISION", "\"$gitRevision\"") - android.defaultConfig.buildConfigField("String", "GIT_BRANCH_NAME", "\"$gitBranchName\"") + android.defaultConfig.buildConfigFieldStr("GIT_REVISION", gitRevision) + android.defaultConfig.buildConfigFieldStr("GIT_BRANCH_NAME", gitBranchName) } licensee { diff --git a/features/call/impl/build.gradle.kts b/features/call/impl/build.gradle.kts index be332ec4fe..f0a9eedca0 100644 --- a/features/call/impl/build.gradle.kts +++ b/features/call/impl/build.gradle.kts @@ -1,3 +1,4 @@ +import extension.buildConfigFieldStr import extension.readLocalProperty import extension.setupAnvil @@ -26,45 +27,35 @@ android { } defaultConfig { - buildConfigField( - type = "String", + buildConfigFieldStr( name = "SENTRY_DSN", - value = (System.getenv("ELEMENT_CALL_SENTRY_DSN") + value = System.getenv("ELEMENT_CALL_SENTRY_DSN") ?: readLocalProperty("features.call.sentry.dsn") ?: "" - ).let { "\"$it\"" } ) - buildConfigField( - type = "String", + buildConfigFieldStr( name = "POSTHOG_USER_ID", - value = (System.getenv("ELEMENT_CALL_POSTHOG_USER_ID") + value = System.getenv("ELEMENT_CALL_POSTHOG_USER_ID") ?: readLocalProperty("features.call.posthog.userid") ?: "" - ).let { "\"$it\"" } ) - buildConfigField( - type = "String", + buildConfigFieldStr( name = "POSTHOG_API_HOST", - value = (System.getenv("ELEMENT_CALL_POSTHOG_API_HOST") + value = System.getenv("ELEMENT_CALL_POSTHOG_API_HOST") ?: readLocalProperty("features.call.posthog.api.host") ?: "" - ).let { "\"$it\"" } ) - buildConfigField( - type = "String", + buildConfigFieldStr( name = "POSTHOG_API_KEY", - value = (System.getenv("ELEMENT_CALL_POSTHOG_API_KEY") + value = System.getenv("ELEMENT_CALL_POSTHOG_API_KEY") ?: readLocalProperty("features.call.posthog.api.key") ?: "" - ).let { "\"$it\"" } ) - buildConfigField( - type = "String", + buildConfigFieldStr( name = "RAGESHAKE_URL", - value = (System.getenv("ELEMENT_CALL_RAGESHAKE_URL") + value = System.getenv("ELEMENT_CALL_RAGESHAKE_URL") ?: readLocalProperty("features.call.regeshake.url") ?: "" - ).let { "\"$it\"" } ) } } From 348f787058b58b99b08352ad6883e7f02ec923ab Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 28 Mar 2025 17:28:24 +0100 Subject: [PATCH 19/54] Timeline header: ensure that the decoration is clickable (#4495) * Timeline header: ensure that the decoration is clickable, and properly fix the icon rendering. * Update screenshots --------- Co-authored-by: ElementBot --- .../android/features/messages/impl/MessagesView.kt | 12 +++++------- ...features.messages.impl_MessagesView_Day_12_en.png | 4 ++-- ...features.messages.impl_MessagesView_Day_13_en.png | 4 ++-- ...atures.messages.impl_MessagesView_Night_12_en.png | 4 ++-- ...atures.messages.impl_MessagesView_Night_13_en.png | 4 ++-- 5 files changed, 13 insertions(+), 15 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 b8fb44dca2..87134ac7d0 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 @@ -25,7 +25,6 @@ import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.requiredWidthIn import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape @@ -484,14 +483,15 @@ private fun MessagesViewTopBar( BackButton(onClick = onBackClick) }, title = { + val roundedCornerShape = RoundedCornerShape(8.dp) Row( + modifier = Modifier + .clip(roundedCornerShape) + .clickable { onRoomDetailsClick() }, horizontalArrangement = Arrangement.spacedBy(4.dp), verticalAlignment = Alignment.CenterVertically, ) { - val roundedCornerShape = RoundedCornerShape(8.dp) - val titleModifier = Modifier - .clip(roundedCornerShape) - .clickable { onRoomDetailsClick() } + val titleModifier = Modifier.weight(1f, fill = false) if (roomName != null && roomAvatar != null) { RoomAvatarAndNameRow( roomName = roomName, @@ -509,7 +509,6 @@ private fun MessagesViewTopBar( when (dmUserIdentityState) { IdentityState.Verified -> { Icon( - modifier = Modifier.requiredWidthIn(min = 16.dp), imageVector = CompoundIcons.Verified(), tint = ElementTheme.colors.iconSuccessPrimary, contentDescription = null, @@ -517,7 +516,6 @@ private fun MessagesViewTopBar( } IdentityState.VerificationViolation -> { Icon( - modifier = Modifier.requiredWidthIn(min = 16.dp), imageVector = CompoundIcons.ErrorSolid(), tint = ElementTheme.colors.iconCriticalPrimary, contentDescription = null, diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png index 381edbced8..ef98edf77b 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc5bf16206197d8f79803b0a53bf9e9f329522855e3e594f775a2d9cf26f1739 -size 60219 +oid sha256:9ade5d45c72d66bc1ede4ddd84976981d7cfc59b90bd17c97fcfdf6ed44fdde9 +size 59753 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png index 786b264f4e..59cded1222 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0f89334dbc8f8cb871f6649bcb5b869a8d25193376976cff6e33ad44c724b64 -size 60111 +oid sha256:66ad9872af4087c25611715b1d369893daa948aa2e1e4b8bc6fbff6067c3295e +size 59685 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png index 12c1955f6a..7732b265fb 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c55355ed7ab137016b21ec96a78ae954887d08a2843be9e5f6686015e0792c70 -size 59695 +oid sha256:7567339acb87356f182961883bfde348cbfdf406eedefc2ecb54fba9cd26e2f2 +size 59291 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png index aa243c0a3d..9ee85846e4 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b00a709eb1e8ed90d193d274ff1449840da856d782f07511698fa4cf1a105a19 -size 59640 +oid sha256:668c3e76f40df6ee3d64d595b840d81d62ec3f52474cd2fc261109aedbf46a69 +size 59291 From c3ee00ed091cfcc92462b2f5ffc49f123a89505f Mon Sep 17 00:00:00 2001 From: ElementBot <110224175+ElementBot@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:58:46 +0200 Subject: [PATCH 20/54] Sync Strings from Localazy (#4506) Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com> --- .../src/main/res/values-eu/translations.xml | 2 + .../src/main/res/values-nb/translations.xml | 3 + .../src/main/res/values-pl/translations.xml | 6 + .../src/main/res/values-el/translations.xml | 4 + .../src/main/res/values-eu/translations.xml | 1 + .../src/main/res/values-et/translations.xml | 3 + .../src/main/res/values-eu/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 3 + .../src/main/res/values-uk/translations.xml | 3 + .../src/main/res/values-nb/translations.xml | 1 + .../src/main/res/values-nb/translations.xml | 4 + .../src/main/res/values-el/translations.xml | 4 +- .../src/main/res/values-eu/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 8 +- .../src/main/res/values-nb/translations.xml | 3 + .../src/main/res/values-nb/translations.xml | 1 + .../src/main/res/values-cs/translations.xml | 4 +- .../src/main/res/values-nb/translations.xml | 4 + .../src/main/res/values-cs/translations.xml | 2 +- .../src/main/res/values-eu/translations.xml | 15 + .../src/main/res/values-el/translations.xml | 1 + .../src/main/res/values-eu/translations.xml | 2 + .../src/main/res/values-eu/translations.xml | 2 + .../src/main/res/values-el/translations.xml | 2 +- .../src/main/res/values-in/translations.xml | 2 +- .../src/main/res/values-nb/translations.xml | 1 + .../src/main/res/values-it/translations.xml | 1 + .../src/main/res/values-pl/translations.xml | 2 + .../src/main/res/values-cs/translations.xml | 18 +- .../src/main/res/values-de/translations.xml | 16 +- .../src/main/res/values-el/translations.xml | 11 +- .../src/main/res/values-et/translations.xml | 20 +- .../src/main/res/values-eu/translations.xml | 5 + .../src/main/res/values-fr/translations.xml | 4 + .../src/main/res/values-in/translations.xml | 10 +- .../src/main/res/values-it/translations.xml | 24 +- .../src/main/res/values-nb/translations.xml | 2 + .../src/main/res/values-pl/translations.xml | 8 + .../src/main/res/values-uk/translations.xml | 18 +- .../src/main/res/values/localazy.xml | 4 + ...nces_AnalyticsPreferencesView_Day_1_de.png | 3 + ...ytics.impl_AnalyticsOptInView_Day_1_de.png | 3 + ...ntity_IdentityChangeStateView_Day_1_de.png | 4 +- ...ntity_IdentityChangeStateView_Day_2_de.png | 4 +- ...essagesViewWithIdentityChange_Day_0_de.png | 4 +- ...essagesViewWithIdentityChange_Day_1_de.png | 4 +- ...essagesViewWithIdentityChange_Day_2_de.png | 4 +- ...veVerifiedUserSendFailureView_Day_2_de.png | 4 +- ...s.messages.impl.link_LinkView_Day_1_de.png | 3 + ...d.list_PinnedMessagesListView_Day_3_de.png | 4 +- ...TimelineItemEventRowTimestamp_Day_3_de.png | 4 +- ...TimelineItemEventRowTimestamp_Day_4_de.png | 4 +- ...TimelineItemEventRowTimestamp_Day_7_de.png | 4 +- ...nents_TimelineItemEventRowUtd_Day_0_de.png | 4 +- ...ItemEventRowWithManyReactions_Day_0_de.png | 4 +- ...mEventRowWithReplyInformative_Day_0_de.png | 4 +- ...mEventRowWithReplyInformative_Day_1_de.png | 4 +- ...TimelineItemEventRowWithReply_Day_4_de.png | 4 +- ...TimelineItemEventRowWithReply_Day_8_de.png | 4 +- ...nts_TimelineItemEventTimestampBelow_de.png | 4 +- ...ine_TimelineViewMessageShield_Day_0_de.png | 4 +- ...es.impl.timeline_TimelineView_Day_0_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_12_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_13_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_14_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_15_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_16_de.png | 4 +- ...s.impl.timeline_TimelineView_Day_17_de.png | 4 +- ...es.impl.timeline_TimelineView_Day_1_de.png | 4 +- ...es.impl.timeline_TimelineView_Day_4_de.png | 4 +- ...es.impl.timeline_TimelineView_Day_6_de.png | 4 +- ...es.impl.timeline_TimelineView_Day_8_de.png | 4 +- ...es.messages.impl_MessagesView_Day_0_de.png | 4 +- ...s.messages.impl_MessagesView_Day_10_de.png | 4 +- ...s.messages.impl_MessagesView_Day_11_de.png | 4 +- ...s.messages.impl_MessagesView_Day_12_de.png | 4 +- ...s.messages.impl_MessagesView_Day_13_de.png | 4 +- ...es.messages.impl_MessagesView_Day_1_de.png | 4 +- ...es.messages.impl_MessagesView_Day_3_de.png | 4 +- ...es.messages.impl_MessagesView_Day_4_de.png | 4 +- ...es.messages.impl_MessagesView_Day_5_de.png | 4 +- ...es.messages.impl_MessagesView_Day_6_de.png | 4 +- ...es.messages.impl_MessagesView_Day_7_de.png | 4 +- ...es.messages.impl_MessagesView_Day_8_de.png | 4 +- ...es.messages.impl_MessagesView_Day_9_de.png | 4 +- ...nboarding.impl_OnBoardingView_Day_0_de.png | 4 +- ...nboarding.impl_OnBoardingView_Day_1_de.png | 4 +- ...nboarding.impl_OnBoardingView_Day_2_de.png | 4 +- ...nboarding.impl_OnBoardingView_Day_3_de.png | 4 +- ...nboarding.impl_OnBoardingView_Day_4_de.png | 3 + ....roomdetails.impl_RoomDetailsDark_0_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_10_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_12_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_13_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_14_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_15_de.png | 4 +- ...roomdetails.impl_RoomDetailsDark_16_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_1_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_2_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_3_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_4_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_6_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_7_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_8_de.png | 4 +- ....roomdetails.impl_RoomDetailsDark_9_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_0_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_10_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_12_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_13_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_14_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_15_de.png | 4 +- ...res.roomdetails.impl_RoomDetails_16_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_1_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_2_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_3_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_4_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_6_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_7_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_8_de.png | 4 +- ...ures.roomdetails.impl_RoomDetails_9_de.png | 4 +- ...tionWithVerificationViolation_Day_0_de.png | 4 +- ...ared_UserProfileHeaderSection_Day_0_de.png | 4 +- ...rofile.shared_UserProfileView_Day_0_de.png | 4 +- ...rofile.shared_UserProfileView_Day_1_de.png | 4 +- ...rofile.shared_UserProfileView_Day_2_de.png | 4 +- ...rofile.shared_UserProfileView_Day_3_de.png | 4 +- ...rofile.shared_UserProfileView_Day_4_de.png | 4 +- ...rofile.shared_UserProfileView_Day_5_de.png | 4 +- ...rofile.shared_UserProfileView_Day_6_de.png | 4 +- ...rofile.shared_UserProfileView_Day_7_de.png | 4 +- ...rofile.shared_UserProfileView_Day_8_de.png | 4 +- ...rofile.shared_UserProfileView_Day_9_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 | 3 + ...textcomposer_TextComposerEdit_Day_0_de.png | 4 +- ...omposerFormattingNotEncrypted_Day_0_de.png | 3 + ...mposer_TextComposerFormatting_Day_0_de.png | 4 +- ...TextComposerReplyNotEncrypted_Day_0_de.png | 3 + ...extComposerReplyNotEncrypted_Day_10_de.png | 3 + ...extComposerReplyNotEncrypted_Day_11_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_1_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_2_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_3_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_4_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_5_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_6_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_7_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_8_de.png | 3 + ...TextComposerReplyNotEncrypted_Day_9_de.png | 3 + ...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 | 3 + ...xtcomposer_TextComposerSimple_Day_0_de.png | 4 +- ...TextComposerVoiceNotEncrypted_Day_0_de.png | 3 + screenshots/html/data.js | 1564 +++++++++-------- 168 files changed, 1245 insertions(+), 1036 deletions(-) create mode 100644 features/roomaliasresolver/impl/src/main/res/values-nb/translations.xml create mode 100644 screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png create mode 100644 screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png create mode 100644 screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png create mode 100644 screenshots/de/features.onboarding.impl_OnBoardingView_Day_4_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png create mode 100644 screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png diff --git a/features/createroom/impl/src/main/res/values-eu/translations.xml b/features/createroom/impl/src/main/res/values-eu/translations.xml index 514c30e19d..43f67e429c 100644 --- a/features/createroom/impl/src/main/res/values-eu/translations.xml +++ b/features/createroom/impl/src/main/res/values-eu/translations.xml @@ -18,4 +18,6 @@ Gelaren ezarpenetan aldatu dezakezu hobespena." "Mintzagaia (aukerakoa)" "Gelen direktorioa" "Errorea gertatu da txata hasten saiatzean" + "Sartu…" + "Ez da gela aurkitu" diff --git a/features/createroom/impl/src/main/res/values-nb/translations.xml b/features/createroom/impl/src/main/res/values-nb/translations.xml index 98ea87e622..9b79740a97 100644 --- a/features/createroom/impl/src/main/res/values-nb/translations.xml +++ b/features/createroom/impl/src/main/res/values-nb/translations.xml @@ -18,4 +18,7 @@ Du kan endre dette når som helst i rominnstillingene." "Emne (valgfritt)" "Romkatalog" "Det oppstod en feil når du prøvde å starte en chat" + "Ikke en gyldig adresse" + "Rom ikke funnet" + "f.eks. #rom-navn:matrix.org" diff --git a/features/createroom/impl/src/main/res/values-pl/translations.xml b/features/createroom/impl/src/main/res/values-pl/translations.xml index 40d31e710d..3ed917b7bb 100644 --- a/features/createroom/impl/src/main/res/values-pl/translations.xml +++ b/features/createroom/impl/src/main/res/values-pl/translations.xml @@ -21,4 +21,10 @@ Możesz to zmienić w ustawieniach pokoju." "Temat (opcjonalnie)" "Katalog pokoi" "Wystąpił błąd podczas próby rozpoczęcia czatu" + "Dołącz do pokoju za pomocą adresu" + "Nieprawidłowy adres" + "Wprowadź…" + "Znaleziono pasujący pokój" + "Nie znaleziono pokoju" + "np. #room-name:matrix.org" 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 326227df48..d07b289382 100644 --- a/features/knockrequests/impl/src/main/res/values-el/translations.xml +++ b/features/knockrequests/impl/src/main/res/values-el/translations.xml @@ -4,7 +4,10 @@ "Σίγουρα θες να αποδεχτείς όλα τα αιτήματα συμμετοχής;" "Αποδοχή όλων των αιτημάτων" "Αποδοχή όλων" + "Δεν μπορέσαμε να δεχτούμε όλα τα αιτήματα. Θες να προσπαθήσεις ξανά;" + "Αποτυχία αποδοχής όλων των αιτημάτων" "Αποδοχή όλων των αιτημάτων συμμετοχής" + "Αποτυχία αποδοχής αιτήματος" "Γίνεται αποδοχή αιτήματος συμμετοχής" "Ναι, απόρριψη και αποκλεισμός" "Σίγουρα θες να απορρίψειε και να αποκλείσεις τον χρήστη %1$s; Αυτός ο χρήστης δεν θα μπορεί να ζητήσει πρόσβαση για να συμμετάσχει ξανά σε αυτό το δωμάτιο." @@ -17,6 +20,7 @@ "Γίνεται απόρριψη αιτήματος συμμετοχής" "Όταν κάποιος θα ζητήσει να συμμετάσχει στο δωμάτιο, θα μπορείς να δεις το αίτημά του εδώ." "Δεν υπάρχει εκκρεμές αίτημα συμμετοχής" + "Φόρτωση αιτημάτων συμμετοχής…" "Αιτήματα συμμετοχής" "Οι χρήστες %1$s +%2$d ακόμη θέλουν να συμμετάσχουν σε αυτό το δωμάτιο" diff --git a/features/messages/impl/src/main/res/values-eu/translations.xml b/features/messages/impl/src/main/res/values-eu/translations.xml index cfd41379f8..34d0a114ee 100644 --- a/features/messages/impl/src/main/res/values-eu/translations.xml +++ b/features/messages/impl/src/main/res/values-eu/translations.xml @@ -25,6 +25,7 @@ "Jakinarazi gela osoari" "Guztiak" "Bidali berriro" + "Huts egin du mezuaren bidalketak" "Gehitu emojia" "Hauxe da %1$s(r)en hasiera" "Hau da elkarrizketaren hasiera." diff --git a/features/preferences/impl/src/main/res/values-et/translations.xml b/features/preferences/impl/src/main/res/values-et/translations.xml index bf7c028dd3..6c5c1af22d 100644 --- a/features/preferences/impl/src/main/res/values-et/translations.xml +++ b/features/preferences/impl/src/main/res/values-et/translations.xml @@ -8,8 +8,11 @@ "Element Calli kohandatud teenuseaadress" "Seadista kohandatud teenuseaadress Element Calli jaoks." "Vigane url. Palun vaata, et url algaks protokolliga (http/https) ning aadress ise oleks ka õige." + "Peida jututubade kutsetest tunnuspildid" + "Peida meedia eelvaated ajajoonel" "Sellega laadid fotosid ja videoid kiiremini üles ning vähendad andmemahtu" "Optimeeri meedia kvaliteeti" + "Modereerimine ja ohutus" "Tõuketeavituste pakkuja" "Kui soovid Markdown-vormingut käsitsi lisada, siis lülita vormindatud teksti toimeti välja." "Lugemisteatised" diff --git a/features/preferences/impl/src/main/res/values-eu/translations.xml b/features/preferences/impl/src/main/res/values-eu/translations.xml index 4caeb4f6db..62e4da471c 100644 --- a/features/preferences/impl/src/main/res/values-eu/translations.xml +++ b/features/preferences/impl/src/main/res/values-eu/translations.xml @@ -5,6 +5,7 @@ "Aukeratu jakinarazpenak nola jaso" "Garatzaile modua" "Gaitu garatzaileentzako ezaugarrietarako eta funtzionalitateetarako sarbidea izateko." + "Moderazioa eta Segurtasuna" "Push jakinarazpen hornitzailea" "Desgaitu testu aberatseko editorea Markdown eskuz idazteko." "Irakurketa-agiriak" 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 e47167e32b..348c54771e 100644 --- a/features/preferences/impl/src/main/res/values-it/translations.xml +++ b/features/preferences/impl/src/main/res/values-it/translations.xml @@ -8,8 +8,11 @@ "URL base di Element Call personalizzato" "Imposta un URL di base personalizzato per Element Call." "URL non valido, assicurati di includere il protocollo (http/https) e l\'indirizzo corretto." + "Nascondi gli avatar nelle richieste di invito alle stanze" + "Nascondi le anteprime dei media nelle conversazioni" "Carica foto e video più velocemente e riduci l\'utilizzo dei dati" "Ottimizza la qualità dei contenuti multimediali" + "Moderazione e Sicurezza" "Fornitore di notifiche push" "Disattiva l\'editor di testo avanzato per scrivere manualmente in Markdown" "Ricevute di visualizzazione" diff --git a/features/preferences/impl/src/main/res/values-uk/translations.xml b/features/preferences/impl/src/main/res/values-uk/translations.xml index afbbe97e39..4a92a89832 100644 --- a/features/preferences/impl/src/main/res/values-uk/translations.xml +++ b/features/preferences/impl/src/main/res/values-uk/translations.xml @@ -8,8 +8,11 @@ "Користувацька URL-адреса Element Call" "Встановіть URL-адресу для Element Call." "Неправильна URL-адреса. Переконайтеся, що ви вказали протокол (http/https) та правильну адресу." + "Сховати аватари у запитах на запрошення до кімнат" + "Сховати попередній перегляд медіа у стрічці" "Швидше завантажуйте фотографії та відео та зменшуйте використання даних" "Оптимізуйте медіаякість" + "Модерування й безпека" "Постачальник push-сповіщень" "Вимкніть редактор розширеного тексту, щоб вводити Markdown вручну." "Читати журнали" diff --git a/features/rageshake/api/src/main/res/values-nb/translations.xml b/features/rageshake/api/src/main/res/values-nb/translations.xml index ca37b6e6b6..dfc2d710ad 100644 --- a/features/rageshake/api/src/main/res/values-nb/translations.xml +++ b/features/rageshake/api/src/main/res/values-nb/translations.xml @@ -2,5 +2,6 @@ "%1$s krasjet sist gang den ble brukt. Vil du dele en krasjrapport med oss?" "Du ser ut til å riste på telefonen i frustrasjon. Vil du åpne feilrapportskjermen?" + "Rageshake" "Gjenkjenningsterskel" diff --git a/features/roomaliasresolver/impl/src/main/res/values-nb/translations.xml b/features/roomaliasresolver/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..4fd8f68bdf --- /dev/null +++ b/features/roomaliasresolver/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,4 @@ + + + "Kunne ikke løse romalias." + 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 3cd064109e..16d6fa18a4 100644 --- a/features/roomdetails/impl/src/main/res/values-el/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-el/translations.xml @@ -7,11 +7,11 @@ "Αποκλεισμός ατόμων" "Αφαίρεση μηνυμάτων" "Όλοι" - "Πρόσκληση ατόμων" + "Προσκάλεσε άτομα και αποδέξου αιτήματα συμμετοχής" "Συντονισμός μελών" "Μηνύματα και περιεχόμενο" "Διαχειριστές και συντονιστές" - "Αφαίρεση ατόμων" + "Αφαίρεση ατόμων και απόρριψη αιτημάτων συμμετοχής" "Αλλαγή avatar δωματίου" "Λεπτομέρειες δωματίου" "Αλλαγή ονόματος δωματίου" diff --git a/features/roomdetails/impl/src/main/res/values-eu/translations.xml b/features/roomdetails/impl/src/main/res/values-eu/translations.xml index 8968f36d80..ecbdc614d4 100644 --- a/features/roomdetails/impl/src/main/res/values-eu/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-eu/translations.xml @@ -52,6 +52,7 @@ "Lehenetsia" "Jakinarazpenak" "Finkatutako mezuak" + "Profila" "Sartzeko eskaerak" "Rolak eta baimenak" "Gelaren izena" @@ -110,9 +111,12 @@ "Gelaren xehetasunak" "Rolak eta baimenak" "Gehitu gelaren helbidea" + "Bai, gaitu zifratzea" "Zifratzea" "Edonork aurkitu eta bat egin dezake" "Edonork" + "Gonbidatutako pertsonak bakarrik sartu ahal izango dira" + "Gonbidapen bidez" "Gelarako sarbidea" "Gaur-gaurkoz ez da guneekin bateragarria" "Guneko kideak" 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 d09ccd3cff..99c763ca9f 100644 --- a/features/roomdetails/impl/src/main/res/values-in/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-in/translations.xml @@ -7,11 +7,11 @@ "Cekal orang-orang" "Hapus pesan" "Semua orang" - "Undang orang-orang" + "Undang orang-orang dan terima permintaan untuk bergabung" "Moderasi anggota" "Pesan dan konten" "Admin dan moderator" - "Keluarkan orang-orang" + "Keluarkan orang-orang dan tolak permintaan untuk bergabung" "Ubah avatar ruangan" "Detail ruangan" "Ubah nama ruangan" @@ -57,6 +57,7 @@ "Permintaan untuk bergabung" "Peran dan perizinan" "Nama ruangan" + "Keamanan & privasi" "Keamanan" "Bagikan ruangan" "Info ruangan" @@ -118,6 +119,9 @@ "Minta untuk bergabung" "Enkripsi" "Siapa pun" + "Hanya undangan" + "Akses ruangan" "Siapa pun" "Keterlihatan ruangan" + "Keamanan & privasi" diff --git a/features/roomdetails/impl/src/main/res/values-nb/translations.xml b/features/roomdetails/impl/src/main/res/values-nb/translations.xml index 4dd6f3fbb1..5ed7599258 100644 --- a/features/roomdetails/impl/src/main/res/values-nb/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-nb/translations.xml @@ -10,6 +10,7 @@ "Fjern meldinger" "Alle" "Inviter folk og godta forespørsler om å bli med" + "Moderering av medlemmer" "Meldinger og innhold" "Administratorer og moderatorer" "Fjern folk og avslå forespørsler om å bli med" @@ -25,6 +26,7 @@ "Du vil ikke kunne angre denne endringen ettersom du degraderer deg selv, og hvis du er den siste privilegerte brukeren i rommet, vil det være umulig å få tilbake privilegiene." "Degradere deg selv?" "%1$s (Venter)" + "(Venter)" "Administratorer har automatisk moderatorrettigheter" "Rediger moderatorer" "Administratorer" @@ -108,6 +110,7 @@ "Endre rollen min" "Nedgradere til medlem" "Nedgradere til moderator" + "Moderering av medlemmer" "Meldinger og innhold" "Moderatorer" "Tillatelser" diff --git a/features/roomlist/impl/src/main/res/values-nb/translations.xml b/features/roomlist/impl/src/main/res/values-nb/translations.xml index a97826a0c3..15cfe25708 100644 --- a/features/roomlist/impl/src/main/res/values-nb/translations.xml +++ b/features/roomlist/impl/src/main/res/values-nb/translations.xml @@ -5,6 +5,7 @@ "Konfigurer gjenoppretting for å beskytte kontoen din" "Skriv inn gjenopprettingsnøkkelen din" "Har du glemt din gjenopprettingsnøkkel?" + "Nøkkellagringen din er ikke synkronisert" "For å sikre at du aldri går glipp av en viktig samtale, må du endre innstillingene dine for å tillate fullskjermvarsler når telefonen er låst." "Forbedre samtaleopplevelsen din" "Er du sikker på at du vil takke nei til invitasjonen til å bli med i %1$s?" diff --git a/features/securebackup/impl/src/main/res/values-cs/translations.xml b/features/securebackup/impl/src/main/res/values-cs/translations.xml index 3ba3bd98ee..f03a7d68d6 100644 --- a/features/securebackup/impl/src/main/res/values-cs/translations.xml +++ b/features/securebackup/impl/src/main/res/values-cs/translations.xml @@ -62,9 +62,9 @@ "Nastavení obnovy" "Ano, resetovat nyní" "Tento proces je nevratný." - "Opravdu chcete obnovit šifrování?" + "Opravdu chcete obnovit svou identitu?" "Došlo k neznámé chybě. Zkontrolujte, zda je heslo k účtu správné a zkuste to znovu." "Zadejte…" - "Potvrďte, že chcete obnovit šifrování." + "Potvrďte, že chcete obnovit svou identitu." "Pro pokračování zadejte heslo k účtu" diff --git a/features/securebackup/impl/src/main/res/values-nb/translations.xml b/features/securebackup/impl/src/main/res/values-nb/translations.xml index 7d7401473e..1123e3ef2c 100644 --- a/features/securebackup/impl/src/main/res/values-nb/translations.xml +++ b/features/securebackup/impl/src/main/res/values-nb/translations.xml @@ -1,11 +1,14 @@ + "Slett nøkkellagring" "Slå på sikkerhetskopiering" "Lagre din kryptografiske identitet og meldingsnøkler sikkert på serveren. Dette gjør at du kan se meldingshistorikken din på alle nye enheter. %1$s." + "Nøkkellagring" "Last opp nøkler fra denne enheten" "Endre gjenopprettingsnøkkel" "Gjenopprett din kryptografiske identitet og meldingshistorikk med en gjenopprettingsnøkkel hvis du har mistet alle dine brukte enheter." "Skriv inn gjenopprettingsnøkkel" + "Nøkkellagringen din er for øyeblikket ikke synkronisert." "Konfigurer gjenoppretting" "Få tilgang til de krypterte meldingene dine hvis du mister alle enhetene dine eller blir logget ut av %1$s overalt." "Logg på kontoen din igjen" @@ -25,6 +28,7 @@ "Er du sikker på at du vil slå av sikkerhetskopiering?" "Du vil ikke ha kryptert meldingshistorikk på nye enheter" "Du mister tilgangen til de krypterte meldingene dine hvis du er logget ut av %1$s overalt" + "Er du sikker på at du vil slå av nøkkellagring og slette den?" "Få en ny gjenopprettingsnøkkel hvis du har mistet den eksisterende. Etter at du har endret gjenopprettingsnøkkelen, vil den gamle ikke lenger fungere." "Generer en ny gjenopprettingsnøkkel" "Ikke del dette med noen!" diff --git a/features/verifysession/impl/src/main/res/values-cs/translations.xml b/features/verifysession/impl/src/main/res/values-cs/translations.xml index 9b59cb2041..bdf73c53f1 100644 --- a/features/verifysession/impl/src/main/res/values-cs/translations.xml +++ b/features/verifysession/impl/src/main/res/values-cs/translations.xml @@ -41,7 +41,7 @@ "Otevřete aplikaci na jiném ověřeném zařízení" "Pro větší bezpečnost ověřte tohoto uživatele porovnáním sady emotikonů na svých zařízeních. Proveďte to pomocí důvěryhodného způsobu komunikace." "Ověřte tohoto uživatele?" - "Pro větší bezpečnost chce jiný uživatel ověřit vaši totožnost. Zobrazí se vám sada emotikonů k porovnání." + "Pro větší bezpečnost chce jiný uživatel ověřit vaši identitu. Zobrazí se vám sada emotikonů k porovnání." "Na druhém zařízení byste měli vidět vyskakovací okno. Začněte s ověrením tam." "Spusťte ověření na druhém zařízení" "Čekání na druhé zařízení" diff --git a/features/verifysession/impl/src/main/res/values-eu/translations.xml b/features/verifysession/impl/src/main/res/values-eu/translations.xml index 999e7ca75d..2497e73069 100644 --- a/features/verifysession/impl/src/main/res/values-eu/translations.xml +++ b/features/verifysession/impl/src/main/res/values-eu/translations.xml @@ -21,11 +21,26 @@ "Saiatu berriro egiaztatzen" "Prest nago" "Bat etorriko zain…" + "Alderatu emojiak eta egiaztatu ordena berean ageri direla." "Saioa hasita" "Egiaztapenak huts egin du" + "Egiaztapen hau zeuk hasi baduzu bakarrik jarraitu." + "Egiaztatu beste gailua zure mezuen historia seguru mantentzeko." + "Orain mezuak modu seguruan irakurri edo bidal ditzakezu beste gailuan." "Gailua egiaztatu da" + "Egiaztapena eskatu da" "Ez datoz bat" "Bat datoz" + "Ziurtatu aplikazioa irekita duzula beste gailuan hemendik egiaztatzea hasi aurretik." + "Ireki aplikazioa egiaztatutako beste gailu batean" + "Segurtasun handiagorako, egiaztatu erabiltzailea emoji multzo bat alderatuz. Egin hau komunikatzeko modu fidagarri bat erabiliz." + "Erabiltzailea egiaztatu?" + "Segurtasun handiagorako, beste erabiltzaile batek zure identitatea egiaztatu nahi du. Emoji sorta bat erakutsiko zaizu konparatzeko." + "Beste gailuan laster-menu bat ikusi beharko zenuke. Hasi egiaztapena hortik orain." + "Hasi egiaztapena beste gailuan" + "Beste gailuaren zain" + "Beste erabiltzailearen zain" + "Onartutakoan egiaztapenarekin jarraitu ahal izango duzu." "Jarraitzeko, onartu zure beste saioan egiaztapen-prozesua hasteko eskaera." "Eskaera onartzeko zain" "Saioa amaitzen…" diff --git a/libraries/dateformatter/impl/src/main/res/values-el/translations.xml b/libraries/dateformatter/impl/src/main/res/values-el/translations.xml index 3b337d1e29..63df4a0070 100644 --- a/libraries/dateformatter/impl/src/main/res/values-el/translations.xml +++ b/libraries/dateformatter/impl/src/main/res/values-el/translations.xml @@ -1,4 +1,5 @@ + "%1$s στις %2$s" "Αυτό το μήνα" diff --git a/libraries/eventformatter/impl/src/main/res/values-eu/translations.xml b/libraries/eventformatter/impl/src/main/res/values-eu/translations.xml index ecd1489c3d..20c4c8e160 100644 --- a/libraries/eventformatter/impl/src/main/res/values-eu/translations.xml +++ b/libraries/eventformatter/impl/src/main/res/values-eu/translations.xml @@ -49,6 +49,8 @@ "Finkatutako mezuak aldatu dituzu" "%1$s(e)k mezu bat finkatu du" "Mezu bat finkatu duzu" + "%1$s(e)k mezu bat finkatzeari utzi dio" + "Mezu bat finkatzeari utzi diozu" "%1$s(e)k gonbidapena baztertu du" "Gonbidapena baztertu duzu" "%1$s(e)k %2$s kendu du" diff --git a/libraries/matrixui/src/main/res/values-eu/translations.xml b/libraries/matrixui/src/main/res/values-eu/translations.xml index 15f4977395..3bea664f97 100644 --- a/libraries/matrixui/src/main/res/values-eu/translations.xml +++ b/libraries/matrixui/src/main/res/values-eu/translations.xml @@ -1,4 +1,6 @@ + "Bidali gonbidapena" + "Gonbidapena bidali?" "%1$s(e)k (%2$s) gonbidatu zaitu" 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 ad88f0f3b3..c45f487d25 100644 --- a/libraries/push/impl/src/main/res/values-el/translations.xml +++ b/libraries/push/impl/src/main/res/values-el/translations.xml @@ -14,7 +14,7 @@ "%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 4c12681fbe..204b719abf 100644 --- a/libraries/push/impl/src/main/res/values-in/translations.xml +++ b/libraries/push/impl/src/main/res/values-in/translations.xml @@ -12,7 +12,7 @@ "%d pemberitahuan" "Notifikasi" - "Panggilan masuk" + "📹 Panggilan masuk" "** Gagal mengirim — silakan buka ruangan" "Gabung" "Tolak" 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 57b2aa3fe9..4187b4c2f8 100644 --- a/libraries/push/impl/src/main/res/values-nb/translations.xml +++ b/libraries/push/impl/src/main/res/values-nb/translations.xml @@ -57,6 +57,7 @@ "Gjeldende push-leverandør: %1$s." "Nåværende push-leverandør" "Ingen push-leverandører funnet." + "Oppdag push-leverandører" "Kontroller at programmet kan vise varsler." "Det er ikke klikket på varselet." "Kan ikke vise varselet." 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 44eaee1fd3..ca7018aaa7 100644 --- a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml @@ -7,6 +7,7 @@ "Aggiungi una didascalia" "Messaggio cifrato…" "Messaggio…" + "Messaggio non cifrato…" "Crea un collegamento" "Modifica collegamento" "Applica il formato grassetto" diff --git a/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml b/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml index e47afe0fe1..121bc2f4d8 100644 --- a/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml +++ b/libraries/textcomposer/impl/src/main/res/values-pl/translations.xml @@ -5,7 +5,9 @@ "Zamknij opcje formatowania" "Przełącz blok kodu" "Dodaj opis" + "Wiadomość szyfrowana…" "Wiadomość…" + "Niezaszyfrowana wiadomość…" "Utwórz link" "Edytuj link" "Zastosuj pogrubienie" 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 e62257aa3e..018921416f 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 @@ + "Profilový obrázek" "Smazat" "zadána %1$d číslice" @@ -7,11 +8,13 @@ "zadáno %1$d číslic" "Skrýt heslo" + "Připojit se k hovoru" "Přejít dolů" "Pouze zmínky" "Ztišeno" "Strana %1$d" "Pozastavit" + "Hlasová zpráva, délka: %1$s, aktuální pozice: %2$s" "Pole pro PIN" "Přehrát" "Hlasování" @@ -32,6 +35,7 @@ "Zahájit hovor" "Uživatelské menu" "Zobrazit podrobnosti" + "Hlasová zpráva, délka: %1$s" "Nahrajte hlasovou zprávu." "Zastavit nahrávání" "Přijmout" @@ -61,6 +65,7 @@ "Odstranit hlasování" "Zakázat" "Vyřadit" + "Zavřít" "Hotovo" "Upravit" "Upravit titulek" @@ -205,6 +210,7 @@ Důvod: %1$s." "%1$s (%2$s)" "Žádné výsledky" "Žádný název místnosti" + "Nešifrováno" "Offline" "Licence s otevřeným zdrojovým kódem" "nebo" @@ -280,18 +286,18 @@ Důvod: %1$s." "Ověření se nezdařilo" "Ověřeno" "Ověřit zařízení" - "Ověření totožnosti" + "Ověření identity" "Ověřit uživatele" "Video" "Hlasová zpráva" "Čekání…" "Čekání na dešifrovací klíč" "Vy" - "Zdá se, že se identita %1$s změnila. %2$s" - "Zdá se, že identita %1$s %2$s se změnila. %3$s" + "Identita uživatele %1$s se změnila. %2$s" + "Identita uživatele %1$s %2$s se změnila. %3$s" "(%1$s)" - "Ověřená identita %1$s se změnila." - "Ověřená identita uživatele %1$s %2$s se změnila. %3$s" + "Identita uživatele %1$s se změnila." + "Identita uživatele %1$s %2$s se změnila. %3$s" "Zrušit ověření" "Odkaz %1$s vás přesměruje na jinou stránku %2$s @@ -375,5 +381,5 @@ Opravdu chcete pokračovat?" "Pro přístup k historickým zprávám musíte toto zařízení ověřit" "Nemáte přístup k této zprávě" "Nelze dešifrovat zprávu" - "Tato zpráva byla zablokována buď proto, že jste neověřili své zařízení, nebo proto, že odesílatel potřebuje ověřit vaši totožnost." + "Tato zpráva byla zablokována buď proto, že jste neověřili své zařízení, nebo proto, že odesílatel potřebuje ověřit vaši identitu." 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 cc9e660018..c60ed87896 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -1,16 +1,19 @@ + "Avatar" "Löschen" "%1$d eingegebene Ziffer" "%1$d eingegebene Ziffern" "Passwort verbergen" + "Anruf beitreten" "Nach unten springen" "Nur Erwähnungen" "Stummgeschaltet" "Seite %1$d" "Pausieren" + "Sprachnachricht, Dauer:%1$s, aktuelle Position: %2$s" "PIN-Feld" "Abspielen" "Umfrage" @@ -30,6 +33,7 @@ "Anruf starten" "Benutzermenü" "Details anzeigen" + "Sprachnachricht, Dauer: %1$s" "Sprachnachricht aufnehmen." "Aufnahme beenden" "Akzeptieren" @@ -59,6 +63,7 @@ "Umfrage löschen" "Deaktivieren" "Verwerfen" + "Schließen" "Erledigt" "Bearbeiten" "Bildunterschrift bearbeiten" @@ -202,6 +207,7 @@ Grund: %1$s." "%1$s(%2$s)" "Keine Ergebnisse" "Kein Raumname" + "Nicht verschlüsselt" "Offline" "Open-Source-Lizenzen" "oder" @@ -283,11 +289,11 @@ Grund: %1$s." "Warten…" "Warte auf diese Nachricht" "Sie" - "%1$s\'s Identität has sich offenbar geändert. %2$s" - "%1$s\'s %2$s Identität hat sich offenbar geändert. %3$s" + "%1$s\'s Identität has sich geändert. %2$s" + "%1$s\'s %2$s Identität hat sich geändert. %3$s" "(%1$s)" - "Die verifizierte Identität von %1$s hat sich geändert." - "Die verifizierte Identität von %1$s\'s %2$s hat sich geändert. %3$s" + "Die Identität von %1$s hat sich geändert." + "Die Identität von %1$s\'s %2$s hat sich geändert. %3$s" "Verifizierung zurückziehen" "Der Link%1$s führt Sie zu einer anderen Seite%2$s. @@ -339,7 +345,7 @@ Möchten Sie wirklich fortfahren?" "Kannst du das nicht bestätigen? Gehe zu deinem Konto, um deine Identität zurückzusetzen." "Verifizierung zurückziehen und senden" "Du kannst deine Verifizierung zurückziehen und diese Nachricht trotzdem senden, oder du kannst sie vorerst abbrechen und es später noch einmal versuchen, nachdem du %1$s erneut verifiziert hast." - "Deine Nachricht wurde nicht gesendet, da sich die verifizierte Identität von %1$s geändert hat" + "Ihre Nachricht wurde nicht gesendet, da die verifizierte Identität von %1$s zurückgesetzt wurde" "Nachricht trotzdem senden" "%1$s verwendet wenigstens ein nicht verifiziertes Gerät. Du kannst die Nachricht trotzdem verschicken, oder vorerst abbrechen und später erneut versuchen, nachdem %2$s alle Geräte verifiziert hat." "Deine Nachricht wurde nicht gesendet, weil %1$s nicht alle Geräte verifiziert hat" 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 1b792ea712..baff4d30c2 100644 --- a/libraries/ui-strings/src/main/res/values-el/translations.xml +++ b/libraries/ui-strings/src/main/res/values-el/translations.xml @@ -127,6 +127,7 @@ "Προβολή στο χρονοδιάγραμμα" "Προβολή πηγής" "Ναι" + "Ναι, δοκιμή ξανά" "Ο διακομιστής σου υποστηρίζει τώρα ένα νέο, ταχύτερο πρωτόκολλο. Αποσυνδέσου και συνδέσου ξανά για αναβάθμιση τώρα. Κάνοντας αυτό τώρα θα σε βοηθήσει να αποφύγεις μια αναγκαστική αποσύνδεση όταν το παλιό πρωτόκολλο καταργηθεί αργότερα." "Διαθέσιμη αναβάθμιση" "Σχετικά" @@ -252,7 +253,7 @@ "Δεν είναι δυνατή η αποκρυπτογράφηση" "Στάλθηκε από μια μη ασφαλής συσκευή" "Δεν έχεις πρόσβαση σε αυτό το μήνυμα" - "Η επαληθευμένη ταυτότητα του αποστολέα έχει αλλάξει" + "Η επαληθευμένη ταυτότητα του αποστολέα έχει επαναφερθεί" "Δεν ήταν δυνατή η αποστολή προσκλήσεων σε έναν ή περισσότερους χρήστες." "Δεν είναι δυνατή η αποστολή προσκλήσεων" "Ξεκλείδωμα" @@ -271,8 +272,8 @@ "Αναμονή…" "Αναμονή για αυτό το μήνυμα" "Εσύ" - "Η ταυτότητα του χρήστη %1$s φαίνεται να έχει αλλάξει. %2$s" - "Η ταυτότητα του %1$s %2$s φαίνεται να έχει αλλάξει. %3$s" + "Η ταυτότητα του χρήστη %1$s επαναφέρθηκε. %2$s" + "Η ταυτότητα του %1$s %2$s επαναφέρθηκε. %3$s" "(%1$s)" "Επιβεβαίωση" "Σφάλμα" @@ -319,7 +320,7 @@ "Δεν μπορείς να επιβεβαιώσεις; Πήγαινε στον λογαριασμό σου για να επαναφέρεις την ταυτότητά σου." "Ανάκληση επαλήθευσης και αποστολή" "Μπορείτε να ανακαλέσεις την επαλήθευσή σου και να στείλεις αυτό το μήνυμα όπως και να \'χει ή μπορείς να το ακυρώσεις προς το παρόν και να προσπαθήσεις ξανά αργότερα μετά την επαλήθευση του χρήστη %1$s." - "Το μήνυμά σου δεν στάλθηκε επειδή η επαληθευμένη ταυτότητα του χρήστη %1$s έχει αλλάξει" + "Το μήνυμά σου δεν στάλθηκε επειδή η επαληθευμένη ταυτότητα του χρήστη %1$s έχει επαναφερθεί" "Αποστολή μηνύματος ούτως ή άλλως" "Ο χρήστης %1$s χρησιμοποιεί τουλάχιστον μία μη επαληθευμένη συσκευή. Μπορείς να στείλεις το μήνυμα όπως και να \'χει ή μπορείς να το ακυρώσεις προς το παρόν και να δοκιμάσεις ξανά αργότερα αφού ο χρήστης %2$s επαληθεύσει όλες τις συσκευές του." "Το μήνυμά σου δεν στάλθηκε επειδή ο χρήστης %1$s δεν έχει επαληθεύσει όλες τις συσκευές" @@ -339,7 +340,7 @@ "Άνοιγμα στο Google Maps" "Άνοιγμα στο OpenStreetMap" "Κοινή χρήση αυτής της τοποθεσίας" - "Το μήνυμα δεν στάλθηκε επειδή η επαληθευμένη ταυτότητα του χρήστη %1$s έχει αλλάξει." + "Το μήνυμα δεν στάλθηκε γιατί έγινε επαναφορά της επαληθευμένης ταυτότητας του χρήστη %1$s." "Το μήνυμα δεν στάλθηκε επειδή ο χρήστης %1$s δεν έχει επαληθεύσει όλες τις συσκευές." "Το μήνυμα δεν στάλθηκε επειδή δεν έχεις επαληθεύσει τουλάχιστον μία από τις συσκευές σου." "Τοποθεσία" 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 e91e8a1ec4..4cd712d0ec 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -1,16 +1,19 @@ + "Tunnuspilt" "Kustuta" "%1$d number sisestatud" "%1$d numbrit sisestatud" "Peida salasõna" + "Liitu kõnega" "Mine lõppu" "Ainult mainimised" "Summutatud" "%1$d. lehekülg" "Peata" + "Häälsõnum, kestus:%1$s, praegune asukoht: %2$s" "PIN-koodi väli" "Esita" "Küsitlus" @@ -30,6 +33,7 @@ "Helista" "Kasutajamenüü" "Vaata üksikasju" + "Häälsõnum, kestus:%1$s" "Salvesta häälsõnum." "Lõpeta salvestamine" "Nõustu" @@ -59,6 +63,7 @@ "Kustuta küsitlus" "Lülita välja" "Loobu" + "Lõpeta" "Valmis" "Muuda" "Muuda selgitust" @@ -202,6 +207,7 @@ Põhjus: %1$s." "%1$s (%2$s)" "Otsingul pole tulemusi" "Jututoal puudub nimi" + "Krüptimata" "Võrgust väljas" "Avatud lähtekoodiga litsentsid" "või" @@ -263,7 +269,7 @@ Põhjus: %1$s." "Dekrüptimine ei olnud võimalik" "Saadetud ebaturvalisest seadmest" "Sul pole ligipääsu antud sõnumile" - "Saatja verifitseeritud identiteet on muutunud" + "Saatja verifitseeritud identiteet on lähtestatud" "Kutset polnud võimalik saata ühele või enamale kasutajale." "Kutse(te) saatmine ei õnnestunud" "Eemalda lukustus" @@ -283,11 +289,11 @@ Põhjus: %1$s." "Ootame…" "Ootame selle sõnumi dekrüptimisvõtit" "Sina" - "Kasutaja %1$s võrguidentiteet tundub olema muutunud. %2$s" - "Kasutaja %1$s %2$s võrguidentiteet tundub olema muutunud. %3$s" + "Kasutaja %1$s võrguidentiteet on lähtestatud. %2$s" + "Kasutaja %1$s %2$s võrguidentiteet on lähtestatud. %3$s" "(%1$s)" - "%1$s kasutaja verifitseeritud identiteet on muutunud." - "%1$s kasutaja (%2$s kasutajanimi) verifitseeritud identiteet on muutunud. %3$s" + "%1$s kasutaja verifitseeritud identiteet on lähtestatud." + "%1$s kasutaja (%2$s kasutajanimi) verifitseeritud identiteet on lähtestatud. %3$s" "Võta verifitseerimine tagasi" "%1$s link viib sind teise veebisaiti %2$s @@ -339,7 +345,7 @@ Kas sa oled kindel, et soovid jätkata?" "Sa ei saa seda kinnitada? Ava oma kasutajakonto haldus ja lähtesta oma võrguidentiteet." "Unusta verifitseerimine ja saada ikkagi" "Sa võid jätta verifitseerimisvea tähelepanuta ja sõnumi ikkagi saata või katkestad saatmise ja peale kasutaja %1$s verifitseerimist proovid seda uuesti." - "Sinu sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on muutunud." + "Sinu sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud." "Saada sõnum ikkagi" "%1$s kasutab ühte või enamat verifitseerimata seadet. Sa võid sõnumi ikkagi saata või katkestad selle ning ootad kuni %2$s on kõik oma seadmed verifitseerinud ning proovid seejärel uuesti." "Sinu sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid" @@ -360,7 +366,7 @@ Kas sa oled kindel, et soovid jätkata?" "Ava Google Mapsis" "Ava OpenStreetMapis" "Jaga seda asukohta" - "Sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on muutunud." + "Sõnum on saatmata, kuna kasutaja %1$s verifitseeritud identiteet on lähtestatud." "Sõnum on saatmata, kuna %1$s pole verifitseerinud kõiki oma seadmeid." "Kuna sa pole üks või enamgi oma seadet verifitseerinud, siis sinu sõnum on saatmata." "Asukoht" 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 2cd454d5a7..5311d9bd59 100644 --- a/libraries/ui-strings/src/main/res/values-eu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-eu/translations.xml @@ -178,6 +178,7 @@ Arrazoia: %1$s." "Matrix IDa ezin da topatu eta, beraz, litekeena da gonbidapena ez jasotzea." "Gelatik ateratzen" "Argia" + "Lerroa arbelean kopiatu da" "Esteka arbelean kopiatu da" "Kargatzen…" "Gehiago kargatzen…" @@ -186,12 +187,14 @@ Arrazoia: %1$s." "%1$d kide" "Mezua" + "Mezuen ekintzak" "Mezuen antolaketa" "Mezua kendu da" "Modernoa" "Mututu" "Emaitzarik ez" "Gelak ez du izenik" + "Zifratu gabe" "Deskonektatuta" "Kode irekiko lizentziak" "edo" @@ -315,4 +318,6 @@ Arrazoia: %1$s." "Kokapena" "Bertsioa: %1$s (%2$s)" "eu" + "Iraganeko mezuak ez daude gailu honetan eskuragarri" + "Ezin da mezua deszifratu" 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 d6cb2dc086..fe664422b3 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -1,16 +1,19 @@ + "Avatar" "Supprimer" "%1$d chiffre saisi" "%1$d chiffres saisis" "Masquer le mot de passe" + "Rejoindre l’appel" "Retourner à la fin de la conversation" "Mentions uniquement" "En sourdine" "Page %1$d" "Pause" + "Message vocal, durée: %1$s, position actuelle: %2$s" "Code PIN" "Lecture" "Sondage" @@ -30,6 +33,7 @@ "Démarrer un appel" "Menu utilisateur" "Afficher les détails" + "Message vocal, durée: %1$s" "Enregistrer un message vocal." "Arrêter l’enregistrement" "Accepter" 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 f624fd4856..d811f5499c 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -248,7 +248,7 @@ Alasan: %1$s." "Tidak dapat mendekripsi" "Dikirim dari perangkat yang tidak aman" "Anda tidak memiliki akses ke pesan ini" - "Identitas terverifikasi pengirim telah berubah" + "Identitas terverifikasi pengirim diatur ulang" "Undangan tidak dapat dikirim ke satu atau beberapa pengguna." "Tidak dapat mengirim undangan" "Buka kunci" @@ -267,8 +267,8 @@ Alasan: %1$s." "Menunggu…" "Menunggu pesan ini" "Anda" - "Identitas %1$s tampaknya telah berubah. %2$s" - "Identitas %1$s yang %2$s tampaknya telah berubah. %3$s" + "Identitas %1$s telah diatur ulang. %2$s" + "Identitas %2$s %1$s telah diatur ulang. %3$s" "(%1$s)" "Konfirmasi" "Eror" @@ -314,7 +314,7 @@ Alasan: %1$s." "Tidak dapat mengonfirmasi? Buka akun Anda untuk mengatur ulang identitas Anda." "Tarik verifikasi dan kirim" "Anda dapat menarik verifikasi dan tetap mengirim pesan ini, atau Anda dapat membatalkan untuk saat ini dan mencoba lagi nanti setelah memverifikasi ulang %1$s." - "Pesan Anda tidak terkirim karena identitas terverifikasi %1$s telah berubah" + "Pesan Anda tidak terkirim karena identitas terverifikasi %1$s telah diatur ulang" "Kirim pesan saja" "%1$s menggunakan satu atau beberapa perangkat yang belum diverifikasi. Anda tetap dapat mengirim pesan, atau Anda dapat membatalkan untuk saat ini dan mencoba lagi nanti setelah %2$s telah memverifikasi semua perangkat mereka." "Pesan Anda tidak terkirim karena %1$s belum memverifikasi semua perangkat" @@ -334,7 +334,7 @@ Alasan: %1$s." "Buka di Google Maps" "Buka di OpenStreetMap" "Bagikan lokasi ini" - "Pesan tidak terkirim karena identitas terverifikasi %1$s telah berubah." + "Pesan tidak terkirim karena identitas terverifikasi %1$s telah diatur ulang." "Pesan tidak terkirim karena %1$s belum memverifikasi semua perangkat." "Pesan tidak terkirim karena Anda belum memverifikasi satu atau beberapa perangkat Anda." "Lokasi" 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 933bb0c32d..bf11478b9e 100644 --- a/libraries/ui-strings/src/main/res/values-it/translations.xml +++ b/libraries/ui-strings/src/main/res/values-it/translations.xml @@ -59,6 +59,7 @@ "Elimina sondaggio" "Disabilita" "Annulla" + "Chiudi" "Fine" "Modifica" "Modifica didascalia" @@ -145,7 +146,9 @@ "Copiato negli appunti" "Copyright" "Creazione stanza…" + "Richiesta annullata" "Hai lasciato la stanza" + "Invito rifiutato" "Scuro" "Errore di decrittazione" "Opzioni sviluppatore" @@ -158,6 +161,7 @@ "Modifica in corso" "Modifica didascalia" "* %1$s %2$s" + "File vuoto" "Crittografia" "Crittografia abilitata" "Inserisci il PIN" @@ -182,6 +186,7 @@ Motivo:. %1$s" "Questo ID Matrix non può essere trovato, quindi l\'invito potrebbe non essere ricevuto." "Lascio la stanza" "Chiaro" + "Riga copiata negli appunti" "Collegamento copiato negli appunti" "Caricamento…" "Caricamento in corso…" @@ -198,6 +203,7 @@ Motivo:. %1$s" "%1$s (%2$s)" "Nessun risultato" "Nessun nome della stanza" + "Non cifrata" "Non in linea" "Licenze open source" "o" @@ -259,7 +265,7 @@ Motivo:. %1$s" "Impossibile decrittografare" "Inviato da un dispositivo non sicuro" "Non hai accesso a questo messaggio" - "L\'identità verificata del mittente è cambiata" + "L\'identità verificata del mittente è stata reimpostata" "Non è stato possibile spedire inviti a uno o più utenti." "Impossibile inviare inviti" "Sblocca" @@ -279,12 +285,16 @@ Motivo:. %1$s" "In attesa…" "In attesa del messaggio" "Tu" - "L\'identità di %1$s sembra essere cambiata. %2$s" - "L\'identità di %1$s %2$s sembra essere cambiata. %3$s" + "L\'identità di %1$s è stata reimpostata. %2$s" + "L\'identità %2$s di %1$s sembra essere cambiata. %3$s" "(%1$s)" - "L\'identità verificata di %1$s è cambiata." - "L\'identità %2$s verificata di %1$s è cambiata. %3$s" + "L\'identità di %1$s è stata reimpostata." + "L\'identità %2$s di %1$s è stata reimpostata. %3$s" "Ritira verifica" + "Il link %1$s ti porta ad un altro sito %2$s + +Sei sicuro di voler continuare?" + "Ricontrolla questo link" "Conferma" "Errore" "Operazione riuscita" @@ -331,7 +341,7 @@ Motivo:. %1$s" "Non riesci a confermare? Vai al tuo account per ripristinare la tua identità." "Ritira la verifica e invia" "Puoi ritirare la tua verifica e inviare comunque questo messaggio, oppure annullarlo per ora e riprovare più tardi dopo aver riverificato %1$s." - "Il tuo messaggio non è stato inviato perché l\'identità verificata di %1$s è cambiata." + "Il tuo messaggio non è stato inviato perché l\'identità verificata di %1$s è stata reimpostata." "Invia comunque il messaggio" "%1$s sta usando uno o più dispositivi non verificati. Puoi inviare il messaggio in ogni caso, oppure annullarlo e riprovare più tardi quando %2$s avrà verificato tutti i suoi dispositivi." "Il tuo messaggio non è stato inviato perché %1$s non ha verificato tutti i dispositivi." @@ -352,7 +362,7 @@ Motivo:. %1$s" "Apri in Google Maps" "Apri in OpenStreetMap" "Condividi questa posizione" - "Messaggio non inviato perché l\'identità verificata di %1$s è cambiata." + "Messaggio non inviato perché l\'identità verificata di %1$s è stata reimpostata." "Messaggio non inviato perché %1$s non ha verificato tutti i dispositivi." "Messaggio non inviato perché non hai verificato uno o più dispositivi." "Posizione" 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 7d4e65b5ac..a059b9fe51 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -300,7 +300,9 @@ "🔐️ Bli med meg på %1$s" "Hei, snakk med meg på %1$s: %2$s" "%1$s Android" + "Rageshake for å rapportere feil" "Kunne ikke velge medium, prøv igjen." + "Teksting er kanskje ikke synlig for personer som bruker eldre apper." "Kunne ikke behandle medier for opplasting, vennligst prøv igjen." "Opplasting av medier mislyktes, vennligst prøv igjen." "Fest viktige meldinger slik at de lett kan ses" 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 d4087c537e..eccfbbdb2f 100644 --- a/libraries/ui-strings/src/main/res/values-pl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml @@ -147,7 +147,9 @@ "Skopiowano do schowka" "Prawa autorskie" "Tworzenie pokoju…" + "Anulowano żądanie" "Opuszczono pokój" + "Odrzucono zaproszenie" "Ciemny" "Błąd deszyfrowania" "Opcje programisty" @@ -160,6 +162,7 @@ "Edytowanie" "Edytowanie opisu" "* %1$s %2$s" + "Pusty plik" "Szyfrowanie" "Szyfrowanie włączone" "Wprowadź kod PIN" @@ -184,6 +187,7 @@ Powód: %1$s." "Nie można znaleźć identyfikatora Matrix ID, zaproszenie mogło nie dotrzeć." "Opuszczanie pokoju" "Jasny" + "Wiersz skopiowany do schowka" "Link został skopiowany do schowka" "Ładowanie…" "Ładuję więcej…" @@ -289,6 +293,10 @@ Powód: %1$s." "Zweryfikowana tożsamość %1$s uległa zmianie" "Zweryfikowana tożsamość %1$s %2$s uległa zmianie. %3$s" "Wycofaj weryfikację" + "Link %1$s prowadzi Cię do innej witryny %2$s + +Czy na pewno chcesz kontynuować?" + "Sprawdź dwukrotnie ten link" "Potwierdzenie" "Błąd" "Sukces" 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 cc05a70f5d..d909d993be 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -61,6 +61,7 @@ "Видалити опитування" "Вимкнути" "Відкинути" + "Відхилити" "Готово" "Редагувати" "Редагувати підпис" @@ -162,6 +163,7 @@ "Редагування" "Редагування підпису" "* %1$s %2$s" + "Порожній файл" "Шифрування" "Шифрування ввімкнено" "Введіть свій PIN-код" @@ -186,6 +188,7 @@ "Цей Matrix-ID не знайдено, тому запрошення може не бути отримано." "Вихід з кімнати" "Світла" + "Рядок скопійовано до буфера обміну" "Посилання скопійовано в буфер обміну" "Завантаження" "Завантаження наступних…" @@ -203,6 +206,7 @@ "%1$s (%2$s)" "Немає результатів" "Немає назви кімнати" + "Не зашифровано" "Не в мережі" "Ліцензії відкритого коду" "або" @@ -265,7 +269,7 @@ "Неможливо розшифрувати" "Надіслано з незахищеного пристрою" "Ви не маєте доступу до цього повідомлення" - "Підтверджена особа відправника змінилася" + "Ідентичність відправника скинуто" "Не вдалося надіслати запрошення одному чи кільком користувачам." "Не вдалося надіслати запрошення" "Розблокувати" @@ -285,11 +289,11 @@ "Очікування…" "Чекаємо на це повідомлення" "Ви" - "Ідентичність %1$s, схоже, змінилася. %2$s" - "Ідентичність %1$s %2$s схоже, змінилася. %3$s" + "Ідентичність %1$s скинуто. %2$s" + "Ідентичність %1$s %2$s скинуто. %3$s" "(%1$s)" - "Верифікована ідентичність %1$s змінилася." - "Верифіковано особистість %1$s %2$s змінилася. %3$s" + "Ідентичність %1$s скинуто." + "Ідентичність %1$s %2$s скинуто. %3$s" "Відкликати верифікацію" "Посилання %1$s спрямовує вас на інший сайт %2$s @@ -342,7 +346,7 @@ "Не можете підтвердити? Перейдіть до свого облікового запису, щоб скинути облікові дані." "Відкликати верифікацію та відправити" "Ви все одно можете відкликати підтвердження та надіслати це повідомлення, або ви можете скасувати підписку на даний момент і спробувати пізніше після повторної перевірки %1$s." - "Ваше повідомлення не було надіслано, оскільки підтверджена особистість %1$s змінилася" + "Ваше повідомлення не надіслано, оскільки підтверджену особистість %1$s скинуто" "Надіслати повідомлення в будь-якому випадку" "%1$s використовує один або кілька неперевірених пристроїв. Ви можете відправити повідомлення в будь-якому випадку, або ж скасувати відправку і спробувати пізніше, коли %2$s перевірить всі пристрої." "Ваше повідомлення не було надіслано, тому що %1$s не перевірив усі пристрої" @@ -363,7 +367,7 @@ "Відкрити в Картах Google" "Відкрити в OpenStreetMap" "Поділитися цим місцем перебування" - "Повідомлення не надіслано, оскільки підтверджена особистість %1$s змінилася." + "Повідомлення не надіслано, оскільки підтверджену особистість %1$s скинуто." "Повідомлення не надіслано, оскільки %1$s перевірив не всі пристрої." "Повідомлення не надіслано, оскільки ви не підтвердили один або кілька своїх пристроїв." "Розташування" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 8e387ead44..d857db0555 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -1,16 +1,19 @@ + "Avatar" "Delete" "%1$d digit entered" "%1$d digits entered" "Hide password" + "Join call" "Jump to bottom" "Mentions only" "Muted" "Page %1$d" "Pause" + "Voice message, duration: %1$s, current position: %2$s" "PIN field" "Play" "Poll" @@ -30,6 +33,7 @@ "Start a call" "User menu" "View details" + "Voice message, duration: %1$s" "Record voice message." "Stop recording" "Accept" diff --git a/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png new file mode 100644 index 0000000000..1b639af6f1 --- /dev/null +++ b/screenshots/de/features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f94d7539ded3cd2494371dd8e7df89036946157c31c7cdbf5d646ea901942733 +size 20796 diff --git a/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png new file mode 100644 index 0000000000..8bcae86780 --- /dev/null +++ b/screenshots/de/features.analytics.impl_AnalyticsOptInView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5a6d3e1fafa9aad0e21c4875eeb12daa69a141fcfee07c4650b1702adbaec0a +size 83723 diff --git a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png index 39555bdd05..f006ac08d3 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb6855006f988e1a37a61067c1cb3525ec3e9b9b387cafd3d0253dd779923adc -size 25949 +oid sha256:a2a9e4c1bf333604bb0a1b17c83af340e7d17a4dd3c465e8a49394dd236c3b45 +size 25844 diff --git a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png index 50087485c8..8a2a525f26 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb7c032b25761eab114463409a119ee61c4697b4ae69ef1c34b323f73fab083c -size 31136 +oid sha256:59eb255368d39bf029237c84977c84a616994193b5c1d1ed43db403bb63e289b +size 29959 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 1571627d84..129987cf6d 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:a56642579318271960d92b28d7037c123b70b1983d59351c6bd026a7c136188e -size 55001 +oid sha256:24abc4b97bde6956806e35a9afd12780371bb0071b1c23598e5f0a6abbb218ac +size 54991 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 cf5d80de9a..e8693e5f62 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:8267d92b66f9e4aec78d904cd618d55143ecf931fbf6cc540f1776551280b099 -size 65857 +oid sha256:bb13812558aa295627e05908477108c8c1bc9cdb0fae5288ca668488cd49d536 +size 65667 diff --git a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png index e25284622c..ab80c73355 100644 --- a/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:931ff76e4b1cea3e7a739bd2bdf0acd4ea3d30aa3b8e7a61118060daf879fad6 -size 68815 +oid sha256:927c67c23735b8eaae8873aaf8e62e0678f9a5418fbfcabf8ee436ee5785a647 +size 67317 diff --git a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png index affefe4253..97457f6c23 100644 --- a/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png +++ b/screenshots/de/features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a840bdc2209053422999babc51bbe56eb32bb6484601f426489f2939eadccaba -size 66992 +oid sha256:0cefe61188c6cad40a9f9ae28c28e5f7f82cbf40467d8f84fa03e8c96df3a02a +size 67095 diff --git a/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png b/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png new file mode 100644 index 0000000000..ac0cb24cc0 --- /dev/null +++ b/screenshots/de/features.messages.impl.link_LinkView_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd7ba46af8c9846828dcd4711915044038201591853c714ed707266e51f19a92 +size 33770 diff --git a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png index f8dcf51960..3afb335f1b 100644 --- a/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png +++ b/screenshots/de/features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a35ec296f86fc93f9e7c7a6c02775435fa07bdc7637641e95bb514ee16559309 -size 42785 +oid sha256:f08c84f2f4e4334e1e3062f3971e2e9ef0211a9af6c76de7ec90f34a470d0119 +size 42777 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png index 903928e368..7b5265b4b1 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bde168175cbe02263bc47ce77072a9a254c152127f05a4e0e51873da861372f1 -size 34072 +oid sha256:b63e95b0309690eb2907f5390d068dba3199e9f91de0693f2b2a1e1c387344e3 +size 34026 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png index 3504696996..c17fee2d09 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6a4905be0d15aa62408a7dd7f45ed15b1692be48db380b8df37b7f2853937b3 -size 35448 +oid sha256:82665bcfa8bac9fd29058bb093fe4cbfbd119a8b446f3104a78cbfca6df422d3 +size 35413 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png index 357feead03..757be6e7b1 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:882a66be42030bb5d9f2375ff7510f6e12efcb151a5b0b420a2a67b65ec69fa5 -size 11215 +oid sha256:e4c20415dd48053f55274361837c3b181d70c050c4a5b5fc3300fdcbe4114e65 +size 11201 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png index cc454d6d09..c1f2f42f5f 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d1ff60c4459b00fb1066d3ecfec6e3f01cbe4e0614969cb09ceeda0659ef51b -size 38018 +oid sha256:a45e8eb20c82ba49ff1c0a1343cc62f03e9b3185a9a9fa9baf01e42b20b729bf +size 37991 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png index fc1c6596d6..5ccb5b1d48 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f568ccc087c0df15189f28860ed589b2ec1e20e3c3f8992af87dbd586a60a672 -size 79346 +oid sha256:5b62274b645a661271cdd83dae6c55947d76f19aee580d701a096b46d625089e +size 79353 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png index 7496926c6e..a80ddaa421 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:267aa60c445389e85128ffb56f4e88002adc11ee3d998571239abed4c15a81a1 -size 151338 +oid sha256:b2a9305f6faaf67eaac59f762e21c77070fbb572561df1cf92ec8d6bca0d0dce +size 151343 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png index 2e7672d3d4..94127b5426 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:839f90abd145051b9f96eb8d01e006a40a52f2df86d240b349e306d54e437595 -size 157214 +oid sha256:8032ef23e046995a32eb8ac61a735fc0960da6b4904464c3dee027c3bd1b4f9b +size 157194 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png index 1b6a5bd47f..8c2d51c040 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9b4578b4e8455cd1674906ca99a91b5ecb16e1273e4a9bd2f94efc706623cbc0 -size 150548 +oid sha256:0e7beb51d718e2a5e0532fbe8d6e2118f50e742194366da48df3dba6d6545d72 +size 150535 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png index 0af6cbcc34..5c9e4cd489 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71fdacdd0336fc10c1b15bb591a81440252fcc74794ad251b39d9b3f392f6e67 -size 152709 +oid sha256:d40a925f1672f1c1c6287b9b9b16c34564a5c40d56a28135fa84e1fec748e39b +size 152711 diff --git a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png index afcf3fed5d..55e117e656 100644 --- a/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png +++ b/screenshots/de/features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5c83f84e0b4f4f4ad9134e0cb0f724c1537a1c10f6233c3a7a39f7e28fa4b55 -size 54517 +oid sha256:0db1de722615d9320694873a12af1bfa6347ffba937587c11248fde4e4845fbf +size 54499 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png b/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png index 6328c9eea4..a058128637 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineViewMessageShield_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8753f05cf2d0e44a29df0788e4c8e7074b1d622c060176b403738e0af6cd6d72 -size 37576 +oid sha256:696794f694b55ba1e21d0031b22d10537be836188d8eaa6ea1dfbad4be0ca616 +size 37566 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png index ad5be81f19..812a37e1a9 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:776fcb3c193baa33c8da6d204e0de2258d974a42071a2524d673d21425525f12 -size 50439 +oid sha256:9a6d76006cefee9da331704ebdd847efdd0f833569db0177a61d2115a43858ce +size 50431 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png index 1de2b75ef7..fc9527c1a6 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a30639b3fab635f8ae26afd7f59453eba8a88b39ddcfbb462fdd4ee69de86728 -size 51916 +oid sha256:a51aa3750c9174ced3bf8d50784fb64a1cc568ad81f271881adea87a753952ed +size 51907 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png index 7b9b856d61..03defa6d0f 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d26fc4ca3568a7c36c5cb35a60b1a5d0e7ad98c44060ae70c1adf3504815ce4 -size 63475 +oid sha256:a3b4a5e7816b5ea30e6d11142aec791b3099770302a082cf93462c33c57e8d25 +size 63467 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png index 44dec4d07b..880fdca99b 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45878b12e1d3ae1051082c443175e3fac64f560e941527fba008a4e7d269cd74 -size 48328 +oid sha256:60ddfc47e4f1065935045277669facc066160d86f2b74ef4b909bacbb3d08ae1 +size 48321 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png index 790f101cc7..178d082f00 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89babdeea68e6d0299a0d60b3a469ecd79a8325326d320e1fb41033f08632d8e -size 72085 +oid sha256:34d53f3e263791f2c432aefcd566d27fffb4034268f35e92333c932947c7f698 +size 72075 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png index 42182d9326..579bcf9954 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2b39abad7f689af11669f8076587ebdd097bf394b8b577c2ed9aca0104653fa -size 58065 +oid sha256:404480e7e7e5cddd60d1c097d8892520b51f70030c393b3a16bff3286f16fcf1 +size 58061 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png index 56dc4117a4..007d075c36 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_17_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7de1093816b10cc68eac1888bfcdba714183a0aae8d5bbab346e74f6b1cecdf2 -size 64376 +oid sha256:24e32b2c8207e0aaf37d21d82cf0c920e20a56e6a4ba01ade77115b6574cbc64 +size 64357 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png index faf47c830a..5c46087fe4 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa629bd30f052f74fc4ea848901c9d0e825f28e53c68bb91367c0325d412344f -size 71833 +oid sha256:f9c0079dbf4dffcf7ee49d66da6403d35e78768a375e04975c5a9a07bd637d4a +size 71828 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png index c447f5e31b..547f4aa714 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03befdea443eb71f166974cd3c6cc10216e887b9e30e8d5b5219a10911ede004 -size 70545 +oid sha256:58196ecddea174d5e941fac0766f40f04e64e7bb2cd82c1540537fb2e9f04bbe +size 70528 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png index e8a887a4f0..7ea447b8fb 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20b21ee5b51d910f15f7db4a928f4ca84db228916b40d232a6b645b6b561b560 -size 73607 +oid sha256:eb5472ae58f7f4eb4e278d2c93c4eeaad0df2721ec7811027f76bb3f602edbc3 +size 73590 diff --git a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png index 2b89daf0d1..e728d86f6f 100644 --- a/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png +++ b/screenshots/de/features.messages.impl.timeline_TimelineView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:584aa114463a3c55bece015e959c519fdf779709ab72dc275cd85d7b62472501 -size 53428 +oid sha256:f74a7a73434450cf5d984a476433140a4857b8ee958498db528a2e32f3b23f56 +size 53423 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png index 97d7007038..6f776b670b 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:641cff9b10ab1ca8a084ad0b0382dd3b450a603ac7072c016d37c8d824114ad6 -size 57840 +oid sha256:ada5d53903f469cb0b0b981546826b6664ce3f983e5dcab74b7d99bc8d568cbc +size 57832 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png index d1ae1005cc..36b43e7db7 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03214da03b4aa5476f7e05a2d8dadd582abf3d5ee3bbf75a3eb97d427c5ff7e7 -size 57868 +oid sha256:092117db4970bb43f37aa04ae4ea3e91129bae8ab3ed05fd594fc3fb964bb317 +size 57860 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png index 450889e5fe..f2e38e02d8 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_11_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac69e0b114b9459700c35d9473b2bf7ce6f6cc53f4c3c07cab75a54ee5bdd72a -size 61187 +oid sha256:47eb746b2ab54a1228e213d4f6920105cb863afa3bc98be46ba7d5f1a186d8a7 +size 61180 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png index 89f61dc3ff..f4cbcfc1a5 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b226411cc571b61e289d6570c3e939c512c9a6626caaedc0ce5372c40dbe58d -size 60626 +oid sha256:73033c71b99d30498239bb98c959f27cc37d7217e4bf1c0fcf3f56665cfc8357 +size 60151 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png index 78ad979650..3f21c36631 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f43aa779948dcaac20a5f7801418f95697ad0d2a113bfb41a07e03d479e01b1c -size 60514 +oid sha256:2029d42a8c696f597438c9dfa38639eadd1f10a00ee404ccb07bd17c9f480f4e +size 60078 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png index 36b7a6b0f5..1f6447f380 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:670d8a563187d4f5a0229873c14dc18ed788519eca4c13072e201a165d4ebe12 -size 57033 +oid sha256:ffce521170b76b53868a9b9a2b51216dce35bebe616acc097b2593977974184b +size 57024 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png index fbf673311f..b822f7d106 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:79f7255d2b2022a4bcc1b71dbf0ee0973918a3970247b9806c8973ce45043cc4 -size 60414 +oid sha256:164f3bacc2ca1c35a93fe5ec1f8fb6356c5fca7507422ee6400f28cfb6556743 +size 60419 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png index 01091aed83..f0fc9507fe 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e616713ebba2e6b6baa3b9c050205c8a7f8165d4ccf85bf4ddb4873d2d9cdab5 -size 55788 +oid sha256:723700294f08916e6f448898ea4c7d633a59c9b2d007f6ba8281c73be39128a7 +size 55769 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 1ef37f5295..1c6f613b11 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:314db3286f8098503818cc45eeebc0c89987748f0f575cfaea465b430bb87c72 -size 55652 +oid sha256:1ed6c7840ad790fc808a6c51bebbfd5ebf0cc1735fa0dea5ce692d99ca0178a5 +size 55646 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 54b7d86aac..ff5440ae92 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:a12f1f767b92975cefe0c1382980794c301517d151892d78be0f6dced876a605 -size 54191 +oid sha256:fa561a80f58818de91d0daa8fdb5b5324b1b94de7f2dc61d4568b51825142d93 +size 54183 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png index 6f1bf5f715..112279203a 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bbffd005a99dac5e62b094d2994c2aabb883b8e5a231e64656caedad6b0c14a6 -size 59693 +oid sha256:a87cc7029191fb410f72868115f27ec4863e53b23f4ff29536a77a77608c19be +size 59689 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png index 538e936a19..a25c8f3724 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb1ee601ccdad413b35bd2fffe4fdef8a341b6ee19253f5a038c94f71dabc6cb -size 60311 +oid sha256:f6a19f900b395bc2f9f4b7eb1ebca10d4ed9d685fec3cb211f102345c345be1c +size 60303 diff --git a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png index edea260cae..b032acd935 100644 --- a/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png +++ b/screenshots/de/features.messages.impl_MessagesView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:097c4ccc5256b3c479d6df8dc3b4bb033e87b7b23293a0c5043d94f16d63bc6f -size 47871 +oid sha256:62b2496a0b101ad4d9aa48b5bde9f70c2d18fbea3eef7b743a27383a42c9b32f +size 47866 diff --git a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_0_de.png b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_0_de.png index 735b7b6834..88ce7f8165 100644 --- a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_0_de.png +++ b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:832fe4b9ed7b53c161374cc72438c49f254569b33d64ded5f661152976b0d883 -size 315128 +oid sha256:e71425e752a8ecd40579d23be5bb300ef1745e0d28436bfa6553af74590b1154 +size 318115 diff --git a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_1_de.png b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_1_de.png index 43fe6a5e8e..4478d30a0a 100644 --- a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_1_de.png +++ b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eae17fb9f4bc1dd4b1321e26901c2acf4e0ab4d43c006ffeab987705d180fb8 -size 310729 +oid sha256:3e35411d5bdd3070aa61621989dcd75bc4625103c83488a64dacaa32f56e5351 +size 319571 diff --git a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_2_de.png b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_2_de.png index b77eaee61d..706aac2785 100644 --- a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_2_de.png +++ b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d9dff767d267c198d1cdcdc79c313b7fd04d1d90436dd754fc0e07b69a2dddc5 -size 313727 +oid sha256:369c3358762a39c41ed62144ab2b5e15077c0cc35d860d409d3dc07ec91014be +size 316905 diff --git a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_3_de.png b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_3_de.png index 4261a03f76..b82143a424 100644 --- a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_3_de.png +++ b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb661c897842a0eedb95e2460205eafe34038eca930a6096a6efdd3125cdbca6 -size 307939 +oid sha256:f1d640e2499bb791232c179a913cd07cc629254d975e02f5679811e929fbfd20 +size 311421 diff --git a/screenshots/de/features.onboarding.impl_OnBoardingView_Day_4_de.png b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_4_de.png new file mode 100644 index 0000000000..4261a03f76 --- /dev/null +++ b/screenshots/de/features.onboarding.impl_OnBoardingView_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb661c897842a0eedb95e2460205eafe34038eca930a6096a6efdd3125cdbca6 +size 307939 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png index 1d3cfbf6d0..5e205681ad 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63fed56c9fc1d4553d39d7139b4bf22a5f68c0937bf38fef91b100ef36c6d47f -size 45891 +oid sha256:064fc91cbf9c394ecc415a0c407b198266c18eeed58e2211e77a99b2566c6b4c +size 45992 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png index 4c1688a458..b1b5c44bbe 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddc40eb87892667798159d8527dc92e63f4f50fc09da65f5b6cd94ed771f511e -size 44774 +oid sha256:1f287d2d55e3ed88bcfd7029e04850b9afb608bff4cdb307a2107ef3492263ea +size 44873 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png index 71823e69ae..b3f166f0f9 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f22d0630fba2b489cd76c2599617898b9b02599a14568c7d85e1dcf396c2233 -size 47034 +oid sha256:f9095463651ea679d8bf78366da02023071a802d551874c56b333cdd9870eb1d +size 47131 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png index 69d5e38955..3ca9500e98 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57dd92d89f9d9501dae6a2d86ea09aca8c90778d089ef12b1f5f8167e2e99fed -size 45123 +oid sha256:e0a2bae68fcaea24090d504a42bae48d4b540e0e7d8cc41b184645c432ff7f77 +size 45223 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png index 8774259edc..e065b4bf53 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a26db933f780f800524a73ceb44bde810144fade08b422f7f01d086ba52a78f4 -size 45632 +oid sha256:791a579b913e406287a37962145cf54c02d68dfc14c8d4a7ae864017de3e5629 +size 45737 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_15_de.png index 064c2df5e7..fec0f1ac74 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:96de74399c8eaa9ea09d1864a2b5984dd082004696300ad1ff59aa0a47bb85fa -size 46213 +oid sha256:c19498feaf3cf309a105b611531c13d596da8c0d33623c393b2a5dbf95c12c87 +size 46314 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png index d2627d7694..77e4be20af 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24e9b81b9bcd5f879d0bc47244a7b9938912d223e15f050dc503e871a4a192fe -size 45451 +oid sha256:157f747b71d355493b7255b22e88742be69df779b6d9a1df6acf01069adab820 +size 45553 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_1_de.png index 5225709c8e..9a88fe6e2a 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:68c3b3ce803a898c5121dc1c1eb19741dbb42d6dcfc4bed65aedf7ef91800124 -size 36350 +oid sha256:4f7f3f083b27f726c4ddf17a6ecffe21d8865c122d55e2879b8b1145438fe7b2 +size 36463 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png index b86aaac933..1e903b4df9 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5c3457ac233e54c18ebdf8baf0d331003be80fd342a6f91bd0257bb89f79a84 -size 38958 +oid sha256:ea2473f89bca4a8e4909b2cd3ded7919a68bce80a3f85373bd40581b6b532464 +size 39067 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png index 13dde4af94..55745b3f8d 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5edc6988867158bf6617bbf5988b0cc942b5d70eba1b4c70ef96b54712064117 -size 45369 +oid sha256:1f1c37582bb9b3f680b302f9dea4f27213b562bdac7210d7d51247abe5b931ba +size 45558 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png index 2b8fbd332a..3a762f83af 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c555ed0912499e49c304e04e907beeedd3772b70795e875416a8208a441403bf -size 44348 +oid sha256:0eeddb05018851f7a7bc0b61bbf83edb11f53dfc16c45df5698cffbf02e4ee7d +size 44441 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png index 4b6ec61cb4..6fa141d6c4 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c00dfa334b1cae6046910f4e372a57f04e1e093e21568b513bb004740dd95b9 -size 45082 +oid sha256:56875192f27f48df3d694effa375e7f703cc5ad820f2dd52b4c0cedea16771d5 +size 45201 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png index 0e8d76f4cb..d31c2858fb 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9340f8533b032a3aa342dfecc4af6593729782c09e1b2909f622d83318bc057f -size 46352 +oid sha256:088695f25c715eff4442f65b285471cbc6e6efbb051c47fad738135146a89e04 +size 46464 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png index 300da10027..fda497dde4 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e342cdbd1c5328b988d722f58cf8e4f456fa2d04647cb7206ae6d1abbcd5277c -size 45146 +oid sha256:e5c948a7593cb3347fb43030a3456a6f1aef4fec0384eb9caacad8349d17626c +size 45248 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png index 775105c877..fa72ce58af 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetailsDark_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97e9cfc23cec7a266d2e4f5de78a9f26eb1f4aa5383ac0888e43445a39c6f124 -size 43929 +oid sha256:f51413349aa28bc6619a55b0ea9cbf36ad8f0f3ec6e30ba80f8f752eb2107668 +size 44033 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png index df75672834..d6af09b4c7 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:234d20bccc37f0d6a28a3dbb181088a4bab5b6a74ded1709285510b6ae7018ce -size 47053 +oid sha256:692d00e0a8597682bf414f91342ae2b7c9b68dc38944e77f783ef5e5776c2240 +size 47041 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png index 52164d70e7..bf9ed2a3cc 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_10_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:53286513a6842be215198c9bc0996caa3d75d74d622b07c328c59733096e4f90 -size 45888 +oid sha256:c37ddb76e6d41c0b781569f482fad117ce48367847e0061972694030a9413085 +size 45882 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png index 1b6d35e2ae..52e4702c1b 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_12_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3970140bb648ac70889dd165eebdef1cf609d89805af448f32665de6a7ab81a -size 47718 +oid sha256:292dcae768ff8534f82e6bbe075a8fb4b4b57718d10a0f93d4d45b84e72becfe +size 47714 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png index 3952181b5d..36499ecb66 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_13_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:149b76592b74cb2d2215e6de6604c43b6602ca55e037a041f938a69ba10f8d64 -size 46217 +oid sha256:b8f1513a55fa0d5b74657bcd224bac851151b2da10dd7f624cd92778e6ab0618 +size 46205 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png index 8adcf955d1..b6fd155e9a 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_14_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b34833ab2ff3b95885edbc113668409f27c410530ee27fe32f1d2d02ba473e22 -size 46721 +oid sha256:9d97e781bf08ff3c519d693ccd2dca3269706667a45ee06c866903b7a95a07da +size 46711 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png index 594027c0b6..8987195d54 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_15_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc5cbcf1c9d1e479b202f64e1bbc2969ec6b0d2c3e75c005f61b27c63a4b5c93 -size 47313 +oid sha256:5b7f88d28b9820258ebac7c375cdf4e64f9ad4a62c195ce4e7253722ced29d5e +size 47302 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png index 4a640ec48e..0fe04d6d9c 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_16_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f3cae332439b8608cb2a6610e8febc6c8fed5349c8e722e58a43a93d4467146 -size 46566 +oid sha256:6126c10ff145a34ccedf9c7179c7786af1b6820a1dc2c3684aa649883e4833ba +size 46555 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_1_de.png index 4b2d354878..91e9215b3d 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:8adb2a2795c647189bb9d6d0ebe8bc71e6f8869f11f13e80f6c075e3019a29cc -size 37394 +oid sha256:66d469f100cb1dc04dad3859c0e8e3f9bb50a98b11947a328424f9c11b581b45 +size 37400 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png index 0bb1e00462..8a32c9c66c 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bfa82fd5e8cedd060cc45f5383e66f1826995d227e7df70b6254a288a9cc7035 -size 40130 +oid sha256:9c38ede826c8a472d00d6132be5e80760434774603afca44b61d4d7afcd68877 +size 40131 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png index 7cc4eafcd2..13dc66abec 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a2ff6c7c3c3fa28bc6d4772179ea9011d6e8dad6fc3e8ca12de3210fa6398591 -size 46468 +oid sha256:86764932b950fb55ae017b870b79ab32e96cc3f88248c0fac5db8f618ca8b2b3 +size 46454 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png index 6ac7d80460..bcf1141910 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12c5d18e668bdc14dc48dc4654df23a9da1287cfa12fc77d192c3174de3b123d -size 45406 +oid sha256:c35256f5869fea4d42aa672f49f48dc073f179ead72004baa25e07b4420d5665 +size 45401 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png index 8b56afe5b6..f6e0a5a0ee 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7dfb941ee934e9b4085e63d47da08b1fdc0d3afbae6d9f39acbe4f120d13f161 -size 46251 +oid sha256:d7b2e6e6461b04a9476e57ccebf35f79de29bf7c43c5936fc7bd497f8c238ac2 +size 46243 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png index de77906f44..e093b35424 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0581402b82ade016a325f9995f2c57266bf5550cacd48fab946c37844c60eb31 -size 47538 +oid sha256:9e8262293955839ab0827b0d9bb04f7528e51513354a45bdd3738c601f5fcba8 +size 47542 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png index e954250c55..581cc59363 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b049e087d71fdcc8dcce50930354095a493d4246578147616865a35a4a96e65 -size 46316 +oid sha256:f3b57566b133fd7cd56b905470b744dc3d98e7a6112f3556b9490cb26c1c4092 +size 46305 diff --git a/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png b/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png index 3786a782fd..608967f681 100644 --- a/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png +++ b/screenshots/de/features.roomdetails.impl_RoomDetails_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fc879b5aebe89c33300e31081c06376b144d8b555e6cae9c7702d814e24cab4 -size 44963 +oid sha256:a9df573a195b9e8475ac9f95e4aed49ff4946846683b3b7cf00a102b2f8311a9 +size 44951 diff --git a/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png index f2e0575f49..0347f23cbe 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3dc3fadf9738dee8425469ddaa0a142ae2933f91bbedbfadc0cf83a16a02297a -size 26786 +oid sha256:7fd007d20fc02d44d2230aa5471c2b7242cc3aff862025517a11a3ec2b8acfb8 +size 25057 diff --git a/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png index 97877dcb47..c80c1adae1 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileHeaderSection_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3a07ae4167cf29cfe165d3acc04e64b0c614d81bc542d57ed1d7a3b68605342 -size 15442 +oid sha256:c317599d84833c06a9931e41c0f20eacae4ea86dd1aa47f44c365acf34842707 +size 15395 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png index 7aed4754d7..0fc6b92e29 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4e22f909849f9b237c9d26db4bd6fed0bf84da7db6086b8557a29e8736e06ff -size 26263 +oid sha256:4945f14720c561504ee460fb88294683881f96ec6038008806100a76f528a308 +size 26163 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png index fd4228a1d9..7fa7119dfe 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_1_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:582e49a18b7b0289467db2bf508714ee22a88ef559aa203d6359cba932244985 -size 24210 +oid sha256:c2fd05a1ff0319b83914fa09677e5347bfa73cb9926cfef0e935bb91f6ea8135 +size 24100 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png index 16c35f3b51..23370ab623 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:828b8226d3601606ec58f0fa0dc883c90ec5f21bfbdabe3fe458ab8817c8cd78 -size 25274 +oid sha256:d2592e29284d3324b3fc3cfca87ac6722ee12cf0a88724ad85a47347f6485e03 +size 25174 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png index 4fdc2e7aa2..9c009c53cd 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ca641bcf4aaa1e97893e97395edda4af40eb07bb94cc4998a512e158717c753 -size 45161 +oid sha256:80af780db60b2804086e405cc33a3a05d511ec9cc9582b930d1ea4828467d153 +size 45134 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png index 71aae98e23..cafaf6d7fe 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7cde506275d63f7b078fad1b30799fda8f73ed6fadc44a8444f38c773ec74eeb -size 37356 +oid sha256:d4efaf4cfae0738d3ea3e6640e4fa0b2f6ccfd4b5c5a48505571e8442f63765d +size 37323 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png index 9bb477e78d..83c27f4994 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_5_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20f32362f398663698fd1d4fe27b0d6104cbdaa8c43b4d971ce9742561573efd -size 23295 +oid sha256:52ec49829640d5dc45f5b3f57d0bf8ecefcca2b4423d43c13718fb9ee3988f04 +size 23206 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png index 2494e35600..2d54ddb4c0 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dba4059e750861096ba06be122b8c0b9e260de5349708223d323b9d45f356b79 -size 25720 +oid sha256:d0b871a866f4ad090f4559ef636e709b332dbfdbe002caaa6fb162d6edde63c7 +size 25680 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png index 394a306cd1..0f162ab3ea 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_7_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c14ca5d1fc33c203fa2b37d9c332bde076d55ae2695ff66463dc885a87b08ad6 -size 27362 +oid sha256:9bc59d332e03ec30c2400420d20a0dda23face75ac40462282f36ecf0042128d +size 27262 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png index a26006e652..3f043c2172 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8cd4dec110d60cbf0a3f3418a66942e4cc22042543ac10b73d96d1d8957b8a9c -size 37361 +oid sha256:67a063a65537c571c9ce463c26304478d0ddf8557c1a2ce1ace6b4b4291aa3f2 +size 37306 diff --git a/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png b/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png index e5b1205cd6..070569718d 100644 --- a/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png +++ b/screenshots/de/features.userprofile.shared_UserProfileView_Day_9_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db2b1cd6f89552691e28f252e45ba54e1049e4f22ce4ffbc98a8f1dd903bb827 -size 36614 +oid sha256:39ad338c3bc4280fc1d55e2be7fad89ab82a067169df6b03375e9bd6e82b5523 +size 34587 diff --git a/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_MarkdownTextComposerEdit_Day_0_de.png index 5cb2d38b7b..d0f08ffe52 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:d669231924e75be81e8bc77ab83cbca830d9ac4931bbc232f2002d45ae0a7137 -size 55492 +oid sha256:af4e734f66b3d9e1158d4276f43ab8b6915cf8005c512b59831dd581a3cb438e +size 55494 diff --git a/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerAddCaption_Day_0_de.png index 74da77c750..b45b6697ba 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:75d446990ba2ec1184daac6adfcdbe9fe0fdd57cebc8762ba59120a0fb4edf09 -size 61241 +oid sha256:9a1864554b9626633423c4e201973a1ec0a18c916d6e3ea898889cc7cfa2a25d +size 61478 diff --git a/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerCaption_Day_0_de.png index 31cbd9061c..6634b3c317 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:ef0769a9b70db32af32aa3eab10cd2283c4d84786d5c6f8442dd408b69997a49 -size 48943 +oid sha256:d76a6371efb5eb1aebf305b3ee85067f63707e0b16066acc10c2d0f750952f48 +size 48921 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditCaption_Day_0_de.png index 829a0ff81b..1f38c4d566 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:585420c98488d2723a89251bb2128f559875b6b691d98e17e1d27414764eeb11 -size 61344 +oid sha256:75c1832be486d6dfba30f7bf115be324caef1242c0796651f655e2e14318b2ad +size 61656 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png new file mode 100644 index 0000000000..768f400cda --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f9dcea0ff31cd53affbe4e6adcae2681ec98570d3f26ef9e79b014c75a57919 +size 67937 diff --git a/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerEdit_Day_0_de.png index 5cb2d38b7b..d0f08ffe52 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:d669231924e75be81e8bc77ab83cbca830d9ac4931bbc232f2002d45ae0a7137 -size 55492 +oid sha256:af4e734f66b3d9e1158d4276f43ab8b6915cf8005c512b59831dd581a3cb438e +size 55494 diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png new file mode 100644 index 0000000000..ed4394b6fa --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bccb7232766f51b2166b9d9621f53f893cf133861f1e77331789a5e2cbc96c1 +size 66072 diff --git a/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerFormatting_Day_0_de.png index fef50a045d..ec74e4e56d 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:957d3b10f0165461fb30cccd0891731ad30598f3808803f3fd194f62632f2522 -size 53407 +oid sha256:b860e3abcf9d5a4265ab3dd17316a00d96d46da5e6ed6f7bb60eaf5e5d0122da +size 53402 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png new file mode 100644 index 0000000000..23421c86c1 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5649deae47b73edf1f57c9e0836285d67b1e3c15de4e8d6587abe635789de05b +size 74898 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png new file mode 100644 index 0000000000..efb98584bd --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:022ebe25ae12c40682454d668ea24dbe749946f0edeee55ddf28ca22d99c360c +size 61519 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png new file mode 100644 index 0000000000..2873584aae --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba32f8394882b4491b345852817e238b30504c2d364a2ab60748e310ecf5f1bd +size 74291 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png new file mode 100644 index 0000000000..d704ded910 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c61e5013cef3e1ebe06c51e24e816d3cdf7fcf04857bc7d02a86a480d83844b +size 82400 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png new file mode 100644 index 0000000000..cda1620f8c --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e40c4bf8e1a08d8a023067681f86ba887b97f54716aef24e0feb8cde2d34975 +size 63999 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png new file mode 100644 index 0000000000..c736dc8169 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:344b99b0df98328ac83711647ab162fa6b652eac9b05640938f682e4de47d4d0 +size 62896 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png new file mode 100644 index 0000000000..177f5135f3 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ea10ab065f00bd96553e64dcfe582274bdb075db2fcb882aeeab3710f7b77f9 +size 68530 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png new file mode 100644 index 0000000000..2a405463e7 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bbb1d73be9f2f9dd999a42e2e75f95e16a8ca610759bd37ef0ba80c5f564b3b +size 61663 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png new file mode 100644 index 0000000000..1eab364bad --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76741feeb6e436310715d45f8fcbe01a1987800f10db5ed9fed478b30a77bd0c +size 62390 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png new file mode 100644 index 0000000000..ced6e2c206 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d33c1114f55bd699ec160b1ebb518fb809b41ca74e145a1cc894b0a54d1a3ee3 +size 63519 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png new file mode 100644 index 0000000000..5505f6779e --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97235ce5cb23cc144a124192cc6849e44beeed331521f289d8d5444df95fc58e +size 71403 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png new file mode 100644 index 0000000000..cf0160a1bf --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61d7d88797f535e24d84ea5fceb15f8362b31d6a08510e38214288e978bad0e5 +size 61926 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_0_de.png index d4187835c3..1cf257b5df 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:8f18ce9ded3bedf206ba07aca96c9e16cf926ce5ddc586784dd5c3f47dec8184 -size 75949 +oid sha256:483a47b2450370d7e5cfc267c4c6d21fb6bf91cc09b734215355276bf21d6516 +size 75980 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_10_de.png index f5e26a4e0e..9f238e3d0f 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:c83569820b8ee4e64dc840c8731c306e44f4af0f2e96905db27b19c34804967b -size 58944 +oid sha256:e03d4fb9d9f61c7be275c35f2147f7fe6eb4e0f8185c81ae0e8c92e3a649b705 +size 59483 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_11_de.png index 37cdd5f0d4..7088990852 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:260d9da9bf947755948d1a6b348194f142879409bb9cdb86fe1d00751fa8ac3f -size 74020 +oid sha256:2b21561e0a75416139e6cea48147fcf8f94fcb82470c083de2386bc09b6bb638 +size 74179 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_1_de.png index 847c9e3deb..7343ba3a68 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:79d6c9484a7eebbd53b0d6ed7933eb9cc74e976069f71bb8ee39bde52bd047db -size 85407 +oid sha256:72cf358766cac6a25856d67b64231e0f197d822d528e6b2677121c939c3af009 +size 85364 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_2_de.png index 2fa288ec23..b62091a933 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:cac51fdd3736bf9fae45c28ae4df283dda473acd0baf0ee2ae5415ed73d22327 -size 62157 +oid sha256:8e97d95e3879db231a277be5811fcb8ad9c4781266180a17ee051b23c70b7d35 +size 62594 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_3_de.png index 85bbb9cc75..4ad99eaff1 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:db2f2d07e4d23b316f9309cacfe5e402cf5e230dcb7bc4efef4566e40d798f42 -size 61245 +oid sha256:04ef750b7bf937ec4f37bfef7b8fe01d8ad5dae3a0e82220a5058a72c2747799 +size 61642 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_4_de.png index 0165e92451..6ec236e181 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:3b27d85232cba50fbeeb5758ecee65594a4660fa8ec670d55b2ccbc0b97d50a9 -size 68483 +oid sha256:ceb13e2468d332613c9876f5b1b8b0f2d1d0308f60f8375d1157a28aab6af6a8 +size 69022 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_5_de.png index 19ad78ebb1..3794879115 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:0cc2e5d586e6296641c37635a8e316f2527c92cf1c21f7ef9915dab01da195e5 -size 59362 +oid sha256:4c213578bdbc2495a4a26251264d803c51f6c4c4cd6547d46f0738a52fd3af3b +size 59895 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_6_de.png index c166ee4899..c9f64c9762 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:0daee317f93a38becad1776e9fbdfc98df8a5b27fdef2befd32e51a556b8ab01 -size 60172 +oid sha256:a15da02688f8f096b84d61579901b0b1b951a3e3ad185a41959f8bf51a12ba02 +size 60667 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_7_de.png index b55a0df772..4b5ed412cc 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:8d01926e2e41de43b6e5bfc691a3d21fc7aea31ee62e578130076c8c74554e6b -size 62377 +oid sha256:5c6b9ef3e544c8b43b037d1d85bffb1c20c19d211ebeae8fde3c1832e2454759 +size 62717 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_8_de.png index afc45ef5c5..a020e8e929 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:bbb6197fb4f6eeaea613ef2d609fac94e027d5fcc5172718bc1ac9fc925b4031 -size 70498 +oid sha256:5bcfd88322da25f0222dc25941b3c05a3e1b40bf9c43d6d6479e8c2e9c1590d5 +size 71118 diff --git a/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png b/screenshots/de/libraries.textcomposer_TextComposerReply_Day_9_de.png index 1008408a72..5ed4c0135b 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:eb7fb190e297edbdc2cd3b715bda9e65bfe366dc4e4c334eb05a713e59948c88 -size 59622 +oid sha256:38722413573171f3e32a273e18d1e07d887dc031b56dbc337495e74b972f8d5e +size 60175 diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png new file mode 100644 index 0000000000..55c39845a0 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bf747f7a203f82715af67bfbe1d7833781122f4df5bb1edee6c69b964bd5354 +size 58386 diff --git a/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerSimple_Day_0_de.png index aac16a3f92..795ba6a267 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:2faa715f5cf4af59c20c6126d6eaccce631f974e746ad595da8c62000b6138dd -size 46301 +oid sha256:38ec4ada1a2d0f5ca18b8d11d30477be907bc9947cd42e93cf546a86cb75e188 +size 46540 diff --git a/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png new file mode 100644 index 0000000000..20a33a20a3 --- /dev/null +++ b/screenshots/de/libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:954c6df99d354ed3984f4a62f330f8389d07d15fc94190226a598a0e235e0ced +size 39572 diff --git a/screenshots/html/data.js b/screenshots/html/data.js index bf1c8da024..4acf1b2941 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,61 +1,63 @@ // 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",20168,], +["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20175,], ["features.invite.impl.response_AcceptDeclineInviteView_Day_0_en","features.invite.impl.response_AcceptDeclineInviteView_Night_0_en",0,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_1_en","features.invite.impl.response_AcceptDeclineInviteView_Night_1_en",20168,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_2_en","features.invite.impl.response_AcceptDeclineInviteView_Night_2_en",20168,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_3_en","features.invite.impl.response_AcceptDeclineInviteView_Night_3_en",20168,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_4_en","features.invite.impl.response_AcceptDeclineInviteView_Night_4_en",20168,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_5_en","features.invite.impl.response_AcceptDeclineInviteView_Night_5_en",20168,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20168,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20168,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20168,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20168,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20168,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_1_en","features.invite.impl.response_AcceptDeclineInviteView_Night_1_en",20175,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_2_en","features.invite.impl.response_AcceptDeclineInviteView_Night_2_en",20175,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_3_en","features.invite.impl.response_AcceptDeclineInviteView_Night_3_en",20175,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_4_en","features.invite.impl.response_AcceptDeclineInviteView_Night_4_en",20175,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_5_en","features.invite.impl.response_AcceptDeclineInviteView_Night_5_en",20175,], +["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20175,], +["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20175,], +["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20175,], +["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20175,], +["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20175,], ["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",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20168,], +["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20175,], ["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",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20168,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20168,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20168,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20168,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20168,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20168,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en",20168,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en",20168,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en",20168,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en",20168,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en",20168,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20168,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20168,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20168,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20168,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20168,], +["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20175,], +["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20175,], +["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20175,], +["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20175,], +["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20175,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en",20175,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en",20175,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en",20175,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en",20175,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en",20175,], +["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20175,], +["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20175,], +["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20175,], +["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20178,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20175,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20178,], +["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20175,], ["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",20168,], +["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20175,], ["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",20168,], +["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20175,], ["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",20168,], +["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20175,], ["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",20168,], +["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20175,], ["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",20168,], +["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20175,], ["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,], @@ -65,18 +67,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","",20168,], -["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20168,], -["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20168,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20168,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20168,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20168,], +["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20175,], ["features.messages.impl.attachments.preview_AttachmentsView_6_en","",0,], -["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20168,], +["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20175,], ["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",20168,], +["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20175,], ["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,], @@ -184,13 +186,13 @@ export const screenshots = [ ["libraries.designsystem.components_Badge_Day_0_en","libraries.designsystem.components_Badge_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",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20168,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20168,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20175,], ["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,], @@ -201,130 +203,130 @@ 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",20168,], -["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20168,], -["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20168,], -["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20168,], -["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20168,], +["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20175,], +["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20175,], +["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20175,], +["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20175,], +["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20168,], +["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20175,], +["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20175,], ["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_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",20168,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20168,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20168,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20168,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20168,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20168,], +["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20175,], +["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20175,], +["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20175,], +["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20175,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20175,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20175,], ["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",20168,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20168,], +["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20175,], +["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20175,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20168,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20175,], ["libraries.designsystem.theme.components_Checkboxes_Toggles_en","",0,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20168,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20168,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20168,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20168,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20175,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20175,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20175,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20175,], ["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",20168,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20168,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20168,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20175,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20175,], +["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20175,], ["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","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20168,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20168,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20168,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20168,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20168,], -["features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20168,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20175,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20175,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20175,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20175,], +["features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20175,], ["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",20168,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20168,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20168,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20168,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20168,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20168,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20168,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20168,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20168,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20168,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20168,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20168,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20168,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20168,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20168,], -["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20168,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20168,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20168,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20168,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20168,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20168,], +["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20175,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20175,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20175,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20175,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20175,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20175,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20175,], +["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20175,], +["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20175,], +["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20175,], +["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20175,], +["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20175,], +["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20175,], +["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20175,], +["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20175,], +["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20175,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20175,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20175,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20175,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20175,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20175,], ["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","",20168,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20168,], +["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20175,], +["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20175,], ["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",20168,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20168,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20168,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20175,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20175,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20175,], ["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",20168,], -["features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20168,], -["features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en",20168,], +["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20175,], +["features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20175,], +["features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en",20175,], ["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",20168,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20168,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20168,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20168,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20168,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20168,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20168,], +["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20175,], +["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20175,], +["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20175,], +["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20175,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20175,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20175,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20175,], ["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,], @@ -337,17 +339,17 @@ 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",20168,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20168,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20168,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20168,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20168,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20168,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20168,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20168,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20168,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20168,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20168,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20175,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20175,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20175,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20175,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20175,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20175,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20175,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20175,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20175,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20175,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20175,], ["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,], @@ -357,9 +359,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","",20168,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20168,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20168,], +["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20175,], +["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20175,], +["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20175,], ["features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en","features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_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,], @@ -377,16 +379,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",20168,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20168,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20168,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20175,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20175,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20175,], ["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",20168,], -["features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20168,], +["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20175,], +["features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20175,], ["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,], @@ -410,8 +412,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",20168,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20168,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20175,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20175,], ["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,], @@ -419,82 +421,84 @@ 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",20168,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20175,], ["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",20168,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20175,], ["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",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20168,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20168,], +["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20175,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20175,], ["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,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20168,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20168,], +["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20175,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20175,], ["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",20168,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20168,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20168,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20168,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20168,], +["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20175,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20175,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20175,], ["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",20168,], -["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20168,], -["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20168,], -["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20168,], -["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20168,], -["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20168,], +["features.leaveroom.api_LeaveRoomView_Day_1_en","features.leaveroom.api_LeaveRoomView_Night_1_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20175,], ["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",20178,], ["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,], @@ -549,30 +553,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",20168,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20168,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20168,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20168,], +["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20175,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20175,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20175,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20175,], ["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",20168,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20168,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20168,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20168,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20168,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20168,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20168,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20168,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20168,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20168,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20168,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20168,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20168,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20168,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20168,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20168,], +["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20175,], +["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20175,], +["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20175,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20175,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20175,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20175,], +["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20175,], +["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20175,], +["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20175,], +["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20175,], +["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20175,], +["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20175,], +["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20175,], +["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20175,], +["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20175,], +["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20175,], ["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,], -["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20168,], +["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20175,], ["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,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomNeutral_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomNeutral_Night_0_en",0,], ["libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en","libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en",0,], @@ -583,22 +588,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",20168,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20168,], +["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20175,], +["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20175,], ["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",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20168,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20168,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20175,], ["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,], @@ -606,14 +611,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","",20168,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20168,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20175,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20175,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20168,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20175,], ["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","",20168,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20175,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,], @@ -625,7 +630,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",20168,], +["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20175,], ["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_10_en","features.messages.impl.timeline.components_MessageEventBubble_Night_10_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_11_en","features.messages.impl.timeline.components_MessageEventBubble_Night_11_en",0,], @@ -642,7 +647,7 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessageEventBubble_Day_7_en","features.messages.impl.timeline.components_MessageEventBubble_Night_7_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_8_en","features.messages.impl.timeline.components_MessageEventBubble_Night_8_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_9_en","features.messages.impl.timeline.components_MessageEventBubble_Night_9_en",0,], -["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20168,], +["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20175,], ["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,], @@ -650,25 +655,25 @@ 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",20168,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20168,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20168,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20168,], -["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20168,], -["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20168,], -["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20168,], -["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20171,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20168,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20168,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20168,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20168,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20168,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20168,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20168,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20168,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20168,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20175,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20175,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20175,], +["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20175,], +["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20175,], +["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20175,], +["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20175,], +["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20175,], +["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20175,], +["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20175,], +["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20175,], +["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20175,], +["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20175,], +["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20175,], +["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20175,], +["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20175,], +["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20175,], ["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",20168,], +["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20175,], ["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,], ["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,], ["appicon.element_MonochromeIcon_en","",0,], @@ -677,28 +682,29 @@ 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",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20168,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20168,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20168,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20175,], +["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20175,], ["libraries.oidc.impl.webview_OidcView_Day_0_en","libraries.oidc.impl.webview_OidcView_Night_0_en",0,], ["libraries.oidc.impl.webview_OidcView_Day_1_en","libraries.oidc.impl.webview_OidcView_Night_1_en",0,], ["libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en","libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en",0,], -["features.onboarding.impl_OnBoardingView_Day_0_en","features.onboarding.impl_OnBoardingView_Night_0_en",20168,], -["features.onboarding.impl_OnBoardingView_Day_1_en","features.onboarding.impl_OnBoardingView_Night_1_en",20168,], -["features.onboarding.impl_OnBoardingView_Day_2_en","features.onboarding.impl_OnBoardingView_Night_2_en",20168,], -["features.onboarding.impl_OnBoardingView_Day_3_en","features.onboarding.impl_OnBoardingView_Night_3_en",20168,], +["features.onboarding.impl_OnBoardingView_Day_0_en","features.onboarding.impl_OnBoardingView_Night_0_en",20175,], +["features.onboarding.impl_OnBoardingView_Day_1_en","features.onboarding.impl_OnBoardingView_Night_1_en",20175,], +["features.onboarding.impl_OnBoardingView_Day_2_en","features.onboarding.impl_OnBoardingView_Night_2_en",20175,], +["features.onboarding.impl_OnBoardingView_Day_3_en","features.onboarding.impl_OnBoardingView_Night_3_en",20175,], +["features.onboarding.impl_OnBoardingView_Day_4_en","features.onboarding.impl_OnBoardingView_Night_4_en",20178,], ["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,], ["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,], @@ -713,65 +719,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",20168,], -["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20168,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20168,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20168,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20168,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20168,], +["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20175,], +["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20175,], +["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20175,], +["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20175,], +["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20175,], ["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",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20168,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20168,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20175,], ["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",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20168,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20168,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20168,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20168,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20168,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20168,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20175,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20175,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20175,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20175,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20175,], ["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",20168,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20168,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20168,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20168,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20168,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20175,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20175,], +["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20175,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20175,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20175,], ["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",20168,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20168,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20168,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20168,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20168,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20168,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20168,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20168,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20168,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20168,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20168,], +["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20175,], +["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20175,], +["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20175,], +["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20175,], +["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20175,], +["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20175,], +["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20175,], +["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20175,], +["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20175,], +["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20175,], +["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20175,], ["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,], @@ -785,207 +791,207 @@ 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","",20168,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20168,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20168,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20168,], +["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20175,], +["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20175,], +["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20175,], +["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20175,], ["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","",20168,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20168,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20168,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20168,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20168,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20168,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20168,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20168,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20168,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20168,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20168,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20168,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20168,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20168,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20168,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20168,], +["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20175,], +["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20175,], +["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20175,], +["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20175,], +["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20175,], +["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20175,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20175,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20175,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20175,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20175,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20175,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20175,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20175,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20175,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20175,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20175,], ["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,], -["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20168,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20168,], +["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20175,], +["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20168,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20168,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20168,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20168,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20168,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20168,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20175,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20175,], ["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",20168,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20168,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20168,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20168,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20168,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20168,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20168,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20168,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20168,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20168,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20168,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20168,], +["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20175,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20175,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20175,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20175,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20175,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20175,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20175,], ["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",20168,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20168,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20168,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20168,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20168,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20175,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20175,], +["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20175,], +["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20175,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20175,], ["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",20168,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20168,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20168,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20168,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20168,], -["features.roomdetails.impl_RoomDetails_0_en","",20168,], -["features.roomdetails.impl_RoomDetails_10_en","",20168,], -["features.roomdetails.impl_RoomDetails_11_en","",20168,], -["features.roomdetails.impl_RoomDetails_12_en","",20168,], -["features.roomdetails.impl_RoomDetails_13_en","",20168,], -["features.roomdetails.impl_RoomDetails_14_en","",20168,], -["features.roomdetails.impl_RoomDetails_15_en","",20168,], -["features.roomdetails.impl_RoomDetails_16_en","",20168,], -["features.roomdetails.impl_RoomDetails_17_en","",20168,], -["features.roomdetails.impl_RoomDetails_18_en","",20168,], -["features.roomdetails.impl_RoomDetails_1_en","",20168,], -["features.roomdetails.impl_RoomDetails_2_en","",20168,], -["features.roomdetails.impl_RoomDetails_3_en","",20168,], -["features.roomdetails.impl_RoomDetails_4_en","",20168,], -["features.roomdetails.impl_RoomDetails_5_en","",20168,], -["features.roomdetails.impl_RoomDetails_6_en","",20168,], -["features.roomdetails.impl_RoomDetails_7_en","",20168,], -["features.roomdetails.impl_RoomDetails_8_en","",20168,], -["features.roomdetails.impl_RoomDetails_9_en","",20168,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20168,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20168,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20168,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20168,], -["features.roomlist.impl.components_RoomListContentView_Day_0_en","features.roomlist.impl.components_RoomListContentView_Night_0_en",20168,], -["features.roomlist.impl.components_RoomListContentView_Day_1_en","features.roomlist.impl.components_RoomListContentView_Night_1_en",20168,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20175,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20175,], +["features.roomdetails.impl_RoomDetailsDark_0_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_10_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_11_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_12_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_13_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_14_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_15_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_16_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_17_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_18_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_1_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_2_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_3_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_4_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_5_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_6_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_7_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_8_en","",20175,], +["features.roomdetails.impl_RoomDetailsDark_9_en","",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20175,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20175,], +["features.roomdetails.impl_RoomDetails_0_en","",20175,], +["features.roomdetails.impl_RoomDetails_10_en","",20175,], +["features.roomdetails.impl_RoomDetails_11_en","",20175,], +["features.roomdetails.impl_RoomDetails_12_en","",20175,], +["features.roomdetails.impl_RoomDetails_13_en","",20175,], +["features.roomdetails.impl_RoomDetails_14_en","",20175,], +["features.roomdetails.impl_RoomDetails_15_en","",20175,], +["features.roomdetails.impl_RoomDetails_16_en","",20175,], +["features.roomdetails.impl_RoomDetails_17_en","",20175,], +["features.roomdetails.impl_RoomDetails_18_en","",20175,], +["features.roomdetails.impl_RoomDetails_1_en","",20175,], +["features.roomdetails.impl_RoomDetails_2_en","",20175,], +["features.roomdetails.impl_RoomDetails_3_en","",20175,], +["features.roomdetails.impl_RoomDetails_4_en","",20175,], +["features.roomdetails.impl_RoomDetails_5_en","",20175,], +["features.roomdetails.impl_RoomDetails_6_en","",20175,], +["features.roomdetails.impl_RoomDetails_7_en","",20175,], +["features.roomdetails.impl_RoomDetails_8_en","",20175,], +["features.roomdetails.impl_RoomDetails_9_en","",20175,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20175,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20175,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20175,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20175,], +["features.roomlist.impl.components_RoomListContentView_Day_0_en","features.roomlist.impl.components_RoomListContentView_Night_0_en",20175,], +["features.roomlist.impl.components_RoomListContentView_Day_1_en","features.roomlist.impl.components_RoomListContentView_Night_1_en",20175,], ["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",20168,], -["features.roomlist.impl.components_RoomListContentView_Day_4_en","features.roomlist.impl.components_RoomListContentView_Night_4_en",20168,], -["features.roomlist.impl.filters_RoomListFiltersView_Day_0_en","features.roomlist.impl.filters_RoomListFiltersView_Night_0_en",20168,], -["features.roomlist.impl.filters_RoomListFiltersView_Day_1_en","features.roomlist.impl.filters_RoomListFiltersView_Night_1_en",20168,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en",20168,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en",20168,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en",20168,], +["features.roomlist.impl.components_RoomListContentView_Day_3_en","features.roomlist.impl.components_RoomListContentView_Night_3_en",20175,], +["features.roomlist.impl.components_RoomListContentView_Day_4_en","features.roomlist.impl.components_RoomListContentView_Night_4_en",20175,], +["features.roomlist.impl.filters_RoomListFiltersView_Day_0_en","features.roomlist.impl.filters_RoomListFiltersView_Night_0_en",20175,], +["features.roomlist.impl.filters_RoomListFiltersView_Day_1_en","features.roomlist.impl.filters_RoomListFiltersView_Night_1_en",20175,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en",20175,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en",20175,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en",20175,], ["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",20168,], -["features.roomlist.impl_RoomListView_Day_0_en","features.roomlist.impl_RoomListView_Night_0_en",20168,], -["features.roomlist.impl_RoomListView_Day_10_en","features.roomlist.impl_RoomListView_Night_10_en",20168,], -["features.roomlist.impl_RoomListView_Day_1_en","features.roomlist.impl_RoomListView_Night_1_en",20168,], -["features.roomlist.impl_RoomListView_Day_2_en","features.roomlist.impl_RoomListView_Night_2_en",20168,], -["features.roomlist.impl_RoomListView_Day_3_en","features.roomlist.impl_RoomListView_Night_3_en",20168,], -["features.roomlist.impl_RoomListView_Day_4_en","features.roomlist.impl_RoomListView_Night_4_en",20168,], -["features.roomlist.impl_RoomListView_Day_5_en","features.roomlist.impl_RoomListView_Night_5_en",20168,], -["features.roomlist.impl_RoomListView_Day_6_en","features.roomlist.impl_RoomListView_Night_6_en",20168,], -["features.roomlist.impl_RoomListView_Day_7_en","features.roomlist.impl_RoomListView_Night_7_en",20168,], +["features.roomlist.impl.search_RoomListSearchContent_Day_1_en","features.roomlist.impl.search_RoomListSearchContent_Night_1_en",20175,], +["features.roomlist.impl_RoomListView_Day_0_en","features.roomlist.impl_RoomListView_Night_0_en",20175,], +["features.roomlist.impl_RoomListView_Day_10_en","features.roomlist.impl_RoomListView_Night_10_en",20175,], +["features.roomlist.impl_RoomListView_Day_1_en","features.roomlist.impl_RoomListView_Night_1_en",20175,], +["features.roomlist.impl_RoomListView_Day_2_en","features.roomlist.impl_RoomListView_Night_2_en",20175,], +["features.roomlist.impl_RoomListView_Day_3_en","features.roomlist.impl_RoomListView_Night_3_en",20175,], +["features.roomlist.impl_RoomListView_Day_4_en","features.roomlist.impl_RoomListView_Night_4_en",20175,], +["features.roomlist.impl_RoomListView_Day_5_en","features.roomlist.impl_RoomListView_Night_5_en",20175,], +["features.roomlist.impl_RoomListView_Day_6_en","features.roomlist.impl_RoomListView_Night_6_en",20175,], +["features.roomlist.impl_RoomListView_Day_7_en","features.roomlist.impl_RoomListView_Night_7_en",20175,], ["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",20168,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20168,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20168,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20175,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20175,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20175,], ["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",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20168,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20168,], +["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20175,], ["libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en","libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en",0,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_0_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_0_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_1_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_1_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_2_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_2_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en",20168,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_0_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_0_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_1_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_1_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_2_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_2_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en",20175,], ["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en",0,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en",20168,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en",20168,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en",20175,], ["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en",0,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20168,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20168,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20168,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20175,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20175,], +["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20175,], ["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,], @@ -1008,12 +1014,12 @@ export const screenshots = [ ["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",20168,], -["features.roomlist.impl.components_RoomSummaryRow_Day_2_en","features.roomlist.impl.components_RoomSummaryRow_Night_2_en",20168,], -["features.roomlist.impl.components_RoomSummaryRow_Day_30_en","features.roomlist.impl.components_RoomSummaryRow_Night_30_en",20168,], -["features.roomlist.impl.components_RoomSummaryRow_Day_31_en","features.roomlist.impl.components_RoomSummaryRow_Night_31_en",20168,], -["features.roomlist.impl.components_RoomSummaryRow_Day_32_en","features.roomlist.impl.components_RoomSummaryRow_Night_32_en",20168,], -["features.roomlist.impl.components_RoomSummaryRow_Day_33_en","features.roomlist.impl.components_RoomSummaryRow_Night_33_en",20168,], +["features.roomlist.impl.components_RoomSummaryRow_Day_29_en","features.roomlist.impl.components_RoomSummaryRow_Night_29_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_2_en","features.roomlist.impl.components_RoomSummaryRow_Night_2_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_30_en","features.roomlist.impl.components_RoomSummaryRow_Night_30_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_31_en","features.roomlist.impl.components_RoomSummaryRow_Night_31_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_32_en","features.roomlist.impl.components_RoomSummaryRow_Night_32_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_33_en","features.roomlist.impl.components_RoomSummaryRow_Night_33_en",20175,], ["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,], @@ -1021,77 +1027,77 @@ export const screenshots = [ ["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",20168,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20168,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20168,], +["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20175,], +["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20175,], +["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20175,], ["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",20168,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20168,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20168,], +["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20175,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20175,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20175,], ["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","",20168,], +["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20175,], ["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","",20168,], -["features.createroom.impl.components_SearchSingleUserResultItem_en","",20168,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20168,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20168,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20168,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20168,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20168,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20168,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20168,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20168,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20168,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20168,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20168,], +["features.createroom.impl.components_SearchMultipleUsersResultItem_en","",20175,], +["features.createroom.impl.components_SearchSingleUserResultItem_en","",20175,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20175,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20175,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20175,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20175,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20175,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20175,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20175,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20175,], +["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20175,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20175,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20175,], ["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,], @@ -1099,11 +1105,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",20168,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20168,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20168,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20168,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20168,], +["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20175,], +["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20175,], +["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20175,], +["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20175,], +["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20175,], ["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,], @@ -1113,27 +1119,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",20168,], -["features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20168,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20168,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20168,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20168,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20168,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20168,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20168,], +["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20175,], +["features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20175,], +["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20175,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20175,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20175,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20175,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20175,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20175,], ["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",20168,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20168,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20168,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20168,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20168,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20168,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20168,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20168,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20168,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20168,], +["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20175,], +["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20175,], +["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20175,], +["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20175,], +["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20175,], +["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20175,], +["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20175,], +["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20175,], +["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20175,], +["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20175,], ["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,], @@ -1142,7 +1148,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",20168,], +["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20175,], ["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,], @@ -1151,40 +1157,56 @@ 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",20171,], +["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20175,], ["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",20168,], +["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20175,], ["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",20168,], +["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20175,], ["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",20168,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20168,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20168,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20168,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20168,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20168,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20168,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20168,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20168,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20168,], +["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20175,], +["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20175,], +["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20175,], +["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20178,], +["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20175,], +["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20178,], +["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20175,], +["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20175,], +["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20175,], +["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20175,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20178,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20178,], +["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20175,], +["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20175,], +["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20178,], +["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20175,], +["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20178,], ["libraries.textcomposer_TextComposerVoice_Day_0_en","libraries.textcomposer_TextComposerVoice_Night_0_en",0,], ["libraries.designsystem.theme.components_TextDark_Text_en","",0,], ["libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en","",0,], @@ -1198,14 +1220,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","",20168,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20168,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20168,], +["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20175,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20175,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20175,], ["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",20168,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20168,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20175,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20175,], ["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,], @@ -1215,18 +1237,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",20168,], +["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20168,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20175,], ["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,], @@ -1234,18 +1256,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",20168,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20168,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20175,], ["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",20171,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20168,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20168,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20168,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20175,], ["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,], @@ -1254,40 +1276,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",20168,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20175,], ["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",20168,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20175,], ["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","",20168,], +["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20175,], ["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",20168,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20168,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20175,], ["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",20168,], +["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20168,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20168,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20168,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20175,], +["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20168,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20175,], ["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",20168,], +["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20175,], ["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,], @@ -1296,8 +1318,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",20168,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20168,], +["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20175,], +["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20175,], ["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,], @@ -1312,8 +1334,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",20168,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20168,], +["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20175,], ["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,], @@ -1336,95 +1358,95 @@ 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",20168,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20168,], +["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20175,], ["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",20168,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20168,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20168,], +["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20175,], ["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",20168,], +["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20175,], ["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",20168,], +["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20175,], ["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",20168,], +["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20175,], ["features.messages.impl.timeline_TimelineView_Day_9_en","features.messages.impl.timeline_TimelineView_Night_9_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",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20168,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20168,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20175,], ["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",20168,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20168,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20168,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20168,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20168,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20168,], +["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20175,], ["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","",20168,], +["libraries.matrix.ui.components_UnresolvedUserRow_en","",20175,], ["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",20168,], -["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20168,], -["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20168,], -["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20168,], +["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20175,], +["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20175,], +["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20175,], +["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20175,], ["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",20168,], +["features.createroom.impl.components_UserListView_Day_7_en","features.createroom.impl.components_UserListView_Night_7_en",20175,], ["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",20168,], +["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20175,], ["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",20168,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20168,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20168,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20168,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20168,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20168,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20168,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20168,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20168,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20168,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20168,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20168,], +["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20175,], +["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20175,], +["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20175,], +["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20175,], +["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20175,], +["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20175,], +["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20175,], +["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20175,], +["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20175,], +["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20175,], +["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20175,], +["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20175,], ["features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_0_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_0_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_10_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_10_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_11_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_11_en",20168,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_0_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_0_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_10_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_10_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_11_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_11_en",20175,], ["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_12_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_12_en",0,], ["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_13_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_13_en",0,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_1_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_1_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_2_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_2_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_3_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_3_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_4_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_4_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_5_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_5_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_6_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_6_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_7_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_7_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_8_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_8_en",20168,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_9_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_9_en",20168,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_1_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_1_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_2_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_2_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_3_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_3_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_4_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_4_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_5_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_5_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_6_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_6_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_7_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_7_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_8_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_8_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_9_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_9_en",20175,], ["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en",0,], ["features.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",20171,], +["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20175,], ["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,], @@ -1443,6 +1465,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",20168,], +["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20175,], ["libraries.designsystem.ruler_WithRulers_Day_0_en","libraries.designsystem.ruler_WithRulers_Night_0_en",0,], ]; From 5a0765833f4c61fc72cf69fcb2d472eccde44b95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 09:38:28 +0200 Subject: [PATCH 21/54] fix(deps): update dependency com.google.firebase:firebase-bom to v33.12.0 (#4508) 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 c2b9ce0f7b..0d20aaef87 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -77,7 +77,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.11.0" +google_firebase_bom = "com.google.firebase:firebase-bom:33.12.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 3b359483a1d1b3e142d573c8924533a676ea6783 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 1 Apr 2025 09:44:06 +0200 Subject: [PATCH 22/54] Add video autoplay to media gallery (#4499) * Add video autoplay when opening the video from either the timeline or the media gallery * Only autoplay when the video is first displayed --- .../impl/datasource/MediaGalleryDataSource.kt | 13 ++++++---- .../mediaviewer/impl/local/LocalMediaView.kt | 2 ++ .../impl/local/audio/MediaAudioView.kt | 1 + .../player/MediaPlayerControllerState.kt | 1 + .../MediaPlayerControllerStateProvider.kt | 2 ++ .../impl/local/video/MediaVideoView.kt | 26 ++++++++++++++++--- .../impl/viewer/MediaViewerDataSource.kt | 2 +- .../impl/viewer/MediaViewerPresenter.kt | 1 + .../impl/viewer/MediaViewerState.kt | 1 + .../impl/viewer/MediaViewerStateProvider.kt | 2 ++ .../impl/viewer/MediaViewerView.kt | 12 +++++++-- 11 files changed, 52 insertions(+), 11 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt index 4ad36d8827..1dc81a11e3 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaGalleryDataSource.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.launchIn @@ -85,11 +86,13 @@ class TimelineMediaGalleryDataSource @Inject constructor( } }.flatMapLatest { timelineMediaItemsFactory.timelineItems - }.map { timelineItems -> - mediaItemsPostProcessor.process(mediaItems = timelineItems) - }.map { - mediaTimeline.orCache(it) - }.onEach { groupedMediaItems -> + } + .distinctUntilChanged() + .map { timelineItems -> + val groupedItems = mediaItemsPostProcessor.process(mediaItems = timelineItems) + mediaTimeline.orCache(groupedItems) + } + .onEach { groupedMediaItems -> groupedMediaItemsFlow.emit(AsyncData.Success(groupedMediaItems)) } .onCompletion { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaView.kt index 10ac3a7c2a..bec02c7fd8 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/LocalMediaView.kt @@ -31,6 +31,7 @@ fun LocalMediaView( textFileViewer: TextFileViewer, modifier: Modifier = Modifier, isDisplayed: Boolean = true, + isUserSelected: Boolean = false, localMediaViewState: LocalMediaViewState = rememberLocalMediaViewState(), mediaInfo: MediaInfo? = localMedia?.info, ) { @@ -47,6 +48,7 @@ fun LocalMediaView( localMediaViewState = localMediaViewState, bottomPaddingInPixels = bottomPaddingInPixels, localMedia = localMedia, + autoplay = isUserSelected, modifier = modifier, ) mimeType == MimeTypes.PlainText -> TextFileView( diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt index 684b96cb9f..028a25999f 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/audio/MediaAudioView.kt @@ -111,6 +111,7 @@ private fun ExoPlayerMediaAudioView( MediaPlayerControllerState( isVisible = true, isPlaying = false, + isReady = false, progressInMillis = 0, durationInMillis = 0, canMute = false, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerState.kt index 349044439e..6160b6758c 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerState.kt @@ -12,6 +12,7 @@ import androidx.annotation.FloatRange data class MediaPlayerControllerState( val isVisible: Boolean, val isPlaying: Boolean, + val isReady: Boolean, val progressInMillis: Long, val durationInMillis: Long, val canMute: Boolean, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerStateProvider.kt index 88e4c2f7c7..2ce66a79e3 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/local/player/MediaPlayerControllerStateProvider.kt @@ -27,6 +27,7 @@ open class MediaPlayerControllerStateProvider : PreviewParameterProvider> { + internal fun dataFlow(): Flow> { return galleryDataSource.groupedMediaItemsFlow() .map { groupedItems -> when (groupedItems) { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt index f897984578..858e3e7916 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerPresenter.kt @@ -148,6 +148,7 @@ class MediaViewerPresenter @AssistedInject constructor( } return MediaViewerState( + initiallySelectedEventId = inputs.eventId, listData = data.value, currentIndex = currentIndex.intValue, snackbarMessage = snackbarMessage, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt index 32c22b0470..5a0c4c2307 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerState.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetSta import kotlinx.collections.immutable.ImmutableList data class MediaViewerState( + val initiallySelectedEventId: EventId?, val listData: ImmutableList, val currentIndex: Int, val snackbarMessage: SnackbarMessage?, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt index 6686cd9fce..324b093325 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerStateProvider.kt @@ -12,6 +12,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.components.media.aWaveForm +import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaviewer.api.MediaInfo @@ -202,6 +203,7 @@ fun aMediaViewerState( mediaBottomSheetState: MediaBottomSheetState = MediaBottomSheetState.Hidden, eventSink: (MediaViewerEvents) -> Unit = {}, ) = MediaViewerState( + initiallySelectedEventId = EventId("\$a:b"), listData = listData.toPersistentList(), currentIndex = currentIndex, snackbarMessage = null, diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/viewer/MediaViewerView.kt index 501c434674..a55846106b 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 @@ -142,8 +142,13 @@ fun MediaViewerView( Box( modifier = Modifier.fillMaxSize() ) { + val isDisplayed = remember(pagerState.settledPage) { + // This 'item provider' lambda will be called when the data source changes with an outdated `settlePage` value + // So we need to update this value only when the `settledPage` value changes. It seems like a bug that needs to be fixed in Compose. + page == pagerState.settledPage + } MediaViewerPage( - isDisplayed = page == pagerState.settledPage, + isDisplayed = isDisplayed, showOverlay = showOverlay, bottomPaddingInPixels = bottomPaddingInPixels, data = dataForPage, @@ -157,7 +162,8 @@ fun MediaViewerView( }, onShowOverlayChange = { showOverlay = it - } + }, + isUserSelected = (state.listData[page] as? MediaViewerPageData.MediaViewerData)?.eventId == state.initiallySelectedEventId, ) // Bottom bar AnimatedVisibility(visible = showOverlay, enter = fadeIn(), exit = fadeOut()) { @@ -273,6 +279,7 @@ private fun MediaViewerPage( bottomPaddingInPixels: Int, data: MediaViewerPageData.MediaViewerData, textFileViewer: TextFileViewer, + isUserSelected: Boolean, onDismiss: () -> Unit, onRetry: () -> Unit, onDismissError: () -> Unit, @@ -328,6 +335,7 @@ private fun MediaViewerPage( currentOnShowOverlayChange(!currentShowOverlay) } }, + isUserSelected = isUserSelected, ) ThumbnailView( mediaInfo = data.mediaInfo, From 3bff64b92a9730fd748cb118c20a7d279b19caa5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 1 Apr 2025 11:38:46 +0200 Subject: [PATCH 23/54] Add kick (remove) confirmation and reason (#4507) * Add confirmation dialog when kicking someone, ith ability to provide a reason. Also add the reason for banning people. * Fix padding issue in dialogs. * Improve TextField in dialog. * Update screenshots * Fix tests * Format and import * Add missing UI tests. * Use `needsConfirmation` as it's already used in the code base. --------- Co-authored-by: ElementBot --- .../moderation/ConfirmingWithReason.kt | 14 +++ .../moderation/RoomMembersModerationEvents.kt | 4 +- .../RoomMembersModerationPresenter.kt | 34 ++++--- .../RoomMembersModerationStateProvider.kt | 20 +++- .../moderation/RoomMembersModerationView.kt | 93 +++++++++++++++++-- .../impl/src/main/res/values/localazy.xml | 3 + .../RoomMembersModerationPresenterTest.kt | 46 ++++++--- .../RoomMembersModerationViewTest.kt | 80 ++++++++++++++-- .../components/dialogs/ListDialog.kt | 15 ++- .../components/list/TextFieldListItem.kt | 47 ++++++++-- .../android/libraries/matrix/test/TestData.kt | 1 + .../src/main/res/values/localazy.xml | 1 + ...on_RoomMembersModerationView_Day_10_en.png | 3 + ...on_RoomMembersModerationView_Day_11_en.png | 3 + ...on_RoomMembersModerationView_Day_12_en.png | 3 + ...ion_RoomMembersModerationView_Day_3_en.png | 4 +- ...ion_RoomMembersModerationView_Day_4_en.png | 4 +- ...ion_RoomMembersModerationView_Day_5_en.png | 4 +- ...ion_RoomMembersModerationView_Day_6_en.png | 4 +- ...ion_RoomMembersModerationView_Day_7_en.png | 4 +- ...ion_RoomMembersModerationView_Day_8_en.png | 4 +- ..._RoomMembersModerationView_Night_10_en.png | 3 + ..._RoomMembersModerationView_Night_11_en.png | 3 + ..._RoomMembersModerationView_Night_12_en.png | 3 + ...n_RoomMembersModerationView_Night_3_en.png | 4 +- ...n_RoomMembersModerationView_Night_4_en.png | 4 +- ...n_RoomMembersModerationView_Night_5_en.png | 4 +- ...n_RoomMembersModerationView_Night_6_en.png | 4 +- ...n_RoomMembersModerationView_Night_7_en.png | 4 +- ...n_RoomMembersModerationView_Night_8_en.png | 4 +- ...s.dialogs_ListDialogContent_Dialogs_en.png | 4 +- ...components.dialogs_ListDialog_Day_0_en.png | 4 +- ...mponents.dialogs_ListDialog_Night_0_en.png | 4 +- ...item_with_border_-_empty_List_items_en.png | 3 + ..._item_with_border_-_text_List_items_en.png | 3 + ...nkDialogCreateLinkWithoutText_Day_0_en.png | 4 +- ...DialogCreateLinkWithoutText_Night_0_en.png | 4 +- ...tComposerLinkDialogCreateLink_Day_0_en.png | 4 +- ...omposerLinkDialogCreateLink_Night_0_en.png | 4 +- 39 files changed, 367 insertions(+), 91 deletions(-) create mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt new file mode 100644 index 0000000000..6893dda308 --- /dev/null +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt @@ -0,0 +1,14 @@ +/* + * 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.roomdetails.impl.members.moderation + +import io.element.android.libraries.architecture.AsyncAction + +data class ConfirmingWithReason( + val reason: String, +) : AsyncAction.Confirming diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt index 824c239a91..348132d9a5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt @@ -12,8 +12,8 @@ import io.element.android.libraries.matrix.api.room.RoomMember sealed interface RoomMembersModerationEvents { data class SelectRoomMember(val roomMember: RoomMember) : RoomMembersModerationEvents - data object KickUser : RoomMembersModerationEvents - data object BanUser : RoomMembersModerationEvents + data class KickUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents + data class BanUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents data class UnbanUser(val userId: UserId) : RoomMembersModerationEvents data object Reset : RoomMembersModerationEvents } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt index e9d4a91514..9baee267f2 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt @@ -96,19 +96,23 @@ class RoomMembersModerationPresenter @Inject constructor( } } is RoomMembersModerationEvents.KickUser -> { - selectedMember?.let { - coroutineScope.kickUser(it.userId, kickUserAsyncAction) - } - selectedMember = null - } - is RoomMembersModerationEvents.BanUser -> { - if (banUserAsyncAction.value.isConfirming()) { + if (event.needsConfirmation) { + kickUserAsyncAction.value = ConfirmingWithReason(event.reason) + } else { selectedMember?.let { - coroutineScope.banUser(it.userId, banUserAsyncAction) + coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction) } selectedMember = null + } + } + is RoomMembersModerationEvents.BanUser -> { + if (event.needsConfirmation) { + banUserAsyncAction.value = ConfirmingWithReason(event.reason) } else { - banUserAsyncAction.value = AsyncAction.ConfirmingNoParams + selectedMember?.let { + coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction) + } + selectedMember = null } } is RoomMembersModerationEvents.UnbanUser -> { @@ -138,18 +142,26 @@ class RoomMembersModerationPresenter @Inject constructor( private fun CoroutineScope.kickUser( userId: UserId, + reason: String, kickUserAction: MutableState>, ) = runActionAndWaitForMembershipChange(kickUserAction) { analyticsService.capture(RoomModeration(RoomModeration.Action.KickMember)) - room.kickUser(userId) + room.kickUser( + userId = userId, + reason = reason.takeIf { it.isNotBlank() }, + ) } private fun CoroutineScope.banUser( userId: UserId, + reason: String, banUserAction: MutableState>, ) = runActionAndWaitForMembershipChange(banUserAction) { analyticsService.capture(RoomModeration(RoomModeration.Action.BanMember)) - room.banUser(userId) + room.banUser( + userId = userId, + reason = reason.takeIf { it.isNotBlank() }, + ) } private fun CoroutineScope.unbanUser( diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt index 41e61d8351..a5ea00db36 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt @@ -37,10 +37,26 @@ class RoomMembersModerationStateProvider : PreviewParameterProvider { - state.eventSink(RoomMembersModerationEvents.KickUser) + state.eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) } is ModerationAction.BanUser -> { - state.eventSink(RoomMembersModerationEvents.BanUser) + state.eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) } } }, @@ -87,6 +89,47 @@ fun RoomMembersModerationView( AsyncIndicatorHost(modifier = Modifier.statusBarsPadding(), state = asyncIndicatorState) when (val action = state.kickUserAsyncAction) { + is AsyncAction.Confirming -> { + if (action is ConfirmingWithReason) { + ListDialog( + title = stringResource(R.string.screen_room_member_list_kick_member_confirmation_title), + submitText = stringResource(R.string.screen_room_member_list_kick_member_confirmation_action), + onSubmit = { + state.eventSink( + RoomMembersModerationEvents.KickUser( + reason = action.reason, + needsConfirmation = false, + ) + ) + }, + applyPaddingToContents = true, + onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, + ) { + item { + Text( + text = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description), + style = ElementTheme.materialTypography.bodyMedium, + ) + } + item { + TextFieldListItem( + placeholder = stringResource(id = CommonStrings.common_reason), + label = stringResource(id = CommonStrings.common_reason), + withBorder = true, + text = action.reason, + onTextChange = { newText -> + state.eventSink( + RoomMembersModerationEvents.KickUser( + reason = newText, + needsConfirmation = true, + ) + ) + }, + ) + } + } + } + } is AsyncAction.Loading -> { LaunchedEffect(action) { val userDisplayName = state.selectedRoomMember?.getBestName().orEmpty() @@ -113,13 +156,45 @@ fun RoomMembersModerationView( when (val action = state.banUserAsyncAction) { is AsyncAction.Confirming -> { - ConfirmationDialog( - title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title), - content = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description), - submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action), - onSubmitClick = { state.eventSink(RoomMembersModerationEvents.BanUser) }, - onDismiss = { state.eventSink(RoomMembersModerationEvents.Reset) } - ) + if (action is ConfirmingWithReason) { + ListDialog( + title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title), + submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action), + onSubmit = { + state.eventSink( + RoomMembersModerationEvents.BanUser( + reason = action.reason, + needsConfirmation = false, + ) + ) + }, + applyPaddingToContents = true, + onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, + ) { + item { + Text( + text = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description), + style = ElementTheme.materialTypography.bodyMedium, + ) + } + item { + TextFieldListItem( + placeholder = stringResource(id = CommonStrings.common_reason), + label = stringResource(id = CommonStrings.common_reason), + withBorder = true, + text = action.reason, + onTextChange = { newText -> + state.eventSink( + RoomMembersModerationEvents.BanUser( + reason = newText, + needsConfirmation = true, + ) + ) + }, + ) + } + } + } } is AsyncAction.Loading -> { LaunchedEffect(action) { diff --git a/features/roomdetails/impl/src/main/res/values/localazy.xml b/features/roomdetails/impl/src/main/res/values/localazy.xml index 62a7e48295..fb2cfc686e 100644 --- a/features/roomdetails/impl/src/main/res/values/localazy.xml +++ b/features/roomdetails/impl/src/main/res/values/localazy.xml @@ -75,6 +75,9 @@ "%1$d person" "%1$d people" + "Remove" + "They will be able to join this room again if invited." + "Are you sure you want to remove this member?" "Remove and ban member" "Remove from room" "Remove and ban member" diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt index d86fc49925..14c8669270 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt @@ -17,14 +17,18 @@ import io.element.android.features.roomdetails.impl.members.aRoomMember import io.element.android.features.roomdetails.impl.members.aVictor import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.test.A_REASON 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.FakeMatrixRoom import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.services.analytics.test.FakeAnalyticsService +import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.collections.immutable.persistentListOf @@ -153,13 +157,14 @@ class RoomMembersModerationPresenterTest { } @Test - fun `present - Kick removes the user`() = runTest { + fun `present - Kick requires confirmation and then kicks the user`() = runTest { val analyticsService = FakeAnalyticsService() + val kickUserResult = lambdaRecorder> { _, _ -> Result.success(Unit) } val room = aMatrixRoom( canKickResult = { Result.success(true) }, canBanResult = { Result.success(true) }, userRoleResult = { Result.success(RoomMember.Role.ADMIN) }, - kickUserResult = { _, _ -> Result.success(Unit) }, + kickUserResult = kickUserResult, ) val selectedMember = aVictor() val presenter = createRoomMembersModerationPresenter(matrixRoom = room, analyticsService = analyticsService) @@ -168,7 +173,15 @@ class RoomMembersModerationPresenterTest { }.test { skipItems(1) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) - awaitItem().eventSink(RoomMembersModerationEvents.KickUser) + awaitItem().eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) + val confirmingState = awaitItem() + assertThat(confirmingState.kickUserAsyncAction).isEqualTo(ConfirmingWithReason("")) + // Change the reason + confirmingState.eventSink(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = true)) + val confirmingWithReasonState = awaitItem() + assertThat(confirmingWithReasonState.kickUserAsyncAction).isEqualTo(ConfirmingWithReason(A_REASON)) + // Confirm + confirmingState.eventSink(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = false)) skipItems(1) val loadingState = awaitItem() assertThat(loadingState.actions).isEmpty() @@ -178,17 +191,22 @@ class RoomMembersModerationPresenterTest { assertThat(selectedRoomMember).isNull() } assertThat(analyticsService.capturedEvents.last()).isEqualTo(RoomModeration(RoomModeration.Action.KickMember)) + kickUserResult.assertions().isCalledOnce().with( + value(selectedMember.userId), + value(A_REASON), + ) } } @Test fun `present - BanUser requires confirmation and then bans the user`() = runTest { val analyticsService = FakeAnalyticsService() + val banUserResult = lambdaRecorder> { _, _ -> Result.success(Unit) } val room = aMatrixRoom( canKickResult = { Result.success(true) }, canBanResult = { Result.success(true) }, userRoleResult = { Result.success(RoomMember.Role.ADMIN) }, - banUserResult = { _, _ -> Result.success(Unit) }, + banUserResult = banUserResult, ) val selectedMember = aVictor() val presenter = createRoomMembersModerationPresenter(matrixRoom = room, analyticsService = analyticsService) @@ -197,12 +215,15 @@ class RoomMembersModerationPresenterTest { }.test { skipItems(1) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) - awaitItem().eventSink(RoomMembersModerationEvents.BanUser) + awaitItem().eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) val confirmingState = awaitItem() - assertThat(confirmingState.banUserAsyncAction).isEqualTo(AsyncAction.ConfirmingNoParams) - + assertThat(confirmingState.banUserAsyncAction).isEqualTo(ConfirmingWithReason("")) + // Change the reason + confirmingState.eventSink(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = true)) + val confirmingWithReasonState = awaitItem() + assertThat(confirmingWithReasonState.banUserAsyncAction).isEqualTo(ConfirmingWithReason(A_REASON)) // Confirm - confirmingState.eventSink(RoomMembersModerationEvents.BanUser) + confirmingState.eventSink(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = false)) skipItems(1) val loadingItem = awaitItem() assertThat(loadingItem.actions).isEmpty() @@ -213,6 +234,10 @@ class RoomMembersModerationPresenterTest { assertThat(selectedRoomMember).isNull() } assertThat(analyticsService.capturedEvents.last()).isEqualTo(RoomModeration(RoomModeration.Action.BanMember)) + banUserResult.assertions().isCalledOnce().with( + value(selectedMember.userId), + value(A_REASON), + ) } } @@ -289,7 +314,7 @@ class RoomMembersModerationPresenterTest { val initialItem = awaitItem() // Kick user and fail awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(aVictor())) - awaitItem().eventSink(RoomMembersModerationEvents.KickUser) + awaitItem().eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = false)) skipItems(1) assertThat(awaitItem().kickUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().kickUserAsyncAction).isInstanceOf(AsyncAction.Failure::class.java) @@ -299,8 +324,7 @@ class RoomMembersModerationPresenterTest { // Ban user and fail initialItem.eventSink(RoomMembersModerationEvents.SelectRoomMember(aVictor())) - awaitItem().eventSink(RoomMembersModerationEvents.BanUser) - awaitItem().eventSink(RoomMembersModerationEvents.BanUser) + awaitItem().eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = false)) skipItems(1) assertThat(awaitItem().banUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().banUserAsyncAction).isInstanceOf(AsyncAction.Failure::class.java) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt index 6fc9b8a20f..bbf988d9ee 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt @@ -10,11 +10,13 @@ package io.element.android.features.roomdetails.impl.members.moderation import androidx.activity.ComponentActivity import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performTextInput import androidx.test.ext.junit.runners.AndroidJUnit4 import io.element.android.features.roomdetails.impl.R import io.element.android.features.roomdetails.impl.members.anAlice -import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.test.A_REASON import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.tests.testutils.EnsureNeverCalledWithParam import io.element.android.tests.testutils.EventsRecorder @@ -92,7 +94,57 @@ class RoomMembersModerationViewTest { rule.clickOn(R.string.screen_room_member_list_manage_member_remove) // Give time for the bottom sheet to animate rule.mainClock.advanceTimeBy(1_000) - eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser) + eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) + } + + @Test + fun `cancelling 'Remove member' confirmation emits the expected event`() { + val eventsRecorder = EventsRecorder() + val roomMember = anAlice() + val state = aRoomMembersModerationState( + selectedRoomMember = roomMember, + kickUserAsyncAction = ConfirmingWithReason(A_REASON), + eventSink = eventsRecorder + ) + rule.setRoomMembersModerationView( + state = state, + ) + // Note: the string key semantics is not perfect here :/ + rule.clickOn(CommonStrings.action_cancel) + eventsRecorder.assertSingle(RoomMembersModerationEvents.Reset) + } + + @Test + fun `confirming 'Remove member' reason edition emits the expected event`() { + val eventsRecorder = EventsRecorder() + val roomMember = anAlice() + val state = aRoomMembersModerationState( + selectedRoomMember = roomMember, + kickUserAsyncAction = ConfirmingWithReason(A_REASON), + eventSink = eventsRecorder + ) + rule.setRoomMembersModerationView( + state = state, + ) + rule.onNodeWithText(A_REASON).performTextInput("z") + eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = "z$A_REASON", needsConfirmation = true)) + } + + @Test + fun `confirming 'Remove member' confirmation emits the expected event`() { + val eventsRecorder = EventsRecorder() + val roomMember = anAlice() + val state = aRoomMembersModerationState( + selectedRoomMember = roomMember, + kickUserAsyncAction = ConfirmingWithReason(A_REASON), + eventSink = eventsRecorder + ) + rule.setRoomMembersModerationView( + state = state, + ) + // Note: the string key semantics is not perfect here :/ + rule.clickOn(R.string.screen_room_member_list_kick_member_confirmation_action) + eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = false)) } @Config(qualifiers = "h1024dp") @@ -116,7 +168,7 @@ class RoomMembersModerationViewTest { rule.clickOn(R.string.screen_room_member_list_manage_member_remove_confirmation_ban) // Give time for the bottom sheet to animate rule.mainClock.advanceTimeBy(1_000) - eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser) + eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) } @Test @@ -125,7 +177,7 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - banUserAsyncAction = AsyncAction.ConfirmingNoParams, + banUserAsyncAction = ConfirmingWithReason(A_REASON), eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -136,13 +188,29 @@ class RoomMembersModerationViewTest { eventsRecorder.assertSingle(RoomMembersModerationEvents.Reset) } + @Test + fun `confirming 'Remove and ban member' reason edition emits the expected event`() { + val eventsRecorder = EventsRecorder() + val roomMember = anAlice() + val state = aRoomMembersModerationState( + selectedRoomMember = roomMember, + banUserAsyncAction = ConfirmingWithReason(A_REASON), + eventSink = eventsRecorder + ) + rule.setRoomMembersModerationView( + state = state, + ) + rule.onNodeWithText(A_REASON).performTextInput("z") + eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = "z$A_REASON", needsConfirmation = true)) + } + @Test fun `confirming 'Remove and ban member' confirmation emits the expected event`() { val eventsRecorder = EventsRecorder() val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - banUserAsyncAction = AsyncAction.ConfirmingNoParams, + banUserAsyncAction = ConfirmingWithReason(A_REASON), eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -150,7 +218,7 @@ class RoomMembersModerationViewTest { ) // Note: the string key semantics is not perfect here :/ rule.clickOn(R.string.screen_room_member_list_ban_member_confirmation_action) - eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser) + eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = false)) } @Test diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt index 0f8f1e43d8..945384e832 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt @@ -38,6 +38,7 @@ fun ListDialog( cancelText: String = stringResource(CommonStrings.action_cancel), submitText: String = stringResource(CommonStrings.action_ok), enabled: Boolean = true, + applyPaddingToContents: Boolean = false, listItems: LazyListScope.() -> Unit, ) { val decoratedSubtitle: @Composable (() -> Unit)? = subtitle?.let { @@ -61,6 +62,7 @@ fun ListDialog( onSubmitClick = onSubmit, enabled = enabled, listItems = listItems, + applyPaddingToContents = applyPaddingToContents, ) } } @@ -72,8 +74,9 @@ private fun ListDialogContent( onSubmitClick: () -> Unit, cancelText: String, submitText: String, - title: String? = null, - enabled: Boolean = true, + title: String?, + enabled: Boolean, + applyPaddingToContents: Boolean, subtitle: @Composable (() -> Unit)? = null, ) { SimpleAlertDialogContent( @@ -84,10 +87,12 @@ private fun ListDialogContent( onCancelClick = onDismissRequest, onSubmitClick = onSubmitClick, enabled = enabled, - applyPaddingToContents = false, + applyPaddingToContents = applyPaddingToContents, ) { + // No start padding if padding is already applied to the content + val horizontalPadding = if (applyPaddingToContents) 0.dp else 8.dp LazyColumn( - modifier = Modifier.padding(start = 8.dp) + modifier = Modifier.padding(horizontal = horizontalPadding) ) { listItems() } } } @@ -111,6 +116,8 @@ internal fun ListDialogContentPreview() { onSubmitClick = {}, cancelText = "Cancel", submitText = "Save", + enabled = true, + applyPaddingToContents = false, ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt index 299b41ad94..76429348cf 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt @@ -29,6 +29,8 @@ fun TextFieldListItem( modifier: Modifier = Modifier, error: String? = null, maxLines: Int = 1, + withBorder: Boolean = false, + label: String? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, ) { @@ -38,12 +40,17 @@ fun TextFieldListItem( value = text, onValueChange = { onTextChange(it) }, placeholder = placeholder?.let { @Composable { Text(it) } }, - colors = OutlinedTextFieldDefaults.colors( - disabledBorderColor = Color.Transparent, - errorBorderColor = Color.Transparent, - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - ), + label = label?.let { @Composable { Text(it) } }, + colors = if (withBorder) { + OutlinedTextFieldDefaults.colors() + } else { + OutlinedTextFieldDefaults.colors( + disabledBorderColor = Color.Transparent, + errorBorderColor = Color.Transparent, + focusedBorderColor = Color.Transparent, + unfocusedBorderColor = Color.Transparent, + ) + }, isError = error != null, supportingText = error?.let { @Composable { Text(it) } }, keyboardOptions = keyboardOptions, @@ -124,3 +131,31 @@ internal fun TextFieldListItemTextFieldValuePreview() { ) } } + +@Preview("Text field List item with border - empty", group = PreviewGroup.ListItems) +@Composable +internal fun TextFieldListItemWithBorderEmptyPreview() { + ElementThemedPreview { + TextFieldListItem( + placeholder = "Placeholder", + label = "Label", + text = "", + withBorder = true, + onTextChange = {}, + ) + } +} + +@Preview("Text field List item with border - text", group = PreviewGroup.ListItems) +@Composable +internal fun TextFieldListItemWithBorderPreview() { + ElementThemedPreview { + TextFieldListItem( + placeholder = "Placeholder", + label = "Label", + text = "Text", + withBorder = true, + onTextChange = {}, + ) + } +} diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt index 509fac833c..7f9e218697 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/TestData.kt @@ -63,6 +63,7 @@ const val A_MESSAGE = "Hello world!" const val A_REPLY = "OK, I'll be there!" const val ANOTHER_MESSAGE = "Hello universe!" const val A_CAPTION = "A media caption" +const val A_REASON = "A reason" const val A_REDACTION_REASON = "A redaction reason" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index d857db0555..3c3a90cf63 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -228,6 +228,7 @@ Reason: %1$s." "Privacy policy" "Reaction" "Reactions" + "Reason" "Recovery key" "Refreshing…" "Replying to %1$s" diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png new file mode 100644 index 0000000000..6f43e3db48 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f83d60c7e1d963ccef24668c219bd9df36494dc8bd8f57af7aa63a3b73ee6882 +size 7545 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png new file mode 100644 index 0000000000..d220520bfc --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b323796ccdf27e5c445aa02e3f7b73f65df961dd88f3ee480efcba14d8038281 +size 19426 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png new file mode 100644 index 0000000000..1b6fb4bab8 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 +size 3642 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png index 908e311bb1..80c195780c 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d06a58bb3b3fe7b01740cc04ed3128d24a13717be84cb4a70ced228d2256b41 -size 9435 +oid sha256:b9a5256bf2af8a8e9ee87bbab2ebdc7cd5823bc6b2cfde6267a68bd797e6eb61 +size 29650 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png index 31231ab57a..e1c80c4a3c 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:571207325446195a58251e7ece1ecaabc8a782cbb526315abe2a82f21e6441eb -size 9006 +oid sha256:501ebaae1e09a4f7853b574b788ddb3a73cd470d37d5dbef1f46b2967761e612 +size 31207 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png index 1b6fb4bab8..908e311bb1 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 -size 3642 +oid sha256:2d06a58bb3b3fe7b01740cc04ed3128d24a13717be84cb4a70ced228d2256b41 +size 9435 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png index 6f43e3db48..27ac4de00f 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f83d60c7e1d963ccef24668c219bd9df36494dc8bd8f57af7aa63a3b73ee6882 -size 7545 +oid sha256:39b34e0940f38ab0d66ba68b61c07ba70a51acfb54f995eedce800231ea6a2c5 +size 28257 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png index 34ded1ba23..bf62183c98 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16685ff4d5d52c5cb15f87fd14178cf791a85f3295b9869f997f4dac9fda1373 -size 25819 +oid sha256:96e0f2e3c32eedf2c85e243661a7947d28cbfe2eee7df81b239c5331770e7f7c +size 29835 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png index d220520bfc..31231ab57a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b323796ccdf27e5c445aa02e3f7b73f65df961dd88f3ee480efcba14d8038281 -size 19426 +oid sha256:571207325446195a58251e7ece1ecaabc8a782cbb526315abe2a82f21e6441eb +size 9006 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png new file mode 100644 index 0000000000..08349f1edb --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba213b12d181b04695b9271670cb7d96ce83dfccc3c2031ee002ba1cf180cc8d +size 6408 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png new file mode 100644 index 0000000000..51ce6077b5 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9def02bcb5784681dc26327791510a9a25f0772644cdae363d7a4b90e69067c +size 17479 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png new file mode 100644 index 0000000000..d6fd8eeb70 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd +size 3659 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png index 13b79b35d3..091915ab82 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273043114950e000953fbede780f3ad8adcce9d3d579edea2cad58f8e3c48881 -size 8175 +oid sha256:e07ab4816ff009eaa26e1f3cf69b613a9a34baea0dd55e0eface745ee7328758 +size 27486 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png index 3631712dc9..3a9c0ea87a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b0d51e2c5b255fb2f94959734293d4b7807f002acb0217c84856f0002297293 -size 7636 +oid sha256:83e72d7332d7574dd2f4ea42b9fa18995359720b18105f08bfde1f7f14cf8725 +size 29080 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png index d6fd8eeb70..13b79b35d3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd -size 3659 +oid sha256:273043114950e000953fbede780f3ad8adcce9d3d579edea2cad58f8e3c48881 +size 8175 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png index 08349f1edb..9144b78743 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba213b12d181b04695b9271670cb7d96ce83dfccc3c2031ee002ba1cf180cc8d -size 6408 +oid sha256:19483b4fae4026098273e6e4c941592074f08b3e7f9fa44e759bdab9daf2b27a +size 26233 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png index 1e509dbffd..34963bd636 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dfb80116e111dcc2fff42ea4a6c26e2857eecfbfcdb6a43d09aaaaf63a990fca -size 24019 +oid sha256:0c36a1bfdfdf92ac180436b8c4aef3d017911119f10f02e2a940b5ab242ac324 +size 27856 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png index 51ce6077b5..3631712dc9 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9def02bcb5784681dc26327791510a9a25f0772644cdae363d7a4b90e69067c -size 17479 +oid sha256:2b0d51e2c5b255fb2f94959734293d4b7807f002acb0217c84856f0002297293 +size 7636 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png index c920765764..9c9335b1b2 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24d042c0c4e9f9d01c5937d42cf16d05ad24e2d8cfd8026038126531b8304cd4 -size 30195 +oid sha256:114c59fd334979528721e0409e22096a058f965b0cfb5b7860816590d7c84652 +size 29924 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png index bce67de223..83dccb1356 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:390153008f59d4915895498d3d6fa3354502f3f3a902b3ae5e53045aec27432d -size 18116 +oid sha256:c5f9152fbdce0823fb728586486e8625f96caceb23b69685680313b62a81c1a8 +size 18073 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png index 7de5764954..bedc583552 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ad10053328a529721e5f6564e493e4d0ea1d9e4e098867f1a4daa938396d712 -size 16273 +oid sha256:1d324a3cf4090c18459f06753d28bee13102457da07ef17358a7d65797df965b +size 16234 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png new file mode 100644 index 0000000000..1d1eb1de3a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dc297457b140b0bcf72fb3de3e2fd8061983ab70ad2d5299cc5ba85d5a7db55 +size 7270 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png new file mode 100644 index 0000000000..7e325e90bf --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a3648b24b1640410c19eb5ee5c9808c48be5cb2dc0862d84f8419289988fd39 +size 8708 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png index 540f1b6ec4..29cc2b7605 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d966380d44d4fdfa87c17135cb540aec7b5e5d9dd433ddb9945d088b46eb76a -size 13485 +oid sha256:f4393abc83861f1ab67e0637d7192887c31d94ecad9642691bcfe87e68df3a42 +size 13422 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png index 74852be96b..3a063e589a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:808978903883f938d08c594c9a87f97774f9a0c11847088a623e199809882adb -size 11916 +oid sha256:57c8c7fa3b993fc52c3fbc2014252e8fff1395f855d6f4acd1681d843eedf2c0 +size 11825 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png index ae450922c0..602069b0e1 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce993fc311dd889c5a709941cec6224af603f3e9db62c02eda36adcb43d9c8d2 -size 14697 +oid sha256:57d2c9529a6cef0b9a009710645f92d50f93563f4f765994f6f006ef4db1d5c4 +size 14684 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png index d4209f72ff..47a56348f4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e256f644dd8cbb96d0d97c0f41e036f41f137cd09e322da9807ad7271943a6a -size 12999 +oid sha256:a43a5ebccf177014e2d7726e9a0f0cf4970252b7301843b98c5ae7e72dc34aee +size 12955 From 5c2a069c950ec0ca39d80b01dd9fbf5d2e1c2203 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 08:20:24 +0200 Subject: [PATCH 24/54] fix(deps): update dependency com.posthog:posthog-android to v3.13.1 (#4516) 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 0d20aaef87..4377649c99 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -195,7 +195,7 @@ opusencoder = "io.element.android:opusencoder:1.1.0" zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics -posthog = "com.posthog:posthog-android:3.13.0" +posthog = "com.posthog:posthog-android:3.13.1" sentry = "io.sentry:sentry-android:8.5.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 1fdb590ece8f428582bf0f8e2ece13781497a82a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Apr 2025 10:05:56 +0200 Subject: [PATCH 25/54] Improve TextFieldDialog (#4512) * Extract TextFieldDialog to its own file (no other change). * Add TextFieldDialogPreview Enhance TextFieldDialog * Let RoomMembersModerationView use TextFieldDialog * Update screenshots * Konsist. * Add modifier parameter. --------- Co-authored-by: ElementBot --- .../moderation/ConfirmingWithReason.kt | 14 -- .../moderation/RoomMembersModerationEvents.kt | 6 +- .../RoomMembersModerationPresenter.kt | 26 ++- .../RoomMembersModerationStateProvider.kt | 12 +- .../moderation/RoomMembersModerationView.kt | 111 ++++--------- .../RoomMembersModerationPresenterTest.kt | 24 +-- .../RoomMembersModerationViewTest.kt | 35 ++-- .../components/dialogs/TextFieldDialog.kt | 154 ++++++++++++++++++ .../components/list/TextFieldListItem.kt | 19 ++- .../preferences/PreferenceTextField.kt | 66 +------- .../tests/konsist/KonsistPreviewTest.kt | 2 + ...on_RoomMembersModerationView_Day_10_en.png | 4 +- ...on_RoomMembersModerationView_Day_11_en.png | 3 - ...on_RoomMembersModerationView_Day_12_en.png | 3 - ...ion_RoomMembersModerationView_Day_4_en.png | 4 +- ...ion_RoomMembersModerationView_Day_5_en.png | 4 +- ...ion_RoomMembersModerationView_Day_6_en.png | 4 +- ...ion_RoomMembersModerationView_Day_7_en.png | 4 +- ...ion_RoomMembersModerationView_Day_8_en.png | 4 +- ...ion_RoomMembersModerationView_Day_9_en.png | 4 +- ..._RoomMembersModerationView_Night_10_en.png | 4 +- ..._RoomMembersModerationView_Night_11_en.png | 3 - ..._RoomMembersModerationView_Night_12_en.png | 3 - ...n_RoomMembersModerationView_Night_4_en.png | 4 +- ...n_RoomMembersModerationView_Night_5_en.png | 4 +- ...n_RoomMembersModerationView_Night_6_en.png | 4 +- ...n_RoomMembersModerationView_Night_7_en.png | 4 +- ...n_RoomMembersModerationView_Night_8_en.png | 4 +- ...n_RoomMembersModerationView_Night_9_en.png | 4 +- ...ogs_TextFieldDialogWithBorder_Day_0_en.png | 3 + ...s_TextFieldDialogWithBorder_Night_0_en.png | 3 + ...logs_TextFieldDialogWithError_Day_0_en.png | 3 + ...gs_TextFieldDialogWithError_Night_0_en.png | 3 + ...nents.dialogs_TextFieldDialog_Day_0_en.png | 3 + ...nts.dialogs_TextFieldDialog_Night_0_en.png | 3 + 35 files changed, 291 insertions(+), 264 deletions(-) delete mode 100644 features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt delete mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt deleted file mode 100644 index 6893dda308..0000000000 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/ConfirmingWithReason.kt +++ /dev/null @@ -1,14 +0,0 @@ -/* - * 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.roomdetails.impl.members.moderation - -import io.element.android.libraries.architecture.AsyncAction - -data class ConfirmingWithReason( - val reason: String, -) : AsyncAction.Confirming diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt index 348132d9a5..eaabc8e4c2 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationEvents.kt @@ -12,8 +12,10 @@ import io.element.android.libraries.matrix.api.room.RoomMember sealed interface RoomMembersModerationEvents { data class SelectRoomMember(val roomMember: RoomMember) : RoomMembersModerationEvents - data class KickUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents - data class BanUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents + data object KickUser : RoomMembersModerationEvents + data class DoKickUser(val reason: String) : RoomMembersModerationEvents + data object BanUser : RoomMembersModerationEvents + data class DoBanUser(val reason: String) : RoomMembersModerationEvents data class UnbanUser(val userId: UserId) : RoomMembersModerationEvents data object Reset : RoomMembersModerationEvents } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt index 9baee267f2..1fea6a8146 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenter.kt @@ -96,24 +96,22 @@ class RoomMembersModerationPresenter @Inject constructor( } } is RoomMembersModerationEvents.KickUser -> { - if (event.needsConfirmation) { - kickUserAsyncAction.value = ConfirmingWithReason(event.reason) - } else { - selectedMember?.let { - coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction) - } - selectedMember = null + kickUserAsyncAction.value = AsyncAction.ConfirmingNoParams + } + is RoomMembersModerationEvents.DoKickUser -> { + selectedMember?.let { + coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction) } + selectedMember = null } is RoomMembersModerationEvents.BanUser -> { - if (event.needsConfirmation) { - banUserAsyncAction.value = ConfirmingWithReason(event.reason) - } else { - selectedMember?.let { - coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction) - } - selectedMember = null + banUserAsyncAction.value = AsyncAction.ConfirmingNoParams + } + is RoomMembersModerationEvents.DoBanUser -> { + selectedMember?.let { + coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction) } + selectedMember = null } is RoomMembersModerationEvents.UnbanUser -> { // We are already confirming when we are reaching this point diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt index a5ea00db36..9139100980 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationStateProvider.kt @@ -39,11 +39,7 @@ class RoomMembersModerationStateProvider : PreviewParameterProvider { - state.eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) + state.eventSink(RoomMembersModerationEvents.KickUser) } is ModerationAction.BanUser -> { - state.eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) + state.eventSink(RoomMembersModerationEvents.BanUser) } } }, @@ -90,45 +89,19 @@ fun RoomMembersModerationView( when (val action = state.kickUserAsyncAction) { is AsyncAction.Confirming -> { - if (action is ConfirmingWithReason) { - ListDialog( - title = stringResource(R.string.screen_room_member_list_kick_member_confirmation_title), - submitText = stringResource(R.string.screen_room_member_list_kick_member_confirmation_action), - onSubmit = { - state.eventSink( - RoomMembersModerationEvents.KickUser( - reason = action.reason, - needsConfirmation = false, - ) - ) - }, - applyPaddingToContents = true, - onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, - ) { - item { - Text( - text = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description), - style = ElementTheme.materialTypography.bodyMedium, - ) - } - item { - TextFieldListItem( - placeholder = stringResource(id = CommonStrings.common_reason), - label = stringResource(id = CommonStrings.common_reason), - withBorder = true, - text = action.reason, - onTextChange = { newText -> - state.eventSink( - RoomMembersModerationEvents.KickUser( - reason = newText, - needsConfirmation = true, - ) - ) - }, - ) - } - } - } + TextFieldDialog( + title = stringResource(R.string.screen_room_member_list_kick_member_confirmation_title), + submitText = stringResource(R.string.screen_room_member_list_kick_member_confirmation_action), + onSubmit = { reason -> + state.eventSink(RoomMembersModerationEvents.DoKickUser(reason = reason)) + }, + onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, + placeholder = stringResource(id = CommonStrings.common_reason), + label = stringResource(id = CommonStrings.common_reason), + withBorder = true, + content = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description), + value = "", + ) } is AsyncAction.Loading -> { LaunchedEffect(action) { @@ -156,45 +129,19 @@ fun RoomMembersModerationView( when (val action = state.banUserAsyncAction) { is AsyncAction.Confirming -> { - if (action is ConfirmingWithReason) { - ListDialog( - title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title), - submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action), - onSubmit = { - state.eventSink( - RoomMembersModerationEvents.BanUser( - reason = action.reason, - needsConfirmation = false, - ) - ) - }, - applyPaddingToContents = true, - onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, - ) { - item { - Text( - text = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description), - style = ElementTheme.materialTypography.bodyMedium, - ) - } - item { - TextFieldListItem( - placeholder = stringResource(id = CommonStrings.common_reason), - label = stringResource(id = CommonStrings.common_reason), - withBorder = true, - text = action.reason, - onTextChange = { newText -> - state.eventSink( - RoomMembersModerationEvents.BanUser( - reason = newText, - needsConfirmation = true, - ) - ) - }, - ) - } - } - } + TextFieldDialog( + title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title), + submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action), + onSubmit = { reason -> + state.eventSink(RoomMembersModerationEvents.DoBanUser(reason = reason)) + }, + onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, + placeholder = stringResource(id = CommonStrings.common_reason), + label = stringResource(id = CommonStrings.common_reason), + withBorder = true, + content = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description), + value = "", + ) } is AsyncAction.Loading -> { LaunchedEffect(action) { diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt index 14c8669270..66e7f6bd90 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationPresenterTest.kt @@ -173,15 +173,11 @@ class RoomMembersModerationPresenterTest { }.test { skipItems(1) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) - awaitItem().eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) + awaitItem().eventSink(RoomMembersModerationEvents.KickUser) val confirmingState = awaitItem() - assertThat(confirmingState.kickUserAsyncAction).isEqualTo(ConfirmingWithReason("")) - // Change the reason - confirmingState.eventSink(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = true)) - val confirmingWithReasonState = awaitItem() - assertThat(confirmingWithReasonState.kickUserAsyncAction).isEqualTo(ConfirmingWithReason(A_REASON)) + assertThat(confirmingState.kickUserAsyncAction).isEqualTo(AsyncAction.ConfirmingNoParams) // Confirm - confirmingState.eventSink(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = false)) + confirmingState.eventSink(RoomMembersModerationEvents.DoKickUser(reason = A_REASON)) skipItems(1) val loadingState = awaitItem() assertThat(loadingState.actions).isEmpty() @@ -215,15 +211,11 @@ class RoomMembersModerationPresenterTest { }.test { skipItems(1) awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(selectedMember)) - awaitItem().eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) + awaitItem().eventSink(RoomMembersModerationEvents.BanUser) val confirmingState = awaitItem() - assertThat(confirmingState.banUserAsyncAction).isEqualTo(ConfirmingWithReason("")) - // Change the reason - confirmingState.eventSink(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = true)) - val confirmingWithReasonState = awaitItem() - assertThat(confirmingWithReasonState.banUserAsyncAction).isEqualTo(ConfirmingWithReason(A_REASON)) + assertThat(confirmingState.banUserAsyncAction).isEqualTo(AsyncAction.ConfirmingNoParams) // Confirm - confirmingState.eventSink(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = false)) + confirmingState.eventSink(RoomMembersModerationEvents.DoBanUser(reason = A_REASON)) skipItems(1) val loadingItem = awaitItem() assertThat(loadingItem.actions).isEmpty() @@ -314,7 +306,7 @@ class RoomMembersModerationPresenterTest { val initialItem = awaitItem() // Kick user and fail awaitItem().eventSink(RoomMembersModerationEvents.SelectRoomMember(aVictor())) - awaitItem().eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = false)) + awaitItem().eventSink(RoomMembersModerationEvents.DoKickUser(reason = "")) skipItems(1) assertThat(awaitItem().kickUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().kickUserAsyncAction).isInstanceOf(AsyncAction.Failure::class.java) @@ -324,7 +316,7 @@ class RoomMembersModerationPresenterTest { // Ban user and fail initialItem.eventSink(RoomMembersModerationEvents.SelectRoomMember(aVictor())) - awaitItem().eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = false)) + awaitItem().eventSink(RoomMembersModerationEvents.DoBanUser(reason = "")) skipItems(1) assertThat(awaitItem().banUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().banUserAsyncAction).isInstanceOf(AsyncAction.Failure::class.java) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt index bbf988d9ee..14c550d0c4 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationViewTest.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.test.performTextInput import androidx.test.ext.junit.runners.AndroidJUnit4 import io.element.android.features.roomdetails.impl.R import io.element.android.features.roomdetails.impl.members.anAlice +import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.test.A_REASON import io.element.android.libraries.ui.strings.CommonStrings @@ -94,7 +95,7 @@ class RoomMembersModerationViewTest { rule.clickOn(R.string.screen_room_member_list_manage_member_remove) // Give time for the bottom sheet to animate rule.mainClock.advanceTimeBy(1_000) - eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true)) + eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser) } @Test @@ -103,7 +104,7 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - kickUserAsyncAction = ConfirmingWithReason(A_REASON), + kickUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -115,19 +116,21 @@ class RoomMembersModerationViewTest { } @Test - fun `confirming 'Remove member' reason edition emits the expected event`() { + fun `confirming 'Remove member' reason edition then validation emits the expected event`() { val eventsRecorder = EventsRecorder() val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - kickUserAsyncAction = ConfirmingWithReason(A_REASON), + kickUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( state = state, ) - rule.onNodeWithText(A_REASON).performTextInput("z") - eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = "z$A_REASON", needsConfirmation = true)) + val reason = rule.activity.getString(CommonStrings.common_reason) + rule.onNodeWithText(reason).performTextInput(A_REASON) + rule.clickOn(R.string.screen_room_member_list_kick_member_confirmation_action) + eventsRecorder.assertSingle(RoomMembersModerationEvents.DoKickUser(reason = A_REASON)) } @Test @@ -136,7 +139,7 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - kickUserAsyncAction = ConfirmingWithReason(A_REASON), + kickUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -144,7 +147,7 @@ class RoomMembersModerationViewTest { ) // Note: the string key semantics is not perfect here :/ rule.clickOn(R.string.screen_room_member_list_kick_member_confirmation_action) - eventsRecorder.assertSingle(RoomMembersModerationEvents.KickUser(reason = A_REASON, needsConfirmation = false)) + eventsRecorder.assertSingle(RoomMembersModerationEvents.DoKickUser(reason = "")) } @Config(qualifiers = "h1024dp") @@ -168,7 +171,7 @@ class RoomMembersModerationViewTest { rule.clickOn(R.string.screen_room_member_list_manage_member_remove_confirmation_ban) // Give time for the bottom sheet to animate rule.mainClock.advanceTimeBy(1_000) - eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true)) + eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser) } @Test @@ -177,7 +180,7 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - banUserAsyncAction = ConfirmingWithReason(A_REASON), + banUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -194,14 +197,16 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - banUserAsyncAction = ConfirmingWithReason(A_REASON), + banUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( state = state, ) - rule.onNodeWithText(A_REASON).performTextInput("z") - eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = "z$A_REASON", needsConfirmation = true)) + val reason = rule.activity.getString(CommonStrings.common_reason) + rule.onNodeWithText(reason).performTextInput(A_REASON) + rule.clickOn(R.string.screen_room_member_list_ban_member_confirmation_action) + eventsRecorder.assertSingle(RoomMembersModerationEvents.DoBanUser(reason = A_REASON)) } @Test @@ -210,7 +215,7 @@ class RoomMembersModerationViewTest { val roomMember = anAlice() val state = aRoomMembersModerationState( selectedRoomMember = roomMember, - banUserAsyncAction = ConfirmingWithReason(A_REASON), + banUserAsyncAction = AsyncAction.ConfirmingNoParams, eventSink = eventsRecorder ) rule.setRoomMembersModerationView( @@ -218,7 +223,7 @@ class RoomMembersModerationViewTest { ) // Note: the string key semantics is not perfect here :/ rule.clickOn(R.string.screen_room_member_list_ban_member_confirmation_action) - eventsRecorder.assertSingle(RoomMembersModerationEvents.BanUser(reason = A_REASON, needsConfirmation = false)) + eventsRecorder.assertSingle(RoomMembersModerationEvents.DoBanUser(reason = "")) } @Test diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt new file mode 100644 index 0000000000..65a18d27ff --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt @@ -0,0 +1,154 @@ +/* + * 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.dialogs + +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +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.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.components.list.TextFieldListItem +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 +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun TextFieldDialog( + title: String, + onSubmit: (String) -> Unit, + onDismissRequest: () -> Unit, + value: String?, + placeholder: String?, + modifier: Modifier = Modifier, + validation: (String?) -> Boolean = { true }, + onValidationErrorMessage: String? = null, + autoSelectOnDisplay: Boolean = true, + maxLines: Int = 1, + content: String? = null, + label: String? = null, + withBorder: Boolean = false, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + submitText: String = stringResource(CommonStrings.action_ok), +) { + val focusRequester = remember { FocusRequester() } + var textFieldContents by rememberSaveable(stateSaver = TextFieldValue.Saver) { + mutableStateOf( + TextFieldValue( + value.orEmpty(), + selection = TextRange(value.orEmpty().length) + ) + ) + } + var error by rememberSaveable { mutableStateOf(if (!validation(value.orEmpty())) onValidationErrorMessage else null) } + var canRequestFocus by rememberSaveable { mutableStateOf(false) } + val canSubmit by remember { derivedStateOf { validation(textFieldContents.text) } } + ListDialog( + title = title, + onSubmit = { onSubmit(textFieldContents.text) }, + onDismissRequest = onDismissRequest, + enabled = canSubmit, + applyPaddingToContents = content.isNullOrEmpty().not(), + submitText = submitText, + modifier = modifier, + ) { + if (content != null) { + item { + Text( + text = content, + style = ElementTheme.materialTypography.bodyMedium, + ) + } + } + item { + TextFieldListItem( + placeholder = placeholder.orEmpty(), + label = label, + withBorder = withBorder, + text = textFieldContents, + onTextChange = { + error = if (!validation(it.text)) onValidationErrorMessage else null + textFieldContents = it + }, + error = error, + keyboardOptions = keyboardOptions, + keyboardActions = KeyboardActions(onAny = { + if (validation(textFieldContents.text)) { + onSubmit(textFieldContents.text) + } + }), + maxLines = maxLines, + modifier = Modifier.focusRequester(focusRequester), + ) + canRequestFocus = true + } + } + + if (autoSelectOnDisplay && canRequestFocus) { + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + } +} + +@PreviewsDayNight +@Composable +internal fun TextFieldDialogPreview() = ElementPreview { + TextFieldDialog( + title = "Title", + value = "", + placeholder = "Placeholder", + onSubmit = {}, + onDismissRequest = {}, + ) +} + +@PreviewsDayNight +@Composable +internal fun TextFieldDialogWithBorderPreview() = ElementPreview { + TextFieldDialog( + title = "Title", + content = "Some content", + onSubmit = {}, + onDismissRequest = {}, + value = "Value", + placeholder = "Placeholder", + label = "Label", + withBorder = true, + onValidationErrorMessage = "Error message", + ) +} + +@PreviewsDayNight +@Composable +internal fun TextFieldDialogWithErrorPreview() = ElementPreview { + TextFieldDialog( + title = "Title", + content = "Some content", + onSubmit = {}, + validation = { false }, + onDismissRequest = {}, + value = "Value", + placeholder = "Placeholder", + label = "Label", + withBorder = true, + onValidationErrorMessage = "Error message", + ) +} diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt index 76429348cf..812f9d7ba4 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt @@ -70,6 +70,8 @@ fun TextFieldListItem( modifier: Modifier = Modifier, error: String? = null, maxLines: Int = 1, + withBorder: Boolean = false, + label: String? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, ) { @@ -79,12 +81,17 @@ fun TextFieldListItem( value = text, onValueChange = { onTextChange(it) }, placeholder = placeholder?.let { @Composable { Text(it) } }, - colors = OutlinedTextFieldDefaults.colors( - disabledBorderColor = Color.Transparent, - errorBorderColor = Color.Transparent, - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - ), + label = label?.let { @Composable { Text(it) } }, + colors = if (withBorder) { + OutlinedTextFieldDefaults.colors() + } else { + OutlinedTextFieldDefaults.colors( + disabledBorderColor = Color.Transparent, + errorBorderColor = Color.Transparent, + focusedBorderColor = Color.Transparent, + unfocusedBorderColor = Color.Transparent, + ) + }, isError = error != null, supportingText = error?.let { @Composable { Text(it) } }, keyboardOptions = keyboardOptions, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceTextField.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceTextField.kt index 8810c83f54..98f324f88a 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceTextField.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceTextField.kt @@ -7,24 +7,15 @@ package io.element.android.libraries.designsystem.components.preferences -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions 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.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.input.TextFieldValue -import io.element.android.libraries.designsystem.components.dialogs.ListDialog +import io.element.android.libraries.designsystem.components.dialogs.TextFieldDialog import io.element.android.libraries.designsystem.components.list.ListItemContent -import io.element.android.libraries.designsystem.components.list.TextFieldListItem import io.element.android.libraries.designsystem.theme.components.ListItem import io.element.android.libraries.designsystem.theme.components.ListItemStyle import io.element.android.libraries.designsystem.theme.components.Text @@ -74,58 +65,3 @@ fun PreferenceTextField( ) } } - -@Composable -private fun TextFieldDialog( - title: String, - onSubmit: (String) -> Unit, - onDismissRequest: () -> Unit, - value: String?, - placeholder: String?, - validation: (String?) -> Boolean = { true }, - onValidationErrorMessage: String? = null, - autoSelectOnDisplay: Boolean = true, - maxLines: Int = 1, - keyboardOptions: KeyboardOptions = KeyboardOptions.Default, -) { - val focusRequester = remember { FocusRequester() } - var textFieldContents by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue(value.orEmpty(), selection = TextRange(value.orEmpty().length))) - } - var error by rememberSaveable { mutableStateOf(null) } - var canRequestFocus by rememberSaveable { mutableStateOf(false) } - val canSubmit by remember { derivedStateOf { validation(textFieldContents.text) } } - ListDialog( - title = title, - onSubmit = { onSubmit(textFieldContents.text) }, - onDismissRequest = onDismissRequest, - enabled = canSubmit, - ) { - item { - TextFieldListItem( - placeholder = placeholder.orEmpty(), - text = textFieldContents, - onTextChange = { - error = if (!validation(it.text)) onValidationErrorMessage else null - textFieldContents = it - }, - error = error, - keyboardOptions = keyboardOptions, - keyboardActions = KeyboardActions(onAny = { - if (validation(textFieldContents.text)) { - onSubmit(textFieldContents.text) - } - }), - maxLines = maxLines, - modifier = Modifier.focusRequester(focusRequester), - ) - canRequestFocus = true - } - } - - if (autoSelectOnDisplay && canRequestFocus) { - LaunchedEffect(Unit) { - focusRequester.requestFocus() - } - } -} diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt index d3d7a1097b..3bf65574ed 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt @@ -120,6 +120,8 @@ class KonsistPreviewTest { "TextComposerSimpleNotEncryptedPreview", "TextComposerVoicePreview", "TextComposerVoiceNotEncryptedPreview", + "TextFieldDialogWithBorderPreview", + "TextFieldDialogWithErrorPreview", "TimelineImageWithCaptionRowPreview", "TimelineItemEventRowForDirectRoomPreview", "TimelineItemEventRowShieldPreview", diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png index 6f43e3db48..1b6fb4bab8 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f83d60c7e1d963ccef24668c219bd9df36494dc8bd8f57af7aa63a3b73ee6882 -size 7545 +oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 +size 3642 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png deleted file mode 100644 index d220520bfc..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_11_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b323796ccdf27e5c445aa02e3f7b73f65df961dd88f3ee480efcba14d8038281 -size 19426 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png deleted file mode 100644 index 1b6fb4bab8..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_12_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 -size 3642 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png index e1c80c4a3c..908e311bb1 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:501ebaae1e09a4f7853b574b788ddb3a73cd470d37d5dbef1f46b2967761e612 -size 31207 +oid sha256:2d06a58bb3b3fe7b01740cc04ed3128d24a13717be84cb4a70ced228d2256b41 +size 9435 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png index 908e311bb1..27ac4de00f 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d06a58bb3b3fe7b01740cc04ed3128d24a13717be84cb4a70ced228d2256b41 -size 9435 +oid sha256:39b34e0940f38ab0d66ba68b61c07ba70a51acfb54f995eedce800231ea6a2c5 +size 28257 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png index 27ac4de00f..31231ab57a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39b34e0940f38ab0d66ba68b61c07ba70a51acfb54f995eedce800231ea6a2c5 -size 28257 +oid sha256:571207325446195a58251e7ece1ecaabc8a782cbb526315abe2a82f21e6441eb +size 9006 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png index bf62183c98..1b6fb4bab8 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96e0f2e3c32eedf2c85e243661a7947d28cbfe2eee7df81b239c5331770e7f7c -size 29835 +oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 +size 3642 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png index 31231ab57a..6f43e3db48 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:571207325446195a58251e7ece1ecaabc8a782cbb526315abe2a82f21e6441eb -size 9006 +oid sha256:f83d60c7e1d963ccef24668c219bd9df36494dc8bd8f57af7aa63a3b73ee6882 +size 7545 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en.png index 1b6fb4bab8..d220520bfc 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96a867cb12498cbdc97957bee07855dfaa13602baddaf933aff2b666ef4c7650 -size 3642 +oid sha256:b323796ccdf27e5c445aa02e3f7b73f65df961dd88f3ee480efcba14d8038281 +size 19426 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png index 08349f1edb..d6fd8eeb70 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba213b12d181b04695b9271670cb7d96ce83dfccc3c2031ee002ba1cf180cc8d -size 6408 +oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd +size 3659 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png deleted file mode 100644 index 51ce6077b5..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_11_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9def02bcb5784681dc26327791510a9a25f0772644cdae363d7a4b90e69067c -size 17479 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png deleted file mode 100644 index d6fd8eeb70..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_12_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd -size 3659 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png index 3a9c0ea87a..13b79b35d3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83e72d7332d7574dd2f4ea42b9fa18995359720b18105f08bfde1f7f14cf8725 -size 29080 +oid sha256:273043114950e000953fbede780f3ad8adcce9d3d579edea2cad58f8e3c48881 +size 8175 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png index 13b79b35d3..9144b78743 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273043114950e000953fbede780f3ad8adcce9d3d579edea2cad58f8e3c48881 -size 8175 +oid sha256:19483b4fae4026098273e6e4c941592074f08b3e7f9fa44e759bdab9daf2b27a +size 26233 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png index 9144b78743..3631712dc9 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19483b4fae4026098273e6e4c941592074f08b3e7f9fa44e759bdab9daf2b27a -size 26233 +oid sha256:2b0d51e2c5b255fb2f94959734293d4b7807f002acb0217c84856f0002297293 +size 7636 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png index 34963bd636..d6fd8eeb70 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0c36a1bfdfdf92ac180436b8c4aef3d017911119f10f02e2a940b5ab242ac324 -size 27856 +oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd +size 3659 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png index 3631712dc9..08349f1edb 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b0d51e2c5b255fb2f94959734293d4b7807f002acb0217c84856f0002297293 -size 7636 +oid sha256:ba213b12d181b04695b9271670cb7d96ce83dfccc3c2031ee002ba1cf180cc8d +size 6408 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en.png index d6fd8eeb70..51ce6077b5 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5bb36ccd718f3fec5b04f1bc812dc7718b5ea7fa4619c8b031466297a8d016fd -size 3659 +oid sha256:f9def02bcb5784681dc26327791510a9a25f0772644cdae363d7a4b90e69067c +size 17479 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png new file mode 100644 index 0000000000..3a854f966d --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be0efd7f33ee57088b04aedf6c63cb8092abc0356a31636fe028e31d542e28d +size 15671 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png new file mode 100644 index 0000000000..ebd75e8e7c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7609a1d51c1be29b0d117dd968bd44b250d02e82e1630fa062da4cd280bb950 +size 13934 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png new file mode 100644 index 0000000000..e1b0620797 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4697eda8d2fb160b2cade0be583148ec0b2e55f35fe44929f98feb4c8535377 +size 17761 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png new file mode 100644 index 0000000000..86791ec94b --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2774d56a1e788567c19df9a714f1399968e75d2df6c3a4f404e3c03a30286567 +size 15951 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png new file mode 100644 index 0000000000..ec70e3fdda --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3257be6487ff2f412564bb8f188860e39b0325156533ad519c9d6852000a173a +size 13119 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png new file mode 100644 index 0000000000..b96e04508c --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:baf396f36cdc0ca5e01842f70fe0b93166fa82c11ad981c54a529f59c90b5111 +size 11469 From 1517e534a76e15c85a071722f44267256906b64c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:53:19 +0200 Subject: [PATCH 26/54] fix(deps): update dependency io.sentry:sentry-android to v8.6.0 (#4509) 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 4377649c99..544b23045a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -196,7 +196,7 @@ zxing_cpp = "io.github.zxing-cpp:android:2.3.0" # Analytics posthog = "com.posthog:posthog-android:3.13.1" -sentry = "io.sentry:sentry-android:8.5.0" +sentry = "io.sentry:sentry-android:8.6.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 2e191de343571c287d40acb8f299c02fbdbe34de Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 2 Apr 2025 11:51:39 +0200 Subject: [PATCH 27/54] Add `WakeLock` to dismiss ringing call screen when call is cancelled (#4478) * Add `WakeLock` to dismiss ringing call screen when call is cancelled We had already some checks in place to automatically cancel a ringing call notification/screen when the call was no longer active, but the `RoomInfo` updates weren't being processed because the app was 'paused'. The partial wakelock should ensure these room info updates are handled. * Add mutual exclusion to `ActiveCallManager` methods to improve thread safety --- .../call/api/ElementCallEntryPoint.kt | 2 +- .../call/impl/DefaultElementCallEntryPoint.kt | 2 +- .../receivers/DeclineCallBroadcastReceiver.kt | 10 ++- .../call/impl/ui/CallScreenPresenter.kt | 7 +- .../call/impl/ui/IncomingCallActivity.kt | 9 ++- .../call/impl/utils/ActiveCallManager.kt | 79 +++++++++++++------ .../call/DefaultElementCallEntryPointTest.kt | 14 +++- .../call/ui/CallScreenPresenterTest.kt | 44 ++++++++--- .../utils/DefaultActiveCallManagerTest.kt | 22 ++++++ .../call/utils/FakeActiveCallManager.kt | 7 +- .../call/test/FakeElementCallEntryPoint.kt | 2 +- .../push/impl/push/DefaultPushHandler.kt | 2 +- 12 files changed, 152 insertions(+), 48 deletions(-) diff --git a/features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt b/features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt index 9229681966..53e1b8c846 100644 --- a/features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt +++ b/features/call/api/src/main/kotlin/io/element/android/features/call/api/ElementCallEntryPoint.kt @@ -32,7 +32,7 @@ interface ElementCallEntryPoint { * @param notificationChannelId The id of the notification channel to use for the call notification. * @param textContent The text content of the notification. If null the default content from the system will be used. */ - fun handleIncomingCall( + suspend fun handleIncomingCall( callType: CallType.RoomCall, eventId: EventId, senderId: UserId, diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt index 290bfe0824..009840743c 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/DefaultElementCallEntryPoint.kt @@ -34,7 +34,7 @@ class DefaultElementCallEntryPoint @Inject constructor( context.startActivity(IntentProvider.createIntent(context, callType)) } - override fun handleIncomingCall( + override suspend fun handleIncomingCall( callType: CallType.RoomCall, eventId: EventId, senderId: UserId, diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt index ab6f07ce49..bbc0611083 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt @@ -16,6 +16,8 @@ import io.element.android.features.call.impl.di.CallBindings import io.element.android.features.call.impl.notifications.CallNotificationData import io.element.android.features.call.impl.utils.ActiveCallManager import io.element.android.libraries.architecture.bindings +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import javax.inject.Inject /** @@ -27,10 +29,16 @@ class DeclineCallBroadcastReceiver : BroadcastReceiver() { } @Inject lateinit var activeCallManager: ActiveCallManager + + @Inject + lateinit var appCoroutineScope: CoroutineScope + override fun onReceive(context: Context, intent: Intent?) { val notificationData = intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_NOTIFICATION_DATA, CallNotificationData::class.java) } ?: return context.bindings().inject(this) - activeCallManager.hungUpCall(callType = CallType.RoomCall(notificationData.sessionId, notificationData.roomId)) + appCoroutineScope.launch { + activeCallManager.hungUpCall(callType = CallType.RoomCall(notificationData.sessionId, notificationData.roomId)) + } } } 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 47f5682f4c..6baffd8143 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 @@ -62,6 +62,7 @@ class CallScreenPresenter @AssistedInject constructor( private val activeCallManager: ActiveCallManager, private val languageTagProvider: LanguageTagProvider, private val appForegroundStateService: AppForegroundStateService, + private val appCoroutineScope: CoroutineScope, ) : Presenter { @AssistedFactory interface Factory { @@ -87,7 +88,7 @@ class CallScreenPresenter @AssistedInject constructor( coroutineScope.launch { // Sets the call as joined activeCallManager.joinedCall(callType) - loadUrl( + fetchRoomCallUrl( inputs = callType, urlState = urlState, callWidgetDriver = callWidgetDriver, @@ -96,7 +97,7 @@ class CallScreenPresenter @AssistedInject constructor( ) } onDispose { - activeCallManager.hungUpCall(callType) + appCoroutineScope.launch { activeCallManager.hungUpCall(callType) } } } @@ -187,7 +188,7 @@ class CallScreenPresenter @AssistedInject constructor( ) } - private suspend fun loadUrl( + private suspend fun fetchRoomCallUrl( inputs: CallType, urlState: MutableState>, callWidgetDriver: MutableState, diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt index 9669285ce0..c5162d9a9e 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt @@ -24,9 +24,11 @@ import io.element.android.libraries.architecture.bindings import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.designsystem.theme.ElementThemeApp import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import javax.inject.Inject /** @@ -55,6 +57,9 @@ class IncomingCallActivity : AppCompatActivity() { @Inject lateinit var buildMeta: BuildMeta + @Inject + lateinit var appCoroutineScope: CoroutineScope + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -102,6 +107,8 @@ class IncomingCallActivity : AppCompatActivity() { private fun onCancel() { val activeCall = activeCallManager.activeCall.value ?: return - activeCallManager.hungUpCall(callType = activeCall.callType) + appCoroutineScope.launch { + activeCallManager.hungUpCall(callType = activeCall.callType) + } } } diff --git a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt index 2a12117a48..fe266d1cf6 100644 --- a/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt +++ b/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt @@ -8,8 +8,11 @@ package io.element.android.features.call.impl.utils import android.annotation.SuppressLint +import android.content.Context +import android.os.PowerManager import androidx.annotation.VisibleForTesting import androidx.core.app.NotificationManagerCompat +import androidx.core.content.getSystemService import com.squareup.anvil.annotations.ContributesBinding import io.element.android.appconfig.ElementCallConfig import io.element.android.features.call.api.CallType @@ -17,6 +20,7 @@ import io.element.android.features.call.api.CurrentCall import io.element.android.features.call.impl.notifications.CallNotificationData import io.element.android.features.call.impl.notifications.RingingCallNotificationCreator import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.MatrixClientProvider import io.element.android.libraries.push.api.notifications.ForegroundServiceType @@ -38,6 +42,8 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import timber.log.Timber import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -55,25 +61,26 @@ interface ActiveCallManager { * Registers an incoming call if there isn't an existing active call and posts a [CallState.Ringing] notification. * @param notificationData The data for the incoming call notification. */ - fun registerIncomingCall(notificationData: CallNotificationData) + suspend fun registerIncomingCall(notificationData: CallNotificationData) /** * Called when the active call has been hung up. It will remove any existing UI and the active call. * @param callType The type of call that the user hung up, either an external url one or a room one. */ - fun hungUpCall(callType: CallType) + suspend fun hungUpCall(callType: CallType) /** * Called after the user joined a call. It will remove any existing UI and set the call state as [CallState.InCall]. * * @param callType The type of call that the user joined, either an external url one or a room one. */ - fun joinedCall(callType: CallType) + suspend fun joinedCall(callType: CallType) } @SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class DefaultActiveCallManager @Inject constructor( + @ApplicationContext context: Context, private val coroutineScope: CoroutineScope, private val onMissedCallNotificationHandler: OnMissedCallNotificationHandler, private val ringingCallNotificationCreator: RingingCallNotificationCreator, @@ -83,33 +90,47 @@ class DefaultActiveCallManager @Inject constructor( ) : ActiveCallManager { private var timedOutCallJob: Job? = null + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val activeWakeLock: PowerManager.WakeLock? = context.getSystemService() + ?.takeIf { it.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK) } + ?.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "${context.packageName}:IncomingCallWakeLock") + override val activeCall = MutableStateFlow(null) + private val mutex = Mutex() + init { observeRingingCall() observeCurrentCall() } - override fun registerIncomingCall(notificationData: CallNotificationData) { - if (activeCall.value != null) { - displayMissedCallNotification(notificationData) - Timber.w("Already have an active call, ignoring incoming call: $notificationData") - return - } - activeCall.value = ActiveCall( - callType = CallType.RoomCall( - sessionId = notificationData.sessionId, - roomId = notificationData.roomId, - ), - callState = CallState.Ringing(notificationData), - ) + override suspend fun registerIncomingCall(notificationData: CallNotificationData) { + mutex.withLock { + if (activeCall.value != null) { + displayMissedCallNotification(notificationData) + Timber.w("Already have an active call, ignoring incoming call: $notificationData") + return + } + activeCall.value = ActiveCall( + callType = CallType.RoomCall( + sessionId = notificationData.sessionId, + roomId = notificationData.roomId, + ), + callState = CallState.Ringing(notificationData), + ) - timedOutCallJob = coroutineScope.launch { - showIncomingCallNotification(notificationData) + timedOutCallJob = coroutineScope.launch { + showIncomingCallNotification(notificationData) - // Wait for the ringing call to time out - delay(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds) - incomingCallTimedOut(displayMissedCallNotification = true) + // Wait for the ringing call to time out + delay(ElementCallConfig.RINGING_CALL_DURATION_SECONDS.seconds) + incomingCallTimedOut(displayMissedCallNotification = true) + } + + // Acquire a wake lock to keep the device awake during the incoming call, so we can process the room info data + if (activeWakeLock?.isHeld == false) { + activeWakeLock.acquire(ElementCallConfig.RINGING_CALL_DURATION_SECONDS * 1000L) + } } } @@ -117,10 +138,13 @@ class DefaultActiveCallManager @Inject constructor( * Called when the incoming call timed out. It will remove the active call and remove any associated UI, adding a 'missed call' notification. */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - fun incomingCallTimedOut(displayMissedCallNotification: Boolean) { + suspend fun incomingCallTimedOut(displayMissedCallNotification: Boolean) = mutex.withLock { val previousActiveCall = activeCall.value ?: return val notificationData = (previousActiveCall.callState as? CallState.Ringing)?.notificationData ?: return activeCall.value = null + if (activeWakeLock?.isHeld == true) { + activeWakeLock.release() + } cancelIncomingCallNotification() @@ -129,18 +153,24 @@ class DefaultActiveCallManager @Inject constructor( } } - override fun hungUpCall(callType: CallType) { + override suspend fun hungUpCall(callType: CallType) = mutex.withLock { if (activeCall.value?.callType != callType) { Timber.w("Call type $callType does not match the active call type, ignoring") return } cancelIncomingCallNotification() + if (activeWakeLock?.isHeld == true) { + activeWakeLock.release() + } timedOutCallJob?.cancel() activeCall.value = null } - override fun joinedCall(callType: CallType) { + override suspend fun joinedCall(callType: CallType) = mutex.withLock { cancelIncomingCallNotification() + if (activeWakeLock?.isHeld == true) { + activeWakeLock.release() + } timedOutCallJob?.cancel() activeCall.value = ActiveCall( @@ -201,6 +231,7 @@ class DefaultActiveCallManager @Inject constructor( ?.getRoom(callType.roomId) ?.roomInfoFlow ?.map { + Timber.d("Has room call status changed for ringing call: ${it.hasRoomCall}") it.hasRoomCall to (callType.sessionId in it.activeRoomCallParticipants) } ?: flowOf() diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt index 97d6dac427..86d9b80d65 100644 --- a/features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/DefaultElementCallEntryPointTest.kt @@ -20,16 +20,21 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.tests.testutils.lambda.lambdaRecorder +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.Shadows.shadowOf +import kotlin.time.Duration.Companion.seconds @RunWith(RobolectricTestRunner::class) class DefaultElementCallEntryPointTest { @Test - fun `startCall - starts ElementCallActivity setup with the needed extras`() { + fun `startCall - starts ElementCallActivity setup with the needed extras`() = runTest { val entryPoint = createEntryPoint() entryPoint.startCall(CallType.RoomCall(A_SESSION_ID, A_ROOM_ID)) @@ -39,8 +44,9 @@ class DefaultElementCallEntryPointTest { assertThat(intent.extras?.containsKey("EXTRA_CALL_TYPE")).isTrue() } + @OptIn(ExperimentalCoroutinesApi::class) @Test - fun `handleIncomingCall - registers the incoming call using ActiveCallManager`() { + fun `handleIncomingCall - registers the incoming call using ActiveCallManager`() = runTest { val registerIncomingCallLambda = lambdaRecorder {} val activeCallManager = FakeActiveCallManager(registerIncomingCallResult = registerIncomingCallLambda) val entryPoint = createEntryPoint(activeCallManager = activeCallManager) @@ -57,10 +63,12 @@ class DefaultElementCallEntryPointTest { textContent = "textContent", ) + advanceTimeBy(1.seconds) + registerIncomingCallLambda.assertions().isCalledOnce() } - private fun createEntryPoint( + private fun TestScope.createEntryPoint( activeCallManager: FakeActiveCallManager = FakeActiveCallManager(), ) = DefaultElementCallEntryPoint( context = InstrumentationRegistry.getInstrumentation().targetContext, 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 ce185bcdfc..5ec48ce6a1 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 @@ -44,12 +44,14 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test +import kotlin.time.Duration.Companion.seconds -class CallScreenPresenterTest { +@OptIn(ExperimentalCoroutinesApi::class) class CallScreenPresenterTest { @get:Rule val warmUpRule = WarmUpRule() @@ -66,7 +68,8 @@ class CallScreenPresenterTest { presenter.present() }.test { // Wait until the URL is loaded - skipItems(1) + advanceTimeBy(1.seconds) + skipItems(2) val initialState = awaitItem() assertThat(initialState.urlState).isEqualTo(AsyncData.Success("https://call.element.io")) assertThat(initialState.webViewError).isNull() @@ -101,16 +104,23 @@ class CallScreenPresenterTest { presenter.present() }.test { // Wait until the URL is loaded + advanceTimeBy(1.seconds) skipItems(1) + joinedCallLambda.assertions().isCalledOnce() val initialState = awaitItem() - assertThat(initialState.urlState).isInstanceOf(AsyncData.Success::class.java) + assertThat(initialState.urlState).isInstanceOf(AsyncData.Loading::class.java) assertThat(initialState.isCallActive).isFalse() assertThat(initialState.isInWidgetMode).isTrue() assertThat(widgetProvider.getWidgetCalled).isTrue() assertThat(widgetDriver.runCalledCount).isEqualTo(1) analyticsLambda.assertions().isCalledOnce().with(value(MobileScreen.ScreenName.RoomCall)) sendCallNotificationIfNeededLambda.assertions().isCalledOnce() + + // Wait until the WidgetDriver is loaded + skipItems(1) + + assertThat(awaitItem().urlState).isInstanceOf(AsyncData.Success::class.java) } } @@ -126,6 +136,9 @@ class CallScreenPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { + // Give it time to load the URL and WidgetDriver + advanceTimeBy(1.seconds) + val initialState = awaitItem() initialState.eventSink(CallScreenEvents.SetupMessageChannels(messageInterceptor)) @@ -141,7 +154,6 @@ class CallScreenPresenterTest { } } - @OptIn(ExperimentalCoroutinesApi::class) @Test fun `present - hang up event closes the screen and stops the widget driver`() = runTest(UnconfinedTestDispatcher()) { val navigator = FakeCallScreenNavigator() @@ -158,11 +170,15 @@ class CallScreenPresenterTest { presenter.present() }.test { val initialState = awaitItem() + + // Give it time to load the URL and WidgetDriver + advanceTimeBy(1.seconds) + initialState.eventSink(CallScreenEvents.SetupMessageChannels(messageInterceptor)) initialState.eventSink(CallScreenEvents.Hangup) - // Let background coroutines run + // Let background coroutines run and the widget drive be received runCurrent() assertThat(navigator.closeCalled).isTrue() @@ -172,7 +188,6 @@ class CallScreenPresenterTest { } } - @OptIn(ExperimentalCoroutinesApi::class) @Test fun `present - a received close message closes the screen and stops the widget driver`() = runTest(UnconfinedTestDispatcher()) { val navigator = FakeCallScreenNavigator() @@ -189,11 +204,16 @@ class CallScreenPresenterTest { presenter.present() }.test { val initialState = awaitItem() + + // Give it time to load the URL and WidgetDriver + advanceTimeBy(1.seconds) + initialState.eventSink(CallScreenEvents.SetupMessageChannels(messageInterceptor)) messageInterceptor.givenInterceptedMessage("""{"action":"io.element.close","api":"fromWidget","widgetId":"1","requestId":"1"}""") // Let background coroutines run + advanceTimeBy(1.seconds) runCurrent() assertThat(navigator.closeCalled).isTrue() @@ -218,7 +238,9 @@ class CallScreenPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { - skipItems(1) + // 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)) @@ -235,7 +257,7 @@ class CallScreenPresenterTest { } """.trimIndent() ) - skipItems(1) + skipItems(2) val finalState = awaitItem() assertThat(finalState.isCallActive).isTrue() } @@ -300,7 +322,8 @@ class CallScreenPresenterTest { presenter.present() }.test { // Wait until the URL is loaded - skipItems(1) + advanceTimeBy(1.seconds) + skipItems(2) val initialState = awaitItem() initialState.eventSink(CallScreenEvents.OnWebViewError("A Webview error")) val finalState = awaitItem() @@ -329,6 +352,8 @@ class CallScreenPresenterTest { initialState.eventSink(CallScreenEvents.OnWebViewError("A Webview error")) val finalState = awaitItem() assertThat(finalState.webViewError).isNull() + + cancelAndIgnoreRemainingEvents() } } @@ -361,6 +386,7 @@ class CallScreenPresenterTest { screenTracker = screenTracker, languageTagProvider = FakeLanguageTagProvider("en-US"), appForegroundStateService = appForegroundStateService, + appCoroutineScope = backgroundScope, ) } } diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt index ea1357c0e9..ff53b1ff77 100644 --- a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/DefaultActiveCallManagerTest.kt @@ -7,7 +7,9 @@ package io.element.android.features.call.utils +import android.os.PowerManager import androidx.core.app.NotificationManagerCompat +import androidx.core.content.getSystemService import androidx.test.platform.app.InstrumentationRegistry import com.google.common.truth.Truth.assertThat import io.element.android.features.call.api.CallType @@ -49,6 +51,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import org.robolectric.Shadows.shadowOf @RunWith(RobolectricTestRunner::class) class DefaultActiveCallManagerTest { @@ -57,10 +60,12 @@ class DefaultActiveCallManagerTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `registerIncomingCall - sets the incoming call as active`() = runTest { + setupShadowPowerManager() val notificationManagerCompat = mockk(relaxed = true) inCancellableScope { val manager = createActiveCallManager(notificationManagerCompat = notificationManagerCompat) + assertThat(manager.activeWakeLock?.isHeld).isFalse() assertThat(manager.activeCall.value).isNull() val callNotificationData = aCallNotificationData() @@ -78,6 +83,7 @@ class DefaultActiveCallManagerTest { runCurrent() + assertThat(manager.activeWakeLock?.isHeld).isTrue() verify { notificationManagerCompat.notify(notificationId, any()) } } } @@ -128,6 +134,7 @@ class DefaultActiveCallManagerTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `incomingCallTimedOut - when there is an active call removes it and adds a missed call notification`() = runTest { + setupShadowPowerManager() val notificationManagerCompat = mockk(relaxed = true) val addMissedCallNotificationLambda = lambdaRecorder { _, _, _ -> } inCancellableScope { @@ -138,11 +145,13 @@ class DefaultActiveCallManagerTest { manager.registerIncomingCall(aCallNotificationData()) assertThat(manager.activeCall.value).isNotNull() + assertThat(manager.activeWakeLock?.isHeld).isTrue() manager.incomingCallTimedOut(displayMissedCallNotification = true) advanceTimeBy(1) assertThat(manager.activeCall.value).isNull() + assertThat(manager.activeWakeLock?.isHeld).isFalse() addMissedCallNotificationLambda.assertions().isCalledOnce() verify { notificationManagerCompat.cancel(notificationId) } } @@ -150,6 +159,7 @@ class DefaultActiveCallManagerTest { @Test fun `hungUpCall - removes existing call if the CallType matches`() = runTest { + setupShadowPowerManager() val notificationManagerCompat = mockk(relaxed = true) // Create a cancellable coroutine scope to cancel the test when needed inCancellableScope { @@ -158,9 +168,11 @@ class DefaultActiveCallManagerTest { val notificationData = aCallNotificationData() manager.registerIncomingCall(notificationData) assertThat(manager.activeCall.value).isNotNull() + assertThat(manager.activeWakeLock?.isHeld).isTrue() manager.hungUpCall(CallType.RoomCall(notificationData.sessionId, notificationData.roomId)) assertThat(manager.activeCall.value).isNull() + assertThat(manager.activeWakeLock?.isHeld).isFalse() verify { notificationManagerCompat.cancel(notificationId) } } @@ -168,6 +180,7 @@ class DefaultActiveCallManagerTest { @Test fun `hungUpCall - does nothing if the CallType doesn't match`() = runTest { + setupShadowPowerManager() val notificationManagerCompat = mockk(relaxed = true) // Create a cancellable coroutine scope to cancel the test when needed inCancellableScope { @@ -175,9 +188,11 @@ class DefaultActiveCallManagerTest { manager.registerIncomingCall(aCallNotificationData()) assertThat(manager.activeCall.value).isNotNull() + assertThat(manager.activeWakeLock?.isHeld).isTrue() manager.hungUpCall(CallType.ExternalUrl("https://example.com")) assertThat(manager.activeCall.value).isNotNull() + assertThat(manager.activeWakeLock?.isHeld).isTrue() verify(exactly = 0) { notificationManagerCompat.cancel(notificationId) } } @@ -284,12 +299,19 @@ class DefaultActiveCallManagerTest { } } + private fun setupShadowPowerManager() { + shadowOf(InstrumentationRegistry.getInstrumentation().targetContext.getSystemService()).apply { + setIsWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK, true) + } + } + private fun CoroutineScope.createActiveCallManager( matrixClientProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(), onMissedCallNotificationHandler: FakeOnMissedCallNotificationHandler = FakeOnMissedCallNotificationHandler(), notificationManagerCompat: NotificationManagerCompat = mockk(relaxed = true), coroutineScope: CoroutineScope = this, ) = DefaultActiveCallManager( + context = InstrumentationRegistry.getInstrumentation().targetContext, coroutineScope = coroutineScope, onMissedCallNotificationHandler = onMissedCallNotificationHandler, ringingCallNotificationCreator = RingingCallNotificationCreator( diff --git a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt index 3024ce9f2f..90527370e7 100644 --- a/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt +++ b/features/call/impl/src/test/kotlin/io/element/android/features/call/utils/FakeActiveCallManager.kt @@ -11,6 +11,7 @@ import io.element.android.features.call.api.CallType import io.element.android.features.call.impl.notifications.CallNotificationData import io.element.android.features.call.impl.utils.ActiveCall import io.element.android.features.call.impl.utils.ActiveCallManager +import io.element.android.tests.testutils.simulateLongTask import kotlinx.coroutines.flow.MutableStateFlow class FakeActiveCallManager( @@ -20,15 +21,15 @@ class FakeActiveCallManager( ) : ActiveCallManager { override val activeCall = MutableStateFlow(null) - override fun registerIncomingCall(notificationData: CallNotificationData) { + override suspend fun registerIncomingCall(notificationData: CallNotificationData) = simulateLongTask { registerIncomingCallResult(notificationData) } - override fun hungUpCall(callType: CallType) { + override suspend fun hungUpCall(callType: CallType) = simulateLongTask { hungUpCallResult(callType) } - override fun joinedCall(callType: CallType) { + override suspend fun joinedCall(callType: CallType) = simulateLongTask { joinedCallResult(callType) } diff --git a/features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt b/features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt index bbd990df27..09a1269259 100644 --- a/features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt +++ b/features/call/test/src/main/kotlin/io/element/android/features/call/test/FakeElementCallEntryPoint.kt @@ -30,7 +30,7 @@ class FakeElementCallEntryPoint( startCallResult(callType) } - override fun handleIncomingCall( + override suspend fun handleIncomingCall( callType: CallType.RoomCall, eventId: EventId, senderId: UserId, diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt index 66742652bf..dd2214650e 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt @@ -118,7 +118,7 @@ class DefaultPushHandler @Inject constructor( } } - private fun handleRingingCallEvent(notifiableEvent: NotifiableRingingCallEvent) { + private suspend fun handleRingingCallEvent(notifiableEvent: NotifiableRingingCallEvent) { Timber.i("## handleInternal() : Incoming call.") elementCallEntryPoint.handleIncomingCall( callType = CallType.RoomCall(notifiableEvent.sessionId, notifiableEvent.roomId), From d7ca529db1ef596014202371af0d65e9b6c07c18 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 2 Apr 2025 11:52:37 +0200 Subject: [PATCH 28/54] Make `RustMatrixClient.close` asynchronous (#4513) * Make `RustMatrixClient.close` asynchronous This is a safer way to destroy the Rust instances associated to it. Since `MatrixClient` doesn't implement `Closeable` anymore, the method has been renamed to `destroy` to follow the existing naming in the project. --- .../libraries/matrix/api/MatrixClient.kt | 3 +-- .../libraries/matrix/impl/RustMatrixClient.kt | 19 ++++++++----------- .../impl/RustMatrixClientFactoryTest.kt | 2 +- .../matrix/impl/RustMatrixClientTest.kt | 19 ++++++++++--------- .../libraries/matrix/test/FakeMatrixClient.kt | 2 -- 5 files changed, 20 insertions(+), 25 deletions(-) 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 c19793fb8d..6a85cf45f5 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 @@ -42,10 +42,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -import java.io.Closeable import java.util.Optional -interface MatrixClient : Closeable { +interface MatrixClient { val sessionId: SessionId val deviceId: DeviceId val userProfile: StateFlow 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 6a69511fd3..d3a004115f 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 @@ -476,16 +476,13 @@ class RustMatrixClient( override fun roomDirectoryService(): RoomDirectoryService = roomDirectoryService - override fun close() { + internal suspend fun destroy() { innerNotificationClient.close() - appCoroutineScope.launch { - roomFactory.destroy() - rustSyncService.destroy() - notificationSettingsService.destroy() - // This is sync, but it can destroy the `Client` instance and block stopping the sync service - notificationProcessSetup.destroy() - } + roomFactory.destroy() + rustSyncService.destroy() + notificationSettingsService.destroy() + notificationProcessSetup.destroy() sessionCoroutineScope.cancel() clientDelegateTaskHandle?.cancelAndDestroy() @@ -504,7 +501,7 @@ class RustMatrixClient( override suspend fun clearCache() { innerClient.clearCaches() - close() + destroy() } override suspend fun logout(userInitiated: Boolean, ignoreSdkError: Boolean) { @@ -527,7 +524,7 @@ class RustMatrixClient( } } } - close() + destroy() deleteSessionDirectory() if (userInitiated) { @@ -577,7 +574,7 @@ class RustMatrixClient( throw it } } - close() + destroy() deleteSessionDirectory() sessionStore.removeSession(sessionId.value) }.onFailure { diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt index 887155e5d7..c051aebbac 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactoryTest.kt @@ -31,7 +31,7 @@ class RustMatrixClientFactoryTest { val sut = createRustMatrixClientFactory() val result = sut.create(aSessionData()) assertThat(result.sessionId).isEqualTo(SessionId("@alice:server.org")) - result.close() + result.destroy() } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt index 33f943cf53..f9a1afb656 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientTest.kt @@ -28,9 +28,10 @@ import java.io.File class RustMatrixClientTest { @Test fun `ensure that sessionId and deviceId can be retrieved from the client`() = runTest { - createRustMatrixClient().use { sut -> - assertThat(sut.sessionId).isEqualTo(A_USER_ID) - assertThat(sut.deviceId).isEqualTo(A_DEVICE_ID) + createRustMatrixClient().run { + assertThat(sessionId).isEqualTo(A_USER_ID) + assertThat(deviceId).isEqualTo(A_DEVICE_ID) + destroy() } } @@ -38,16 +39,16 @@ class RustMatrixClientTest { fun `clear cache invokes the method clearCaches from the client and close it`() = runTest { val clearCachesResult = lambdaRecorder { } val closeResult = lambdaRecorder { } - createRustMatrixClient( + val client = createRustMatrixClient( client = FakeRustClient( clearCachesResult = clearCachesResult, closeResult = closeResult, ) - ).use { sut -> - sut.clearCache() - clearCachesResult.assertions().isCalledOnce() - closeResult.assertions().isCalledOnce() - } + ) + client.clearCache() + clearCachesResult.assertions().isCalledOnce() + closeResult.assertions().isCalledOnce() + client.destroy() } private fun TestScope.createRustMatrixClient( 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 8a77a60975..446a039bd9 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 @@ -181,8 +181,6 @@ class FakeMatrixClient( deactivateAccountResult(password, eraseData) } - override fun close() = Unit - override suspend fun getUserProfile(): Result = simulateLongTask { val result = getProfileResults[sessionId]?.getOrNull() ?: MatrixUser(sessionId, userDisplayName, userAvatarUrl) _userProfile.tryEmit(result) From b2791d5aadc648814559041ce71a7d08e46377f0 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 2 Apr 2025 12:58:40 +0200 Subject: [PATCH 29/54] Make sure the live timeline is destroyed before clearing a room's cache (#4515) * Make sure the live timeline is destroyed before clearing a room's cache According to the SDK team, having a live timeline could lead to DB issues. * Try to destroy all room and list item references when the `RustRoomFactory` is destroyed It may also have some effect on DB corruption issues we've seen --- .../android/features/roomlist/impl/RoomListPresenter.kt | 2 ++ .../android/libraries/matrix/impl/room/RustRoomFactory.kt | 4 ++++ 2 files changed, 6 insertions(+) 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 a9be28e6ae..19e46607ef 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 @@ -311,6 +311,8 @@ class RoomListPresenter @Inject constructor( private fun CoroutineScope.clearCacheOfRoom(roomId: RoomId) = launch { client.getRoom(roomId)?.use { room -> + // Ideally we wouldn't have a live timeline at this point, but right now we instantiate one when retrieving the room + room.liveTimeline.close() room.clearEventCacheStorage() } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt index 2bcd15c142..a65112fca9 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt @@ -81,6 +81,10 @@ class RustRoomFactory( withContext(NonCancellable + dispatcher) { mutex.withLock { Timber.d("Destroying room factory") + cache.snapshot().values.forEach { (listItem, innerRoom) -> + innerRoom.destroy() + listItem.destroy() + } cache.evictAll() isDestroyed = true } From c3ff9c9bdaaaccef4c02c7d16d7dee98c3e7bb04 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 2 Apr 2025 13:21:53 +0200 Subject: [PATCH 30/54] Enable Rust trace log packs (#4514) * Enable Rust trace log packs This is a way to forcefully enable trace logs only for a few Rust crates in a safe way --- .../x/initializer/PlatformInitializer.kt | 1 + .../impl/developer/DeveloperSettingsEvents.kt | 2 ++ .../developer/DeveloperSettingsPresenter.kt | 21 ++++++++++++++++++ .../impl/developer/DeveloperSettingsState.kt | 2 ++ .../DeveloperSettingsStateProvider.kt | 4 ++++ .../impl/developer/DeveloperSettingsView.kt | 20 +++++++++++++++++ .../developer/DeveloperSettingsViewTest.kt | 4 ++-- .../matrix/api/tracing/TraceLogPack.kt | 22 +++++++++++++++++++ .../api/tracing/TracingConfiguration.kt | 1 + .../matrix/impl/tracing/RustTracingService.kt | 3 +-- .../impl/tracing/TraceLogPacksMapping.kt | 21 ++++++++++++++++++ .../api/store/AppPreferencesStore.kt | 4 ++++ .../impl/store/DefaultAppPreferencesStore.kt | 19 ++++++++++++++++ .../test/InMemoryAppPreferencesStore.kt | 11 ++++++++++ 14 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.kt diff --git a/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt index 650480a0ee..6dd0d69dc0 100644 --- a/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt +++ b/app/src/main/kotlin/io/element/android/x/initializer/PlatformInitializer.kt @@ -37,6 +37,7 @@ class PlatformInitializer : Initializer { writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter), logLevel = logLevel, extraTargets = listOf(ELEMENT_X_TARGET), + traceLogPacks = runBlocking { preferencesStore.getTracingLogPacksFlow().first() }, ) bugReporter.setCurrentTracingLogLevel(logLevel.name) platformService.init(tracingConfiguration) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt index 4a9437a188..74c673bc8a 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt @@ -9,11 +9,13 @@ package io.element.android.features.preferences.impl.developer import io.element.android.features.preferences.impl.developer.tracing.LogLevelItem import io.element.android.libraries.featureflag.ui.model.FeatureUiModel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack sealed interface DeveloperSettingsEvents { data class UpdateEnabledFeature(val feature: FeatureUiModel, val isEnabled: Boolean) : DeveloperSettingsEvents data class SetCustomElementCallBaseUrl(val baseUrl: String?) : DeveloperSettingsEvents data class SetHideImagesAndVideos(val value: Boolean) : DeveloperSettingsEvents data class SetTracingLogLevel(val logLevel: LogLevelItem) : DeveloperSettingsEvents + data class ToggleTracingLogPack(val logPack: TraceLogPack, val enabled: Boolean) : DeveloperSettingsEvents data object ClearCache : DeveloperSettingsEvents } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index ee57d3b8e7..aa2c5a1c50 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshots.SnapshotStateMap @@ -34,9 +35,13 @@ import io.element.android.libraries.featureflag.api.Feature import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.ui.model.FeatureUiModel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore +import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import java.net.URL @@ -77,6 +82,12 @@ class DeveloperSettingsPresenter @Inject constructor( appPreferencesStore.getTracingLogLevelFlow().map { AsyncData.Success(it.toLogLevelItem()) } } val tracingLogLevel by tracingLogLevelFlow.collectAsState(initial = AsyncData.Uninitialized) + val tracingLogPacks by produceState(persistentListOf()) { + appPreferencesStore.getTracingLogPacksFlow() + // Sort the entries alphabetically by its title + .map { it.sortedBy { it.title }.toPersistentList() } + .collectLatest { value = it } + } LaunchedEffect(Unit) { FeatureFlags.entries @@ -121,6 +132,15 @@ class DeveloperSettingsPresenter @Inject constructor( is DeveloperSettingsEvents.SetTracingLogLevel -> coroutineScope.launch { appPreferencesStore.setTracingLogLevel(event.logLevel.toLogLevel()) } + is DeveloperSettingsEvents.ToggleTracingLogPack -> coroutineScope.launch { + val currentPacks = tracingLogPacks.toMutableSet() + if (currentPacks.contains(event.logPack)) { + currentPacks.remove(event.logPack) + } else { + currentPacks.add(event.logPack) + } + appPreferencesStore.setTracingLogPacks(currentPacks) + } } } @@ -135,6 +155,7 @@ class DeveloperSettingsPresenter @Inject constructor( ), hideImagesAndVideos = hideImagesAndVideos, tracingLogLevel = tracingLogLevel, + tracingLogPacks = tracingLogPacks, eventSink = ::handleEvents ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt index 6bc8743439..efcfcd01d4 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsState.kt @@ -12,6 +12,7 @@ import io.element.android.features.rageshake.api.preferences.RageshakePreference import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.featureflag.ui.model.FeatureUiModel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import kotlinx.collections.immutable.ImmutableList data class DeveloperSettingsState( @@ -22,6 +23,7 @@ data class DeveloperSettingsState( val customElementCallBaseUrlState: CustomElementCallBaseUrlState, val hideImagesAndVideos: Boolean, val tracingLogLevel: AsyncData, + val tracingLogPacks: ImmutableList, val eventSink: (DeveloperSettingsEvents) -> Unit ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt index 064a208f49..18151d32c7 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsStateProvider.kt @@ -13,6 +13,8 @@ import io.element.android.features.rageshake.api.preferences.aRageshakePreferenc import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.featureflag.ui.model.aFeatureUiModelList +import io.element.android.libraries.matrix.api.tracing.TraceLogPack +import kotlinx.collections.immutable.toPersistentList open class DeveloperSettingsStateProvider : PreviewParameterProvider { override val values: Sequence @@ -33,6 +35,7 @@ fun aDeveloperSettingsState( clearCacheAction: AsyncAction = AsyncAction.Uninitialized, customElementCallBaseUrlState: CustomElementCallBaseUrlState = aCustomElementCallBaseUrlState(), hideImagesAndVideos: Boolean = false, + traceLogPacks: List = emptyList(), eventSink: (DeveloperSettingsEvents) -> Unit = {}, ) = DeveloperSettingsState( features = aFeatureUiModelList(), @@ -42,6 +45,7 @@ fun aDeveloperSettingsState( customElementCallBaseUrlState = customElementCallBaseUrlState, hideImagesAndVideos = hideImagesAndVideos, tracingLogLevel = AsyncData.Success(LogLevelItem.INFO), + tracingLogPacks = traceLogPacks.toPersistentList(), eventSink = eventSink, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt index de368b9a65..e335c0a6cd 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt @@ -7,6 +7,7 @@ package io.element.android.features.preferences.impl.developer +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.progressSemantics import androidx.compose.foundation.text.KeyboardOptions @@ -16,6 +17,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType 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.preferences.impl.R import io.element.android.features.preferences.impl.developer.tracing.LogLevelItem import io.element.android.features.rageshake.api.preferences.RageshakePreferencesView @@ -32,6 +34,7 @@ import io.element.android.libraries.designsystem.theme.components.ListItem import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.featureflag.ui.FeatureListView import io.element.android.libraries.featureflag.ui.model.FeatureUiModel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.toPersistentList @@ -56,6 +59,7 @@ fun DeveloperSettingsView( FeatureListContent(state) } ElementCallCategory(state = state) + PreferenceCategory(title = "Rust SDK") { PreferenceDropdown( title = "Tracing log level", @@ -67,6 +71,22 @@ fun DeveloperSettingsView( } ) } + PreferenceCategory(title = "Enable trace logs per SDK feature") { + Text( + text = "Requires app reboot", + style = ElementTheme.typography.fontBodyMdRegular, + color = ElementTheme.colors.textSecondary, + modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp) + ) + for (logPack in TraceLogPack.entries) { + PreferenceSwitch( + title = logPack.title, + isChecked = state.tracingLogPacks.contains(logPack), + onCheckedChange = { isChecked -> state.eventSink(DeveloperSettingsEvents.ToggleTracingLogPack(logPack, isChecked)) } + ) + } + } + PreferenceCategory(title = "Showkase") { ListItem( headlineContent = { diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt index 94b70442d9..255c6442d9 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsViewTest.kt @@ -68,7 +68,7 @@ class DeveloperSettingsViewTest { eventsRecorder.assertSingle(DeveloperSettingsEvents.SetCustomElementCallBaseUrl("https://call.element.dev")) } - @Config(qualifiers = "h1024dp") + @Config(qualifiers = "h1200dp") @Test fun `clicking on open showkase invokes the expected callback`() { val eventsRecorder = EventsRecorder(expectEvents = false) @@ -97,7 +97,7 @@ class DeveloperSettingsViewTest { eventsRecorder.assertSingle(DeveloperSettingsEvents.SetTracingLogLevel(LogLevelItem.DEBUG)) } - @Config(qualifiers = "h1500dp") + @Config(qualifiers = "h1700dp") @Test fun `clicking on clear cache emits the expected event`() { val eventsRecorder = EventsRecorder() 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 new file mode 100644 index 0000000000..b0a67a9e92 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TraceLogPack.kt @@ -0,0 +1,22 @@ +/* + * 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.tracing + +enum class TraceLogPack(val key: String) { + EVENT_CACHE("event_cache") { + override val title: String = "Event Cache" + }, + SEND_QUEUE("send_queue") { + override val title: String = "Send Queue" + }, + TIMELINE("timeline") { + override val title: String = "Timeline" + }; + + abstract val title: String +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingConfiguration.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingConfiguration.kt index db2c946bf5..f559176fa6 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingConfiguration.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/TracingConfiguration.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.matrix.api.tracing data class TracingConfiguration( val logLevel: LogLevel, val extraTargets: List, + val traceLogPacks: Set, val writesToLogcat: Boolean, val writesToFilesConfiguration: WriteToFilesConfiguration, ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt index 60ee29dc57..07ee1dc1b9 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/RustTracingService.kt @@ -51,7 +51,6 @@ fun TracingConfiguration.map(): org.matrix.rustcomponents.sdk.TracingConfigurati writeToStdoutOrSystem = writesToLogcat, logLevel = logLevel.toRustLogLevel(), extraTargets = extraTargets, - // WARNING: this should be used only to debug issues, changes to this value should *never* be published - traceLogPacks = emptyList(), + traceLogPacks = traceLogPacks.map(), writeToFiles = writesToFilesConfiguration.toTracingFileConfiguration(), ) 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 new file mode 100644 index 0000000000..11187a90a3 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/tracing/TraceLogPacksMapping.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.matrix.impl.tracing + +import io.element.android.libraries.matrix.api.tracing.TraceLogPack +import org.matrix.rustcomponents.sdk.TraceLogPacks as RustTraceLogPack + +fun TraceLogPack.map(): RustTraceLogPack = when (this) { + TraceLogPack.SEND_QUEUE -> RustTraceLogPack.SEND_QUEUE + TraceLogPack.EVENT_CACHE -> RustTraceLogPack.EVENT_CACHE + TraceLogPack.TIMELINE -> RustTraceLogPack.TIMELINE +} + +fun Collection.map(): List { + return map { it.map() } +} 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 537c8d6040..c072229626 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 @@ -8,6 +8,7 @@ package io.element.android.libraries.preferences.api.store import io.element.android.libraries.matrix.api.tracing.LogLevel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import kotlinx.coroutines.flow.Flow interface AppPreferencesStore { @@ -26,5 +27,8 @@ interface AppPreferencesStore { suspend fun setTracingLogLevel(logLevel: LogLevel) fun getTracingLogLevelFlow(): Flow + suspend fun setTracingLogPacks(targets: Set) + fun getTracingLogPacksFlow(): Flow> + suspend fun reset() } 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 06f4b05912..a05e9c48da 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 @@ -20,6 +20,7 @@ import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.api.tracing.LogLevel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -32,6 +33,7 @@ private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseU private val themeKey = stringPreferencesKey("theme") private val hideImagesAndVideosKey = booleanPreferencesKey("hideImagesAndVideos") private val logLevelKey = stringPreferencesKey("logLevel") +private val traceLogPacksKey = stringPreferencesKey("traceLogPacks") @ContributesBinding(AppScope::class) class DefaultAppPreferencesStore @Inject constructor( @@ -105,6 +107,23 @@ class DefaultAppPreferencesStore @Inject constructor( } } + override suspend fun setTracingLogPacks(targets: Set) { + val value = targets.joinToString(",") { it.key } + store.edit { prefs -> + prefs[traceLogPacksKey] = value + } + } + + override fun getTracingLogPacksFlow(): Flow> { + return store.data.map { prefs -> + prefs[traceLogPacksKey] + ?.split(",") + ?.mapNotNull { value -> TraceLogPack.entries.find { it.key == value } } + ?.toSet() + ?: emptySet() + } + } + override suspend fun reset() { store.edit { it.clear() } } 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 1a332b42aa..f57a7d4578 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 @@ -8,6 +8,7 @@ package io.element.android.libraries.preferences.test import io.element.android.libraries.matrix.api.tracing.LogLevel +import io.element.android.libraries.matrix.api.tracing.TraceLogPack import io.element.android.libraries.preferences.api.store.AppPreferencesStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -19,6 +20,7 @@ class InMemoryAppPreferencesStore( theme: String? = null, simplifiedSlidingSyncEnabled: Boolean = false, logLevel: LogLevel = LogLevel.INFO, + traceLockPacks: Set = emptySet(), ) : AppPreferencesStore { private val isDeveloperModeEnabled = MutableStateFlow(isDeveloperModeEnabled) private val hideImagesAndVideos = MutableStateFlow(hideImagesAndVideos) @@ -26,6 +28,7 @@ class InMemoryAppPreferencesStore( private val theme = MutableStateFlow(theme) private val simplifiedSlidingSyncEnabled = MutableStateFlow(simplifiedSlidingSyncEnabled) private val logLevel = MutableStateFlow(logLevel) + private val tracingLogPacks = MutableStateFlow(traceLockPacks) override suspend fun setDeveloperModeEnabled(enabled: Boolean) { isDeveloperModeEnabled.value = enabled @@ -67,6 +70,14 @@ class InMemoryAppPreferencesStore( return logLevel } + override suspend fun setTracingLogPacks(logPacks: Set) { + tracingLogPacks.value = logPacks + } + + override fun getTracingLogPacksFlow(): Flow> { + return tracingLogPacks + } + override suspend fun reset() { // No op } From fcaf6a53f832e6902ba9a50b990ac8ec240b3ffd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 15:55:50 +0200 Subject: [PATCH 31/54] fix(deps): update kotlin (#4444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): update kotlin * Fix 'exhaustive when' issue * Fix lint issues * Fix issue in merge conflict resolving. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín Co-authored-by: Benoit Marty --- .idea/kotlinc.xml | 2 +- gradle/libs.versions.toml | 4 ++-- .../impl/timeline/item/event/TimelineEventContentMapper.kt | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index c22b6fa9ee..131e44d798 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 544b23045a..776695161c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,9 +4,9 @@ [versions] # Project android_gradle_plugin = "8.9.1" -kotlin = "2.1.10" +kotlin = "2.1.20" kotlinpoet = "2.1.0" -ksp = "2.1.10-1.0.31" +ksp = "2.1.20-1.0.31" firebaseAppDistribution = "5.1.1" # AndroidX diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt index 19e4c36c6f..4d1de2cbfa 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt @@ -22,7 +22,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.RoomMembershi import io.element.android.libraries.matrix.api.timeline.item.event.StateContent import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent -import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent import io.element.android.libraries.matrix.api.timeline.item.event.UtdCause import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.poll.map @@ -110,7 +109,6 @@ class TimelineEventContentMapper( } is TimelineItemContent.CallInvite -> LegacyCallInviteContent is TimelineItemContent.CallNotify -> CallNotifyContent - else -> UnknownContent } } } From 670af86e8b54304b480b72f4817dc9fbee59a030 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Apr 2025 16:04:07 +0200 Subject: [PATCH 32/54] Replace OutlinedTextField by our TextField (#4521) * Let TextFieldListItem take the entire width. * Add unit test to detect usage of OutlinedTextField. * Use TextField instead of OutlinedTextField * Remove unnecessary opt in to ExperimentalFoundationApi * Use TextField instead of OutlinedTextField * Fix compilation issue. * Update screenshots * ListDialog: add space between items. * Update screenshots * Set applyPaddingToContents to true by default. * Update screenshots --------- Co-authored-by: ElementBot --- .../impl/list/DependencyLicensesListView.kt | 7 +- .../components/customreaction/EmojiPicker.kt | 3 +- .../reactionsummary/ReactionSummaryView.kt | 2 - .../moderation/RoomMembersModerationView.kt | 2 - .../impl/filters/RoomListFiltersView.kt | 2 - .../components/dialogs/ListDialog.kt | 8 +- .../components/dialogs/TextFieldDialog.kt | 25 +----- .../components/list/TextFieldListItem.kt | 83 +++---------------- .../tests/konsist/KonsistImportTest.kt | 13 +++ ...st_DependencyLicensesListView_Day_2_en.png | 4 +- ...st_DependencyLicensesListView_Day_3_en.png | 4 +- ..._DependencyLicensesListView_Night_2_en.png | 4 +- ..._DependencyLicensesListView_Night_3_en.png | 4 +- ...ion_RoomMembersModerationView_Day_3_en.png | 4 +- ...ion_RoomMembersModerationView_Day_5_en.png | 4 +- ...n_RoomMembersModerationView_Night_3_en.png | 4 +- ...n_RoomMembersModerationView_Night_5_en.png | 4 +- ...s.dialogs_ListDialogContent_Dialogs_en.png | 4 +- ...components.dialogs_ListDialog_Day_0_en.png | 4 +- ...mponents.dialogs_ListDialog_Night_0_en.png | 4 +- ...ogs_TextFieldDialogWithBorder_Day_0_en.png | 3 - ...s_TextFieldDialogWithBorder_Night_0_en.png | 3 - ...logs_TextFieldDialogWithError_Day_0_en.png | 4 +- ...gs_TextFieldDialogWithError_Night_0_en.png | 4 +- ...nents.dialogs_TextFieldDialog_Day_0_en.png | 4 +- ...nts.dialogs_TextFieldDialog_Night_0_en.png | 4 +- ..._field_List_item_-_empty_List_items_en.png | 4 +- ...st_item_-_textfieldvalue_List_items_en.png | 4 +- ...item_with_border_-_empty_List_items_en.png | 3 - ..._item_with_border_-_text_List_items_en.png | 3 - ...t_field_List_item_-_text_List_items_en.png | 4 +- ...nkDialogCreateLinkWithoutText_Day_0_en.png | 4 +- ...DialogCreateLinkWithoutText_Night_0_en.png | 4 +- ...tComposerLinkDialogCreateLink_Day_0_en.png | 4 +- ...omposerLinkDialogCreateLink_Night_0_en.png | 4 +- ...extComposerLinkDialogEditLink_Day_0_en.png | 4 +- ...tComposerLinkDialogEditLink_Night_0_en.png | 4 +- 37 files changed, 86 insertions(+), 167 deletions(-) delete mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png delete mode 100644 tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png 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 109878cffa..61e4ace265 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 @@ -7,7 +7,6 @@ package io.element.android.features.licenses.impl.list -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -15,7 +14,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.OutlinedTextField import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -33,10 +31,11 @@ import io.element.android.libraries.designsystem.theme.components.Icon 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.TextField import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.ui.strings.CommonStrings -@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun DependencyLicensesListView( state: DependencyLicensesListState, @@ -60,7 +59,7 @@ fun DependencyLicensesListView( ) { if (state.licenses.isSuccess()) { // Search field - OutlinedTextField( + TextField( value = state.filter, onValueChange = { state.eventSink(DependencyLicensesListEvent.SetFilter(it)) }, leadingIcon = { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiPicker.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiPicker.kt index b8256ba402..fcaac65e82 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiPicker.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiPicker.kt @@ -7,7 +7,6 @@ package io.element.android.features.messages.impl.timeline.components.customreaction -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -41,7 +40,7 @@ import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentSetOf import kotlinx.coroutines.launch -@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun EmojiPicker( onSelectEmoji: (Emoji) -> Unit, 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 12f325a20d..b1aa726628 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 @@ -7,7 +7,6 @@ package io.element.android.features.messages.impl.timeline.components.reactionsummary -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -94,7 +93,6 @@ fun ReactionSummaryView( } } -@OptIn(ExperimentalFoundationApi::class) @Composable private fun ReactionSummaryViewContent( summary: ReactionSummaryState.Summary, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationView.kt index 0b08269d81..1629db74fb 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/moderation/RoomMembersModerationView.kt @@ -98,7 +98,6 @@ fun RoomMembersModerationView( onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, placeholder = stringResource(id = CommonStrings.common_reason), label = stringResource(id = CommonStrings.common_reason), - withBorder = true, content = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description), value = "", ) @@ -138,7 +137,6 @@ fun RoomMembersModerationView( onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) }, placeholder = stringResource(id = CommonStrings.common_reason), label = stringResource(id = CommonStrings.common_reason), - withBorder = true, content = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description), value = "", ) 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 81bae26b4a..214ac44cfd 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 @@ -10,7 +10,6 @@ package io.element.android.features.roomlist.impl.filters import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.Spring import androidx.compose.animation.core.spring -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.animateScrollBy @@ -48,7 +47,6 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag -@OptIn(ExperimentalFoundationApi::class) @Composable fun RoomListFiltersView( state: RoomListFiltersState, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt index 945384e832..944fca1cf4 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ListDialog.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.designsystem.components.dialogs +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope @@ -38,7 +39,7 @@ fun ListDialog( cancelText: String = stringResource(CommonStrings.action_cancel), submitText: String = stringResource(CommonStrings.action_ok), enabled: Boolean = true, - applyPaddingToContents: Boolean = false, + applyPaddingToContents: Boolean = true, listItems: LazyListScope.() -> Unit, ) { val decoratedSubtitle: @Composable (() -> Unit)? = subtitle?.let { @@ -92,7 +93,8 @@ private fun ListDialogContent( // No start padding if padding is already applied to the content val horizontalPadding = if (applyPaddingToContents) 0.dp else 8.dp LazyColumn( - modifier = Modifier.padding(horizontal = horizontalPadding) + modifier = Modifier.padding(horizontal = horizontalPadding), + verticalArrangement = Arrangement.spacedBy(16.dp), ) { listItems() } } } @@ -117,7 +119,7 @@ internal fun ListDialogContentPreview() { cancelText = "Cancel", submitText = "Save", enabled = true, - applyPaddingToContents = false, + applyPaddingToContents = true, ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt index 65a18d27ff..bb31edd313 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/TextFieldDialog.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.designsystem.components.dialogs +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.runtime.Composable @@ -44,7 +45,6 @@ fun TextFieldDialog( maxLines: Int = 1, content: String? = null, label: String? = null, - withBorder: Boolean = false, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, submitText: String = stringResource(CommonStrings.action_ok), ) { @@ -65,7 +65,6 @@ fun TextFieldDialog( onSubmit = { onSubmit(textFieldContents.text) }, onDismissRequest = onDismissRequest, enabled = canSubmit, - applyPaddingToContents = content.isNullOrEmpty().not(), submitText = submitText, modifier = modifier, ) { @@ -81,7 +80,6 @@ fun TextFieldDialog( TextFieldListItem( placeholder = placeholder.orEmpty(), label = label, - withBorder = withBorder, text = textFieldContents, onTextChange = { error = if (!validation(it.text)) onValidationErrorMessage else null @@ -95,7 +93,9 @@ fun TextFieldDialog( } }), maxLines = maxLines, - modifier = Modifier.focusRequester(focusRequester), + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), ) canRequestFocus = true } @@ -120,22 +120,6 @@ internal fun TextFieldDialogPreview() = ElementPreview { ) } -@PreviewsDayNight -@Composable -internal fun TextFieldDialogWithBorderPreview() = ElementPreview { - TextFieldDialog( - title = "Title", - content = "Some content", - onSubmit = {}, - onDismissRequest = {}, - value = "Value", - placeholder = "Placeholder", - label = "Label", - withBorder = true, - onValidationErrorMessage = "Error message", - ) -} - @PreviewsDayNight @Composable internal fun TextFieldDialogWithErrorPreview() = ElementPreview { @@ -148,7 +132,6 @@ internal fun TextFieldDialogWithErrorPreview() = ElementPreview { value = "Value", placeholder = "Placeholder", label = "Label", - withBorder = true, onValidationErrorMessage = "Error message", ) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt index 812f9d7ba4..f9d61b6593 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/list/TextFieldListItem.kt @@ -9,17 +9,14 @@ package io.element.android.libraries.designsystem.components.list import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview -import io.element.android.compound.theme.ElementTheme 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.theme.components.TextField +import io.element.android.libraries.designsystem.theme.components.TextFieldValidity @Composable fun TextFieldListItem( @@ -29,33 +26,19 @@ fun TextFieldListItem( modifier: Modifier = Modifier, error: String? = null, maxLines: Int = 1, - withBorder: Boolean = false, label: String? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, ) { - val textFieldStyle = ElementTheme.materialTypography.bodyLarge - - OutlinedTextField( + TextField( value = text, onValueChange = { onTextChange(it) }, - placeholder = placeholder?.let { @Composable { Text(it) } }, - label = label?.let { @Composable { Text(it) } }, - colors = if (withBorder) { - OutlinedTextFieldDefaults.colors() - } else { - OutlinedTextFieldDefaults.colors( - disabledBorderColor = Color.Transparent, - errorBorderColor = Color.Transparent, - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - ) - }, - isError = error != null, - supportingText = error?.let { @Composable { Text(it) } }, + placeholder = placeholder, + label = label, + validity = if (error != null) TextFieldValidity.Invalid else TextFieldValidity.None, + supportingText = error, keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, - textStyle = textFieldStyle, maxLines = maxLines, singleLine = maxLines == 1, modifier = modifier, @@ -70,33 +53,19 @@ fun TextFieldListItem( modifier: Modifier = Modifier, error: String? = null, maxLines: Int = 1, - withBorder: Boolean = false, label: String? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, ) { - val textFieldStyle = ElementTheme.materialTypography.bodyLarge - - OutlinedTextField( + TextField( value = text, onValueChange = { onTextChange(it) }, - placeholder = placeholder?.let { @Composable { Text(it) } }, - label = label?.let { @Composable { Text(it) } }, - colors = if (withBorder) { - OutlinedTextFieldDefaults.colors() - } else { - OutlinedTextFieldDefaults.colors( - disabledBorderColor = Color.Transparent, - errorBorderColor = Color.Transparent, - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - ) - }, - isError = error != null, - supportingText = error?.let { @Composable { Text(it) } }, + placeholder = placeholder, + label = label, + validity = if (error != null) TextFieldValidity.Invalid else TextFieldValidity.None, + supportingText = error, keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, - textStyle = textFieldStyle, maxLines = maxLines, singleLine = maxLines == 1, modifier = modifier, @@ -138,31 +107,3 @@ internal fun TextFieldListItemTextFieldValuePreview() { ) } } - -@Preview("Text field List item with border - empty", group = PreviewGroup.ListItems) -@Composable -internal fun TextFieldListItemWithBorderEmptyPreview() { - ElementThemedPreview { - TextFieldListItem( - placeholder = "Placeholder", - label = "Label", - text = "", - withBorder = true, - onTextChange = {}, - ) - } -} - -@Preview("Text field List item with border - text", group = PreviewGroup.ListItems) -@Composable -internal fun TextFieldListItemWithBorderPreview() { - ElementThemedPreview { - TextFieldListItem( - placeholder = "Placeholder", - label = "Label", - text = "Text", - withBorder = true, - onTextChange = {}, - ) - } -} 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 cb996db3b9..129f9150ed 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 @@ -24,4 +24,17 @@ class KonsistImportTest { it.name == "org.jetbrains.annotations.VisibleForTesting" } } + + @Test + fun `OutlinedTextField should not be used`() { + Konsist + .scopeFromProject() + .imports + .assertFalse( + additionalMessage = "Please use 'io.element.android.libraries.designsystem.theme.components.TextField' instead of " + + "'androidx.compose.material3.OutlinedTextField.", + ) { + it.name == "androidx.compose.material3.OutlinedTextField" + } + } } 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 dcb5fb0de3..e0851891b2 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:5248793987bd2f6f98e571366e6fcc87085fdba5372a4a31314a52a13efcc78a -size 30160 +oid sha256:72a0143f03e008d0961066cd600d7567c5a64b36d8d4ed610324ae68b15660ef +size 30061 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 bf50b6961e..debbf12ddf 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:2d835fa6c041ca10d362e7c0dd77fe784e2f3b903523b9a813e1cd47a04f53df -size 31365 +oid sha256:d6c2cbf04f228dc6d63660d4a0d5bd7a56e2dfa7aba0778e01860d99017d25e4 +size 31325 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 af20cfd8a5..6fea0e40d1 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:7363ab9655be9350ff4f10eda2278962489b8fd983a7b3f5a91b40f281bbb37f -size 29379 +oid sha256:fd5044ab9be16487d6637d80aa81d2d70f48596f9bd9db2049cc152145ab5b06 +size 29268 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 743e065990..88a2f62577 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:a4290ae65632bee52d5c7ea6cb34de07e8fb585398edccb1a411d669410d8299 -size 30547 +oid sha256:8ecfa7ad0239499dfb3611b0049244d46d2dc795906bf5e5afdefd0bf9ede43f +size 30464 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png index 80c195780c..27a01cf88b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9a5256bf2af8a8e9ee87bbab2ebdc7cd5823bc6b2cfde6267a68bd797e6eb61 -size 29650 +oid sha256:6a3da0d5bba7824bc5a76b87bb2be17d17d7d2f0492f4332416929366efb7a61 +size 30927 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png index 27ac4de00f..51a2138363 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39b34e0940f38ab0d66ba68b61c07ba70a51acfb54f995eedce800231ea6a2c5 -size 28257 +oid sha256:cce848d6c16adfcbd2ef9eef5e65a035ccd4d0a3092953e51433fc134c286518 +size 29471 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png index 091915ab82..d3470ac368 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e07ab4816ff009eaa26e1f3cf69b613a9a34baea0dd55e0eface745ee7328758 -size 27486 +oid sha256:6723e18a9ec3f01a2909f97c5ad80b7ce682653ec16229e1129ac509c2decd0a +size 28912 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png index 9144b78743..a5ba8dad45 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19483b4fae4026098273e6e4c941592074f08b3e7f9fa44e759bdab9daf2b27a -size 26233 +oid sha256:2f7b32aed7f97cd97719c22400cbe7a4d14e9a4cf10d42b26b853cd81cb42f1e +size 27620 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png index 9c9335b1b2..031080449d 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialogContent_Dialogs_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:114c59fd334979528721e0409e22096a058f965b0cfb5b7860816590d7c84652 -size 29924 +oid sha256:4a35c5690e291b30e85491485dca6203d3541bae8aa6e680f53d5480b312b4fa +size 30859 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png index 83dccb1356..08268d09c4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5f9152fbdce0823fb728586486e8625f96caceb23b69685680313b62a81c1a8 -size 18073 +oid sha256:6bf99a794b62bcac4356d40c621e541cc8b4819851be94ee4fb5f990821dad43 +size 18696 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png index bedc583552..f0edea1109 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_ListDialog_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d324a3cf4090c18459f06753d28bee13102457da07ef17358a7d65797df965b -size 16234 +oid sha256:9ac05090a322d3b3eb9bc6a8975a3f832e15099553186b9054036807b6d16124 +size 16719 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png deleted file mode 100644 index 3a854f966d..0000000000 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Day_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1be0efd7f33ee57088b04aedf6c63cb8092abc0356a31636fe028e31d542e28d -size 15671 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png deleted file mode 100644 index ebd75e8e7c..0000000000 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithBorder_Night_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7609a1d51c1be29b0d117dd968bd44b250d02e82e1630fa062da4cd280bb950 -size 13934 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png index e1b0620797..c937b35d4f 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4697eda8d2fb160b2cade0be583148ec0b2e55f35fe44929f98feb4c8535377 -size 17761 +oid sha256:869c9e0b2dd0ea776b99ab4e223c2e8c31f62a2ea9f7c2aa7c06423eb9bfa531 +size 18638 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png index 86791ec94b..3865c87243 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2774d56a1e788567c19df9a714f1399968e75d2df6c3a4f404e3c03a30286567 -size 15951 +oid sha256:5ca9146ee4758956ef5487e198352e836ed354a0c427f854780db2d3977621d9 +size 16738 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png index ec70e3fdda..8c14f92fb0 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3257be6487ff2f412564bb8f188860e39b0325156533ad519c9d6852000a173a -size 13119 +oid sha256:a7874f4a2365bed4de566c8db579d8a456d298da8c913bbdabfd7b66ba2d99d9 +size 13342 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png index b96e04508c..4712e3e1ea 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:baf396f36cdc0ca5e01842f70fe0b93166fa82c11ad981c54a529f59c90b5111 -size 11469 +oid sha256:271f172f1c5cc924426afa2ae51f295c10cf51602600b46cac812a2973b6e68d +size 11694 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en.png index f232126cfb..fac015d66d 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemEmpty_Text_field_List_item_-_empty_List_items_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73978f15c708b9bb39f20aaaf2e1510caa796b8875bd1418d0ce1e6a99f60ad6 -size 8907 +oid sha256:798d2a617d7d5cdad84a3e39a81e83c9de1d5b84bfd35f54fd3a1e2271bdc411 +size 9277 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en.png index c619f9a53a..dd5b34fcd5 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemTextFieldValue_Text_field_List_item_-_textfieldvalue_List_items_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b02a6c58c1a54f4e86b7b5db36c925ccc9a2012dc30372736216d489d2a8e33e -size 9819 +oid sha256:ddbf6a82c11d7dd55140c65677a5c96d53e09ad08c6a65313575a1d9b73744fa +size 10207 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png deleted file mode 100644 index 1d1eb1de3a..0000000000 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorderEmpty_Text_field_List_item_with_border_-_empty_List_items_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dc297457b140b0bcf72fb3de3e2fd8061983ab70ad2d5299cc5ba85d5a7db55 -size 7270 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png deleted file mode 100644 index 7e325e90bf..0000000000 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItemWithBorder_Text_field_List_item_with_border_-_text_List_items_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a3648b24b1640410c19eb5ee5c9808c48be5cb2dc0862d84f8419289988fd39 -size 8708 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en.png index bc29b0cfa4..7b92100afd 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components.list_TextFieldListItem_Text_field_List_item_-_text_List_items_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f25810294b831c73b678d93a0352c4d2e84e946ee197680be40074145a4ba5ab -size 6104 +oid sha256:3427ed512414c9e6bdfb90db3caf29dacb8373878e56992eff260506d128c4bf +size 6564 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png index 29cc2b7605..a3bdbf9b77 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4393abc83861f1ab67e0637d7192887c31d94ecad9642691bcfe87e68df3a42 -size 13422 +oid sha256:12f0ca8fdeddd40c744cb0ece103a98bfa2f38450d46458fcc6fc06751360ed5 +size 13606 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png index 3a063e589a..42bb0815dc 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57c8c7fa3b993fc52c3fbc2014252e8fff1395f855d6f4acd1681d843eedf2c0 -size 11825 +oid sha256:e7c5e43207805ef6241140c17405258d2d6615ca80180cc6880457326b6b8446 +size 12011 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png index 602069b0e1..ebc1200cfe 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57d2c9529a6cef0b9a009710645f92d50f93563f4f765994f6f006ef4db1d5c4 -size 14684 +oid sha256:2928dcfc8005ecf9b4666ab6e4c53f79641eb6946271db8a994a40edb40c963d +size 15180 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png index 47a56348f4..ea6127c771 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a43a5ebccf177014e2d7726e9a0f0cf4970252b7301843b98c5ae7e72dc34aee -size 12955 +oid sha256:69d4d152932d0ff43f179f739810a63afad8124dd5ea706d73ab399cc00871cb +size 13472 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en.png index bd2bfdf6b6..6973fd68c7 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0602f269f3d3879db0a6b18ff56de7dd3fcecf79ccee1c25e2aa763dab9e1e3d -size 16958 +oid sha256:ac58ade49e587fe1be47055a6c0147dba40ee4e3ded1a3ae67ae9ccecf4c54b0 +size 17424 diff --git a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en.png index e244a6fd2a..6f592e0827 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ef3f08243ed2dde9dbe4eb7422d68c33a4ae1443b7b75dd3661d245f58b539a -size 15088 +oid sha256:e9d00a99b3bfad8572a86562f1e40b4ac06f241efcd778398d1f7593ff3f5c43 +size 15620 From edd09ef7bbd46d0c41770f6be82481734077fe59 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 2 Apr 2025 18:03:14 +0200 Subject: [PATCH 33/54] Fix warnings in InMemoryAppPreferencesStore (#4523) --- .../preferences/test/InMemoryAppPreferencesStore.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 f57a7d4578..ab3913cd08 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 @@ -18,7 +18,6 @@ class InMemoryAppPreferencesStore( hideImagesAndVideos: Boolean = false, customElementCallBaseUrl: String? = null, theme: String? = null, - simplifiedSlidingSyncEnabled: Boolean = false, logLevel: LogLevel = LogLevel.INFO, traceLockPacks: Set = emptySet(), ) : AppPreferencesStore { @@ -26,7 +25,6 @@ class InMemoryAppPreferencesStore( private val hideImagesAndVideos = MutableStateFlow(hideImagesAndVideos) private val customElementCallBaseUrl = MutableStateFlow(customElementCallBaseUrl) private val theme = MutableStateFlow(theme) - private val simplifiedSlidingSyncEnabled = MutableStateFlow(simplifiedSlidingSyncEnabled) private val logLevel = MutableStateFlow(logLevel) private val tracingLogPacks = MutableStateFlow(traceLockPacks) @@ -70,8 +68,8 @@ class InMemoryAppPreferencesStore( return logLevel } - override suspend fun setTracingLogPacks(logPacks: Set) { - tracingLogPacks.value = logPacks + override suspend fun setTracingLogPacks(targets: Set) { + tracingLogPacks.value = targets } override fun getTracingLogPacksFlow(): Flow> { From a045b3f7c8153967ed28b84d1ce90b58e6a1f930 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:03:59 +0200 Subject: [PATCH 34/54] fix(deps): update kotlin (#4522) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 776695161c..d595c5cce8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ android_gradle_plugin = "8.9.1" kotlin = "2.1.20" kotlinpoet = "2.1.0" -ksp = "2.1.20-1.0.31" +ksp = "2.1.20-1.0.32" firebaseAppDistribution = "5.1.1" # AndroidX @@ -39,7 +39,7 @@ test_core = "1.6.1" # Jetbrain datetime = "0.6.2" -serialization_json = "1.8.0" +serialization_json = "1.8.1" #other coil = "3.1.0" From 73ce386873b5b2567ae3ca866517d28b75a6902f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:52:30 +0000 Subject: [PATCH 35/54] fix(deps): update dependencyanalysis to v2.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 d595c5cce8..44f6810356 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ wysiwyg = "2.38.3" telephoto = "0.15.1" # Dependency analysis -dependencyAnalysis = "2.13.3" +dependencyAnalysis = "2.14.0" # DI dagger = "2.56.1" From c09ff581586588ad17637cec498418a963c0ab51 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 3 Apr 2025 17:11:23 +0200 Subject: [PATCH 36/54] Remove alias from room invite item (#4531) * Remove the potential room alias from invitation cells * Update screenshots --------- Co-authored-by: ElementBot --- .../features/roomlist/impl/components/RoomSummaryRow.kt | 6 ++---- ...es.roomlist.impl.components_RoomSummaryRow_Day_29_en.png | 4 ++-- ....roomlist.impl.components_RoomSummaryRow_Night_29_en.png | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) 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 0fbd4d38fe..9ce03ab4cc 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 @@ -57,7 +57,6 @@ import io.element.android.libraries.designsystem.theme.roomListRoomMessage import io.element.android.libraries.designsystem.theme.roomListRoomMessageDate import io.element.android.libraries.designsystem.theme.roomListRoomName import io.element.android.libraries.designsystem.theme.unreadIndicator -import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.ui.components.InviteSenderView import io.element.android.libraries.matrix.ui.model.InviteSender @@ -87,7 +86,7 @@ internal fun RoomSummaryRow( }, ) { InviteNameAndIndicatorRow(name = room.name) - InviteSubtitle(isDm = room.isDm, inviteSender = room.inviteSender, canonicalAlias = room.canonicalAlias) + InviteSubtitle(isDm = room.isDm, inviteSender = room.inviteSender) if (!room.isDm && room.inviteSender != null) { Spacer(modifier = Modifier.height(4.dp)) InviteSenderView( @@ -232,13 +231,12 @@ private fun NameAndTimestampRow( private fun InviteSubtitle( isDm: Boolean, inviteSender: InviteSender?, - canonicalAlias: RoomAlias?, modifier: Modifier = Modifier ) { val subtitle = if (isDm) { inviteSender?.userId?.value } else { - canonicalAlias?.value + null } if (subtitle != null) { Text( 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.roomlist.impl.components_RoomSummaryRow_Day_29_en.png index 96d500520c..9c35c6a4d6 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_29_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_29_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe7856a003131918100d8ce3da0e879f7c8d63de64e1b5889327738cb7a8f2f2 -size 23128 +oid sha256:f8f5508fc0509afed78f4259037c1f886b9c872d581756db947a11e688248c5a +size 20623 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.roomlist.impl.components_RoomSummaryRow_Night_29_en.png index 9287673872..8369441179 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_29_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_29_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e45e0dc5de85736bdbb3221f26c1cae3af78dd63acf0208fd12e023d91fa70e7 -size 23183 +oid sha256:480a8c2cb0c3ef6d30125cae576d9737b69b3ee55b8d0cb761562098c784ca83 +size 20476 From a230b83e9913537b7d3fe6a44135bf7aeae31d3a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Apr 2025 16:50:43 +0200 Subject: [PATCH 37/54] Remember flows (#4533) * Add Konsist test to ensure that the result of a function returning a flow is remembered. * Remember flows before they are collected by state. * Fix compilation issue * Make isOnline a val. * Make selectedUsers() a val. * Make flow() a val. * Make getUserConsent(), didAskUserConsent() and getAnalyticsId() some val. * Remove Timeline.paginationStatus() and replace by direct access to the underlined flow. * Simplify test * userConsentFlow must be initialized before because it's used in observeUserConsent * Fix test compilation --- .../appnav/loggedin/LoggedInPresenter.kt | 3 +- .../android/appnav/room/RoomFlowNode.kt | 3 +- .../appnav/room/joined/JoinedRoomFlowNode.kt | 3 +- .../AnalyticsPreferencesPresenter.kt | 3 +- .../impl/AnalyticsOptInPresenterTest.kt | 12 +++--- .../createroom/impl/CreateRoomDataStore.kt | 2 +- .../configureroom/ConfigureRoomPresenter.kt | 4 +- .../impl/root/CreateRoomRootPresenter.kt | 4 +- .../impl/userlist/DefaultUserListPresenter.kt | 2 +- .../impl/userlist/UserListDataStore.kt | 12 +++--- .../features/ftue/impl/FtueFlowNode.kt | 2 +- .../ftue/impl/state/DefaultFtueService.kt | 4 +- .../joinroom/impl/JoinRoomPresenter.kt | 4 +- .../DefaultBiometricAuthenticatorManager.kt | 4 +- .../settings/LockScreenSettingsPresenter.kt | 4 +- .../AccountProviderDataSource.kt | 4 +- .../ConfirmAccountProviderPresenter.kt | 2 +- .../screens/createaccount/MessageParser.kt | 2 +- .../loginpassword/LoginPasswordPresenter.kt | 2 +- .../AccountProviderDataSourceTest.kt | 6 +-- .../messages/impl/MessagesPresenter.kt | 3 +- .../impl/actionlist/ActionListPresenter.kt | 4 +- .../preview/AttachmentsPreviewPresenter.kt | 8 +++- .../MessageComposerPresenter.kt | 24 ++++++------ .../impl/timeline/TimelinePresenter.kt | 12 ++++-- .../protection/TimelineProtectionPresenter.kt | 4 +- .../typing/TypingNotificationPresenter.kt | 4 +- .../migration/impl/MigrationPresenter.kt | 4 +- .../poll/impl/history/PollHistoryPresenter.kt | 2 +- .../advanced/AdvancedSettingsPresenter.kt | 21 +++++------ .../blockedusers/BlockedUsersPresenter.kt | 10 ++--- .../developer/DeveloperSettingsPresenter.kt | 14 ++++--- .../NotificationSettingsPresenter.kt | 8 ++-- .../impl/bugreport/BugReportPresenter.kt | 6 +-- .../DefaultRageshakePreferencesPresenter.kt | 17 +++++---- .../roomdetails/impl/RoomDetailsPresenter.kt | 4 +- .../roomlist/impl/RoomListPresenter.kt | 3 +- .../signedout/impl/SignedOutPresenter.kt | 4 +- .../libraries/matrix/api/sync/SyncService.kt | 5 +-- .../libraries/matrix/api/timeline/Timeline.kt | 7 +++- .../matrix/impl/sync/RustSyncService.kt | 3 ++ .../matrix/impl/timeline/RustTimeline.kt | 20 +++------- .../DefaultCallWidgetSettingsProvider.kt | 2 +- .../matrix/test/sync/FakeSyncService.kt | 3 ++ .../matrix/test/timeline/FakeTimeline.kt | 12 +----- .../impl/DefaultPermissionsPresenter.kt | 13 ++++--- .../analytics/api/AnalyticsService.kt | 12 +++--- .../analytics/impl/DefaultAnalyticsService.kt | 18 +++------ .../impl/DefaultAnalyticsServiceTest.kt | 12 +++--- .../analytics/noop/NoopAnalyticsService.kt | 6 +-- .../analytics/test/FakeAnalyticsService.kt | 9 ++--- .../android/tests/konsist/KonsistFlowTest.kt | 37 +++++++++++++++++++ 52 files changed, 221 insertions(+), 172 deletions(-) create mode 100644 tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFlowTest.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt index fbecfeb60b..2a7403862e 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt @@ -30,7 +30,6 @@ import io.element.android.libraries.matrix.api.oidc.AccountManagementAction import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.sync.SlidingSyncVersion import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isOnline import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus import io.element.android.libraries.push.api.PushService @@ -79,7 +78,7 @@ class LoggedInPresenter @Inject constructor( .launchIn(this) } val syncIndicator by matrixClient.roomListService.syncIndicator.collectAsState() - val isOnline by syncService.isOnline().collectAsState() + val isOnline by syncService.isOnline.collectAsState() val showSyncSpinner by remember { derivedStateOf { isOnline && syncIndicator == RoomListService.SyncIndicator.Show diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt index 56f3716ca1..a2016a9171 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/RoomFlowNode.kt @@ -49,7 +49,6 @@ import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isOnline import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first @@ -211,7 +210,7 @@ class RoomFlowNode @AssistedInject constructor( } private fun loadingNode(buildContext: BuildContext) = node(buildContext) { modifier -> - val isOnline by syncService.isOnline().collectAsState() + val isOnline by syncService.isOnline.collectAsState() LoadingRoomNodeView( state = LoadingRoomState.Loading, hasNetworkConnection = isOnline, diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt index 49a05c9d36..3c6f30af72 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomFlowNode.kt @@ -36,7 +36,6 @@ import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isOnline import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map @@ -114,7 +113,7 @@ class JoinedRoomFlowNode @AssistedInject constructor( private fun loadingNode(buildContext: BuildContext, onBackClick: () -> Unit) = node(buildContext) { modifier -> val loadingRoomState by loadingRoomStateStateFlow.collectAsState() - val isOnline by syncService.isOnline().collectAsState() + val isOnline by syncService.isOnline.collectAsState() LoadingRoomNodeView( state = loadingRoomState, hasNetworkConnection = isOnline, diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenter.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenter.kt index 8212cc6c88..6904734f26 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenter.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/preferences/AnalyticsPreferencesPresenter.kt @@ -27,8 +27,7 @@ class AnalyticsPreferencesPresenter @Inject constructor( @Composable override fun present(): AnalyticsPreferencesState { val localCoroutineScope = rememberCoroutineScope() - val isEnabled = analyticsService.getUserConsent() - .collectAsState(initial = false) + val isEnabled = analyticsService.userConsentFlow.collectAsState(initial = false) fun handleEvents(event: AnalyticsOptInEvents) { when (event) { diff --git a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenterTest.kt b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenterTest.kt index 1353d5ab5f..e9319fd7ba 100644 --- a/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenterTest.kt +++ b/features/analytics/impl/src/test/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInPresenterTest.kt @@ -35,10 +35,10 @@ class AnalyticsOptInPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(analyticsService.didAskUserConsent().first()).isFalse() + assertThat(analyticsService.didAskUserConsentFlow.first()).isFalse() initialState.eventSink.invoke(AnalyticsOptInEvents.EnableAnalytics(true)) - assertThat(analyticsService.didAskUserConsent().first()).isTrue() - assertThat(analyticsService.getUserConsent().first()).isTrue() + assertThat(analyticsService.didAskUserConsentFlow.first()).isTrue() + assertThat(analyticsService.userConsentFlow.first()).isTrue() } } @@ -53,10 +53,10 @@ class AnalyticsOptInPresenterTest { presenter.present() }.test { val initialState = awaitItem() - assertThat(analyticsService.didAskUserConsent().first()).isFalse() + assertThat(analyticsService.didAskUserConsentFlow.first()).isFalse() initialState.eventSink.invoke(AnalyticsOptInEvents.EnableAnalytics(false)) - assertThat(analyticsService.didAskUserConsent().first()).isTrue() - assertThat(analyticsService.getUserConsent().first()).isFalse() + assertThat(analyticsService.didAskUserConsentFlow.first()).isTrue() + assertThat(analyticsService.userConsentFlow.first()).isFalse() } } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt index 5f629d51eb..29b1525f51 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomDataStore.kt @@ -39,7 +39,7 @@ class CreateRoomDataStore @Inject constructor( } val createRoomConfigWithInvites: Flow = combine( - selectedUserListDataStore.selectedUsers(), + selectedUserListDataStore.selectedUsers, createRoomConfigFlow, ) { selectedUsers, config -> config.copy(invites = selectedUsers.toImmutableList()) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index fd54b753d9..0025a64df3 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -66,7 +66,9 @@ class ConfigureRoomPresenter @Inject constructor( val cameraPermissionState = cameraPermissionPresenter.present() val createRoomConfig by dataStore.createRoomConfigWithInvites.collectAsState(CreateRoomConfig()) val homeserverName = remember { matrixClient.userIdServerName() } - val isKnockFeatureEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(initial = false) + val isKnockFeatureEnabled by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock) + }.collectAsState(initial = false) val roomAddressValidity = remember { mutableStateOf(RoomAddressValidity.Unknown) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index c05ed770f9..ea8be45e6b 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -52,7 +52,9 @@ class CreateRoomRootPresenter @Inject constructor( val localCoroutineScope = rememberCoroutineScope() val startDmActionState: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } - val isRoomDirectorySearchEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomDirectorySearch).collectAsState(initial = false) + val isRoomDirectorySearchEnabled by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomDirectorySearch) + }.collectAsState(initial = false) fun handleEvents(event: CreateRoomRootEvents) { when (event) { diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt index ad9b18f624..32d5767cc6 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/DefaultUserListPresenter.kt @@ -54,7 +54,7 @@ class DefaultUserListPresenter @AssistedInject constructor( recentDirectRooms = matrixClient.getRecentDirectRooms() } var isSearchActive by rememberSaveable { mutableStateOf(false) } - val selectedUsers by userListDataStore.selectedUsers().collectAsState(emptyList()) + val selectedUsers by userListDataStore.selectedUsers.collectAsState(emptyList()) var searchQuery by rememberSaveable { mutableStateOf("") } var searchResults: SearchBarResultState> by remember { mutableStateOf(SearchBarResultState.Initial()) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt index 3be9868c98..a500e3a05f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/userlist/UserListDataStore.kt @@ -8,22 +8,22 @@ package io.element.android.features.createroom.impl.userlist import io.element.android.libraries.matrix.api.user.MatrixUser -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import javax.inject.Inject class UserListDataStore @Inject constructor() { - private val selectedUsers: MutableStateFlow> = MutableStateFlow(emptyList()) + private val _selectedUsers: MutableStateFlow> = MutableStateFlow(emptyList()) fun selectUser(user: MatrixUser) { - if (!selectedUsers.value.contains(user)) { - selectedUsers.tryEmit(selectedUsers.value.plus(user)) + if (!_selectedUsers.value.contains(user)) { + _selectedUsers.tryEmit(_selectedUsers.value.plus(user)) } } fun removeUserFromSelection(user: MatrixUser) { - selectedUsers.tryEmit(selectedUsers.value.minus(user)) + _selectedUsers.tryEmit(_selectedUsers.value.minus(user)) } - fun selectedUsers(): Flow> = selectedUsers + val selectedUsers = _selectedUsers.asStateFlow() } diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt index 034701fec4..71a27dcaae 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/FtueFlowNode.kt @@ -84,7 +84,7 @@ class FtueFlowNode @AssistedInject constructor( moveToNextStepIfNeeded() }) - analyticsService.didAskUserConsent() + analyticsService.didAskUserConsentFlow .distinctUntilChanged() .onEach { moveToNextStepIfNeeded() } .launchIn(lifecycleScope) diff --git a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/DefaultFtueService.kt b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/DefaultFtueService.kt index 0409d73538..744053b976 100644 --- a/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/DefaultFtueService.kt +++ b/features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/state/DefaultFtueService.kt @@ -66,7 +66,7 @@ class DefaultFtueService @Inject constructor( .onEach { updateState() } .launchIn(sessionCoroutineScope) - analyticsService.didAskUserConsent() + analyticsService.didAskUserConsentFlow .distinctUntilChanged() .onEach { updateState() } .launchIn(sessionCoroutineScope) @@ -118,7 +118,7 @@ class DefaultFtueService @Inject constructor( } private suspend fun needsAnalyticsOptIn(): Boolean { - return analyticsService.didAskUserConsent().first().not() + return analyticsService.didAskUserConsentFlow.first().not() } private suspend fun shouldAskNotificationPermissions(): Boolean { 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 09ec3c9a5f..b1fb345a0c 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 @@ -82,7 +82,9 @@ class JoinRoomPresenter @AssistedInject constructor( override fun present(): JoinRoomState { val coroutineScope = rememberCoroutineScope() var retryCount by remember { mutableIntStateOf(0) } - val roomInfo by matrixClient.getRoomInfoFlow(roomId.toRoomIdOrAlias()).collectAsState(initial = Optional.empty()) + val roomInfo by remember { + matrixClient.getRoomInfoFlow(roomId.toRoomIdOrAlias()) + }.collectAsState(initial = Optional.empty()) val joinAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } val knockAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } val cancelKnockAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt index 62de1f902d..5c2b1fdd53 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/biometric/DefaultBiometricAuthenticatorManager.kt @@ -87,7 +87,9 @@ class DefaultBiometricAuthenticatorManager @Inject constructor( @Composable override fun rememberUnlockBiometricAuthenticator(): BiometricAuthenticator { - val isBiometricAllowed by lockScreenStore.isBiometricUnlockAllowed().collectAsState(initial = false) + val isBiometricAllowed by remember { + lockScreenStore.isBiometricUnlockAllowed() + }.collectAsState(initial = false) val lifecycleState by LocalLifecycleOwner.current.lifecycle.currentStateFlow.collectAsState() val isAvailable by remember(lifecycleState) { derivedStateOf { isBiometricAllowed && hasAvailableAuthenticator } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt index f9a2cd8767..97dd875b01 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/settings/LockScreenSettingsPresenter.kt @@ -38,7 +38,9 @@ class LockScreenSettingsPresenter @Inject constructor( value = !lockScreenConfig.isPinMandatory && hasPinCode } } - val isBiometricEnabled by lockScreenStore.isBiometricUnlockAllowed().collectAsState(initial = false) + val isBiometricEnabled by remember { + lockScreenStore.isBiometricUnlockAllowed() + }.collectAsState(initial = false) var showRemovePinConfirmation by remember { mutableStateOf(false) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt index 3f9c368a1d..3e1fc1853c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSource.kt @@ -33,9 +33,7 @@ class AccountProviderDataSource @Inject constructor( defaultAccountProvider ) - fun flow(): StateFlow { - return accountProvider.asStateFlow() - } + val flow: StateFlow = accountProvider.asStateFlow() fun reset() { accountProvider.tryEmit(defaultAccountProvider) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt index eb5a8fee67..99b029a928 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt @@ -52,7 +52,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( @Composable override fun present(): ConfirmAccountProviderState { - val accountProvider by accountProviderDataSource.flow().collectAsState() + val accountProvider by accountProviderDataSource.flow.collectAsState() val localCoroutineScope = rememberCoroutineScope() val loginFlowAction: MutableState> = remember { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MessageParser.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MessageParser.kt index 027036059d..c937cf9d48 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MessageParser.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/MessageParser.kt @@ -30,7 +30,7 @@ class DefaultMessageParser @Inject constructor( val parser = Json { ignoreUnknownKeys = true } val response = parser.decodeFromString(MobileRegistrationResponse.serializer(), message) val userId = response.userId ?: error("No user ID in response") - val homeServer = response.homeServer ?: accountProviderDataSource.flow().value.url + val homeServer = response.homeServer ?: accountProviderDataSource.flow.value.url val accessToken = response.accessToken ?: error("No access token in response") val deviceId = response.deviceId ?: error("No device ID in response") return ExternalSession( diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt index ea60dc66f0..3a12715f6e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordPresenter.kt @@ -40,7 +40,7 @@ class LoginPasswordPresenter @Inject constructor( val formState = rememberSaveable { mutableStateOf(LoginFormState.Default) } - val accountProvider by accountProviderDataSource.flow().collectAsState() + val accountProvider by accountProviderDataSource.flow.collectAsState() fun handleEvents(event: LoginPasswordEvents) { when (event) { diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt index b0570cee93..e9a8595f3b 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderDataSourceTest.kt @@ -23,7 +23,7 @@ class AccountProviderDataSourceTest { @Test fun `present - initial state`() = runTest { val sut = AccountProviderDataSource(FakeEnterpriseService()) - sut.flow().test { + sut.flow.test { val initialState = awaitItem() assertThat(initialState).isEqualTo( AccountProvider( @@ -43,7 +43,7 @@ class AccountProviderDataSourceTest { val sut = AccountProviderDataSource(FakeEnterpriseService( defaultHomeserverResult = { AuthenticationConfig.MATRIX_ORG_URL } )) - sut.flow().test { + sut.flow.test { val initialState = awaitItem() assertThat(initialState).isEqualTo( AccountProvider( @@ -61,7 +61,7 @@ class AccountProviderDataSourceTest { @Test fun `present - user change and reset`() = runTest { val sut = AccountProviderDataSource(FakeEnterpriseService()) - sut.flow().test { + sut.flow.test { val initialState = awaitItem() assertThat(initialState.url).isEqualTo(FakeEnterpriseService.A_FAKE_HOMESERVER) sut.userSelection(AccountProvider(url = "https://example.com")) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 4541e267fc..b5a1842212 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -75,7 +75,6 @@ import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOwn import io.element.android.libraries.matrix.api.room.powerlevels.canSendMessage import io.element.android.libraries.matrix.api.sync.SyncService -import io.element.android.libraries.matrix.api.sync.isOnline import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.matrix.ui.model.getAvatarData @@ -183,7 +182,7 @@ class MessagesPresenter @AssistedInject constructor( showReinvitePrompt = !hasDismissedInviteDialog && composerHasFocus && roomInfo.isDm && roomInfo.activeMembersCount == 1L } } - val isOnline by syncService.isOnline().collectAsState() + val isOnline by syncService.isOnline.collectAsState() val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt index 5274dcbc22..2ca03e09ea 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt @@ -84,7 +84,9 @@ class DefaultActionListPresenter @AssistedInject constructor( mutableStateOf(ActionListState.Target.None) } - val isDeveloperModeEnabled by appPreferencesStore.isDeveloperModeEnabledFlow().collectAsState(initial = false) + val isDeveloperModeEnabled by remember { + appPreferencesStore.isDeveloperModeEnabledFlow() + }.collectAsState(initial = false) val isPinnedEventsEnabled = isPinnedMessagesFeatureEnabled() val pinnedEventIds by remember { room.roomInfoFlow.map { it.pinnedEventIds } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt index e7160d26dc..2f560cd7ac 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt @@ -78,8 +78,12 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( val ongoingSendAttachmentJob = remember { mutableStateOf(null) } - val allowCaption by featureFlagService.isFeatureEnabledFlow(FeatureFlags.MediaCaptionCreation).collectAsState(initial = false) - val showCaptionCompatibilityWarning by featureFlagService.isFeatureEnabledFlow(FeatureFlags.MediaCaptionWarning).collectAsState(initial = false) + val allowCaption by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.MediaCaptionCreation) + }.collectAsState(initial = false) + val showCaptionCompatibilityWarning by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.MediaCaptionWarning) + }.collectAsState(initial = false) var useSendQueue by remember { mutableStateOf(false) } var preprocessMediaJob by remember { mutableStateOf(null) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 73057b1a51..95ea275278 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -177,7 +177,9 @@ class MessageComposerPresenter @AssistedInject constructor( } var showAttachmentSourcePicker: Boolean by remember { mutableStateOf(false) } - val sendTypingNotifications by sessionPreferencesStore.isSendTypingNotificationsEnabled().collectAsState(initial = true) + val sendTypingNotifications by remember { + sessionPreferencesStore.isSendTypingNotificationsEnabled() + }.collectAsState(initial = true) LaunchedEffect(cameraPermissionState.permissionGranted) { if (cameraPermissionState.permissionGranted) { @@ -397,16 +399,16 @@ class MessageComposerPresenter @AssistedInject constructor( .stateIn(this, SharingStarted.Lazily, emptyList()) combine(mentionTriggerFlow, room.membersStateFlow, roomAliasSuggestionsFlow) { suggestion, roomMembersState, roomAliasSuggestions -> - val result = suggestionsProcessor.process( - suggestion = suggestion, - roomMembersState = roomMembersState, - roomAliasSuggestions = roomAliasSuggestions, - currentUserId = currentUserId, - canSendRoomMention = ::canSendRoomMention, - ) - suggestions.clear() - suggestions.addAll(result) - } + val result = suggestionsProcessor.process( + suggestion = suggestion, + roomMembersState = roomMembersState, + roomAliasSuggestions = roomAliasSuggestions, + currentUserId = currentUserId, + canSendRoomMention = ::canSendRoomMention, + ) + suggestions.clear() + suggestions.addAll(result) + } .collect() } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt index 4061be78c1..6ac01c990b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt @@ -109,9 +109,15 @@ class TimelinePresenter @AssistedInject constructor( val messageShield: MutableState = remember { mutableStateOf(null) } val resolveVerifiedUserSendFailureState = resolveVerifiedUserSendFailurePresenter.present() - val isSendPublicReadReceiptsEnabled by sessionPreferencesStore.isSendPublicReadReceiptsEnabled().collectAsState(initial = true) - val renderReadReceipts by sessionPreferencesStore.isRenderReadReceiptsEnabled().collectAsState(initial = true) - val isLive by timelineController.isLive().collectAsState(initial = true) + val isSendPublicReadReceiptsEnabled by remember { + sessionPreferencesStore.isSendPublicReadReceiptsEnabled() + }.collectAsState(initial = true) + val renderReadReceipts by remember { + sessionPreferencesStore.isRenderReadReceiptsEnabled() + }.collectAsState(initial = true) + val isLive by remember { + timelineController.isLive() + }.collectAsState(initial = true) fun handleEvents(event: TimelineEvents) { when (event) { 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 ce2ef75321..e4283b1a02 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 @@ -25,7 +25,9 @@ class TimelineProtectionPresenter @Inject constructor( ) : Presenter { @Composable override fun present(): TimelineProtectionState { - val hideMediaContent by appPreferencesStore.doesHideImagesAndVideosFlow().collectAsState(initial = false) + val hideMediaContent by remember { + appPreferencesStore.doesHideImagesAndVideosFlow() + }.collectAsState(initial = false) var allowedEvents by remember { mutableStateOf>(setOf()) } val protectionState by remember(hideMediaContent) { derivedStateOf { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt index 35759ade74..4dfc02a2a1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/typing/TypingNotificationPresenter.kt @@ -37,7 +37,9 @@ class TypingNotificationPresenter @Inject constructor( ) : Presenter { @Composable override fun present(): TypingNotificationState { - val renderTypingNotifications by sessionPreferencesStore.isRenderTypingNotificationsEnabled().collectAsState(initial = true) + val renderTypingNotifications by remember { + sessionPreferencesStore.isRenderTypingNotificationsEnabled() + }.collectAsState(initial = true) val typingMembersState by produceState(initialValue = persistentListOf(), key1 = renderTypingNotifications) { if (renderTypingNotifications) { observeRoomTypingMembers() diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt index f89d81685f..3d8fc3a0aa 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt @@ -33,7 +33,9 @@ class MigrationPresenter @Inject constructor( @Composable override fun present(): MigrationState { - val migrationStoreVersion by migrationStore.applicationMigrationVersion().collectAsState(initial = null) + val migrationStoreVersion by remember { + migrationStore.applicationMigrationVersion() + }.collectAsState(initial = null) var migrationAction: AsyncData by remember { mutableStateOf(AsyncData.Uninitialized) } // Uncomment this block to run the migration everytime diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt index 00f68e923b..d4da6a76b4 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryPresenter.kt @@ -40,7 +40,7 @@ class PollHistoryPresenter @Inject constructor( @Composable override fun present(): PollHistoryState { val timeline = room.liveTimeline - val paginationState by timeline.paginationStatus(Timeline.PaginationDirection.BACKWARDS).collectAsState() + val paginationState by timeline.backwardPaginationStatus.collectAsState() val pollHistoryItemsFlow = remember { timeline.timelineItems.map { items -> pollHistoryItemFactory.create(items) 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 b256997d1c..80f9a98b0c 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 @@ -29,19 +29,18 @@ class AdvancedSettingsPresenter @Inject constructor( @Composable override fun present(): AdvancedSettingsState { val localCoroutineScope = rememberCoroutineScope() - val isDeveloperModeEnabled by appPreferencesStore - .isDeveloperModeEnabledFlow() - .collectAsState(initial = false) - val isSharePresenceEnabled by sessionPreferencesStore - .isSharePresenceEnabled() - .collectAsState(initial = true) - val doesCompressMedia by sessionPreferencesStore - .doesCompressMedia() - .collectAsState(initial = true) + val isDeveloperModeEnabled by remember { + appPreferencesStore.isDeveloperModeEnabledFlow() + }.collectAsState(initial = false) + val isSharePresenceEnabled by remember { + sessionPreferencesStore.isSharePresenceEnabled() + }.collectAsState(initial = true) + val doesCompressMedia by remember { + sessionPreferencesStore.doesCompressMedia() + }.collectAsState(initial = true) val theme by remember { appPreferencesStore.getThemeFlow().mapToTheme() - } - .collectAsState(initial = Theme.System) + }.collectAsState(initial = Theme.System) var showChangeThemeDialog by remember { mutableStateOf(false) } fun handleEvents(event: AdvancedSettingsEvents) { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenter.kt index 19365e307c..c673276a17 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/blockedusers/BlockedUsersPresenter.kt @@ -44,17 +44,17 @@ class BlockedUsersPresenter @Inject constructor( mutableStateOf(AsyncAction.Uninitialized) } - val renderBlockedUsersDetail = featureFlagService - .isFeatureEnabledFlow(FeatureFlags.ShowBlockedUsersDetails) - .collectAsState(initial = false) + val renderBlockedUsersDetail by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.ShowBlockedUsersDetails) + }.collectAsState(initial = false) val ignoredUserIds by matrixClient.ignoredUsersFlow.collectAsState() val ignoredMatrixUser by produceState( initialValue = ignoredUserIds.map { MatrixUser(userId = it) }, - key1 = renderBlockedUsersDetail.value, + key1 = renderBlockedUsersDetail, key2 = ignoredUserIds ) { value = ignoredUserIds.map { - if (renderBlockedUsersDetail.value) { + if (renderBlockedUsersDetail) { matrixClient.getProfile(it).getOrNull() } else { null diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index aa2c5a1c50..5159983a6e 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -71,12 +71,14 @@ class DeveloperSettingsPresenter @Inject constructor( val clearCacheAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } - val customElementCallBaseUrl by appPreferencesStore - .getCustomElementCallBaseUrlFlow() - .collectAsState(initial = null) - val hideImagesAndVideos by appPreferencesStore - .doesHideImagesAndVideosFlow() - .collectAsState(initial = false) + val customElementCallBaseUrl by remember { + appPreferencesStore + .getCustomElementCallBaseUrlFlow() + }.collectAsState(initial = null) + val hideImagesAndVideos by remember { + appPreferencesStore + .doesHideImagesAndVideosFlow() + }.collectAsState(initial = false) val tracingLogLevelFlow = remember { appPreferencesStore.getTracingLogLevelFlow().map { AsyncData.Success(it.toLogLevelItem()) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenter.kt index 317c6e796e..3c1c81e758 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/notifications/NotificationSettingsPresenter.kt @@ -58,9 +58,9 @@ class NotificationSettingsPresenter @Inject constructor( val changeNotificationSettingAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } val localCoroutineScope = rememberCoroutineScope() - val appNotificationsEnabled = userPushStore - .getNotificationEnabledForDevice() - .collectAsState(initial = false) + val appNotificationsEnabled by remember { + userPushStore.getNotificationEnabledForDevice() + }.collectAsState(initial = false) val matrixSettings: MutableState = remember { mutableStateOf(NotificationSettingsState.MatrixSettings.Uninitialized) @@ -158,7 +158,7 @@ class NotificationSettingsPresenter @Inject constructor( matrixSettings = matrixSettings.value, appSettings = NotificationSettingsState.AppSettings( systemNotificationsEnabled = systemNotificationsEnabled.value, - appNotificationsEnabled = appNotificationsEnabled.value + appNotificationsEnabled = appNotificationsEnabled, ), changeNotificationSettingAction = changeNotificationSettingAction.value, currentPushDistributor = currentDistributor, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt index 294fc194d5..455cefdb24 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportPresenter.kt @@ -64,9 +64,9 @@ class BugReportPresenter @Inject constructor( screenshotHolder.getFileUri() ) } - val crashInfo: String by crashDataStore - .crashInfo() - .collectAsState(initial = "") + val crashInfo: String by remember { + crashDataStore.crashInfo() + }.collectAsState(initial = "") val sendingProgress = remember { mutableFloatStateOf(0f) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt index ba883b50a9..b4f45a3bdc 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/preferences/DefaultRageshakePreferencesPresenter.kt @@ -10,6 +10,7 @@ package io.element.android.features.rageshake.impl.preferences import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -39,13 +40,13 @@ class DefaultRageshakePreferencesPresenter @Inject constructor( mutableStateOf(rageshake.isAvailable()) } val isFeatureAvailable = remember { rageshakeFeatureAvailability.isAvailable() } - val isEnabled = rageshakeDataStore - .isEnabled() - .collectAsState(initial = false) + val isEnabled by remember { + rageshakeDataStore.isEnabled() + }.collectAsState(initial = false) - val sensitivity = rageshakeDataStore - .sensitivity() - .collectAsState(initial = 0f) + val sensitivity by remember { + rageshakeDataStore.sensitivity() + }.collectAsState(initial = 0f) fun handleEvents(event: RageshakePreferencesEvents) { when (event) { @@ -56,9 +57,9 @@ class DefaultRageshakePreferencesPresenter @Inject constructor( return RageshakePreferencesState( isFeatureEnabled = isFeatureAvailable, - isEnabled = isEnabled.value, + isEnabled = isEnabled, isSupported = isSupported.value, - sensitivity = sensitivity.value, + sensitivity = sensitivity, eventSink = ::handleEvents ) } 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 df1daf6386..bcbdb83e2d 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 @@ -122,7 +122,9 @@ class RoomDetailsPresenter @Inject constructor( } val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value) - val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false) + val isKnockRequestsEnabled by remember { + featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock) + }.collectAsState(false) val knockRequestsCount by produceState(null) { room.knockRequestsFlow.collect { value = it.size } } 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 19e46607ef..660f0f516f 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 @@ -50,7 +50,6 @@ 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.sync.isOnline 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 @@ -101,7 +100,7 @@ class RoomListPresenter @Inject constructor( val coroutineScope = rememberCoroutineScope() val leaveRoomState = leaveRoomPresenter.present() val matrixUser = client.userProfile.collectAsState() - val isOnline by syncService.isOnline().collectAsState() + val isOnline by syncService.isOnline.collectAsState() val filtersState = filtersPresenter.present() val searchState = searchPresenter.present() val acceptDeclineInviteState = acceptDeclineInvitePresenter.present() diff --git a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutPresenter.kt b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutPresenter.kt index dd7c24ab35..773954c3e0 100644 --- a/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutPresenter.kt +++ b/features/signedout/impl/src/main/kotlin/io/element/android/features/signedout/impl/SignedOutPresenter.kt @@ -34,7 +34,9 @@ class SignedOutPresenter @AssistedInject constructor( @Composable override fun present(): SignedOutState { - val sessions by sessionStore.sessionsFlow().collectAsState(initial = emptyList()) + val sessions by remember { + sessionStore.sessionsFlow() + }.collectAsState(initial = emptyList()) val signedOutSession by remember { derivedStateOf { sessions.firstOrNull { it.userId == sessionId } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt index 21554dbbd6..13cb54b500 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/sync/SyncService.kt @@ -7,7 +7,6 @@ package io.element.android.libraries.matrix.api.sync -import io.element.android.libraries.core.coroutine.mapState import kotlinx.coroutines.flow.StateFlow interface SyncService { @@ -25,6 +24,6 @@ interface SyncService { * Flow of [SyncState]. Will be updated as soon as the current [SyncState] changes. */ val syncState: StateFlow -} -fun SyncService.isOnline(): StateFlow = syncState.mapState { it != SyncState.Offline } + val isOnline: StateFlow +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt index c74f7b2c00..904aae0355 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt @@ -49,7 +49,10 @@ interface Timeline : AutoCloseable { val membershipChangeEventReceived: Flow suspend fun sendReadReceipt(eventId: EventId, receiptType: ReceiptType): Result suspend fun paginate(direction: PaginationDirection): Result - fun paginationStatus(direction: PaginationDirection): StateFlow + + val backwardPaginationStatus: StateFlow + val forwardPaginationStatus: StateFlow + val timelineItems: Flow> suspend fun sendMessage( @@ -105,7 +108,7 @@ interface Timeline : AutoCloseable { caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, - ): Result + ): Result suspend fun sendFile( file: File, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt index 3318e1384f..1d8eb7c0ea 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.impl.sync +import io.element.android.libraries.core.coroutine.mapState import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.sync.SyncState import kotlinx.coroutines.CoroutineDispatcher @@ -73,4 +74,6 @@ class RustSyncService( } .distinctUntilChanged() .stateIn(sessionCoroutineScope, SharingStarted.Eagerly, SyncState.Idle) + + override val isOnline: StateFlow = syncState.mapState { it != SyncState.Offline } } 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 46c2bfebd4..efe16f0073 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 @@ -54,7 +54,6 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first @@ -127,11 +126,11 @@ class RustTimeline( private val lastForwardIndicatorsPostProcessor = LastForwardIndicatorsPostProcessor(mode) private val typingNotificationPostProcessor = TypingNotificationPostProcessor(mode) - private val backPaginationStatus = MutableStateFlow( + override val backwardPaginationStatus = MutableStateFlow( Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode != Timeline.Mode.PINNED_EVENTS) ) - private val forwardPaginationStatus = MutableStateFlow( + override val forwardPaginationStatus = MutableStateFlow( Timeline.PaginationStatus(isPaginating = false, hasMoreToLoad = mode == Timeline.Mode.FOCUSED_ON_EVENT) ) @@ -167,7 +166,7 @@ class RustTimeline( private fun updatePaginationStatus(direction: Timeline.PaginationDirection, update: (Timeline.PaginationStatus) -> Timeline.PaginationStatus) { when (direction) { - Timeline.PaginationDirection.BACKWARDS -> backPaginationStatus.getAndUpdate(update) + Timeline.PaginationDirection.BACKWARDS -> backwardPaginationStatus.getAndUpdate(update) Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus.getAndUpdate(update) } } @@ -185,7 +184,7 @@ class RustTimeline( } }.onFailure { error -> if (error is TimelineException.CannotPaginate) { - Timber.d("Can't paginate $direction on room ${matrixRoom.roomId} with paginationStatus: ${backPaginationStatus.value}") + Timber.d("Can't paginate $direction on room ${matrixRoom.roomId} with paginationStatus: ${backwardPaginationStatus.value}") } else { updatePaginationStatus(direction) { it.copy(isPaginating = false) } Timber.e(error, "Error paginating $direction on room ${matrixRoom.roomId}") @@ -199,21 +198,14 @@ class RustTimeline( private fun canPaginate(direction: Timeline.PaginationDirection): Boolean { if (!isTimelineInitialized.value) return false return when (direction) { - Timeline.PaginationDirection.BACKWARDS -> backPaginationStatus.value.canPaginate + Timeline.PaginationDirection.BACKWARDS -> backwardPaginationStatus.value.canPaginate Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus.value.canPaginate } } - override fun paginationStatus(direction: Timeline.PaginationDirection): StateFlow { - return when (direction) { - Timeline.PaginationDirection.BACKWARDS -> backPaginationStatus - Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus - } - } - override val timelineItems: Flow> = combine( _timelineItems, - backPaginationStatus, + backwardPaginationStatus, forwardPaginationStatus, matrixRoom.roomInfoFlow.map { it.creator to it.isDm }.distinctUntilChanged(), isTimelineInitialized, 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 b761dd7e3b..7f179ad2f7 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 @@ -29,7 +29,7 @@ class DefaultCallWidgetSettingsProvider @Inject constructor( private val analyticsService: AnalyticsService, ) : CallWidgetSettingsProvider { override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean): MatrixWidgetSettings { - val isAnalyticsEnabled = analyticsService.getUserConsent().first() + val isAnalyticsEnabled = analyticsService.userConsentFlow.first() val options = VirtualElementCallWidgetOptions( elementCallUrl = baseUrl, widgetId = widgetId, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt index 9019eea646..5469e5b4aa 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/sync/FakeSyncService.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.test.sync +import io.element.android.libraries.core.coroutine.mapState import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.sync.SyncState import kotlinx.coroutines.flow.MutableStateFlow @@ -29,6 +30,8 @@ class FakeSyncService( override val syncState: StateFlow = syncStateFlow + override val isOnline: StateFlow = syncState.mapState { it != SyncState.Offline } + suspend fun emitSyncState(syncState: SyncState) { syncStateFlow.emit(syncState) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt index 1c335057b5..f43c00c63a 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt @@ -28,19 +28,18 @@ import io.element.android.tests.testutils.lambda.lambdaError import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import java.io.File class FakeTimeline( private val name: String = "FakeTimeline", override val timelineItems: Flow> = MutableStateFlow(emptyList()), - private val backwardPaginationStatus: MutableStateFlow = MutableStateFlow( + override val backwardPaginationStatus: MutableStateFlow = MutableStateFlow( Timeline.PaginationStatus( isPaginating = false, hasMoreToLoad = true ) ), - private val forwardPaginationStatus: MutableStateFlow = MutableStateFlow( + override val forwardPaginationStatus: MutableStateFlow = MutableStateFlow( Timeline.PaginationStatus( isPaginating = false, hasMoreToLoad = false @@ -377,13 +376,6 @@ class FakeTimeline( override suspend fun paginate(direction: Timeline.PaginationDirection): Result = paginateLambda(direction) - override fun paginationStatus(direction: Timeline.PaginationDirection): StateFlow { - return when (direction) { - Timeline.PaginationDirection.BACKWARDS -> backwardPaginationStatus - Timeline.PaginationDirection.FORWARDS -> forwardPaginationStatus - } - } - var loadReplyDetailsLambda: (eventId: EventId) -> InReplyTo = { InReplyTo.NotLoaded(it) } diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt index 3e5e3b7407..e9072e3666 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import com.google.accompanist.permissions.ExperimentalPermissionsApi @@ -56,13 +57,13 @@ class DefaultPermissionsPresenter @AssistedInject constructor( // To reset the store: ResetStore() - val isAlreadyDenied: Boolean by permissionsStore - .isPermissionDenied(permission) - .collectAsState(initial = false) + val isAlreadyDenied: Boolean by remember { + permissionsStore.isPermissionDenied(permission) + }.collectAsState(initial = false) - val isAlreadyAsked: Boolean by permissionsStore - .isPermissionAsked(permission) - .collectAsState(initial = false) + val isAlreadyAsked: Boolean by remember { + permissionsStore.isPermissionAsked(permission) + }.collectAsState(initial = false) var permissionState: PermissionState? = null diff --git a/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt index 9ff4053b33..750a6d1d17 100644 --- a/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt +++ b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt @@ -19,9 +19,9 @@ interface AnalyticsService : AnalyticsTracker, ErrorTracker { fun getAvailableAnalyticsProviders(): Set /** - * Return a Flow of Boolean, true if the user has given their consent. + * A Flow of Boolean, true if the user has given their consent. */ - fun getUserConsent(): Flow + val userConsentFlow: Flow /** * Update the user consent value. @@ -29,9 +29,9 @@ interface AnalyticsService : AnalyticsTracker, ErrorTracker { suspend fun setUserConsent(userConsent: Boolean) /** - * Return a Flow of Boolean, true if the user has been asked for their consent. + * A Flow of Boolean, true if the user has been asked for their consent. */ - fun didAskUserConsent(): Flow + val didAskUserConsentFlow: Flow /** * Store the fact that the user has been asked for their consent. @@ -39,9 +39,9 @@ interface AnalyticsService : AnalyticsTracker, ErrorTracker { suspend fun setDidAskUserConsent() /** - * Return a Flow of String, used for analytics Id. + * A Flow of String, used for analytics Id. */ - fun getAnalyticsId(): Flow + val analyticsIdFlow: Flow /** * Update analyticsId from the AccountData. diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt index 6dafd7f334..5ee74860aa 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt @@ -43,6 +43,10 @@ class DefaultAnalyticsService @Inject constructor( // Cache for the properties to send private var pendingUserProperties: UserProperties? = null + override val userConsentFlow: Flow = analyticsStore.userConsentFlow + override val didAskUserConsentFlow: Flow = analyticsStore.didAskUserConsentFlow + override val analyticsIdFlow: Flow = analyticsStore.analyticsIdFlow + init { observeUserConsent() observeSessions() @@ -52,19 +56,11 @@ class DefaultAnalyticsService @Inject constructor( return analyticsProviders } - override fun getUserConsent(): Flow { - return analyticsStore.userConsentFlow - } - override suspend fun setUserConsent(userConsent: Boolean) { Timber.tag(analyticsTag.value).d("setUserConsent($userConsent)") analyticsStore.setUserConsent(userConsent) } - override fun didAskUserConsent(): Flow { - return analyticsStore.didAskUserConsentFlow - } - override suspend fun setDidAskUserConsent() { Timber.tag(analyticsTag.value).d("setDidAskUserConsent()") analyticsStore.setDidAskUserConsent() @@ -74,10 +70,6 @@ class DefaultAnalyticsService @Inject constructor( analyticsStore.setDidAskUserConsent(false) } - override fun getAnalyticsId(): Flow { - return analyticsStore.analyticsIdFlow - } - override suspend fun setAnalyticsId(analyticsId: String) { Timber.tag(analyticsTag.value).d("setAnalyticsId($analyticsId)") analyticsStore.setAnalyticsId(analyticsId) @@ -93,7 +85,7 @@ class DefaultAnalyticsService @Inject constructor( } private fun observeUserConsent() { - getUserConsent() + userConsentFlow .onEach { consent -> Timber.tag(analyticsTag.value).d("User consent updated to $consent") userConsent.set(consent) diff --git a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt index 1b00b238eb..e05a6e4208 100644 --- a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt +++ b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt @@ -132,10 +132,10 @@ class DefaultAnalyticsServiceTest { analyticsStore = store, ) assertThat(store.userConsentFlow.first()).isFalse() - assertThat(sut.getUserConsent().first()).isFalse() + assertThat(sut.userConsentFlow.first()).isFalse() sut.setUserConsent(true) assertThat(store.userConsentFlow.first()).isTrue() - assertThat(sut.getUserConsent().first()).isTrue() + assertThat(sut.userConsentFlow.first()).isTrue() } @Test @@ -146,10 +146,10 @@ class DefaultAnalyticsServiceTest { analyticsStore = store, ) assertThat(store.analyticsIdFlow.first()).isEqualTo("") - assertThat(sut.getAnalyticsId().first()).isEqualTo("") + assertThat(sut.analyticsIdFlow.first()).isEqualTo("") sut.setAnalyticsId(AN_ID) assertThat(store.analyticsIdFlow.first()).isEqualTo(AN_ID) - assertThat(sut.getAnalyticsId().first()).isEqualTo(AN_ID) + assertThat(sut.analyticsIdFlow.first()).isEqualTo(AN_ID) } @Test @@ -160,10 +160,10 @@ class DefaultAnalyticsServiceTest { analyticsStore = store, ) assertThat(store.didAskUserConsentFlow.first()).isFalse() - assertThat(sut.didAskUserConsent().first()).isFalse() + assertThat(sut.didAskUserConsentFlow.first()).isFalse() sut.setDidAskUserConsent() assertThat(store.didAskUserConsentFlow.first()).isTrue() - assertThat(sut.didAskUserConsent().first()).isTrue() + assertThat(sut.didAskUserConsentFlow.first()).isTrue() } @Test diff --git a/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt index eb05c5c151..9af15543f0 100644 --- a/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt +++ b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt @@ -24,11 +24,11 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class NoopAnalyticsService @Inject constructor() : AnalyticsService { override fun getAvailableAnalyticsProviders(): Set = emptySet() - override fun getUserConsent(): Flow = flowOf(false) + override val userConsentFlow: Flow = flowOf(false) override suspend fun setUserConsent(userConsent: Boolean) = Unit - override fun didAskUserConsent(): Flow = flowOf(true) + override val didAskUserConsentFlow: Flow = flowOf(true) override suspend fun setDidAskUserConsent() = Unit - override fun getAnalyticsId(): Flow = flowOf("") + override val analyticsIdFlow: Flow = flowOf("") override suspend fun setAnalyticsId(analyticsId: String) = Unit override suspend fun reset() = Unit override fun capture(event: VectorAnalyticsEvent) = Unit diff --git a/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt b/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt index d60cc8f633..081f66d4e6 100644 --- a/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt +++ b/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt @@ -15,6 +15,7 @@ import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analyticsproviders.api.AnalyticsProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow class FakeAnalyticsService( isEnabled: Boolean = false, @@ -22,7 +23,7 @@ class FakeAnalyticsService( private val resetLambda: () -> Unit = {}, ) : AnalyticsService { private val isEnabledFlow = MutableStateFlow(isEnabled) - private val didAskUserConsentFlow = MutableStateFlow(didAskUserConsent) + override val didAskUserConsentFlow = MutableStateFlow(didAskUserConsent) val capturedEvents = mutableListOf() val screenEvents = mutableListOf() val trackedErrors = mutableListOf() @@ -30,19 +31,17 @@ class FakeAnalyticsService( override fun getAvailableAnalyticsProviders(): Set = emptySet() - override fun getUserConsent(): Flow = isEnabledFlow + override val userConsentFlow: Flow = isEnabledFlow.asStateFlow() override suspend fun setUserConsent(userConsent: Boolean) { isEnabledFlow.value = userConsent } - override fun didAskUserConsent(): Flow = didAskUserConsentFlow - override suspend fun setDidAskUserConsent() { didAskUserConsentFlow.value = true } - override fun getAnalyticsId(): Flow = MutableStateFlow("") + override val analyticsIdFlow: Flow = MutableStateFlow("") override suspend fun setAnalyticsId(analyticsId: String) { } diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFlowTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFlowTest.kt new file mode 100644 index 0000000000..b9cca40740 --- /dev/null +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistFlowTest.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.tests.konsist + +import androidx.compose.runtime.Composable +import com.lemonappdev.konsist.api.Konsist +import com.lemonappdev.konsist.api.ext.list.withAnnotationOf +import com.lemonappdev.konsist.api.verify.assertFalse +import org.junit.Test + +class KonsistFlowTest { + @Test + fun `flow must be remembered when it is collected as state`() { + // Match + // ```).collectAsState``` + // and + // ```) + // .collectAsState``` + val regex = "(.*)\\)(\n\\s*)*\\.collectAsState".toRegex() + + Konsist + .scopeFromProject() + .functions() + .withAnnotationOf(Composable::class) + .assertFalse( + additionalMessage = "Please check that the flow is remembered when it is collected as state." + + " Only val flows can be not remembered.", + ) { function -> + regex.matches(function.text) + } + } +} From d8d9f2cf1410e687f5849b8096682f624e523772 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 4 Apr 2025 16:51:31 +0200 Subject: [PATCH 38/54] Remove the green badge on a pending invite after a first preview (#4532) * Remove condition on displayType as I believe, that it has no effect. * Remove the green badge on a pending invite after a first preview * Update screenshots * Fix test * Improve DefaultSeenInvitesStore, clear it on logout, and on clear cache. Also create a store per session. * Remember the returned flow. --------- Co-authored-by: ElementBot --- .../features/invite/api/SeenInvitesStore.kt | 37 ++++++++ features/invite/impl/build.gradle.kts | 2 + .../invite/impl/DefaultSeenInvitesStore.kt | 90 +++++++++++++++++++ .../response/AcceptDeclineInvitePresenter.kt | 4 + .../AcceptDeclineInvitePresenterTest.kt | 43 ++++++++- features/invite/test/build.gradle.kts | 29 ++++++ .../invite/test/InMemorySeenInvitesStore.kt | 33 +++++++ features/joinroom/impl/build.gradle.kts | 1 + .../joinroom/impl/JoinRoomPresenter.kt | 13 +++ .../joinroom/impl/di/JoinRoomModule.kt | 3 + .../joinroom/impl/JoinRoomPresenterTest.kt | 16 +++- features/preferences/impl/build.gradle.kts | 2 + .../impl/tasks/ClearCacheUseCase.kt | 3 + .../tasks/DefaultClearCacheUseCaseTest.kt | 7 ++ features/roomlist/impl/build.gradle.kts | 5 +- .../impl/RoomListContentStateProvider.kt | 4 + .../roomlist/impl/RoomListPresenter.kt | 7 +- .../features/roomlist/impl/RoomListState.kt | 3 + .../impl/components/RoomListContentView.kt | 3 + .../impl/components/RoomSummaryRow.kt | 14 ++- .../impl/model/RoomListRoomSummary.kt | 6 +- .../impl/search/RoomListSearchView.kt | 2 + .../roomlist/impl/RoomListPresenterTest.kt | 14 ++- .../impl/model/RoomListRoomSummaryTest.kt | 6 +- ...pl.components_RoomSummaryRow_Day_30_en.png | 4 +- ....components_RoomSummaryRow_Night_30_en.png | 4 +- 26 files changed, 326 insertions(+), 29 deletions(-) create mode 100644 features/invite/api/src/main/kotlin/io/element/android/features/invite/api/SeenInvitesStore.kt create mode 100644 features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt create mode 100644 features/invite/test/build.gradle.kts create mode 100644 features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InMemorySeenInvitesStore.kt diff --git a/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/SeenInvitesStore.kt b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/SeenInvitesStore.kt new file mode 100644 index 0000000000..682970ffe7 --- /dev/null +++ b/features/invite/api/src/main/kotlin/io/element/android/features/invite/api/SeenInvitesStore.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.features.invite.api + +import io.element.android.libraries.matrix.api.core.RoomId +import kotlinx.coroutines.flow.Flow + +interface SeenInvitesStore { + /** + * Returns a flow of seen room IDs of invitation. + */ + fun seenRoomIds(): Flow> + + /** + * Mark the invitation as seen. + * Call this when the invitation details are shown to the user. + * @param roomId the room ID of the invitation to mark as seen. + */ + suspend fun markAsSeen(roomId: RoomId) + + /** + * Mark the invitation as unseen. + * Call this when the invitation has been accepted or declined. + * @param roomId the room ID of the invitation to mark as unseen. + */ + suspend fun markAsUnSeen(roomId: RoomId) + + /** + * Delete the store. + */ + suspend fun clear() +} diff --git a/features/invite/impl/build.gradle.kts b/features/invite/impl/build.gradle.kts index 8c00ac3d23..7f052bea09 100644 --- a/features/invite/impl/build.gradle.kts +++ b/features/invite/impl/build.gradle.kts @@ -21,6 +21,7 @@ setupAnvil() dependencies { api(projects.features.invite.api) implementation(libs.androidx.datastore.preferences) + implementation(projects.libraries.androidutils) implementation(projects.libraries.core) implementation(projects.libraries.architecture) implementation(projects.libraries.matrix.api) @@ -35,6 +36,7 @@ dependencies { testImplementation(libs.molecule.runtime) testImplementation(libs.test.truth) testImplementation(libs.test.turbine) + testImplementation(projects.features.invite.test) testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.push.test) testImplementation(projects.services.analytics.test) diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt new file mode 100644 index 0000000000..3accc163b0 --- /dev/null +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt @@ -0,0 +1,90 @@ +/* + * 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.impl + +import android.content.Context +import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringSetPreferencesKey +import androidx.datastore.preferences.preferencesDataStoreFile +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.invite.api.SeenInvitesStore +import io.element.android.libraries.androidutils.file.safeDelete +import io.element.android.libraries.androidutils.hash.hash +import io.element.android.libraries.di.ApplicationContext +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.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.user.CurrentSessionIdHolder +import io.element.android.libraries.sessionstorage.api.observer.SessionListener +import io.element.android.libraries.sessionstorage.api.observer.SessionObserver +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +private val seenInvitesKey = stringSetPreferencesKey("seenInvites") + +@SingleIn(SessionScope::class) +@ContributesBinding(SessionScope::class) +class DefaultSeenInvitesStore @Inject constructor( + @ApplicationContext context: Context, + currentSessionIdHolder: CurrentSessionIdHolder, + @SessionCoroutineScope sessionCoroutineScope: CoroutineScope, + sessionObserver: SessionObserver, +) : SeenInvitesStore { + private val sessionId: SessionId = currentSessionIdHolder.current + + init { + sessionObserver.addListener(object : SessionListener { + override suspend fun onSessionCreated(userId: String) = Unit + override suspend fun onSessionDeleted(userId: String) { + if (sessionId.value == userId) { + clear() + } + } + }) + } + + private val dataStoreFile = sessionId.value.hash().take(16).let { hashedUserId -> + context.preferencesDataStoreFile("session_${hashedUserId}_seen-invites") + } + + private val store = PreferenceDataStoreFactory.create( + scope = sessionCoroutineScope, + migrations = emptyList(), + ) { + dataStoreFile + } + + override fun seenRoomIds(): Flow> = + store.data.map { prefs -> + prefs[seenInvitesKey] + .orEmpty() + .map { RoomId(it) } + .toSet() + } + + override suspend fun markAsSeen(roomId: RoomId) { + store.edit { prefs -> + prefs[seenInvitesKey] = prefs[seenInvitesKey].orEmpty() + roomId.value + } + } + + override suspend fun markAsUnSeen(roomId: RoomId) { + store.edit { prefs -> + prefs[seenInvitesKey] = prefs[seenInvitesKey].orEmpty() - roomId.value + } + } + + override suspend fun clear() { + dataStoreFile.safeDelete() + } +} diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt index 9f4a7ee848..e02642c32e 100644 --- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenter.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.ConfirmingDeclineInvite @@ -34,6 +35,7 @@ class AcceptDeclineInvitePresenter @Inject constructor( private val client: MatrixClient, private val joinRoom: JoinRoom, private val notificationCleaner: NotificationCleaner, + private val seenInvitesStore: SeenInvitesStore, ) : Presenter { @Composable override fun present(): AcceptDeclineInviteState { @@ -107,6 +109,7 @@ class AcceptDeclineInvitePresenter @Inject constructor( ) .onSuccess { notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, roomId) + seenInvitesStore.markAsUnSeen(roomId) } .map { roomId } } @@ -125,6 +128,7 @@ class AcceptDeclineInvitePresenter @Inject constructor( client.ignoreUser(inviteData.senderId).getOrThrow() } notificationCleaner.clearMembershipNotificationForRoom(client.sessionId, inviteData.roomId) + seenInvitesStore.markAsUnSeen(inviteData.roomId) inviteData.roomId }.runCatchingUpdatingState(declinedAction) } diff --git a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt index 870d3bba09..7feaff091e 100644 --- a/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt +++ b/features/invite/impl/src/test/kotlin/io/element/android/features/invite/impl/response/AcceptDeclineInvitePresenterTest.kt @@ -9,9 +9,11 @@ package io.element.android.features.invite.impl.response import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.ConfirmingDeclineInvite import io.element.android.features.invite.api.response.InviteData +import io.element.android.features.invite.test.InMemorySeenInvitesStore import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -20,6 +22,8 @@ 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.core.toRoomIdOrAlias 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_ROOM_NAME import io.element.android.libraries.matrix.test.A_SESSION_ID import io.element.android.libraries.matrix.test.A_USER_ID @@ -33,6 +37,7 @@ import io.element.android.tests.testutils.lambda.assert import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test +import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -54,7 +59,10 @@ class AcceptDeclineInvitePresenterTest { @Test fun `present - declining invite cancel flow`() = runTest { - val presenter = createAcceptDeclineInvitePresenter() + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) + val presenter = createAcceptDeclineInvitePresenter( + seenInvitesStore = seenInvitesStore, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -72,6 +80,7 @@ class AcceptDeclineInvitePresenterTest { assertThat(state.declineAction).isInstanceOf(AsyncAction.Uninitialized::class.java) } } + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -84,7 +93,11 @@ class AcceptDeclineInvitePresenterTest { Result.success(FakeRoomPreview(declineInviteResult = declineInviteFailure)) } ) - val presenter = createAcceptDeclineInvitePresenter(client = client) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) + val presenter = createAcceptDeclineInvitePresenter( + client = client, + seenInvitesStore = seenInvitesStore, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -111,6 +124,7 @@ class AcceptDeclineInvitePresenterTest { cancelAndConsumeRemainingEvents() } assert(declineInviteFailure).isCalledOnce() + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -129,9 +143,11 @@ class AcceptDeclineInvitePresenterTest { Result.success(FakeRoomPreview(declineInviteResult = declineInviteSuccess)) } ) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) val presenter = createAcceptDeclineInvitePresenter( client = client, notificationCleaner = fakeNotificationCleaner, + seenInvitesStore = seenInvitesStore, ) presenter.test { val inviteData = anInviteData() @@ -156,6 +172,7 @@ class AcceptDeclineInvitePresenterTest { clearMembershipNotificationForRoomLambda.assertions() .isCalledOnce() .with(value(A_SESSION_ID), value(A_ROOM_ID)) + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -174,9 +191,11 @@ class AcceptDeclineInvitePresenterTest { }, ignoreUserResult = ignoreUserSuccess ) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) val presenter = createAcceptDeclineInvitePresenter( client = client, notificationCleaner = fakeNotificationCleaner, + seenInvitesStore = seenInvitesStore, ) presenter.test { val inviteData = anInviteData() @@ -202,6 +221,7 @@ class AcceptDeclineInvitePresenterTest { clearMembershipNotificationForRoomLambda.assertions() .isCalledOnce() .with(value(A_SESSION_ID), value(A_ROOM_ID)) + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -214,7 +234,11 @@ class AcceptDeclineInvitePresenterTest { Result.success(FakeRoomPreview(declineInviteResult = declineInviteFailure)) } ) - val presenter = createAcceptDeclineInvitePresenter(client = client) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) + val presenter = createAcceptDeclineInvitePresenter( + client = client, + seenInvitesStore = seenInvitesStore, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -230,6 +254,7 @@ class AcceptDeclineInvitePresenterTest { } assertThat(awaitItem().declineAction.isLoading()).isTrue() } + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -237,7 +262,11 @@ class AcceptDeclineInvitePresenterTest { val joinRoomFailure = lambdaRecorder { roomIdOrAlias: RoomIdOrAlias, _: List, _: JoinedRoom.Trigger -> Result.failure(RuntimeException("Failed to join room $roomIdOrAlias")) } - val presenter = createAcceptDeclineInvitePresenter(joinRoomLambda = joinRoomFailure) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) + val presenter = createAcceptDeclineInvitePresenter( + joinRoomLambda = joinRoomFailure, + seenInvitesStore = seenInvitesStore, + ) presenter.test { val inviteData = anInviteData() awaitItem().also { state -> @@ -266,6 +295,7 @@ class AcceptDeclineInvitePresenterTest { value(emptyList()), value(JoinedRoom.Trigger.Invite) ) + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3) } @Test @@ -279,9 +309,11 @@ class AcceptDeclineInvitePresenterTest { val joinRoomSuccess = lambdaRecorder { _: RoomIdOrAlias, _: List, _: JoinedRoom.Trigger -> Result.success(Unit) } + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)) val presenter = createAcceptDeclineInvitePresenter( joinRoomLambda = joinRoomSuccess, notificationCleaner = fakeNotificationCleaner, + seenInvitesStore = seenInvitesStore, ) presenter.test { val inviteData = anInviteData() @@ -308,6 +340,7 @@ class AcceptDeclineInvitePresenterTest { clearMembershipNotificationForRoomLambda.assertions() .isCalledOnce() .with(value(A_SESSION_ID), value(A_ROOM_ID)) + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(A_ROOM_ID_2, A_ROOM_ID_3) } private fun anInviteData( @@ -330,11 +363,13 @@ class AcceptDeclineInvitePresenterTest { Result.success(Unit) }, notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), + seenInvitesStore: SeenInvitesStore = InMemorySeenInvitesStore(), ): AcceptDeclineInvitePresenter { return AcceptDeclineInvitePresenter( client = client, joinRoom = FakeJoinRoom(joinRoomLambda), notificationCleaner = notificationCleaner, + seenInvitesStore = seenInvitesStore, ) } } diff --git a/features/invite/test/build.gradle.kts b/features/invite/test/build.gradle.kts new file mode 100644 index 0000000000..dc43ba00c3 --- /dev/null +++ b/features/invite/test/build.gradle.kts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.features.invite.test" +} + +dependencies { + implementation(libs.coroutines.core) + implementation(projects.libraries.matrix.api) + api(projects.features.invite.api) +} diff --git a/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InMemorySeenInvitesStore.kt b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InMemorySeenInvitesStore.kt new file mode 100644 index 0000000000..25db72532e --- /dev/null +++ b/features/invite/test/src/main/kotlin/io/element/android/features/invite/test/InMemorySeenInvitesStore.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.features.invite.test + +import io.element.android.features.invite.api.SeenInvitesStore +import io.element.android.libraries.matrix.api.core.RoomId +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow + +class InMemorySeenInvitesStore( + initialRoomIds: Set = emptySet(), +) : SeenInvitesStore { + private val roomIds = MutableStateFlow(initialRoomIds) + + override fun seenRoomIds(): Flow> = roomIds + + override suspend fun markAsSeen(roomId: RoomId) { + roomIds.value += roomId + } + + override suspend fun markAsUnSeen(roomId: RoomId) { + roomIds.value -= roomId + } + + override suspend fun clear() { + roomIds.value = emptySet() + } +} diff --git a/features/joinroom/impl/build.gradle.kts b/features/joinroom/impl/build.gradle.kts index 65635f1907..ecf3843674 100644 --- a/features/joinroom/impl/build.gradle.kts +++ b/features/joinroom/impl/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { testImplementation(libs.test.robolectric) testImplementation(libs.test.truth) testImplementation(libs.test.turbine) + testImplementation(projects.features.invite.test) testImplementation(projects.libraries.matrix.test) testImplementation(projects.tests.testutils) testImplementation(libs.androidx.compose.ui.test.junit) 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 b1fb345a0c..9914afbded 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 @@ -9,6 +9,7 @@ package io.element.android.features.joinroom.impl import androidx.annotation.VisibleForTesting import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -22,6 +23,7 @@ import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.InviteData @@ -67,6 +69,7 @@ class JoinRoomPresenter @AssistedInject constructor( private val forgetRoom: ForgetRoom, private val acceptDeclineInvitePresenter: Presenter, private val buildMeta: BuildMeta, + private val seenInvitesStore: SeenInvitesStore, ) : Presenter { interface Factory { fun create( @@ -149,6 +152,10 @@ class JoinRoomPresenter @AssistedInject constructor( } val acceptDeclineInviteState = acceptDeclineInvitePresenter.present() + LaunchedEffect(contentState) { + contentState.markRoomInviteAsSeen() + } + fun handleEvents(event: JoinRoomEvents) { when (event) { JoinRoomEvents.JoinRoom -> coroutineScope.joinRoom(joinAction) @@ -236,6 +243,12 @@ class JoinRoomPresenter @AssistedInject constructor( forgetRoom.invoke(roomId) } } + + private suspend fun ContentState.markRoomInviteAsSeen() { + if ((this as? ContentState.Loaded)?.joinAuthorisationStatus as? JoinAuthorisationStatus.IsInvited != null) { + seenInvitesStore.markAsSeen(roomId) + } + } } private fun RoomPreviewInfo.toContentState(senderMember: RoomMember?, reason: String?): ContentState { 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 ff4cbbbc80..6a9bd559af 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 @@ -11,6 +11,7 @@ import com.squareup.anvil.annotations.ContributesTo import dagger.Module import dagger.Provides import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.joinroom.impl.JoinRoomPresenter import io.element.android.features.roomdirectory.api.RoomDescription @@ -35,6 +36,7 @@ object JoinRoomModule { forgetRoom: ForgetRoom, acceptDeclineInvitePresenter: Presenter, buildMeta: BuildMeta, + seenInvitesStore: SeenInvitesStore, ): JoinRoomPresenter.Factory { return object : JoinRoomPresenter.Factory { override fun create( @@ -57,6 +59,7 @@ object JoinRoomModule { cancelKnockRoom = cancelKnockRoom, acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, buildMeta = buildMeta, + 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 1c146285c2..b226d53706 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 @@ -9,9 +9,11 @@ package io.element.android.features.joinroom.impl import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.JoinedRoom +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.anAcceptDeclineInviteState +import io.element.android.features.invite.test.InMemorySeenInvitesStore import io.element.android.features.joinroom.impl.di.CancelKnockRoom import io.element.android.features.joinroom.impl.di.ForgetRoom import io.element.android.features.joinroom.impl.di.KnockRoom @@ -52,6 +54,7 @@ import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -111,14 +114,19 @@ class JoinRoomPresenterTest { flowOf(Optional.of(roomSummary)) } } + val seenInvitesStore = InMemorySeenInvitesStore() val presenter = createJoinRoomPresenter( - matrixClient = matrixClient + matrixClient = matrixClient, + seenInvitesStore = seenInvitesStore, ) + assertThat(seenInvitesStore.seenRoomIds().first()).isEmpty() presenter.test { skipItems(1) awaitItem().also { state -> assertThat(state.joinAuthorisationStatus).isEqualTo(JoinAuthorisationStatus.IsInvited(null)) } + // Check that the roomId is stored in the seen invites store + assertThat(seenInvitesStore.seenRoomIds().first()).containsExactly(roomSummary.roomId) } } @@ -759,7 +767,8 @@ class JoinRoomPresenterTest { cancelKnockRoom: CancelKnockRoom = FakeCancelKnockRoom(), forgetRoom: ForgetRoom = FakeForgetRoom(), buildMeta: BuildMeta = aBuildMeta(applicationName = "AppName"), - acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() } + acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() }, + seenInvitesStore: SeenInvitesStore = InMemorySeenInvitesStore(), ): JoinRoomPresenter { return JoinRoomPresenter( roomId = roomId, @@ -773,7 +782,8 @@ class JoinRoomPresenterTest { cancelKnockRoom = cancelKnockRoom, forgetRoom = forgetRoom, buildMeta = buildMeta, - acceptDeclineInvitePresenter = acceptDeclineInvitePresenter + acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, + seenInvitesStore = seenInvitesStore, ) } diff --git a/features/preferences/impl/build.gradle.kts b/features/preferences/impl/build.gradle.kts index c1f32affa3..8d34d55559 100644 --- a/features/preferences/impl/build.gradle.kts +++ b/features/preferences/impl/build.gradle.kts @@ -74,6 +74,7 @@ dependencies { implementation(projects.features.licenses.api) implementation(projects.features.logout.api) implementation(projects.features.deactivation.api) + implementation(projects.features.invite.api) implementation(projects.features.roomlist.api) implementation(projects.services.analytics.api) implementation(projects.services.analytics.compose) @@ -103,6 +104,7 @@ dependencies { testImplementation(projects.libraries.push.test) testImplementation(projects.libraries.pushstore.test) testImplementation(projects.features.ftue.test) + testImplementation(projects.features.invite.test) testImplementation(projects.features.rageshake.test) testImplementation(projects.features.rageshake.impl) testImplementation(projects.features.logout.test) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt index 27763db5f5..8a081c0e41 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/tasks/ClearCacheUseCase.kt @@ -11,6 +11,7 @@ import android.content.Context import coil3.SingletonImageLoader import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.ftue.api.state.FtueService +import io.element.android.features.invite.api.SeenInvitesStore import io.element.android.features.preferences.impl.DefaultCacheService import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.ApplicationContext @@ -35,6 +36,7 @@ class DefaultClearCacheUseCase @Inject constructor( private val okHttpClient: Provider, private val ftueService: FtueService, private val pushService: PushService, + private val seenInvitesStore: SeenInvitesStore, ) : ClearCacheUseCase { override suspend fun invoke() = withContext(coroutineDispatchers.io) { // Clear Matrix cache @@ -50,6 +52,7 @@ class DefaultClearCacheUseCase @Inject constructor( context.cacheDir.deleteRecursively() // Clear some settings ftueService.reset() + seenInvitesStore.clear() // Ensure any error will be displayed again pushService.setIgnoreRegistrationError(matrixClient.sessionId, false) // Ensure the app is restarted diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt index 778db4a4a8..401477d5fc 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/tasks/DefaultClearCacheUseCaseTest.kt @@ -11,13 +11,16 @@ import androidx.test.platform.app.InstrumentationRegistry import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.ftue.test.FakeFtueService +import io.element.android.features.invite.test.InMemorySeenInvitesStore import io.element.android.features.preferences.impl.DefaultCacheService import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.push.test.FakePushService import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import okhttp3.OkHttpClient import org.junit.Test @@ -41,6 +44,8 @@ class DefaultClearCacheUseCaseTest { val pushService = FakePushService( setIgnoreRegistrationErrorLambda = setIgnoreRegistrationErrorLambda ) + val seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID)) + assertThat(seenInvitesStore.seenRoomIds().first()).isNotEmpty() val sut = DefaultClearCacheUseCase( context = InstrumentationRegistry.getInstrumentation().context, matrixClient = matrixClient, @@ -49,6 +54,7 @@ class DefaultClearCacheUseCaseTest { okHttpClient = { OkHttpClient.Builder().build() }, ftueService = ftueService, pushService = pushService, + seenInvitesStore = seenInvitesStore, ) defaultCacheService.clearedCacheEventFlow.test { sut.invoke() @@ -57,6 +63,7 @@ class DefaultClearCacheUseCaseTest { setIgnoreRegistrationErrorLambda.assertions().isCalledOnce() .with(value(matrixClient.sessionId), value(false)) assertThat(awaitItem()).isEqualTo(matrixClient.sessionId) + assertThat(seenInvitesStore.seenRoomIds().first()).isEmpty() } } } diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index 87f683d847..a6f09ff4ed 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -61,6 +61,9 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(libs.test.robolectric) + testImplementation(projects.features.invite.test) + testImplementation(projects.features.logout.test) + testImplementation(projects.features.networkmonitor.test) testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.featureflag.test) testImplementation(projects.libraries.dateformatter.test) @@ -72,7 +75,5 @@ dependencies { testImplementation(projects.libraries.push.test) testImplementation(projects.services.analytics.test) testImplementation(projects.services.toolbox.test) - testImplementation(projects.features.networkmonitor.test) - testImplementation(projects.features.logout.test) testImplementation(projects.tests.testutils) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt index 64348f623c..7435424b15 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt @@ -11,8 +11,10 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.roomlist.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 import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentSet open class RoomListContentStateProvider : PreviewParameterProvider { override val values: Sequence @@ -29,10 +31,12 @@ internal fun aRoomsContentState( securityBannerState: SecurityBannerState = SecurityBannerState.None, summaries: ImmutableList = aRoomListRoomSummaryList(), fullScreenIntentPermissionsState: FullScreenIntentPermissionsState = aFullScreenIntentPermissionsState(), + seenRoomInvites: Set = emptySet(), ) = RoomListContentState.Rooms( securityBannerState = securityBannerState, fullScreenIntentPermissionsState = fullScreenIntentPermissionsState, summaries = summaries, + seenRoomInvites = seenRoomInvites.toPersistentSet(), ) internal fun aSkeletonContentState() = RoomListContentState.Skeleton(16) 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 660f0f516f..461204b2a2 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 @@ -24,6 +24,7 @@ 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.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.InviteData @@ -57,6 +58,7 @@ import io.element.android.libraries.push.api.notifications.NotificationCleaner import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.toPersistentList +import kotlinx.collections.immutable.toPersistentSet import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job @@ -92,6 +94,7 @@ class RoomListPresenter @Inject constructor( private val logoutPresenter: Presenter, private val appPreferencesStore: AppPreferencesStore, private val rageshakeFeatureAvailability: RageshakeFeatureAvailability, + private val seenInvitesStore: SeenInvitesStore, ) : Presenter { private val encryptionService: EncryptionService = client.encryptionService() @@ -227,6 +230,7 @@ class RoomListPresenter @Inject constructor( loadingState == RoomList.LoadingState.NotLoaded || roomSummaries is AsyncData.Loading } } + val seenRoomInvites by remember { seenInvitesStore.seenRoomIds() }.collectAsState(emptySet()) val securityBannerState by rememberSecurityBannerState(securityBannerDismissed) return when { showEmpty -> RoomListContentState.Empty(securityBannerState = securityBannerState) @@ -235,7 +239,8 @@ class RoomListPresenter @Inject constructor( RoomListContentState.Rooms( securityBannerState = securityBannerState, fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(), - summaries = roomSummaries.dataOrNull().orEmpty().toPersistentList() + summaries = roomSummaries.dataOrNull().orEmpty().toPersistentList(), + seenRoomInvites = seenRoomInvites.toPersistentSet(), ) } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index 4ee15b7fab..ae62b88deb 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermiss import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.ImmutableSet @Immutable data class RoomListState( @@ -65,9 +66,11 @@ sealed interface RoomListContentState { data class Empty( val securityBannerState: SecurityBannerState, ) : RoomListContentState + data class Rooms( val securityBannerState: SecurityBannerState, val fullScreenIntentPermissionsState: FullScreenIntentPermissionsState, val summaries: ImmutableList, + val seenRoomInvites: ImmutableSet, ) : RoomListContentState } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt index ebd618185c..acdb762fa7 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt @@ -46,6 +46,7 @@ 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.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Button @@ -239,6 +240,8 @@ private fun RoomsViewList( ) { index, room -> RoomSummaryRow( room = room, + isInviteSeen = room.displayType == RoomSummaryDisplayType.INVITE && + state.seenRoomInvites.contains(room.roomId), onClick = onRoomClick, eventSink = eventSink, ) 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 9ce03ab4cc..bfa255af13 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 @@ -68,6 +68,7 @@ internal val minHeight = 84.dp @Composable internal fun RoomSummaryRow( room: RoomListRoomSummary, + isInviteSeen: Boolean, onClick: (RoomListRoomSummary) -> Unit, eventSink: (RoomListEvents) -> Unit, modifier: Modifier = Modifier, @@ -85,7 +86,7 @@ internal fun RoomSummaryRow( Timber.d("Long click on invite room") }, ) { - InviteNameAndIndicatorRow(name = room.name) + InviteNameAndIndicatorRow(name = room.name, isInviteSeen = isInviteSeen) InviteSubtitle(isDm = room.isDm, inviteSender = room.inviteSender) if (!room.isDm && room.inviteSender != null) { Spacer(modifier = Modifier.height(4.dp)) @@ -300,6 +301,7 @@ private fun LastMessageAndIndicatorRow( @Composable private fun InviteNameAndIndicatorRow( name: String?, + isInviteSeen: Boolean, modifier: Modifier = Modifier, ) { Row( @@ -316,9 +318,11 @@ private fun InviteNameAndIndicatorRow( maxLines = 1, overflow = TextOverflow.Ellipsis ) - UnreadIndicatorAtom( - color = ElementTheme.colors.unreadIndicator - ) + if (!isInviteSeen) { + UnreadIndicatorAtom( + color = ElementTheme.colors.unreadIndicator + ) + } } } @@ -384,6 +388,8 @@ private fun MentionIndicatorAtom() { internal fun RoomSummaryRowPreview(@PreviewParameter(RoomListRoomSummaryProvider::class) data: RoomListRoomSummary) = ElementPreview { RoomSummaryRow( room = data, + // Set isInviteSeen to true for the preview when the room has name "Bob" + isInviteSeen = data.name == "Bob", onClick = {}, eventSink = {}, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt index 498ad762a3..cb4c48d3f7 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummary.kt @@ -39,12 +39,10 @@ data class RoomListRoomSummary( ) { val isHighlighted = userDefinedNotificationMode != RoomNotificationMode.MUTE && (numberOfUnreadNotifications > 0 || numberOfUnreadMentions > 0) || - isMarkedUnread || - displayType == RoomSummaryDisplayType.INVITE + isMarkedUnread val hasNewContent = numberOfUnreadMessages > 0 || numberOfUnreadMentions > 0 || numberOfUnreadNotifications > 0 || - isMarkedUnread || - displayType == RoomSummaryDisplayType.INVITE + isMarkedUnread } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt index 90b4fba44c..4f6e783704 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearchView.kt @@ -173,6 +173,8 @@ private fun RoomListSearchContent( ) { room -> RoomSummaryRow( room = room, + // TODO + isInviteSeen = false, onClick = ::onRoomClick, eventSink = eventSink, ) 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 5043b78b10..50e7628d09 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 @@ -12,9 +12,11 @@ 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.invite.api.SeenInvitesStore import io.element.android.features.invite.api.response.AcceptDeclineInviteEvents import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.anAcceptDeclineInviteState +import io.element.android.features.invite.test.InMemorySeenInvitesStore import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomState import io.element.android.features.leaveroom.api.aLeaveRoomState @@ -169,10 +171,11 @@ class RoomListPresenterTest { val matrixClient = FakeMatrixClient( roomListService = roomListService ) - val presenter = createRoomListPresenter(client = matrixClient) - moleculeFlow(RecompositionMode.Immediate) { - presenter.present() - }.test { + val presenter = createRoomListPresenter( + client = matrixClient, + seenInvitesStore = InMemorySeenInvitesStore(setOf(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3)), + ) + presenter.test { val initialState = consumeItemsUntilPredicate { state -> state.contentState is RoomListContentState.Skeleton }.last() assertThat(initialState.contentState).isInstanceOf(RoomListContentState.Skeleton::class.java) roomListService.postAllRoomsLoadingState(RoomList.LoadingState.Loaded(1)) @@ -194,6 +197,7 @@ class RoomListPresenterTest { timestamp = "0 TimeOrDate true", ) ) + assertThat(withRoomsState.contentAsRooms().seenRoomInvites).containsExactly(A_ROOM_ID, A_ROOM_ID_2, A_ROOM_ID_3) cancelAndIgnoreRemainingEvents() } } @@ -680,6 +684,7 @@ class RoomListPresenterTest { notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), appPreferencesStore: AppPreferencesStore = InMemoryAppPreferencesStore(), rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { true }, + seenInvitesStore: SeenInvitesStore = InMemorySeenInvitesStore() ) = RoomListPresenter( client = client, syncService = syncService, @@ -711,6 +716,7 @@ class RoomListPresenterTest { logoutPresenter = { aDirectLogoutState() }, appPreferencesStore = appPreferencesStore, rageshakeFeatureAvailability = rageshakeFeatureAvailability, + seenInvitesStore = seenInvitesStore, ) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryTest.kt index caa204328b..a7940a203b 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/model/RoomListRoomSummaryTest.kt @@ -65,12 +65,12 @@ class RoomListRoomSummaryTest { } @Test - fun `when display type is invite then isHighlighted and hasNewContent are true`() { + fun `when display type is invite then isHighlighted and hasNewContent are false`() { val sut = createRoomListRoomSummary( displayType = RoomSummaryDisplayType.INVITE, ) - assertThat(sut.isHighlighted).isTrue() - assertThat(sut.hasNewContent).isTrue() + assertThat(sut.isHighlighted).isFalse() + assertThat(sut.hasNewContent).isFalse() } } 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.roomlist.impl.components_RoomSummaryRow_Day_30_en.png index 5ee881449b..c5f164e6cd 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_30_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Day_30_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f64d2899886ab2e20bbd2dd0e0e2bd909f461751e60f4b6d93e506963c41ce03 -size 15832 +oid sha256:a92aa815f9c74893ea1b9b98912f0eefd86159af900ece588a3eb426264d076a +size 15473 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.roomlist.impl.components_RoomSummaryRow_Night_30_en.png index 4ec7b36e3b..c4379b0b60 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_30_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomlist.impl.components_RoomSummaryRow_Night_30_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:20a0dfc19f05e9727cf70cf7eaf83503c805423cc36edbefaa119c2692eaadd2 -size 15678 +oid sha256:8287ed2eda7e0d486f6122c5bd61517f7f6ccc5ea21413f2eea085683d15ba68 +size 15370 From 1290188f5ba4a892a9ed3dd7e3be53e1df066108 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:18:49 +0200 Subject: [PATCH 39/54] fix(deps): update dependency io.element.android:compound-android to v25.4.4 (#4537) 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 44f6810356..15171e96b5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -164,7 +164,7 @@ coil_network_okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version coil_compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } coil_gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil" } coil_test = { module = "io.coil-kt.coil3:coil-test", version.ref = "coil" } -compound = { module = "io.element.android:compound-android", version = "25.2.26" } +compound = { module = "io.element.android:compound-android", version = "25.4.4" } datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "datetime" } serialization_json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization_json" } kotlinx_collections_immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8" From 886161b355a6006135f2f8a33e38f9be5c35a717 Mon Sep 17 00:00:00 2001 From: ElementBot <110224175+ElementBot@users.noreply.github.com> Date: Mon, 7 Apr 2025 09:20:32 +0200 Subject: [PATCH 40/54] Sync Strings from Localazy (#4543) Co-authored-by: bmarty <3940906+bmarty@users.noreply.github.com> --- .../src/main/res/values-sk/translations.xml | 3 + .../src/main/res/values-et/translations.xml | 3 + .../src/main/res/values-hu/translations.xml | 3 + .../src/main/res/values-sk/translations.xml | 3 + .../src/main/res/values-sv/translations.xml | 3 + .../src/main/res/values-et/translations.xml | 16 + .../src/main/res/values-hu/translations.xml | 5 + .../src/main/res/values-sk/translations.xml | 17 +- .../src/main/res/values-sv/translations.xml | 13 + .../src/main/res/values/localazy.xml | 15 + ...st_DependencyLicensesListView_Day_2_de.png | 4 +- ...st_DependencyLicensesListView_Day_3_de.png | 4 +- ...ion_RoomMembersModerationView_Day_3_de.png | 4 +- ...ion_RoomMembersModerationView_Day_4_de.png | 4 +- ...ion_RoomMembersModerationView_Day_5_de.png | 3 + ...ion_RoomMembersModerationView_Day_6_de.png | 4 +- ...ion_RoomMembersModerationView_Day_7_de.png | 3 - ...ion_RoomMembersModerationView_Day_8_de.png | 4 +- ...ion_RoomMembersModerationView_Day_9_de.png | 3 + ...pl.components_RoomSummaryRow_Day_29_de.png | 4 +- ...pl.components_RoomSummaryRow_Day_30_de.png | 4 +- ...logs_TextFieldDialogWithError_Day_0_de.png | 3 + ...nents.dialogs_TextFieldDialog_Day_0_de.png | 3 + ...nkDialogCreateLinkWithoutText_Day_0_de.png | 4 +- ...tComposerLinkDialogCreateLink_Day_0_de.png | 4 +- ...extComposerLinkDialogEditLink_Day_0_de.png | 4 +- screenshots/html/data.js | 1589 +++++++++-------- 27 files changed, 906 insertions(+), 823 deletions(-) create mode 100644 screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_de.png delete mode 100644 screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_de.png create mode 100644 screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png create mode 100644 screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png diff --git a/features/preferences/impl/src/main/res/values-sk/translations.xml b/features/preferences/impl/src/main/res/values-sk/translations.xml index 118cd7d6a5..0a4cdb7c27 100644 --- a/features/preferences/impl/src/main/res/values-sk/translations.xml +++ b/features/preferences/impl/src/main/res/values-sk/translations.xml @@ -8,8 +8,11 @@ "Vlastná Element Call základná URL adresa" "Nastaviť vlastnú základnú URL adresu pre Element Call." "Neplatná adresa URL, uistite sa, že ste uviedli protokol (http/https) a správnu adresu." + "Skrytie profilové obrázky v žiadostiach o pozvánku do miestnosti" + "Skryť ukážky médií na časovej osi" "Nahrávajte fotografie a videá rýchlejšie a znížte spotrebu dát" "Optimalizovať kvalitu médií" + "Moderovanie a bezpečnosť" "Poskytovateľ oznámení Push" "Vypnite rozšírený textový editor na ručné písanie Markdown." "Potvrdenia o prečítaní" diff --git a/features/roomdetails/impl/src/main/res/values-et/translations.xml b/features/roomdetails/impl/src/main/res/values-et/translations.xml index 8cf2c4a6a3..16f3d852b1 100644 --- a/features/roomdetails/impl/src/main/res/values-et/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-et/translations.xml @@ -75,6 +75,9 @@ "%1$d osaleja" "%1$d osalejat" + "Eemalda" + "Uue kutse saamisel on tal võimalik selle jututoaga uuesti liituda." + "Kas sa oled kindel, et soovid selle osaleja eemaldada?" "Eemalda ja sea suhtluskeeld" "Eemalda kasutaja jututoast" "Eemalda ja sea suhtluskeeld" diff --git a/features/roomdetails/impl/src/main/res/values-hu/translations.xml b/features/roomdetails/impl/src/main/res/values-hu/translations.xml index 585f61ece5..e9cec9a02a 100644 --- a/features/roomdetails/impl/src/main/res/values-hu/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-hu/translations.xml @@ -75,6 +75,9 @@ "%1$d személy" "%1$d személy" + "Eltávolítás" + "Ehhez a szobához is csatlakozhat, ha meghívják." + "Biztos, hogy eltávolítja ezt a tagot?" "Eltávolítás és a tag kitiltása" "Eltávolítás a szobából" "Eltávolítás és a tag kitiltása" diff --git a/features/roomdetails/impl/src/main/res/values-sk/translations.xml b/features/roomdetails/impl/src/main/res/values-sk/translations.xml index 4c470cd1a7..39e2fccaa9 100644 --- a/features/roomdetails/impl/src/main/res/values-sk/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-sk/translations.xml @@ -76,6 +76,9 @@ "%1$d osoby" "%1$d osôb" + "Odstrániť" + "V prípade pozvania sa budú môcť znova pripojiť k tejto miestnosti." + "Ste si istý, že chcete odstrániť tohto člena?" "Odstrániť a zakázať člena" "Odstrániť z miestnosti" "Odstrániť a zakázať člena" diff --git a/features/roomdetails/impl/src/main/res/values-sv/translations.xml b/features/roomdetails/impl/src/main/res/values-sv/translations.xml index aace77772d..988c1dfdbc 100644 --- a/features/roomdetails/impl/src/main/res/values-sv/translations.xml +++ b/features/roomdetails/impl/src/main/res/values-sv/translations.xml @@ -75,6 +75,9 @@ "%1$d person" "%1$d personer" + "Ta bort" + "Denne kommer kunna gå med i rummet igen om denne bjuds in" + "Är du säker på att du vill ta bort den här medlemmen?" "Ta bort och banna medlem" "Ta bort från rummet" "Ta bort och banna medlem" 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 4cd712d0ec..df27c2e79d 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -60,6 +60,7 @@ "Eemalda konto" "Eemalda konto kasutusest" "Keeldu" + "Keeldu ja blokeeri" "Kustuta küsitlus" "Lülita välja" "Loobu" @@ -105,8 +106,10 @@ "Eemalda sõnum" "Vasta" "Vasta jutulõngas" + "Teata" "Teata veast" "Teata sisust haldurile" + "Teata jututoast" "Lähtesta" "Lähtesta oma identiteet" "Proovi uuesti" @@ -216,6 +219,7 @@ Põhjus: %1$s." "Püsilink" "Õigus" "Esiletõstetud" + "Palun kontrolli oma nutiseadme internetiühendust" "Palun oota…" "Kas oled kindel, et soovid selle küsitluse lõpetada?" "Küsitlus: %1$s" @@ -228,6 +232,7 @@ Põhjus: %1$s." "Privaatsuspoliitika" "Reaktsioon" "Reaktsioonid" + "Põhjus" "Taastevõti" "Värskendame andmeid…" "Vastates kasutajale %1$s" @@ -299,6 +304,8 @@ Põhjus: %1$s." Kas sa oled kindel, et soovid jätkata?" "Palun kontrolli seda linki mõttega" + "Teatasid jututoast" + "Teatasid jututoast ja lahkusid sealt" "Kinnitus" "Viga" "Õnnestus" @@ -330,6 +337,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" + "Sa ei näe enam selle kasutaja saadetud sõnumeid ja jututubade kutseid" + "Blokeeri kasutaja" + "Teata sellest jututoast oma teenusepakkujale." + "Keeldu ja blokeeri" "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." @@ -341,6 +352,11 @@ Kas sa oled kindel, et soovid jätkata?" "%1$d esiletõstetud sõnumit" "Esiletõstetud sõnumid" + "Jututoast haldajale teatamine õnnestus, kuid jututost lahkumisel tekkis viga. Palun proovi uuesti lahkuda." + "Pole võimalik lahkuda jututoast" + "Teata sellest jututoast süsteemi haldajale. Kui sõnumid on krüptitud, ei saa haldaja neid lugeda." + "Kirjelda põhjust…" + "Teata jututoast" "Oma võrguidentiteedi lähtestamiseks suuname sind %1$s kasutajakonto halduse lehele. Hiljem suunatakse sind tagasi sama rakenduse juurde." "Sa ei saa seda kinnitada? Ava oma kasutajakonto haldus ja lähtesta oma võrguidentiteet." "Unusta verifitseerimine ja saada ikkagi" 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 6967eab8ca..9ab1c58d37 100644 --- a/libraries/ui-strings/src/main/res/values-hu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml @@ -1,16 +1,19 @@ + "Profilkép" "Törlés" "%1$d megadott számjegy" "%1$d megadott számjegy" "Jelszó elrejtése" + "Csatlakozás a híváshoz" "Ugrás az aljára" "Csak megemlítések" "Némítva" "%1$d. oldal" "Szüneteltetés" + "Hangüzenet, időtartam:%1$s, jelenlegi pozíció:%2$s" "PIN-mező" "Lejátszás" "Szavazás" @@ -30,6 +33,7 @@ "Hanghívás indítása" "Felhasználói menü" "Részletek megtekintése" + "Hangüzenet, időtartam: %1$s" "Hangüzenet felvétele." "Rögzítés leállítása" "Elfogadás" @@ -224,6 +228,7 @@ Ok: %1$s." "Adatvédelmi nyilatkozat" "Reakció" "Reakciók" + "Ok" "Helyreállítási kulcs" "Frissítés…" "Válasz %1$s számára" 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 e80a688803..3a768dffc4 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 @@ + "Obrázok" "Vymazať" "%1$d zadaná číslica" @@ -7,11 +8,13 @@ "%1$d zadaných číslic" "Skryť heslo" + "Pripojiť sa k hovoru" "Prejsť na spodok" "Iba zmienky" "Stlmené" "Strana %1$d" "Pozastaviť" + "Hlasová správa, dĺžka:%1$s, aktuálna pozícia: %2$s" "Pole PIN" "Prehrať" "Anketa" @@ -32,6 +35,7 @@ "Začať hovor" "Používateľské menu" "Zobraziť podrobnosti" + "Hlasová správa, dĺžka: %1$s" "Nahrať hlasovú správu." "Zastaviť nahrávanie" "Prijať" @@ -61,6 +65,7 @@ "Odstrániť anketu" "Vypnúť" "Zahodiť" + "Zamietnuť" "Hotovo" "Upraviť" "Upraviť titulok" @@ -205,6 +210,7 @@ Dôvod: %1$s." "%1$s (%2$s)" "Žiadne výsledky" "Žiadny názov miestnosti" + "Nešifrované" "Offline" "Licencie s otvoreným zdrojom" "alebo" @@ -226,6 +232,7 @@ Dôvod: %1$s." "Zásady ochrany osobných údajov" "Reakcia" "Reakcie" + "Dôvod" "Kľúč na obnovenie" "Obnovuje sa…" "Odpoveď na %1$s" @@ -267,7 +274,7 @@ Dôvod: %1$s." "Nie je možné dešifrovať" "Odoslané z nezabezpečeného zariadenia" "Nemáte prístup k tejto správe" - "Overená totožnosť odosielateľa sa zmenila" + "Overená totožnosť odosielateľa bola obnovená" "Pozvánky nebolo možné odoslať jednému alebo viacerým používateľom." "Nie je možné odoslať pozvánku/ky" "Odomknúť" @@ -287,11 +294,11 @@ Dôvod: %1$s." "Čaká sa…" "Čaká sa na dešifrovací kľúč" "Vy" - "Zdá sa, že totožnosť používateľa %1$s sa zmenila.%2$s" - "Zdá sa, že identita %2$s používateľa %1$s sa zmenila. %3$s" + "Totožnosť používateľa %1$s sa obnovila.%2$s" + "Totožnosť používateľa %1$s %2$s bola obnovená. %3$s" "(%1$s)" - "Overená totožnosť používateľa %1$s sa zmenila." - "Overená identita používateľa %1$s %2$s sa zmenila. %3$s" + "Totožnosť používateľa %1$s bola obnovená." + "Totožnosť používateľa %1$s %2$s bola obnovená. %3$s" "Zrušiť overenie" "Odkaz %1$s vás presmeruje na inú stránku %2$s 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 c94c028884..abf33b622a 100644 --- a/libraries/ui-strings/src/main/res/values-sv/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml @@ -1,16 +1,19 @@ + "Avatar" "Radera" "%1$d siffra angiven" "%1$d siffror angivna" "Dölj lösenord" + "Anslut till samtal" "Hoppa till botten" "Endast omnämningar" "Tystad" "Sida %1$d" "Pausa" + "Röstmeddelande, varaktighet:%1$s, nuvarande position: %2$s" "PIN-fält" "Spela upp" "Omröstning" @@ -30,6 +33,7 @@ "Starta ett samtal" "Användarmeny" "Visa detaljer" + "Röstmeddelande, varaktighet: %1$s" "Spela in röstmeddelande." "Stoppa inspelning" "Godkänn" @@ -101,8 +105,10 @@ "Ta bort meddelande" "Svara" "Svara i tråd" + "Anmäl" "Rapportera bugg" "Rapportera innehåll" + "Anmäl rum" "Återställ" "Återställ identitet" "Försök igen" @@ -224,6 +230,7 @@ Anledning:%1$s." "Integritetspolicy" "Reaktion" "Reaktioner" + "Orsak" "Återställningsnyckel" "Uppdaterar …" "Svarar till %1$s" @@ -295,6 +302,8 @@ Anledning:%1$s." Är du säker på att du vill fortsätta?" "Dubbelkolla den här länken" + "Rum anmält" + "Anmälde och lämnade rummet" "Bekräftelse" "Fel" "Lyckades" @@ -337,6 +346,10 @@ Anledning:%1$s." "%1$d Fästa meddelanden" "Fästa meddelanden" + "Kunde inte lämna rummet" + "Anmäl det här rummet till din administratör. Om meddelandena är krypterade kommer din administratör inte att kunna läsa dem." + "Beskriv anledningen …" + "Rapportera rum" "Du är på väg att gå till ditt %1$s-konto för att återställa din identitet. Därefter kommer du att tas tillbaka till appen." "Kan du inte bekräfta? Gå till ditt konto för att återställa din identitet." "Dra tillbaka verifieringen och skicka" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 3c3a90cf63..a4121570f0 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -60,6 +60,7 @@ "Deactivate" "Deactivate account" "Decline" + "Decline and block" "Delete Poll" "Disable" "Discard" @@ -105,8 +106,10 @@ "Remove message" "Reply" "Reply in thread" + "Report" "Report bug" "Report content" + "Report room" "Reset" "Reset identity" "Retry" @@ -216,6 +219,7 @@ Reason: %1$s." "Permalink" "Permission" "Pinned" + "Please check your internet connection" "Please wait…" "Are you sure you want to end this poll?" "Poll: %1$s" @@ -300,6 +304,8 @@ Reason: %1$s." Are you sure you want to continue?" "Double-check this link" + "Room reported" + "Reported and left room" "Confirmation" "Error" "Success" @@ -331,6 +337,10 @@ Are you sure you want to continue?" "Hey, talk to me on %1$s: %2$s" "%1$s Android" "Rageshake to report bug" + "You will not see any messages or room invites from this user" + "Block user" + "Report this room to your account provider." + "Decline and block" "Failed selecting media, please try again." "Captions might not be visible to people using older apps." "Failed processing media to upload, please try again." @@ -342,6 +352,11 @@ Are you sure you want to continue?" "%1$d Pinned messages" "Pinned messages" + "Your report was submitted successfully, but we encountered an issue while trying to leave the room. Please try again." + "Unable to Leave Room" + "Report this room to your admin. If the messages are encrypted, your admin will not be able to read them." + "Describe the reason…" + "Report room" "You\'re about to go to your %1$s account to reset your identity. Afterwards you\'ll be taken back to the app." "Can\'t confirm? Go to your account to reset your identity." "Withdraw verification and send" diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png index 44373b5952..9f16ca802b 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_2_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2f621af124e1e4b9e843da434787e2cb27f2b4190a19f6da430924cc1e52a1c -size 29963 +oid sha256:9fb2f05e2eea4d25a5bb87f3fc6391df2bf0923967d6ad973152557517fa7819 +size 29864 diff --git a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png index 6481e55289..725423f7ad 100644 --- a/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png +++ b/screenshots/de/features.licenses.impl.list_DependencyLicensesListView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7f81a4ca9cdf84e23ac4030c1de78ad5337303d6f532a49c29a0463cda0a34c -size 31164 +oid sha256:c5c32861bbae702e9f45263ed3ee710d450b4eb66f1919a4f11eb5ccce7a0354 +size 31120 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_de.png index b9df84aae0..6950ee7b49 100644 --- a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_de.png +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7ed8b8a8190f00ed028a901e23abaf6497b91718afd3f64af94e1d75e9562ff -size 9601 +oid sha256:607f0410ab4482574395083969389b4e7f02ed797a4ccfc182d1dcb1b3d346ae +size 31530 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_de.png index 46bcee2f62..b9df84aae0 100644 --- a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_de.png +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8a335d4f61371a5ba7f609446ba93c80b53ce06ca47aa011ab89ef43d3cfce3 -size 9926 +oid sha256:d7ed8b8a8190f00ed028a901e23abaf6497b91718afd3f64af94e1d75e9562ff +size 9601 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_de.png new file mode 100644 index 0000000000..dd2ad2a206 --- /dev/null +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79d235afe2b0a6aab372e445f89c0b4c79f7be0980b460c08ee7fb25275c55b7 +size 38145 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_de.png index e15d3745bb..46bcee2f62 100644 --- a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_de.png +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc604387773fc50481303c325a57813f354ea14724a2f0ea2d46f059ef9e5204 -size 9294 +oid sha256:a8a335d4f61371a5ba7f609446ba93c80b53ce06ca47aa011ab89ef43d3cfce3 +size 9926 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_de.png deleted file mode 100644 index cb2b0d0502..0000000000 --- a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_de.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5da94309ef91e21e8058de89a135ab6efafa2c9c176df606f7cc62a9857122d -size 34612 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_de.png index f01a1fe8f3..e15d3745bb 100644 --- a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_de.png +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:244eb76ef937bac78604faa38d8fbbbd1ce9ed7d51cf979f7533f7e23ef95471 -size 28531 +oid sha256:cc604387773fc50481303c325a57813f354ea14724a2f0ea2d46f059ef9e5204 +size 9294 diff --git a/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_de.png b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_de.png new file mode 100644 index 0000000000..f01a1fe8f3 --- /dev/null +++ b/screenshots/de/features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:244eb76ef937bac78604faa38d8fbbbd1ce9ed7d51cf979f7533f7e23ef95471 +size 28531 diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png b/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png index e5a2899c68..8cf571f814 100644 --- a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png +++ b/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_29_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0774bcd58a29a30201977cc738c7635637b20a633ec90b3add6dd63b2a02325c -size 25403 +oid sha256:5a8f4b3792370cc2a11d236d3d8a2b31fd326369a1682db0708428c37c1d2575 +size 22729 diff --git a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png b/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png index 44479cb175..2f32a78319 100644 --- a/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png +++ b/screenshots/de/features.roomlist.impl.components_RoomSummaryRow_Day_30_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5381f248d6731dd75627bd74df015af82f4cc0d15cfa9a84571ad2c83ee8d436 -size 16803 +oid sha256:dd5f51e5d8f363aefa9d77c893d371a29d5d6a53eae2ccc69e432fded1b95c9c +size 16441 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png new file mode 100644 index 0000000000..bde5f11c9c --- /dev/null +++ b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialogWithError_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dff9f674b9d6ac618a59f8ba9a1b7d85218e720f40c7a313f8bf06254f0b9de1 +size 19237 diff --git a/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png new file mode 100644 index 0000000000..2ebb09a927 --- /dev/null +++ b/screenshots/de/libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_de.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caccab75ed386837ef568242893d41bc235b0cb33c62fa02d298a86b2bd5e491 +size 13869 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png index 6cd878104e..817e9368ee 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9465ae95a76d3c51c086ec9dc8b75e72005af324d6d358356ef361c48545bad -size 14760 +oid sha256:19eff09a3190f13352919e820f64a831544d3bcb5d45904bbb953be8d49f8e10 +size 14868 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png index d5211b270d..e1c4bd661b 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:082070d50d9aaa75dc3a9bae767cdb3955e303583b442c9cb99496c0c095b64f -size 15926 +oid sha256:796d1da0f461fe6a9544b98acb73a408feddb754f0fd1f595e773a65591d59b0 +size 16341 diff --git a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png index c033287b5e..aca05f1877 100644 --- a/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png +++ b/screenshots/de/libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_de.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33fb10df2e336c5ed144f6a18cbcefac5a1478d87bc4c53b00ce45d495c3700f -size 19638 +oid sha256:7167d05769b82a6c42face1fd25ecf82a96770fb0279834ffa99bd01d7ed53d9 +size 19969 diff --git a/screenshots/html/data.js b/screenshots/html/data.js index 4acf1b2941..8947f3de9f 100644 --- a/screenshots/html/data.js +++ b/screenshots/html/data.js @@ -1,63 +1,63 @@ // 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",20175,], +["features.preferences.impl.about_AboutView_Day_0_en","features.preferences.impl.about_AboutView_Night_0_en",20182,], ["features.invite.impl.response_AcceptDeclineInviteView_Day_0_en","features.invite.impl.response_AcceptDeclineInviteView_Night_0_en",0,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_1_en","features.invite.impl.response_AcceptDeclineInviteView_Night_1_en",20175,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_2_en","features.invite.impl.response_AcceptDeclineInviteView_Night_2_en",20175,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_3_en","features.invite.impl.response_AcceptDeclineInviteView_Night_3_en",20175,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_4_en","features.invite.impl.response_AcceptDeclineInviteView_Night_4_en",20175,], -["features.invite.impl.response_AcceptDeclineInviteView_Day_5_en","features.invite.impl.response_AcceptDeclineInviteView_Night_5_en",20175,], -["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20175,], -["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20175,], -["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20175,], -["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20175,], -["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20175,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_1_en","features.invite.impl.response_AcceptDeclineInviteView_Night_1_en",20182,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_2_en","features.invite.impl.response_AcceptDeclineInviteView_Night_2_en",20182,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_3_en","features.invite.impl.response_AcceptDeclineInviteView_Night_3_en",20182,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_4_en","features.invite.impl.response_AcceptDeclineInviteView_Night_4_en",20182,], +["features.invite.impl.response_AcceptDeclineInviteView_Day_5_en","features.invite.impl.response_AcceptDeclineInviteView_Night_5_en",20182,], +["features.logout.impl_AccountDeactivationView_Day_0_en","features.logout.impl_AccountDeactivationView_Night_0_en",20182,], +["features.logout.impl_AccountDeactivationView_Day_1_en","features.logout.impl_AccountDeactivationView_Night_1_en",20182,], +["features.logout.impl_AccountDeactivationView_Day_2_en","features.logout.impl_AccountDeactivationView_Night_2_en",20182,], +["features.logout.impl_AccountDeactivationView_Day_3_en","features.logout.impl_AccountDeactivationView_Night_3_en",20182,], +["features.logout.impl_AccountDeactivationView_Day_4_en","features.logout.impl_AccountDeactivationView_Night_4_en",20182,], ["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",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_10_en","features.messages.impl.actionlist_ActionListViewContent_Night_10_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_11_en","features.messages.impl.actionlist_ActionListViewContent_Night_11_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_12_en","features.messages.impl.actionlist_ActionListViewContent_Night_12_en",20182,], ["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",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20175,], -["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20175,], -["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20175,], -["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20175,], -["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20175,], -["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20175,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en",20175,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en",20175,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en",20175,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en",20175,], -["features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en",20175,], -["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20175,], -["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20175,], -["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20175,], -["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20178,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20175,], -["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20178,], -["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20175,], +["features.messages.impl.actionlist_ActionListViewContent_Day_2_en","features.messages.impl.actionlist_ActionListViewContent_Night_2_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_3_en","features.messages.impl.actionlist_ActionListViewContent_Night_3_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_4_en","features.messages.impl.actionlist_ActionListViewContent_Night_4_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_5_en","features.messages.impl.actionlist_ActionListViewContent_Night_5_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_6_en","features.messages.impl.actionlist_ActionListViewContent_Night_6_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_7_en","features.messages.impl.actionlist_ActionListViewContent_Night_7_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_8_en","features.messages.impl.actionlist_ActionListViewContent_Night_8_en",20182,], +["features.messages.impl.actionlist_ActionListViewContent_Day_9_en","features.messages.impl.actionlist_ActionListViewContent_Night_9_en",20182,], +["features.createroom.impl.addpeople_AddPeopleView_Day_0_en","features.createroom.impl.addpeople_AddPeopleView_Night_0_en",20182,], +["features.createroom.impl.addpeople_AddPeopleView_Day_1_en","features.createroom.impl.addpeople_AddPeopleView_Night_1_en",20182,], +["features.createroom.impl.addpeople_AddPeopleView_Day_2_en","features.createroom.impl.addpeople_AddPeopleView_Night_2_en",20182,], +["features.createroom.impl.addpeople_AddPeopleView_Day_3_en","features.createroom.impl.addpeople_AddPeopleView_Night_3_en",20182,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_0_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_0_en",20182,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_1_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_1_en",20182,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_2_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_2_en",20182,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_3_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_3_en",20182,], +["features.preferences.impl.advanced_AdvancedSettingsView_Day_4_en","features.preferences.impl.advanced_AdvancedSettingsView_Night_4_en",20182,], +["libraries.designsystem.components.dialogs_AlertDialogContent_Dialogs_en","",20182,], +["libraries.designsystem.components.dialogs_AlertDialog_Day_0_en","libraries.designsystem.components.dialogs_AlertDialog_Night_0_en",20182,], +["features.analytics.impl_AnalyticsOptInView_Day_0_en","features.analytics.impl_AnalyticsOptInView_Night_0_en",20182,], +["features.analytics.impl_AnalyticsOptInView_Day_1_en","features.analytics.impl_AnalyticsOptInView_Night_1_en",20182,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_0_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_0_en",20182,], +["features.analytics.api.preferences_AnalyticsPreferencesView_Day_1_en","features.analytics.api.preferences_AnalyticsPreferencesView_Night_1_en",20182,], +["features.preferences.impl.analytics_AnalyticsSettingsView_Day_0_en","features.preferences.impl.analytics_AnalyticsSettingsView_Night_0_en",20182,], ["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",20175,], +["services.apperror.impl_AppErrorView_Day_0_en","services.apperror.impl_AppErrorView_Night_0_en",20182,], ["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",20175,], +["libraries.designsystem.components.async_AsyncActionView_Day_1_en","libraries.designsystem.components.async_AsyncActionView_Night_1_en",20182,], ["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",20175,], +["libraries.designsystem.components.async_AsyncActionView_Day_3_en","libraries.designsystem.components.async_AsyncActionView_Night_3_en",20182,], ["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",20175,], +["libraries.designsystem.components.async_AsyncFailure_Day_0_en","libraries.designsystem.components.async_AsyncFailure_Night_0_en",20182,], ["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",20175,], +["features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Day_0_en","features.messages.impl.messagecomposer_AttachmentSourcePickerMenu_Night_0_en",20182,], ["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,], @@ -67,18 +67,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","",20175,], -["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20175,], -["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20175,], -["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20175,], -["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20175,], -["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_0_en","",20182,], +["features.messages.impl.attachments.preview_AttachmentsView_1_en","",20182,], +["features.messages.impl.attachments.preview_AttachmentsView_2_en","",20182,], +["features.messages.impl.attachments.preview_AttachmentsView_3_en","",20182,], +["features.messages.impl.attachments.preview_AttachmentsView_4_en","",20182,], +["features.messages.impl.attachments.preview_AttachmentsView_5_en","",20182,], ["features.messages.impl.attachments.preview_AttachmentsView_6_en","",0,], -["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20175,], +["features.messages.impl.attachments.preview_AttachmentsView_7_en","",20182,], ["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",20175,], +["libraries.matrix.ui.components_AvatarActionBottomSheet_Day_0_en","libraries.matrix.ui.components_AvatarActionBottomSheet_Night_0_en",20182,], ["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,], @@ -186,13 +186,13 @@ export const screenshots = [ ["libraries.designsystem.components_Badge_Day_0_en","libraries.designsystem.components_Badge_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",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20175,], -["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20175,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_0_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_0_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_1_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_1_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_2_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_2_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_3_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_3_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_4_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_4_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_5_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_5_en",20182,], +["features.preferences.impl.blockedusers_BlockedUsersView_Day_6_en","features.preferences.impl.blockedusers_BlockedUsersView_Night_6_en",20182,], ["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,], @@ -203,130 +203,130 @@ 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",20175,], -["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20175,], -["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20175,], -["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20175,], -["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20175,], +["features.rageshake.impl.bugreport_BugReportView_Day_0_en","features.rageshake.impl.bugreport_BugReportView_Night_0_en",20182,], +["features.rageshake.impl.bugreport_BugReportView_Day_1_en","features.rageshake.impl.bugreport_BugReportView_Night_1_en",20182,], +["features.rageshake.impl.bugreport_BugReportView_Day_2_en","features.rageshake.impl.bugreport_BugReportView_Night_2_en",20182,], +["features.rageshake.impl.bugreport_BugReportView_Day_3_en","features.rageshake.impl.bugreport_BugReportView_Night_3_en",20182,], +["features.rageshake.impl.bugreport_BugReportView_Day_4_en","features.rageshake.impl.bugreport_BugReportView_Night_4_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20175,], +["features.messages.impl.timeline.components_CallMenuItem_Day_2_en","features.messages.impl.timeline.components_CallMenuItem_Night_2_en",20182,], +["features.messages.impl.timeline.components_CallMenuItem_Day_3_en","features.messages.impl.timeline.components_CallMenuItem_Night_3_en",20182,], ["features.messages.impl.timeline.components_CallMenuItem_Day_4_en","features.messages.impl.timeline.components_CallMenuItem_Night_4_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",20175,], -["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20175,], -["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20175,], -["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20175,], -["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20175,], -["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20175,], +["features.call.impl.ui_CallScreenView_Day_1_en","features.call.impl.ui_CallScreenView_Night_1_en",20182,], +["features.call.impl.ui_CallScreenView_Day_2_en","features.call.impl.ui_CallScreenView_Night_2_en",20182,], +["features.call.impl.ui_CallScreenView_Day_3_en","features.call.impl.ui_CallScreenView_Night_3_en",20182,], +["libraries.textcomposer_CaptionWarningBottomSheet_Day_0_en","libraries.textcomposer_CaptionWarningBottomSheet_Night_0_en",20182,], +["features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Day_0_en","features.login.impl.screens.changeaccountprovider_ChangeAccountProviderView_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_10_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_10_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_1_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_1_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_2_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_2_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_3_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_3_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_4_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_4_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_5_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_5_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_6_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_6_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_7_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_7_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_8_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_8_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Day_9_en","features.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_Night_9_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_1_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_2_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_3_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_4_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_5_en",20182,], +["features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_Night_6_en",20182,], ["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",20175,], -["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20175,], +["features.login.impl.changeserver_ChangeServerView_Day_1_en","features.login.impl.changeserver_ChangeServerView_Night_1_en",20182,], +["features.login.impl.changeserver_ChangeServerView_Day_2_en","features.login.impl.changeserver_ChangeServerView_Night_2_en",20182,], ["libraries.matrix.ui.components_CheckableResolvedUserRow_en","",0,], -["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20175,], +["libraries.matrix.ui.components_CheckableUnresolvedUserRow_en","",20182,], ["libraries.designsystem.theme.components_Checkboxes_Toggles_en","",0,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20175,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20175,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20175,], -["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20175,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_0_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_0_en",20182,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_1_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_1_en",20182,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_2_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_2_en",20182,], +["features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Day_3_en","features.ftue.impl.sessionverification.choosemode_ChooseSelfVerificationModeView_Night_3_en",20182,], ["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",20175,], -["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20175,], -["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20175,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_0_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_0_en",20182,], +["libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Day_1_en","libraries.designsystem.atomic.molecules_ComposerAlertMolecule_Night_1_en",20182,], +["libraries.textcomposer_ComposerModeView_Day_0_en","libraries.textcomposer_ComposerModeView_Night_0_en",20182,], ["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","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20175,], -["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20175,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20175,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20175,], -["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20175,], -["features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20175,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_0_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_1_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_2_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_3_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_4_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewDark_5_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_0_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_1_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_2_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_3_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_4_en","",20182,], +["features.createroom.impl.configureroom_ConfigureRoomViewLight_5_en","",20182,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_0_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_0_en",20182,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_1_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_1_en",20182,], +["features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Day_2_en","features.login.impl.screens.confirmaccountprovider_ConfirmAccountProviderView_Night_2_en",20182,], +["features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_ConfirmRecoveryKeyBanner_Night_0_en",20182,], ["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",20175,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20175,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20175,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20175,], -["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20175,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20175,], -["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20175,], -["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20175,], -["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20175,], -["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20175,], -["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20175,], -["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20175,], -["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20175,], -["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20175,], -["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20175,], -["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20175,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20175,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20175,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20175,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20175,], -["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20175,], +["features.rageshake.api.crash_CrashDetectionView_Day_0_en","features.rageshake.api.crash_CrashDetectionView_Night_0_en",20182,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_0_en","features.login.impl.screens.createaccount_CreateAccountView_Night_0_en",20182,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_1_en","features.login.impl.screens.createaccount_CreateAccountView_Night_1_en",20182,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_2_en","features.login.impl.screens.createaccount_CreateAccountView_Night_2_en",20182,], +["features.login.impl.screens.createaccount_CreateAccountView_Day_3_en","features.login.impl.screens.createaccount_CreateAccountView_Night_3_en",20182,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_0_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_0_en",20182,], +["libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Day_1_en","libraries.matrix.ui.components_CreateDmConfirmationBottomSheet_Night_1_en",20182,], +["features.poll.impl.create_CreatePollView_Day_0_en","features.poll.impl.create_CreatePollView_Night_0_en",20182,], +["features.poll.impl.create_CreatePollView_Day_1_en","features.poll.impl.create_CreatePollView_Night_1_en",20182,], +["features.poll.impl.create_CreatePollView_Day_2_en","features.poll.impl.create_CreatePollView_Night_2_en",20182,], +["features.poll.impl.create_CreatePollView_Day_3_en","features.poll.impl.create_CreatePollView_Night_3_en",20182,], +["features.poll.impl.create_CreatePollView_Day_4_en","features.poll.impl.create_CreatePollView_Night_4_en",20182,], +["features.poll.impl.create_CreatePollView_Day_5_en","features.poll.impl.create_CreatePollView_Night_5_en",20182,], +["features.poll.impl.create_CreatePollView_Day_6_en","features.poll.impl.create_CreatePollView_Night_6_en",20182,], +["features.poll.impl.create_CreatePollView_Day_7_en","features.poll.impl.create_CreatePollView_Night_7_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_0_en","features.createroom.impl.root_CreateRoomRootView_Night_0_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_1_en","features.createroom.impl.root_CreateRoomRootView_Night_1_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_2_en","features.createroom.impl.root_CreateRoomRootView_Night_2_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_3_en","features.createroom.impl.root_CreateRoomRootView_Night_3_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_4_en","features.createroom.impl.root_CreateRoomRootView_Night_4_en",20182,], +["features.createroom.impl.root_CreateRoomRootView_Day_5_en","features.createroom.impl.root_CreateRoomRootView_Night_5_en",20182,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_0_en","",20182,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_1_en","",20182,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_2_en","",20182,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_3_en","",20182,], +["libraries.dateformatter.impl.previews_DateFormatterModeView_4_en","",20182,], ["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","",20175,], -["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20175,], +["libraries.designsystem.theme.components.previews_DatePickerDark_DateTime_pickers_en","",20182,], +["libraries.designsystem.theme.components.previews_DatePickerLight_DateTime_pickers_en","",20182,], ["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",20175,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20175,], -["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20175,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_1_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_1_en",20182,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_2_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_2_en",20182,], +["features.logout.impl.direct_DefaultDirectLogoutView_Day_3_en","features.logout.impl.direct_DefaultDirectLogoutView_Night_3_en",20182,], ["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",20175,], -["features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20175,], -["features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en",20175,], +["features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Day_0_en","features.preferences.impl.notifications.edit_DefaultNotificationSettingOption_Night_0_en",20182,], +["features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBarWithIndicator_Night_0_en",20182,], +["features.roomlist.impl.components_DefaultRoomListTopBar_Day_0_en","features.roomlist.impl.components_DefaultRoomListTopBar_Night_0_en",20182,], ["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",20175,], -["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20175,], -["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20175,], -["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20175,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20175,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20175,], -["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20175,], +["features.licenses.impl.list_DependencyLicensesListView_Day_0_en","features.licenses.impl.list_DependencyLicensesListView_Night_0_en",20182,], +["features.licenses.impl.list_DependencyLicensesListView_Day_1_en","features.licenses.impl.list_DependencyLicensesListView_Night_1_en",20182,], +["features.licenses.impl.list_DependencyLicensesListView_Day_2_en","features.licenses.impl.list_DependencyLicensesListView_Night_2_en",20182,], +["features.licenses.impl.list_DependencyLicensesListView_Day_3_en","features.licenses.impl.list_DependencyLicensesListView_Night_3_en",20182,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_0_en","features.preferences.impl.developer_DeveloperSettingsView_Night_0_en",20182,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_1_en","features.preferences.impl.developer_DeveloperSettingsView_Night_1_en",20182,], +["features.preferences.impl.developer_DeveloperSettingsView_Day_2_en","features.preferences.impl.developer_DeveloperSettingsView_Night_2_en",20182,], ["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,], @@ -339,17 +339,17 @@ 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",20175,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20175,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20175,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20175,], -["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20175,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20175,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20175,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20175,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20175,], -["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20175,], -["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20175,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_0_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_0_en",20182,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_1_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_1_en",20182,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_2_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_2_en",20182,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_3_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_3_en",20182,], +["features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Day_4_en","features.preferences.impl.notifications.edit_EditDefaultNotificationSettingView_Night_4_en",20182,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_0_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_0_en",20182,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_1_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_1_en",20182,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_2_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_2_en",20182,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_3_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_3_en",20182,], +["features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Day_4_en","features.roomdetails.impl.securityandprivacy.editroomaddress_EditRoomAddressView_Night_4_en",20182,], +["features.preferences.impl.user.editprofile_EditUserProfileView_Day_0_en","features.preferences.impl.user.editprofile_EditUserProfileView_Night_0_en",20182,], ["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,], @@ -359,9 +359,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","",20175,], -["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20175,], -["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20175,], +["libraries.designsystem.components.dialogs_ErrorDialogContent_Dialogs_en","",20182,], +["libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialogWithDoNotShowAgain_Night_0_en",20182,], +["libraries.designsystem.components.dialogs_ErrorDialog_Day_0_en","libraries.designsystem.components.dialogs_ErrorDialog_Night_0_en",20182,], ["features.messages.impl.timeline.debug_EventDebugInfoView_Day_0_en","features.messages.impl.timeline.debug_EventDebugInfoView_Night_0_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,], @@ -379,16 +379,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",20175,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20175,], -["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20175,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_1_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_1_en",20182,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_2_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_2_en",20182,], +["features.messages.impl.timeline.focus_FocusRequestStateView_Day_3_en","features.messages.impl.timeline.focus_FocusRequestStateView_Night_3_en",20182,], ["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",20175,], -["features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20175,], +["features.messages.impl.forward_ForwardMessagesView_Day_3_en","features.messages.impl.forward_ForwardMessagesView_Night_3_en",20182,], +["features.roomlist.impl.components_FullScreenIntentPermissionBanner_Day_0_en","features.roomlist.impl.components_FullScreenIntentPermissionBanner_Night_0_en",20182,], ["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,], @@ -412,8 +412,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",20175,], -["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20175,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_1_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_1_en",20182,], +["features.messages.impl.crypto.identity_IdentityChangeStateView_Day_2_en","features.messages.impl.crypto.identity_IdentityChangeStateView_Night_2_en",20182,], ["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,], @@ -421,84 +421,84 @@ 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",20175,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_4_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_4_en",20182,], ["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",20175,], +["libraries.matrix.ui.messages.reply_InReplyToView_Day_8_en","libraries.matrix.ui.messages.reply_InReplyToView_Night_8_en",20182,], ["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",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20175,], -["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20175,], +["features.call.impl.ui_IncomingCallScreen_Day_0_en","features.call.impl.ui_IncomingCallScreen_Night_0_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_0_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_0_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_10_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_10_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_11_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_11_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_12_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_12_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_13_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_13_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_1_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_1_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_2_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_2_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_3_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_3_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_4_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_4_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_5_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_5_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_6_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_6_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_7_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_7_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_8_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_8_en",20182,], +["features.verifysession.impl.incoming_IncomingVerificationView_Day_9_en","features.verifysession.impl.incoming_IncomingVerificationView_Night_9_en",20182,], ["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,], -["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20175,], -["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20175,], +["libraries.matrix.ui.components_InviteSenderView_Day_0_en","libraries.matrix.ui.components_InviteSenderView_Night_0_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_0_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_0_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_1_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_1_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_2_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_2_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_3_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_3_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_4_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_4_en",20182,], +["features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Day_5_en","features.createroom.impl.joinbyaddress_JoinRoomByAddressView_Night_5_en",20182,], ["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",20175,], -["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20175,], -["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20175,], -["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20175,], -["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20175,], +["features.joinroom.impl_JoinRoomView_Day_10_en","features.joinroom.impl_JoinRoomView_Night_10_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_11_en","features.joinroom.impl_JoinRoomView_Night_11_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_12_en","features.joinroom.impl_JoinRoomView_Night_12_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_13_en","features.joinroom.impl_JoinRoomView_Night_13_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_14_en","features.joinroom.impl_JoinRoomView_Night_14_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_15_en","features.joinroom.impl_JoinRoomView_Night_15_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_16_en","features.joinroom.impl_JoinRoomView_Night_16_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_1_en","features.joinroom.impl_JoinRoomView_Night_1_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_2_en","features.joinroom.impl_JoinRoomView_Night_2_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_3_en","features.joinroom.impl_JoinRoomView_Night_3_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_4_en","features.joinroom.impl_JoinRoomView_Night_4_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_5_en","features.joinroom.impl_JoinRoomView_Night_5_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_6_en","features.joinroom.impl_JoinRoomView_Night_6_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_7_en","features.joinroom.impl_JoinRoomView_Night_7_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_8_en","features.joinroom.impl_JoinRoomView_Night_8_en",20182,], +["features.joinroom.impl_JoinRoomView_Day_9_en","features.joinroom.impl_JoinRoomView_Night_9_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_0_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_0_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_1_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_1_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_2_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_2_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_3_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_3_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_4_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_4_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_5_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_5_en",20182,], +["features.knockrequests.impl.banner_KnockRequestsBannerView_Day_6_en","features.knockrequests.impl.banner_KnockRequestsBannerView_Night_6_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_0_en","features.knockrequests.impl.list_KnockRequestsListView_Night_0_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_10_en","features.knockrequests.impl.list_KnockRequestsListView_Night_10_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_1_en","features.knockrequests.impl.list_KnockRequestsListView_Night_1_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_2_en","features.knockrequests.impl.list_KnockRequestsListView_Night_2_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_3_en","features.knockrequests.impl.list_KnockRequestsListView_Night_3_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_4_en","features.knockrequests.impl.list_KnockRequestsListView_Night_4_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_5_en","features.knockrequests.impl.list_KnockRequestsListView_Night_5_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_6_en","features.knockrequests.impl.list_KnockRequestsListView_Night_6_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_7_en","features.knockrequests.impl.list_KnockRequestsListView_Night_7_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_8_en","features.knockrequests.impl.list_KnockRequestsListView_Night_8_en",20182,], +["features.knockrequests.impl.list_KnockRequestsListView_Day_9_en","features.knockrequests.impl.list_KnockRequestsListView_Night_9_en",20182,], ["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",20175,], -["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20175,], -["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20175,], -["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20175,], -["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20175,], -["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20175,], +["features.leaveroom.api_LeaveRoomView_Day_1_en","features.leaveroom.api_LeaveRoomView_Night_1_en",20182,], +["features.leaveroom.api_LeaveRoomView_Day_2_en","features.leaveroom.api_LeaveRoomView_Night_2_en",20182,], +["features.leaveroom.api_LeaveRoomView_Day_3_en","features.leaveroom.api_LeaveRoomView_Night_3_en",20182,], +["features.leaveroom.api_LeaveRoomView_Day_4_en","features.leaveroom.api_LeaveRoomView_Night_4_en",20182,], +["features.leaveroom.api_LeaveRoomView_Day_5_en","features.leaveroom.api_LeaveRoomView_Night_5_en",20182,], +["features.leaveroom.api_LeaveRoomView_Day_6_en","features.leaveroom.api_LeaveRoomView_Night_6_en",20182,], ["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",20178,], +["features.messages.impl.link_LinkView_Day_1_en","features.messages.impl.link_LinkView_Night_1_en",20182,], ["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,], @@ -553,29 +553,29 @@ 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",20175,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20175,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20175,], -["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20175,], +["appnav.room.joined_LoadingRoomNodeView_Day_1_en","appnav.room.joined_LoadingRoomNodeView_Night_1_en",20182,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_0_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_0_en",20182,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_1_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_1_en",20182,], +["features.lockscreen.impl.settings_LockScreenSettingsView_Day_2_en","features.lockscreen.impl.settings_LockScreenSettingsView_Night_2_en",20182,], ["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",20175,], -["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20175,], -["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20175,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20175,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20175,], -["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20175,], -["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20175,], -["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20175,], -["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20175,], -["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20175,], -["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20175,], -["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20175,], -["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20175,], -["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20175,], -["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20175,], -["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20175,], +["appnav.loggedin_LoggedInView_Day_1_en","appnav.loggedin_LoggedInView_Night_1_en",20182,], +["appnav.loggedin_LoggedInView_Day_2_en","appnav.loggedin_LoggedInView_Night_2_en",20182,], +["appnav.loggedin_LoggedInView_Day_3_en","appnav.loggedin_LoggedInView_Night_3_en",20182,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_0_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_0_en",20182,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_1_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_1_en",20182,], +["features.login.impl.screens.loginpassword_LoginPasswordView_Day_2_en","features.login.impl.screens.loginpassword_LoginPasswordView_Night_2_en",20182,], +["features.logout.impl_LogoutView_Day_0_en","features.logout.impl_LogoutView_Night_0_en",20182,], +["features.logout.impl_LogoutView_Day_1_en","features.logout.impl_LogoutView_Night_1_en",20182,], +["features.logout.impl_LogoutView_Day_2_en","features.logout.impl_LogoutView_Night_2_en",20182,], +["features.logout.impl_LogoutView_Day_3_en","features.logout.impl_LogoutView_Night_3_en",20182,], +["features.logout.impl_LogoutView_Day_4_en","features.logout.impl_LogoutView_Night_4_en",20182,], +["features.logout.impl_LogoutView_Day_5_en","features.logout.impl_LogoutView_Night_5_en",20182,], +["features.logout.impl_LogoutView_Day_6_en","features.logout.impl_LogoutView_Night_6_en",20182,], +["features.logout.impl_LogoutView_Day_7_en","features.logout.impl_LogoutView_Night_7_en",20182,], +["features.logout.impl_LogoutView_Day_8_en","features.logout.impl_LogoutView_Night_8_en",20182,], +["features.logout.impl_LogoutView_Day_9_en","features.logout.impl_LogoutView_Night_9_en",20182,], ["libraries.designsystem.components.button_MainActionButton_Buttons_en","",0,], -["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20175,], +["libraries.textcomposer_MarkdownTextComposerEdit_Day_0_en","libraries.textcomposer_MarkdownTextComposerEdit_Night_0_en",20182,], ["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,], @@ -588,22 +588,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",20175,], -["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20175,], +["libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDeleteConfirmationBottomSheet_Night_0_en",20182,], +["libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Day_0_en","libraries.mediaviewer.impl.details_MediaDetailsBottomSheet_Night_0_en",20182,], ["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",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20175,], -["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20175,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_0_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_0_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_10_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_10_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_11_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_11_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_12_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_12_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_1_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_1_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_2_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_2_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_3_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_3_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_4_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_4_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_5_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_5_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_6_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_6_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_7_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_7_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_8_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_8_en",20182,], +["libraries.mediaviewer.impl.gallery_MediaGalleryView_Day_9_en","libraries.mediaviewer.impl.gallery_MediaGalleryView_Night_9_en",20182,], ["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,], @@ -611,14 +611,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","",20175,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20175,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_11_en","",20182,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_12_en","",20182,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_13_en","",0,], -["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20175,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_14_en","",20182,], ["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","",20175,], +["libraries.mediaviewer.impl.viewer_MediaViewerView_2_en","",20182,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_3_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_4_en","",0,], ["libraries.mediaviewer.impl.viewer_MediaViewerView_5_en","",0,], @@ -630,7 +630,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",20175,], +["features.messages.impl.messagecomposer_MessageComposerView_Day_0_en","features.messages.impl.messagecomposer_MessageComposerView_Night_0_en",20182,], ["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_10_en","features.messages.impl.timeline.components_MessageEventBubble_Night_10_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_11_en","features.messages.impl.timeline.components_MessageEventBubble_Night_11_en",0,], @@ -647,7 +647,7 @@ export const screenshots = [ ["features.messages.impl.timeline.components_MessageEventBubble_Day_7_en","features.messages.impl.timeline.components_MessageEventBubble_Night_7_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_8_en","features.messages.impl.timeline.components_MessageEventBubble_Night_8_en",0,], ["features.messages.impl.timeline.components_MessageEventBubble_Day_9_en","features.messages.impl.timeline.components_MessageEventBubble_Night_9_en",0,], -["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20175,], +["features.messages.impl.timeline.components_MessageShieldView_Day_0_en","features.messages.impl.timeline.components_MessageShieldView_Night_0_en",20182,], ["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,], @@ -655,25 +655,25 @@ 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",20175,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20175,], -["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20175,], -["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20175,], -["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20175,], -["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20175,], -["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20175,], -["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20175,], -["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20175,], -["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20175,], -["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20175,], -["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20175,], -["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20175,], -["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20175,], -["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20175,], -["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20175,], -["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20175,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_0_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_0_en",20182,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_1_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_1_en",20182,], +["features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Day_2_en","features.messages.impl.crypto.identity_MessagesViewWithIdentityChange_Night_2_en",20182,], +["features.messages.impl_MessagesView_Day_0_en","features.messages.impl_MessagesView_Night_0_en",20182,], +["features.messages.impl_MessagesView_Day_10_en","features.messages.impl_MessagesView_Night_10_en",20182,], +["features.messages.impl_MessagesView_Day_11_en","features.messages.impl_MessagesView_Night_11_en",20182,], +["features.messages.impl_MessagesView_Day_12_en","features.messages.impl_MessagesView_Night_12_en",20182,], +["features.messages.impl_MessagesView_Day_13_en","features.messages.impl_MessagesView_Night_13_en",20182,], +["features.messages.impl_MessagesView_Day_1_en","features.messages.impl_MessagesView_Night_1_en",20182,], +["features.messages.impl_MessagesView_Day_2_en","features.messages.impl_MessagesView_Night_2_en",20182,], +["features.messages.impl_MessagesView_Day_3_en","features.messages.impl_MessagesView_Night_3_en",20182,], +["features.messages.impl_MessagesView_Day_4_en","features.messages.impl_MessagesView_Night_4_en",20182,], +["features.messages.impl_MessagesView_Day_5_en","features.messages.impl_MessagesView_Night_5_en",20182,], +["features.messages.impl_MessagesView_Day_6_en","features.messages.impl_MessagesView_Night_6_en",20182,], +["features.messages.impl_MessagesView_Day_7_en","features.messages.impl_MessagesView_Night_7_en",20182,], +["features.messages.impl_MessagesView_Day_8_en","features.messages.impl_MessagesView_Night_8_en",20182,], +["features.messages.impl_MessagesView_Day_9_en","features.messages.impl_MessagesView_Night_9_en",20182,], ["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",20175,], +["features.migration.impl_MigrationView_Day_1_en","features.migration.impl_MigrationView_Night_1_en",20182,], ["libraries.designsystem.theme.components_ModalBottomSheetDark_Bottom_Sheets_en","",0,], ["libraries.designsystem.theme.components_ModalBottomSheetLight_Bottom_Sheets_en","",0,], ["appicon.element_MonochromeIcon_en","",0,], @@ -682,29 +682,29 @@ 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",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20175,], -["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20175,], -["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20175,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_0_en","features.preferences.impl.notifications_NotificationSettingsView_Night_0_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_10_en","features.preferences.impl.notifications_NotificationSettingsView_Night_10_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_11_en","features.preferences.impl.notifications_NotificationSettingsView_Night_11_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_12_en","features.preferences.impl.notifications_NotificationSettingsView_Night_12_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_13_en","features.preferences.impl.notifications_NotificationSettingsView_Night_13_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_1_en","features.preferences.impl.notifications_NotificationSettingsView_Night_1_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_2_en","features.preferences.impl.notifications_NotificationSettingsView_Night_2_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_3_en","features.preferences.impl.notifications_NotificationSettingsView_Night_3_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_4_en","features.preferences.impl.notifications_NotificationSettingsView_Night_4_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_5_en","features.preferences.impl.notifications_NotificationSettingsView_Night_5_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_6_en","features.preferences.impl.notifications_NotificationSettingsView_Night_6_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_7_en","features.preferences.impl.notifications_NotificationSettingsView_Night_7_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_8_en","features.preferences.impl.notifications_NotificationSettingsView_Night_8_en",20182,], +["features.preferences.impl.notifications_NotificationSettingsView_Day_9_en","features.preferences.impl.notifications_NotificationSettingsView_Night_9_en",20182,], +["features.ftue.impl.notifications_NotificationsOptInView_Day_0_en","features.ftue.impl.notifications_NotificationsOptInView_Night_0_en",20182,], ["libraries.oidc.impl.webview_OidcView_Day_0_en","libraries.oidc.impl.webview_OidcView_Night_0_en",0,], ["libraries.oidc.impl.webview_OidcView_Day_1_en","libraries.oidc.impl.webview_OidcView_Night_1_en",0,], ["libraries.designsystem.atomic.pages_OnBoardingPage_Day_0_en","libraries.designsystem.atomic.pages_OnBoardingPage_Night_0_en",0,], -["features.onboarding.impl_OnBoardingView_Day_0_en","features.onboarding.impl_OnBoardingView_Night_0_en",20175,], -["features.onboarding.impl_OnBoardingView_Day_1_en","features.onboarding.impl_OnBoardingView_Night_1_en",20175,], -["features.onboarding.impl_OnBoardingView_Day_2_en","features.onboarding.impl_OnBoardingView_Night_2_en",20175,], -["features.onboarding.impl_OnBoardingView_Day_3_en","features.onboarding.impl_OnBoardingView_Night_3_en",20175,], -["features.onboarding.impl_OnBoardingView_Day_4_en","features.onboarding.impl_OnBoardingView_Night_4_en",20178,], +["features.onboarding.impl_OnBoardingView_Day_0_en","features.onboarding.impl_OnBoardingView_Night_0_en",20182,], +["features.onboarding.impl_OnBoardingView_Day_1_en","features.onboarding.impl_OnBoardingView_Night_1_en",20182,], +["features.onboarding.impl_OnBoardingView_Day_2_en","features.onboarding.impl_OnBoardingView_Night_2_en",20182,], +["features.onboarding.impl_OnBoardingView_Day_3_en","features.onboarding.impl_OnBoardingView_Night_3_en",20182,], +["features.onboarding.impl_OnBoardingView_Day_4_en","features.onboarding.impl_OnBoardingView_Night_4_en",20182,], ["libraries.designsystem.background_OnboardingBackground_Day_0_en","libraries.designsystem.background_OnboardingBackground_Night_0_en",0,], ["libraries.designsystem.theme.components_OutlinedButtonLargeLowPadding_Buttons_en","",0,], ["libraries.designsystem.theme.components_OutlinedButtonLarge_Buttons_en","",0,], @@ -719,65 +719,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",20175,], -["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20175,], -["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20175,], -["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20175,], -["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20175,], -["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20175,], +["libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Day_0_en","libraries.mediaviewer.impl.local.pdf_PdfPagesErrorView_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Day_0_en","features.roomdetails.impl.rolesandpermissions.changeroles_PendingMemberRowWithLongName_Night_0_en",20182,], +["libraries.permissions.api_PermissionsView_Day_0_en","libraries.permissions.api_PermissionsView_Night_0_en",20182,], +["libraries.permissions.api_PermissionsView_Day_1_en","libraries.permissions.api_PermissionsView_Night_1_en",20182,], +["libraries.permissions.api_PermissionsView_Day_2_en","libraries.permissions.api_PermissionsView_Night_2_en",20182,], +["libraries.permissions.api_PermissionsView_Day_3_en","libraries.permissions.api_PermissionsView_Night_3_en",20182,], ["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",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20175,], -["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20175,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_0_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_0_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_1_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_1_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_2_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_2_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_3_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_3_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_4_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_4_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_5_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_5_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_6_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_6_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockViewInApp_Day_7_en","features.lockscreen.impl.unlock_PinUnlockViewInApp_Night_7_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_0_en","features.lockscreen.impl.unlock_PinUnlockView_Night_0_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_1_en","features.lockscreen.impl.unlock_PinUnlockView_Night_1_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_2_en","features.lockscreen.impl.unlock_PinUnlockView_Night_2_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_3_en","features.lockscreen.impl.unlock_PinUnlockView_Night_3_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_4_en","features.lockscreen.impl.unlock_PinUnlockView_Night_4_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_5_en","features.lockscreen.impl.unlock_PinUnlockView_Night_5_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_6_en","features.lockscreen.impl.unlock_PinUnlockView_Night_6_en",20182,], +["features.lockscreen.impl.unlock_PinUnlockView_Day_7_en","features.lockscreen.impl.unlock_PinUnlockView_Night_7_en",20182,], ["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",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20175,], -["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20175,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20175,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20175,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20175,], -["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20175,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_10_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_10_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_1_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_1_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_2_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_2_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_3_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_3_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_4_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_4_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_5_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_5_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_6_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_6_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_7_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_7_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_8_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_8_en",20182,], +["features.messages.impl.pinned.banner_PinnedMessagesBannerView_Day_9_en","features.messages.impl.pinned.banner_PinnedMessagesBannerView_Night_9_en",20182,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_0_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_0_en",20182,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_1_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_1_en",20182,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_2_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_2_en",20182,], +["features.messages.impl.pinned.list_PinnedMessagesListView_Day_3_en","features.messages.impl.pinned.list_PinnedMessagesListView_Night_3_en",20182,], ["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",20175,], -["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20175,], -["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20175,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20175,], -["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20175,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en",20182,], +["features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en",20182,], +["features.poll.api.pollcontent_PollAnswerViewEndedSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en",20182,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en",20182,], +["features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Day_0_en","features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en",20182,], ["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",20175,], -["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20175,], -["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20175,], -["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20175,], -["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20175,], -["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20175,], -["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20175,], -["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20175,], -["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20175,], -["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20175,], -["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20175,], +["features.poll.api.pollcontent_PollContentViewCreatorEditable_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en",20182,], +["features.poll.api.pollcontent_PollContentViewCreatorEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en",20182,], +["features.poll.api.pollcontent_PollContentViewCreator_Day_0_en","features.poll.api.pollcontent_PollContentViewCreator_Night_0_en",20182,], +["features.poll.api.pollcontent_PollContentViewDisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en",20182,], +["features.poll.api.pollcontent_PollContentViewEnded_Day_0_en","features.poll.api.pollcontent_PollContentViewEnded_Night_0_en",20182,], +["features.poll.api.pollcontent_PollContentViewUndisclosed_Day_0_en","features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en",20182,], +["features.poll.impl.history_PollHistoryView_Day_0_en","features.poll.impl.history_PollHistoryView_Night_0_en",20182,], +["features.poll.impl.history_PollHistoryView_Day_1_en","features.poll.impl.history_PollHistoryView_Night_1_en",20182,], +["features.poll.impl.history_PollHistoryView_Day_2_en","features.poll.impl.history_PollHistoryView_Night_2_en",20182,], +["features.poll.impl.history_PollHistoryView_Day_3_en","features.poll.impl.history_PollHistoryView_Night_3_en",20182,], +["features.poll.impl.history_PollHistoryView_Day_4_en","features.poll.impl.history_PollHistoryView_Night_4_en",20182,], ["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,], @@ -791,207 +791,208 @@ 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","",20175,], -["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20175,], -["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20175,], -["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20175,], +["features.preferences.impl.root_PreferencesRootViewDark_0_en","",20182,], +["features.preferences.impl.root_PreferencesRootViewDark_1_en","",20182,], +["features.preferences.impl.root_PreferencesRootViewLight_0_en","",20182,], +["features.preferences.impl.root_PreferencesRootViewLight_1_en","",20182,], ["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","",20175,], -["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20175,], -["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20175,], -["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20175,], -["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20175,], -["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20175,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20175,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20175,], -["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20175,], -["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20175,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20175,], -["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20175,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20175,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20175,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20175,], -["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20175,], +["libraries.designsystem.components_ProgressDialogContent_Dialogs_en","",20182,], +["libraries.designsystem.components_ProgressDialog_Day_0_en","libraries.designsystem.components_ProgressDialog_Night_0_en",20182,], +["features.messages.impl.timeline.protection_ProtectedView_Day_0_en","features.messages.impl.timeline.protection_ProtectedView_Night_0_en",20182,], +["features.messages.impl.timeline.protection_ProtectedView_Day_1_en","features.messages.impl.timeline.protection_ProtectedView_Night_1_en",20182,], +["features.messages.impl.timeline.protection_ProtectedView_Day_2_en","features.messages.impl.timeline.protection_ProtectedView_Night_2_en",20182,], +["features.messages.impl.timeline.protection_ProtectedView_Day_3_en","features.messages.impl.timeline.protection_ProtectedView_Night_3_en",20182,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_0_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_0_en",20182,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_1_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_1_en",20182,], +["features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Day_2_en","features.login.impl.screens.qrcode.confirmation_QrCodeConfirmationView_Night_2_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_0_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_0_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_1_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_1_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_2_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_2_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_3_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_3_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_4_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_4_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_5_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_5_en",20182,], +["features.login.impl.screens.qrcode.error_QrCodeErrorView_Day_6_en","features.login.impl.screens.qrcode.error_QrCodeErrorView_Night_6_en",20182,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_0_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_0_en",20182,], +["features.login.impl.screens.qrcode.intro_QrCodeIntroView_Day_1_en","features.login.impl.screens.qrcode.intro_QrCodeIntroView_Night_1_en",20182,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_0_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_0_en",20182,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_1_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_1_en",20182,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_2_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_2_en",20182,], +["features.login.impl.screens.qrcode.scan_QrCodeScanView_Day_3_en","features.login.impl.screens.qrcode.scan_QrCodeScanView_Night_3_en",20182,], ["libraries.designsystem.theme.components_RadioButton_Toggles_en","",0,], -["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20175,], -["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20175,], +["features.rageshake.api.detection_RageshakeDialogContent_Day_0_en","features.rageshake.api.detection_RageshakeDialogContent_Night_0_en",20182,], +["features.rageshake.api.preferences_RageshakePreferencesView_Day_0_en","features.rageshake.api.preferences_RageshakePreferencesView_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20175,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20175,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20175,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20175,], -["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20175,], -["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20175,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_0_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_0_en",20182,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_1_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_1_en",20182,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_2_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_2_en",20182,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_3_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_3_en",20182,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_4_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_4_en",20182,], +["features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Day_5_en","features.messages.impl.timeline.components.receipt.bottomsheet_ReadReceiptBottomSheet_Night_5_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_0_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_0_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_10_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_10_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_11_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_11_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_12_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_12_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_13_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_13_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_1_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_1_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_2_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_2_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_3_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_3_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_4_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_4_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_5_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_5_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_6_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_6_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_7_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_7_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_8_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_8_en",20182,], +["features.securebackup.impl.setup.views_RecoveryKeyView_Day_9_en","features.securebackup.impl.setup.views_RecoveryKeyView_Night_9_en",20182,], ["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",20175,], -["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20175,], -["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20175,], -["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20175,], -["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20175,], -["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20175,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20175,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20175,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20175,], -["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20175,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20175,], -["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20175,], +["features.messages.impl.report_ReportMessageView_Day_0_en","features.messages.impl.report_ReportMessageView_Night_0_en",20182,], +["features.messages.impl.report_ReportMessageView_Day_1_en","features.messages.impl.report_ReportMessageView_Night_1_en",20182,], +["features.messages.impl.report_ReportMessageView_Day_2_en","features.messages.impl.report_ReportMessageView_Night_2_en",20182,], +["features.messages.impl.report_ReportMessageView_Day_3_en","features.messages.impl.report_ReportMessageView_Night_3_en",20182,], +["features.messages.impl.report_ReportMessageView_Day_4_en","features.messages.impl.report_ReportMessageView_Night_4_en",20182,], +["features.messages.impl.report_ReportMessageView_Day_5_en","features.messages.impl.report_ReportMessageView_Night_5_en",20182,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_0_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_0_en",20182,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_1_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_1_en",20182,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_2_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_2_en",20182,], +["features.securebackup.impl.reset.password_ResetIdentityPasswordView_Day_3_en","features.securebackup.impl.reset.password_ResetIdentityPasswordView_Night_3_en",20182,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_0_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_0_en",20182,], +["features.securebackup.impl.reset.root_ResetIdentityRootView_Day_1_en","features.securebackup.impl.reset.root_ResetIdentityRootView_Night_1_en",20182,], ["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",20175,], -["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20175,], -["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20175,], -["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20175,], -["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20175,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_1_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_1_en",20182,], +["features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Day_2_en","features.messages.impl.crypto.sendfailure.resolve_ResolveVerifiedUserSendFailureView_Night_2_en",20182,], +["libraries.designsystem.components.dialogs_RetryDialogContent_Dialogs_en","",20182,], +["libraries.designsystem.components.dialogs_RetryDialog_Day_0_en","libraries.designsystem.components.dialogs_RetryDialog_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_0_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_0_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_1_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_1_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_2_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_2_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_3_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_3_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_4_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_4_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_5_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_5_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_6_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_6_en",20182,], +["features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Day_7_en","features.roomdetails.impl.rolesandpermissions_RolesAndPermissionsView_Night_7_en",20182,], ["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",20175,], -["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20175,], -["features.roomdetails.impl_RoomDetailsDark_0_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_10_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_11_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_12_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_13_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_14_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_15_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_16_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_17_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_18_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_1_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_2_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_3_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_4_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_5_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_6_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_7_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_8_en","",20175,], -["features.roomdetails.impl_RoomDetailsDark_9_en","",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20175,], -["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20175,], -["features.roomdetails.impl_RoomDetails_0_en","",20175,], -["features.roomdetails.impl_RoomDetails_10_en","",20175,], -["features.roomdetails.impl_RoomDetails_11_en","",20175,], -["features.roomdetails.impl_RoomDetails_12_en","",20175,], -["features.roomdetails.impl_RoomDetails_13_en","",20175,], -["features.roomdetails.impl_RoomDetails_14_en","",20175,], -["features.roomdetails.impl_RoomDetails_15_en","",20175,], -["features.roomdetails.impl_RoomDetails_16_en","",20175,], -["features.roomdetails.impl_RoomDetails_17_en","",20175,], -["features.roomdetails.impl_RoomDetails_18_en","",20175,], -["features.roomdetails.impl_RoomDetails_1_en","",20175,], -["features.roomdetails.impl_RoomDetails_2_en","",20175,], -["features.roomdetails.impl_RoomDetails_3_en","",20175,], -["features.roomdetails.impl_RoomDetails_4_en","",20175,], -["features.roomdetails.impl_RoomDetails_5_en","",20175,], -["features.roomdetails.impl_RoomDetails_6_en","",20175,], -["features.roomdetails.impl_RoomDetails_7_en","",20175,], -["features.roomdetails.impl_RoomDetails_8_en","",20175,], -["features.roomdetails.impl_RoomDetails_9_en","",20175,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20175,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20175,], -["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20175,], -["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20175,], -["features.roomlist.impl.components_RoomListContentView_Day_0_en","features.roomlist.impl.components_RoomListContentView_Night_0_en",20175,], -["features.roomlist.impl.components_RoomListContentView_Day_1_en","features.roomlist.impl.components_RoomListContentView_Night_1_en",20175,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_1_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_1_en",20182,], +["features.roomaliasresolver.impl_RoomAliasResolverView_Day_2_en","features.roomaliasresolver.impl_RoomAliasResolverView_Night_2_en",20182,], +["features.roomdetails.impl_RoomDetailsDark_0_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_10_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_11_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_12_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_13_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_14_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_15_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_16_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_17_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_18_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_1_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_2_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_3_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_4_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_5_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_6_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_7_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_8_en","",20182,], +["features.roomdetails.impl_RoomDetailsDark_9_en","",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_0_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_0_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_1_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_1_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_2_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_2_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_3_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_3_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_4_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_4_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_5_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_5_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_6_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_6_en",20182,], +["features.roomdetails.impl.edit_RoomDetailsEditView_Day_7_en","features.roomdetails.impl.edit_RoomDetailsEditView_Night_7_en",20182,], +["features.roomdetails.impl_RoomDetails_0_en","",20182,], +["features.roomdetails.impl_RoomDetails_10_en","",20182,], +["features.roomdetails.impl_RoomDetails_11_en","",20182,], +["features.roomdetails.impl_RoomDetails_12_en","",20182,], +["features.roomdetails.impl_RoomDetails_13_en","",20182,], +["features.roomdetails.impl_RoomDetails_14_en","",20182,], +["features.roomdetails.impl_RoomDetails_15_en","",20182,], +["features.roomdetails.impl_RoomDetails_16_en","",20182,], +["features.roomdetails.impl_RoomDetails_17_en","",20182,], +["features.roomdetails.impl_RoomDetails_18_en","",20182,], +["features.roomdetails.impl_RoomDetails_1_en","",20182,], +["features.roomdetails.impl_RoomDetails_2_en","",20182,], +["features.roomdetails.impl_RoomDetails_3_en","",20182,], +["features.roomdetails.impl_RoomDetails_4_en","",20182,], +["features.roomdetails.impl_RoomDetails_5_en","",20182,], +["features.roomdetails.impl_RoomDetails_6_en","",20182,], +["features.roomdetails.impl_RoomDetails_7_en","",20182,], +["features.roomdetails.impl_RoomDetails_8_en","",20182,], +["features.roomdetails.impl_RoomDetails_9_en","",20182,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_0_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_0_en",20182,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_1_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_1_en",20182,], +["features.roomdirectory.impl.root_RoomDirectoryView_Day_2_en","features.roomdirectory.impl.root_RoomDirectoryView_Night_2_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_0_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_0_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_1_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_1_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_2_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_2_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_3_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_3_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_4_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_4_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_5_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_5_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_6_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_6_en",20182,], +["features.roomdetails.impl.invite_RoomInviteMembersView_Day_7_en","features.roomdetails.impl.invite_RoomInviteMembersView_Night_7_en",20182,], +["features.roomlist.impl.components_RoomListContentView_Day_0_en","features.roomlist.impl.components_RoomListContentView_Night_0_en",20182,], +["features.roomlist.impl.components_RoomListContentView_Day_1_en","features.roomlist.impl.components_RoomListContentView_Night_1_en",20182,], ["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",20175,], -["features.roomlist.impl.components_RoomListContentView_Day_4_en","features.roomlist.impl.components_RoomListContentView_Night_4_en",20175,], -["features.roomlist.impl.filters_RoomListFiltersView_Day_0_en","features.roomlist.impl.filters_RoomListFiltersView_Night_0_en",20175,], -["features.roomlist.impl.filters_RoomListFiltersView_Day_1_en","features.roomlist.impl.filters_RoomListFiltersView_Night_1_en",20175,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en",20175,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en",20175,], -["features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en",20175,], +["features.roomlist.impl.components_RoomListContentView_Day_3_en","features.roomlist.impl.components_RoomListContentView_Night_3_en",20182,], +["features.roomlist.impl.components_RoomListContentView_Day_4_en","features.roomlist.impl.components_RoomListContentView_Night_4_en",20182,], +["features.roomlist.impl.filters_RoomListFiltersView_Day_0_en","features.roomlist.impl.filters_RoomListFiltersView_Night_0_en",20182,], +["features.roomlist.impl.filters_RoomListFiltersView_Day_1_en","features.roomlist.impl.filters_RoomListFiltersView_Night_1_en",20182,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_0_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_0_en",20182,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_1_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_1_en",20182,], +["features.roomlist.impl_RoomListModalBottomSheetContent_Day_2_en","features.roomlist.impl_RoomListModalBottomSheetContent_Night_2_en",20182,], ["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",20175,], -["features.roomlist.impl_RoomListView_Day_0_en","features.roomlist.impl_RoomListView_Night_0_en",20175,], -["features.roomlist.impl_RoomListView_Day_10_en","features.roomlist.impl_RoomListView_Night_10_en",20175,], -["features.roomlist.impl_RoomListView_Day_1_en","features.roomlist.impl_RoomListView_Night_1_en",20175,], -["features.roomlist.impl_RoomListView_Day_2_en","features.roomlist.impl_RoomListView_Night_2_en",20175,], -["features.roomlist.impl_RoomListView_Day_3_en","features.roomlist.impl_RoomListView_Night_3_en",20175,], -["features.roomlist.impl_RoomListView_Day_4_en","features.roomlist.impl_RoomListView_Night_4_en",20175,], -["features.roomlist.impl_RoomListView_Day_5_en","features.roomlist.impl_RoomListView_Night_5_en",20175,], -["features.roomlist.impl_RoomListView_Day_6_en","features.roomlist.impl_RoomListView_Night_6_en",20175,], -["features.roomlist.impl_RoomListView_Day_7_en","features.roomlist.impl_RoomListView_Night_7_en",20175,], +["features.roomlist.impl.search_RoomListSearchContent_Day_1_en","features.roomlist.impl.search_RoomListSearchContent_Night_1_en",20182,], +["features.roomlist.impl_RoomListView_Day_0_en","features.roomlist.impl_RoomListView_Night_0_en",20182,], +["features.roomlist.impl_RoomListView_Day_10_en","features.roomlist.impl_RoomListView_Night_10_en",20182,], +["features.roomlist.impl_RoomListView_Day_1_en","features.roomlist.impl_RoomListView_Night_1_en",20182,], +["features.roomlist.impl_RoomListView_Day_2_en","features.roomlist.impl_RoomListView_Night_2_en",20182,], +["features.roomlist.impl_RoomListView_Day_3_en","features.roomlist.impl_RoomListView_Night_3_en",20182,], +["features.roomlist.impl_RoomListView_Day_4_en","features.roomlist.impl_RoomListView_Night_4_en",20182,], +["features.roomlist.impl_RoomListView_Day_5_en","features.roomlist.impl_RoomListView_Night_5_en",20182,], +["features.roomlist.impl_RoomListView_Day_6_en","features.roomlist.impl_RoomListView_Night_6_en",20182,], +["features.roomlist.impl_RoomListView_Day_7_en","features.roomlist.impl_RoomListView_Night_7_en",20182,], ["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",20175,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20175,], -["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20175,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_0_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_0_en",20182,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_1_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_1_en",20182,], +["features.roomdetails.impl.members_RoomMemberListViewBanned_Day_2_en","features.roomdetails.impl.members_RoomMemberListViewBanned_Night_2_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_0_en","features.roomdetails.impl.members_RoomMemberListView_Night_0_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_1_en","features.roomdetails.impl.members_RoomMemberListView_Night_1_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_2_en","features.roomdetails.impl.members_RoomMemberListView_Night_2_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_3_en","features.roomdetails.impl.members_RoomMemberListView_Night_3_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_4_en","features.roomdetails.impl.members_RoomMemberListView_Night_4_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_5_en","features.roomdetails.impl.members_RoomMemberListView_Night_5_en",20182,], ["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",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20175,], -["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20175,], +["features.roomdetails.impl.members_RoomMemberListView_Day_7_en","features.roomdetails.impl.members_RoomMemberListView_Night_7_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_8_en","features.roomdetails.impl.members_RoomMemberListView_Night_8_en",20182,], +["features.roomdetails.impl.members_RoomMemberListView_Day_9_en","features.roomdetails.impl.members_RoomMemberListView_Night_9_en",20182,], ["libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Day_0_en","libraries.designsystem.atomic.molecules_RoomMembersCountMolecule_Night_0_en",0,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_0_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_0_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_1_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_1_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_2_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_2_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en",0,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en",20175,], -["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en",0,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20175,], -["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20175,], -["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20175,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_0_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_0_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_10_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_10_en",0,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_1_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_1_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_2_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_2_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_3_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_3_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_4_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_4_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_5_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_5_en",20185,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_6_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_6_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_7_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_7_en",0,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_8_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_8_en",20182,], +["features.roomdetails.impl.members.moderation_RoomMembersModerationView_Day_9_en","features.roomdetails.impl.members.moderation_RoomMembersModerationView_Night_9_en",20185,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsOption_Night_0_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_0_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_1_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_1_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_2_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_2_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_3_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_3_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_4_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_4_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_5_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_5_en",20182,], +["features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Day_6_en","features.roomdetails.impl.notificationsettings_RoomNotificationSettingsView_Night_6_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_0_en","libraries.roomselect.impl_RoomSelectView_Night_0_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_1_en","libraries.roomselect.impl_RoomSelectView_Night_1_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_2_en","libraries.roomselect.impl_RoomSelectView_Night_2_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_3_en","libraries.roomselect.impl_RoomSelectView_Night_3_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_4_en","libraries.roomselect.impl_RoomSelectView_Night_4_en",20182,], +["libraries.roomselect.impl_RoomSelectView_Day_5_en","libraries.roomselect.impl_RoomSelectView_Night_5_en",20182,], ["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,], @@ -1014,12 +1015,12 @@ export const screenshots = [ ["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",20175,], -["features.roomlist.impl.components_RoomSummaryRow_Day_2_en","features.roomlist.impl.components_RoomSummaryRow_Night_2_en",20175,], -["features.roomlist.impl.components_RoomSummaryRow_Day_30_en","features.roomlist.impl.components_RoomSummaryRow_Night_30_en",20175,], -["features.roomlist.impl.components_RoomSummaryRow_Day_31_en","features.roomlist.impl.components_RoomSummaryRow_Night_31_en",20175,], -["features.roomlist.impl.components_RoomSummaryRow_Day_32_en","features.roomlist.impl.components_RoomSummaryRow_Night_32_en",20175,], -["features.roomlist.impl.components_RoomSummaryRow_Day_33_en","features.roomlist.impl.components_RoomSummaryRow_Night_33_en",20175,], +["features.roomlist.impl.components_RoomSummaryRow_Day_29_en","features.roomlist.impl.components_RoomSummaryRow_Night_29_en",20182,], +["features.roomlist.impl.components_RoomSummaryRow_Day_2_en","features.roomlist.impl.components_RoomSummaryRow_Night_2_en",20182,], +["features.roomlist.impl.components_RoomSummaryRow_Day_30_en","features.roomlist.impl.components_RoomSummaryRow_Night_30_en",20182,], +["features.roomlist.impl.components_RoomSummaryRow_Day_31_en","features.roomlist.impl.components_RoomSummaryRow_Night_31_en",20182,], +["features.roomlist.impl.components_RoomSummaryRow_Day_32_en","features.roomlist.impl.components_RoomSummaryRow_Night_32_en",20182,], +["features.roomlist.impl.components_RoomSummaryRow_Day_33_en","features.roomlist.impl.components_RoomSummaryRow_Night_33_en",20182,], ["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,], @@ -1027,77 +1028,77 @@ export const screenshots = [ ["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",20175,], -["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20175,], -["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20175,], +["appnav.root_RootView_Day_0_en","appnav.root_RootView_Night_0_en",20182,], +["appnav.root_RootView_Day_1_en","appnav.root_RootView_Night_1_en",20182,], +["appnav.root_RootView_Day_2_en","appnav.root_RootView_Night_2_en",20182,], ["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",20175,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20175,], -["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20175,], +["features.verifysession.impl.emoji_SasEmojis_Day_0_en","features.verifysession.impl.emoji_SasEmojis_Night_0_en",20182,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_0_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_0_en",20182,], +["features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Day_1_en","features.login.impl.screens.searchaccountprovider_SearchAccountProviderView_Night_1_en",20182,], ["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","",20175,], +["libraries.designsystem.theme.components_SearchBarActiveWithNoResults_Search_views_en","",20182,], ["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","",20175,], -["features.createroom.impl.components_SearchSingleUserResultItem_en","",20175,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20175,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20175,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20175,], -["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20175,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20175,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20175,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20175,], -["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20175,], -["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20175,], -["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20175,], -["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20175,], +["features.createroom.impl.components_SearchMultipleUsersResultItem_en","",20182,], +["features.createroom.impl.components_SearchSingleUserResultItem_en","",20182,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_0_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_0_en",20182,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_1_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_1_en",20182,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_2_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_2_en",20182,], +["features.securebackup.impl.disable_SecureBackupDisableView_Day_3_en","features.securebackup.impl.disable_SecureBackupDisableView_Night_3_en",20182,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_0_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_0_en",20182,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_1_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_1_en",20182,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_2_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_2_en",20182,], +["features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Day_3_en","features.securebackup.impl.enter_SecureBackupEnterRecoveryKeyView_Night_3_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_0_en","features.securebackup.impl.root_SecureBackupRootView_Night_0_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_10_en","features.securebackup.impl.root_SecureBackupRootView_Night_10_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_11_en","features.securebackup.impl.root_SecureBackupRootView_Night_11_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_12_en","features.securebackup.impl.root_SecureBackupRootView_Night_12_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_13_en","features.securebackup.impl.root_SecureBackupRootView_Night_13_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_14_en","features.securebackup.impl.root_SecureBackupRootView_Night_14_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_15_en","features.securebackup.impl.root_SecureBackupRootView_Night_15_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_16_en","features.securebackup.impl.root_SecureBackupRootView_Night_16_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_17_en","features.securebackup.impl.root_SecureBackupRootView_Night_17_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_1_en","features.securebackup.impl.root_SecureBackupRootView_Night_1_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_2_en","features.securebackup.impl.root_SecureBackupRootView_Night_2_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_3_en","features.securebackup.impl.root_SecureBackupRootView_Night_3_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_4_en","features.securebackup.impl.root_SecureBackupRootView_Night_4_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_5_en","features.securebackup.impl.root_SecureBackupRootView_Night_5_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_6_en","features.securebackup.impl.root_SecureBackupRootView_Night_6_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_7_en","features.securebackup.impl.root_SecureBackupRootView_Night_7_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_8_en","features.securebackup.impl.root_SecureBackupRootView_Night_8_en",20182,], +["features.securebackup.impl.root_SecureBackupRootView_Day_9_en","features.securebackup.impl.root_SecureBackupRootView_Night_9_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_0_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_1_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_2_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_3_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupViewChange_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupViewChange_Night_4_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_0_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_0_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_1_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_1_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_2_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_2_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_3_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_3_en",20182,], +["features.securebackup.impl.setup_SecureBackupSetupView_Day_4_en","features.securebackup.impl.setup_SecureBackupSetupView_Night_4_en",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_0_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_1_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_2_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_3_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_4_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_5_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_6_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_7_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewDark_8_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_0_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_1_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_2_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_3_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_4_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_5_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_6_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_7_en","",20182,], +["features.roomdetails.impl.securityandprivacy_SecurityAndPrivacyViewLight_8_en","",20182,], ["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,], @@ -1105,11 +1106,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",20175,], -["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20175,], -["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20175,], -["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20175,], -["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20175,], +["features.location.impl.send_SendLocationView_Day_0_en","features.location.impl.send_SendLocationView_Night_0_en",20182,], +["features.location.impl.send_SendLocationView_Day_1_en","features.location.impl.send_SendLocationView_Night_1_en",20182,], +["features.location.impl.send_SendLocationView_Day_2_en","features.location.impl.send_SendLocationView_Night_2_en",20182,], +["features.location.impl.send_SendLocationView_Day_3_en","features.location.impl.send_SendLocationView_Night_3_en",20182,], +["features.location.impl.send_SendLocationView_Day_4_en","features.location.impl.send_SendLocationView_Night_4_en",20182,], ["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,], @@ -1119,27 +1120,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",20175,], -["features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20175,], -["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20175,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20175,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20175,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20175,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20175,], -["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20175,], +["features.verifysession.impl.incoming.ui_SessionDetailsView_Day_0_en","features.verifysession.impl.incoming.ui_SessionDetailsView_Night_0_en",20182,], +["features.roomlist.impl.components_SetUpRecoveryKeyBanner_Day_0_en","features.roomlist.impl.components_SetUpRecoveryKeyBanner_Night_0_en",20182,], +["features.lockscreen.impl.setup.biometric_SetupBiometricView_Day_0_en","features.lockscreen.impl.setup.biometric_SetupBiometricView_Night_0_en",20182,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_0_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_0_en",20182,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_1_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_1_en",20182,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_2_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_2_en",20182,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_3_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_3_en",20182,], +["features.lockscreen.impl.setup.pin_SetupPinView_Day_4_en","features.lockscreen.impl.setup.pin_SetupPinView_Night_4_en",20182,], ["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",20175,], -["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20175,], -["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20175,], -["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20175,], -["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20175,], -["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20175,], -["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20175,], -["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20175,], -["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20175,], -["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20175,], +["features.share.impl_ShareView_Day_3_en","features.share.impl_ShareView_Night_3_en",20182,], +["features.location.impl.show_ShowLocationView_Day_0_en","features.location.impl.show_ShowLocationView_Night_0_en",20182,], +["features.location.impl.show_ShowLocationView_Day_1_en","features.location.impl.show_ShowLocationView_Night_1_en",20182,], +["features.location.impl.show_ShowLocationView_Day_2_en","features.location.impl.show_ShowLocationView_Night_2_en",20182,], +["features.location.impl.show_ShowLocationView_Day_3_en","features.location.impl.show_ShowLocationView_Night_3_en",20182,], +["features.location.impl.show_ShowLocationView_Day_4_en","features.location.impl.show_ShowLocationView_Night_4_en",20182,], +["features.location.impl.show_ShowLocationView_Day_5_en","features.location.impl.show_ShowLocationView_Night_5_en",20182,], +["features.location.impl.show_ShowLocationView_Day_6_en","features.location.impl.show_ShowLocationView_Night_6_en",20182,], +["features.location.impl.show_ShowLocationView_Day_7_en","features.location.impl.show_ShowLocationView_Night_7_en",20182,], +["features.signedout.impl_SignedOutView_Day_0_en","features.signedout.impl_SignedOutView_Night_0_en",20182,], ["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,], @@ -1148,7 +1149,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",20175,], +["features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Day_0_en","features.login.impl.dialogs_SlidingSyncNotSupportedDialog_Night_0_en",20182,], ["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,], @@ -1157,58 +1158,60 @@ 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",20175,], +["features.location.api.internal_StaticMapPlaceholder_Day_0_en","features.location.api.internal_StaticMapPlaceholder_Night_0_en",20182,], ["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",20175,], +["features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en","features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en",20182,], ["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",20175,], +["appnav.loggedin_SyncStateView_Day_0_en","appnav.loggedin_SyncStateView_Night_0_en",20182,], ["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",20175,], -["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20175,], -["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20175,], -["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20178,], -["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20175,], -["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20178,], -["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20175,], -["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20175,], -["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20175,], -["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20175,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20178,], -["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20178,], -["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20175,], -["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20175,], -["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20178,], -["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20175,], -["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20178,], +["libraries.textcomposer_TextComposerAddCaption_Day_0_en","libraries.textcomposer_TextComposerAddCaption_Night_0_en",20182,], +["libraries.textcomposer_TextComposerCaption_Day_0_en","libraries.textcomposer_TextComposerCaption_Night_0_en",20182,], +["libraries.textcomposer_TextComposerEditCaption_Day_0_en","libraries.textcomposer_TextComposerEditCaption_Night_0_en",20182,], +["libraries.textcomposer_TextComposerEditNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerEditNotEncrypted_Night_0_en",20182,], +["libraries.textcomposer_TextComposerEdit_Day_0_en","libraries.textcomposer_TextComposerEdit_Night_0_en",20182,], +["libraries.textcomposer_TextComposerFormattingNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerFormattingNotEncrypted_Night_0_en",20182,], +["libraries.textcomposer_TextComposerFormatting_Day_0_en","libraries.textcomposer_TextComposerFormatting_Night_0_en",20182,], +["libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLinkWithoutText_Night_0_en",20182,], +["libraries.textcomposer_TextComposerLinkDialogCreateLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogCreateLink_Night_0_en",20182,], +["libraries.textcomposer_TextComposerLinkDialogEditLink_Day_0_en","libraries.textcomposer_TextComposerLinkDialogEditLink_Night_0_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_0_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_10_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_10_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_11_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_11_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_1_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_1_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_2_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_2_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_3_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_3_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_4_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_4_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_5_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_5_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_6_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_6_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_7_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_7_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_8_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_8_en",20182,], +["libraries.textcomposer_TextComposerReplyNotEncrypted_Day_9_en","libraries.textcomposer_TextComposerReplyNotEncrypted_Night_9_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_0_en","libraries.textcomposer_TextComposerReply_Night_0_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_10_en","libraries.textcomposer_TextComposerReply_Night_10_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_11_en","libraries.textcomposer_TextComposerReply_Night_11_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_1_en","libraries.textcomposer_TextComposerReply_Night_1_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_2_en","libraries.textcomposer_TextComposerReply_Night_2_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_3_en","libraries.textcomposer_TextComposerReply_Night_3_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_4_en","libraries.textcomposer_TextComposerReply_Night_4_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_5_en","libraries.textcomposer_TextComposerReply_Night_5_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_6_en","libraries.textcomposer_TextComposerReply_Night_6_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_7_en","libraries.textcomposer_TextComposerReply_Night_7_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_8_en","libraries.textcomposer_TextComposerReply_Night_8_en",20182,], +["libraries.textcomposer_TextComposerReply_Day_9_en","libraries.textcomposer_TextComposerReply_Night_9_en",20182,], +["libraries.textcomposer_TextComposerSimpleNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerSimpleNotEncrypted_Night_0_en",20182,], +["libraries.textcomposer_TextComposerSimple_Day_0_en","libraries.textcomposer_TextComposerSimple_Night_0_en",20182,], +["libraries.textcomposer_TextComposerVoiceNotEncrypted_Day_0_en","libraries.textcomposer_TextComposerVoiceNotEncrypted_Night_0_en",20182,], ["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",20185,], +["libraries.designsystem.components.dialogs_TextFieldDialog_Day_0_en","libraries.designsystem.components.dialogs_TextFieldDialog_Night_0_en",20185,], ["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,], @@ -1220,14 +1223,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","",20175,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20175,], -["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20175,], +["libraries.designsystem.theme.components.previews_TimePickerHorizontal_DateTime_pickers_en","",20182,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalDark_DateTime_pickers_en","",20182,], +["libraries.designsystem.theme.components.previews_TimePickerVerticalLight_DateTime_pickers_en","",20182,], ["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",20175,], -["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20175,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_3_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_3_en",20182,], +["features.messages.impl.timeline.components_TimelineEventTimestampView_Day_4_en","features.messages.impl.timeline.components_TimelineEventTimestampView_Night_4_en",20182,], ["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,], @@ -1237,18 +1240,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",20175,], +["features.messages.impl.timeline.components_TimelineItemCallNotifyView_Day_0_en","features.messages.impl.timeline.components_TimelineItemCallNotifyView_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_0_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_1_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_2_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_3_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_4_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_4_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_5_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_5_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_6_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_6_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_7_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_7_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Day_8_en","features.messages.impl.timeline.components.event_TimelineItemEncryptedView_Night_8_en",20182,], ["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,], @@ -1256,18 +1259,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",20175,], -["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_3_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_3_en",20182,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_4_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20175,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Day_7_en","features.messages.impl.timeline.components_TimelineItemEventRowTimestamp_Night_7_en",20182,], +["features.messages.impl.timeline.components_TimelineItemEventRowUtd_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowUtd_Night_0_en",20182,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithManyReactions_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_0_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_0_en",20182,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Day_1_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReplyInformative_Night_1_en",20182,], ["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,], @@ -1276,40 +1279,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",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_4_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_4_en",20182,], ["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",20175,], +["features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Day_8_en","features.messages.impl.timeline.components_TimelineItemEventRowWithReply_Night_8_en",20182,], ["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","",20175,], +["features.messages.impl.timeline.components_TimelineItemEventTimestampBelow_en","",20182,], ["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",20175,], -["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentCollapse_Night_0_en",20182,], +["features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Day_0_en","features.messages.impl.timeline.components_TimelineItemGroupedEventsRowContentExpanded_Night_0_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemImageViewHideMediaContent_Night_0_en",20182,], ["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",20175,], +["features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemLegacyCallInviteView_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20175,], -["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20175,], -["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_1_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_2_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemPollView_Day_3_en","features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en",20182,], +["features.messages.impl.timeline.components_TimelineItemReactionsLayout_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsLayout_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20175,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewIncoming_Night_0_en",20182,], +["features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Day_0_en","features.messages.impl.timeline.components_TimelineItemReactionsViewOutgoing_Night_0_en",20182,], ["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",20175,], +["features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemReadMarkerView_Night_0_en",20182,], ["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,], @@ -1318,8 +1321,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",20175,], -["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemRedactedView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemRedactedView_Night_0_en",20182,], +["features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Day_0_en","features.messages.impl.timeline.components.virtual_TimelineItemRoomBeginningView_Night_0_en",20182,], ["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,], @@ -1334,8 +1337,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",20175,], -["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20175,], +["features.messages.impl.timeline.components.event_TimelineItemUnknownView_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemUnknownView_Night_0_en",20182,], +["features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Day_0_en","features.messages.impl.timeline.components.event_TimelineItemVideoViewHideMediaContent_Night_0_en",20182,], ["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,], @@ -1358,95 +1361,95 @@ 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",20175,], -["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20175,], +["features.messages.impl.timeline_TimelineViewMessageShield_Day_0_en","features.messages.impl.timeline_TimelineViewMessageShield_Night_0_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_0_en","features.messages.impl.timeline_TimelineView_Night_0_en",20182,], ["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",20175,], -["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20175,], -["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20175,], +["features.messages.impl.timeline_TimelineView_Day_11_en","features.messages.impl.timeline_TimelineView_Night_11_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_12_en","features.messages.impl.timeline_TimelineView_Night_12_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_13_en","features.messages.impl.timeline_TimelineView_Night_13_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_14_en","features.messages.impl.timeline_TimelineView_Night_14_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_15_en","features.messages.impl.timeline_TimelineView_Night_15_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_16_en","features.messages.impl.timeline_TimelineView_Night_16_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_17_en","features.messages.impl.timeline_TimelineView_Night_17_en",20182,], +["features.messages.impl.timeline_TimelineView_Day_1_en","features.messages.impl.timeline_TimelineView_Night_1_en",20182,], ["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",20175,], +["features.messages.impl.timeline_TimelineView_Day_4_en","features.messages.impl.timeline_TimelineView_Night_4_en",20182,], ["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",20175,], +["features.messages.impl.timeline_TimelineView_Day_6_en","features.messages.impl.timeline_TimelineView_Night_6_en",20182,], ["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",20175,], +["features.messages.impl.timeline_TimelineView_Day_8_en","features.messages.impl.timeline_TimelineView_Night_8_en",20182,], ["features.messages.impl.timeline_TimelineView_Day_9_en","features.messages.impl.timeline_TimelineView_Night_9_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",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20175,], -["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20175,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_0_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_0_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_1_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_1_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_2_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_2_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_3_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_3_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_4_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_4_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_5_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_5_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_6_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_6_en",20182,], +["libraries.troubleshoot.impl_TroubleshootNotificationsView_Day_7_en","libraries.troubleshoot.impl_TroubleshootNotificationsView_Night_7_en",20182,], ["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",20175,], -["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20175,], -["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20175,], -["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20175,], -["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20175,], -["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20175,], +["features.messages.impl.typing_TypingNotificationView_Day_1_en","features.messages.impl.typing_TypingNotificationView_Night_1_en",20182,], +["features.messages.impl.typing_TypingNotificationView_Day_2_en","features.messages.impl.typing_TypingNotificationView_Night_2_en",20182,], +["features.messages.impl.typing_TypingNotificationView_Day_3_en","features.messages.impl.typing_TypingNotificationView_Night_3_en",20182,], +["features.messages.impl.typing_TypingNotificationView_Day_4_en","features.messages.impl.typing_TypingNotificationView_Night_4_en",20182,], +["features.messages.impl.typing_TypingNotificationView_Day_5_en","features.messages.impl.typing_TypingNotificationView_Night_5_en",20182,], +["features.messages.impl.typing_TypingNotificationView_Day_6_en","features.messages.impl.typing_TypingNotificationView_Night_6_en",20182,], ["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","",20175,], +["libraries.matrix.ui.components_UnresolvedUserRow_en","",20182,], ["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",20175,], -["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20175,], -["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20175,], -["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20175,], +["features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Day_0_en","features.roomdetails.impl.notificationsettings_UserDefinedRoomNotificationSettingsView_Night_0_en",20182,], +["features.createroom.impl.components_UserListView_Day_0_en","features.createroom.impl.components_UserListView_Night_0_en",20182,], +["features.createroom.impl.components_UserListView_Day_1_en","features.createroom.impl.components_UserListView_Night_1_en",20182,], +["features.createroom.impl.components_UserListView_Day_2_en","features.createroom.impl.components_UserListView_Night_2_en",20182,], ["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",20175,], +["features.createroom.impl.components_UserListView_Day_7_en","features.createroom.impl.components_UserListView_Night_7_en",20182,], ["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",20175,], +["features.createroom.impl.components_UserListView_Day_9_en","features.createroom.impl.components_UserListView_Night_9_en",20182,], ["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",20175,], -["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20175,], -["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20175,], -["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20175,], -["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20175,], -["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20175,], -["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20175,], -["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20175,], -["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20175,], -["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20175,], -["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20175,], -["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20175,], +["features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en","features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en",20182,], +["features.userprofile.shared_UserProfileHeaderSection_Day_0_en","features.userprofile.shared_UserProfileHeaderSection_Night_0_en",20182,], +["features.userprofile.shared_UserProfileView_Day_0_en","features.userprofile.shared_UserProfileView_Night_0_en",20182,], +["features.userprofile.shared_UserProfileView_Day_1_en","features.userprofile.shared_UserProfileView_Night_1_en",20182,], +["features.userprofile.shared_UserProfileView_Day_2_en","features.userprofile.shared_UserProfileView_Night_2_en",20182,], +["features.userprofile.shared_UserProfileView_Day_3_en","features.userprofile.shared_UserProfileView_Night_3_en",20182,], +["features.userprofile.shared_UserProfileView_Day_4_en","features.userprofile.shared_UserProfileView_Night_4_en",20182,], +["features.userprofile.shared_UserProfileView_Day_5_en","features.userprofile.shared_UserProfileView_Night_5_en",20182,], +["features.userprofile.shared_UserProfileView_Day_6_en","features.userprofile.shared_UserProfileView_Night_6_en",20182,], +["features.userprofile.shared_UserProfileView_Day_7_en","features.userprofile.shared_UserProfileView_Night_7_en",20182,], +["features.userprofile.shared_UserProfileView_Day_8_en","features.userprofile.shared_UserProfileView_Night_8_en",20182,], +["features.userprofile.shared_UserProfileView_Day_9_en","features.userprofile.shared_UserProfileView_Night_9_en",20182,], ["features.verifysession.impl.ui_VerificationUserProfileContent_Day_0_en","features.verifysession.impl.ui_VerificationUserProfileContent_Night_0_en",0,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_0_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_0_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_10_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_10_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_11_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_11_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_0_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_0_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_10_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_10_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_11_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_11_en",20182,], ["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_12_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_12_en",0,], ["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_13_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_13_en",0,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_1_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_1_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_2_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_2_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_3_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_3_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_4_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_4_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_5_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_5_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_6_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_6_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_7_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_7_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_8_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_8_en",20175,], -["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_9_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_9_en",20175,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_1_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_1_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_2_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_2_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_3_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_3_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_4_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_4_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_5_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_5_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_6_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_6_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_7_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_7_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_8_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_8_en",20182,], +["features.verifysession.impl.outgoing_VerifySelfSessionView_Day_9_en","features.verifysession.impl.outgoing_VerifySelfSessionView_Night_9_en",20182,], ["libraries.designsystem.ruler_VerticalRuler_Day_0_en","libraries.designsystem.ruler_VerticalRuler_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_0_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_0_en",0,], ["libraries.mediaviewer.impl.gallery.ui_VideoItemView_Day_1_en","libraries.mediaviewer.impl.gallery.ui_VideoItemView_Night_1_en",0,], ["features.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",20175,], +["features.viewfolder.impl.file_ViewFileView_Day_3_en","features.viewfolder.impl.file_ViewFileView_Night_3_en",20182,], ["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,], @@ -1465,6 +1468,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",20175,], +["features.ftue.impl.welcome_WelcomeView_Day_0_en","features.ftue.impl.welcome_WelcomeView_Night_0_en",20182,], ["libraries.designsystem.ruler_WithRulers_Day_0_en","libraries.designsystem.ruler_WithRulers_Night_0_en",0,], ]; From b1dd555baaa639314254f39aaa10b0384abd4136 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:50:22 +0200 Subject: [PATCH 41/54] chore(deps): update plugin dependencycheck to v12.1.1 (#4540) 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 15171e96b5..fe48fd3263 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -239,7 +239,7 @@ anvil = { id = "dev.zacsweers.anvil", version.ref = "anvil" } detekt = "io.gitlab.arturbosch.detekt:1.23.8" ktlint = "org.jlleitschuh.gradle.ktlint:12.2.0" dependencygraph = "com.savvasdalkitsis.module-dependency-graph:0.12" -dependencycheck = "org.owasp.dependencycheck:12.1.0" +dependencycheck = "org.owasp.dependencycheck:12.1.1" dependencyanalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyAnalysis" } paparazzi = "app.cash.paparazzi:1.3.5" sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } From 977268b876154884a26485fa43657db8a76055b6 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 7 Apr 2025 10:50:45 +0200 Subject: [PATCH 42/54] Fix bullet points not having leading margin on timeline items (#4536) * Fix bullet points not having leading margin on timeline items * Remove other usages of `SpannableString` constructor, use either `valueOf` to reuse the existing value or `SpannedString` instead if the spans don't have to change --- .../impl/timeline/components/event/TimelineItemTextView.kt | 4 ++-- .../libraries/designsystem/components/ClickableLinkText.kt | 2 +- .../android/libraries/designsystem/text/AnnotatedStrings.kt | 4 ++-- .../textcomposer/components/markdown/StableCharSequence.kt | 4 ++-- .../libraries/textcomposer/model/MarkdownTextEditorState.kt | 4 +--- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt index a4a7cff9cb..d496b94f3b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemTextView.kt @@ -7,7 +7,7 @@ package io.element.android.features.messages.impl.timeline.components.event -import android.text.SpannableString +import android.text.SpannedString import androidx.annotation.VisibleForTesting import androidx.compose.foundation.layout.Box import androidx.compose.material3.LocalContentColor @@ -71,7 +71,7 @@ fun TimelineItemTextView( internal fun getTextWithResolvedMentions(content: TimelineItemTextBasedContent): CharSequence { val mentionSpanUpdater = LocalMentionSpanUpdater.current val bodyWithResolvedMentions = mentionSpanUpdater.rememberMentionSpans(content.formattedBody) - return SpannableString(bodyWithResolvedMentions) + return SpannedString.valueOf(bodyWithResolvedMentions) } @PreviewsDayNight diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt index 169403104a..3638556da3 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/ClickableLinkText.kt @@ -135,7 +135,7 @@ fun ClickableLinkText( fun AnnotatedString.linkify(linkStyle: SpanStyle): AnnotatedString { val original = this - val spannable = SpannableString(this.text) + val spannable = SpannableString.valueOf(this.text) LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS or Linkify.PHONE_NUMBERS or Linkify.EMAIL_ADDRESSES) val spans = spannable.getSpans(0, spannable.length, URLSpan::class.java) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt index 36ac7d71bd..79f70cc2f5 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/AnnotatedStrings.kt @@ -8,7 +8,7 @@ package io.element.android.libraries.designsystem.text import android.graphics.Typeface -import android.text.SpannableString +import android.text.SpannedString import android.text.style.ForegroundColorSpan import android.text.style.StyleSpan import android.text.style.UnderlineSpan @@ -26,7 +26,7 @@ import io.element.android.compound.theme.LinkColor fun String.toAnnotatedString(): AnnotatedString = buildAnnotatedString { append(this@toAnnotatedString) - val spannable = SpannableString(this@toAnnotatedString) + val spannable = SpannedString.valueOf(this@toAnnotatedString) spannable.getSpans(0, spannable.length, Any::class.java).forEach { span -> val start = spannable.getSpanStart(span) val end = spannable.getSpanEnd(span) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt index 6d861894a6..bc1de30826 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/StableCharSequence.kt @@ -16,11 +16,11 @@ import io.element.android.libraries.core.extensions.orEmpty @Stable class StableCharSequence(initialText: CharSequence = "") { - private var value by mutableStateOf(SpannableString(initialText)) + private var value by mutableStateOf(SpannableString.valueOf(initialText)) private var needsDisplaying by mutableStateOf(false) fun update(newText: CharSequence?, needsDisplaying: Boolean) { - value = SpannableString(newText.orEmpty()) + value = SpannableString.valueOf(newText.orEmpty()) this.needsDisplaying = needsDisplaying } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt index 8ee7696e2b..14f56f3bbb 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.textcomposer.model import android.os.Parcelable import android.text.Spannable -import android.text.SpannableString import android.text.SpannableStringBuilder import android.text.Spanned import androidx.compose.runtime.Composable @@ -118,8 +117,7 @@ class MarkdownTextEditorState( } fun getMentions(): List { - val text = SpannableString(text.value()) - val mentionSpans = text.getMentionSpans() + val mentionSpans = text.value().getMentionSpans() return mentionSpans.mapNotNull { mentionSpan -> when (mentionSpan.type) { is MentionType.User -> IntentionalMention.User(mentionSpan.type.userId) From b0beb0dfc9a2fd71bbcc418826b5ad7b2d0c88e6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 7 Apr 2025 11:32:35 +0200 Subject: [PATCH 43/54] Use colors from compound for badges (#4545) * Use badge color from Compound and remove temporary aliases * Use color instead of a copy of it. * Update screenshots --------- Co-authored-by: ElementBot --- app/src/main/res/values/colors.xml | 4 +- .../atomic/atoms/MatrixBadgeAtom.kt | 16 ++-- .../designsystem/components/Badge.kt | 8 +- .../designsystem/theme/ColorAliases.kt | 79 ++++--------------- ...teaccount_CreateAccountView_Night_1_en.png | 4 +- ...ures.logout.impl_LogoutView_Night_2_en.png | 4 +- ....event_TimelineItemPollView_Night_0_en.png | 4 +- ....event_TimelineItemPollView_Night_1_en.png | 4 +- ....event_TimelineItemPollView_Night_2_en.png | 4 +- ....event_TimelineItemPollView_Night_3_en.png | 4 +- ...impl.timeline_TimelineView_Night_11_en.png | 4 +- ...werViewDisclosedNotSelected_Night_0_en.png | 4 +- ...AnswerViewDisclosedSelected_Night_0_en.png | 4 +- ...PollAnswerViewEndedSelected_Night_0_en.png | 4 +- ...rViewEndedWinnerNotSelected_Night_0_en.png | 4 +- ...swerViewEndedWinnerSelected_Night_0_en.png | 4 +- ...rViewUndisclosedNotSelected_Night_0_en.png | 4 +- ...lContentViewCreatorEditable_Night_0_en.png | 2 +- ...PollContentViewCreatorEnded_Night_0_en.png | 4 +- ...tent_PollContentViewCreator_Night_0_en.png | 4 +- ...nt_PollContentViewDisclosed_Night_0_en.png | 4 +- ...ontent_PollContentViewEnded_Night_0_en.png | 4 +- ..._PollContentViewUndisclosed_Night_0_en.png | 4 +- ...mpl.history_PollHistoryView_Night_0_en.png | 4 +- ...mpl.history_PollHistoryView_Night_1_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_0_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_10_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_11_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_12_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_13_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_14_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_15_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_16_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_17_en.png | 4 +- ...roomdetails.impl_RoomDetailsDark_18_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_1_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_2_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_3_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_4_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_5_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_6_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_7_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_8_en.png | 4 +- ....roomdetails.impl_RoomDetailsDark_9_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_0_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_10_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_11_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_12_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_13_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_14_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_15_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_16_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_17_en.png | 4 +- ...res.roomdetails.impl_RoomDetails_18_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_1_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_2_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_3_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_4_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_5_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_6_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_7_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_8_en.png | 4 +- ...ures.roomdetails.impl_RoomDetails_9_en.png | 4 +- ...ared_UserProfileHeaderSection_Day_0_en.png | 4 +- ...ed_UserProfileHeaderSection_Night_0_en.png | 4 +- ...rofile.shared_UserProfileView_Day_2_en.png | 4 +- ...file.shared_UserProfileView_Night_2_en.png | 4 +- ...mic.atoms_MatrixBadgeAtomInfo_Day_0_en.png | 4 +- ...c.atoms_MatrixBadgeAtomInfo_Night_0_en.png | 4 +- ...atoms_MatrixBadgeAtomPositive_Day_0_en.png | 4 +- ...oms_MatrixBadgeAtomPositive_Night_0_en.png | 4 +- ...designsystem.components_Badge_Day_0_en.png | 4 +- ...signsystem.components_Badge_Night_0_en.png | 4 +- ...gnsystem.theme_ColorAliases_Night_0_en.png | 4 +- 74 files changed, 164 insertions(+), 221 deletions(-) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 884ae0ea71..f61fb33868 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,8 +5,8 @@ ~ Please see LICENSE files in the repository root for full details. --> - + #FF101317 - + #FFFFFFFF diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/MatrixBadgeAtom.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/MatrixBadgeAtom.kt index 4da9f58f69..51507064eb 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/MatrixBadgeAtom.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/atoms/MatrixBadgeAtom.kt @@ -14,14 +14,10 @@ import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.libraries.designsystem.components.Badge import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.badgeInfoBackgroundColor -import io.element.android.libraries.designsystem.theme.badgeInfoContentColor import io.element.android.libraries.designsystem.theme.badgeNegativeBackgroundColor import io.element.android.libraries.designsystem.theme.badgeNegativeContentColor import io.element.android.libraries.designsystem.theme.badgeNeutralBackgroundColor import io.element.android.libraries.designsystem.theme.badgeNeutralContentColor -import io.element.android.libraries.designsystem.theme.badgePositiveBackgroundColor -import io.element.android.libraries.designsystem.theme.badgePositiveContentColor object MatrixBadgeAtom { data class MatrixBadgeData( @@ -42,22 +38,22 @@ object MatrixBadgeAtom { data: MatrixBadgeData, ) { val backgroundColor = when (data.type) { - Type.Positive -> ElementTheme.colors.badgePositiveBackgroundColor + Type.Positive -> ElementTheme.colors.bgBadgeAccent Type.Neutral -> ElementTheme.colors.badgeNeutralBackgroundColor Type.Negative -> ElementTheme.colors.badgeNegativeBackgroundColor - Type.Info -> ElementTheme.colors.badgeInfoBackgroundColor + Type.Info -> ElementTheme.colors.bgBadgeInfo } val textColor = when (data.type) { - Type.Positive -> ElementTheme.colors.badgePositiveContentColor + Type.Positive -> ElementTheme.colors.textBadgeAccent Type.Neutral -> ElementTheme.colors.badgeNeutralContentColor Type.Negative -> ElementTheme.colors.badgeNegativeContentColor - Type.Info -> ElementTheme.colors.badgeInfoContentColor + Type.Info -> ElementTheme.colors.textBadgeInfo } val iconColor = when (data.type) { - Type.Positive -> ElementTheme.colors.iconSuccessPrimary + Type.Positive -> ElementTheme.colors.textBadgeAccent Type.Neutral -> ElementTheme.colors.iconSecondary Type.Negative -> ElementTheme.colors.iconCriticalPrimary - Type.Info -> ElementTheme.colors.iconInfoPrimary + Type.Info -> ElementTheme.colors.textBadgeInfo } Badge( text = data.text, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Badge.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Badge.kt index d49e0a41e0..5e2160a01f 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Badge.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/Badge.kt @@ -25,8 +25,6 @@ import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.badgePositiveBackgroundColor -import io.element.android.libraries.designsystem.theme.badgePositiveContentColor import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Surface import io.element.android.libraries.designsystem.theme.components.Text @@ -76,9 +74,9 @@ internal fun BadgePreview() { Badge( text = "Trusted", icon = CompoundIcons.Verified(), - backgroundColor = ElementTheme.colors.badgePositiveBackgroundColor, - textColor = ElementTheme.colors.badgePositiveContentColor, - iconColor = ElementTheme.colors.iconSuccessPrimary, + backgroundColor = ElementTheme.colors.bgBadgeAccent, + textColor = ElementTheme.colors.textBadgeAccent, + iconColor = ElementTheme.colors.textBadgeAccent, ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorAliases.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorAliases.kt index 503acdb6a4..5576a56519 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorAliases.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/ColorAliases.kt @@ -38,77 +38,42 @@ val SemanticColors.placeholderBackground get() = bgSubtleSecondary // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.messageFromMeBackground - get() = if (isLight) { - // We want LightDesignTokens.colorGray400 - Color(0xFFE1E6EC) - } else { - // We want DarkDesignTokens.colorGray500 - Color(0xFF323539) - } + get() = if (isLight) LightColorTokens.colorGray400 else DarkColorTokens.colorGray500 // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.messageFromOtherBackground - get() = if (isLight) { - // We want LightDesignTokens.colorGray300 - Color(0xFFF0F2F5) - } else { - // We want DarkDesignTokens.colorGray400 - Color(0xFF26282D) - } + get() = if (isLight) LightColorTokens.colorGray300 else DarkColorTokens.colorGray400 // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.progressIndicatorTrackColor - get() = if (isLight) { - // We want LightDesignTokens.colorAlphaGray500 - Color(0x33052448) - } else { - // We want DarkDesignTokens.colorAlphaGray500 - Color(0x25F4F7FA) - } + get() = if (isLight) LightColorTokens.colorAlphaGray500 else DarkColorTokens.colorAlphaGray500 // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.iconSuccessPrimaryBackground - get() = if (isLight) { - // We want LightDesignTokens.colorGreen300 - Color(0xffe3f7ed) - } else { - // We want DarkDesignTokens.colorGreen300 - Color(0xff002513) - } + get() = if (isLight) LightColorTokens.colorGreen300 else DarkColorTokens.colorGreen300 // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.bgSubtleTertiary - get() = if (isLight) { - // We want LightDesignTokens.colorGray100 - Color(0xfffbfcfd) - } else { - // We want DarkDesignTokens.colorGray100 - Color(0xff14171b) - } + get() = if (isLight) LightColorTokens.colorGray100 else DarkColorTokens.colorGray100 // Temporary color, which is not in the token right now val SemanticColors.temporaryColorBgSpecial get() = if (isLight) Color(0xFFE4E8F0) else Color(0xFF3A4048) // This color is not present in Semantic color, so put hard-coded value for now +@OptIn(CoreColorToken::class) val SemanticColors.pinDigitBg - get() = if (isLight) { - // We want LightDesignTokens.colorGray300 - Color(0xFFF0F2F5) - } else { - // We want DarkDesignTokens.colorGray400 - Color(0xFF26282D) - } + get() = if (isLight) LightColorTokens.colorGray300 else DarkColorTokens.colorGray400 +@OptIn(CoreColorToken::class) val SemanticColors.currentUserMentionPillText - get() = if (isLight) { - // We want LightDesignTokens.colorGreen1100 - Color(0xff005c45) - } else { - // We want DarkDesignTokens.colorGreen1100 - Color(0xff1fc090) - } + get() = if (isLight) LightColorTokens.colorGreen1100 else DarkColorTokens.colorGreen1100 val SemanticColors.currentUserMentionPillBackground get() = if (isLight) { @@ -141,14 +106,6 @@ val SemanticColors.highlightedMessageBackgroundColor // Badge colors -@OptIn(CoreColorToken::class) -val SemanticColors.badgePositiveBackgroundColor - get() = if (isLight) LightColorTokens.colorAlphaGreen300 else DarkColorTokens.colorAlphaGreen300 - -@OptIn(CoreColorToken::class) -val SemanticColors.badgePositiveContentColor - get() = if (isLight) LightColorTokens.colorGreen1100 else DarkColorTokens.colorGreen1100 - @OptIn(CoreColorToken::class) val SemanticColors.badgeNeutralBackgroundColor get() = if (isLight) LightColorTokens.colorAlphaGray300 else DarkColorTokens.colorAlphaGray300 @@ -165,14 +122,6 @@ val SemanticColors.badgeNegativeBackgroundColor val SemanticColors.badgeNegativeContentColor get() = if (isLight) LightColorTokens.colorRed1100 else DarkColorTokens.colorRed1100 -@OptIn(CoreColorToken::class) -val SemanticColors.badgeInfoBackgroundColor - get() = if (isLight) LightColorTokens.colorAlphaBlue300 else DarkColorTokens.colorAlphaBlue300 - -@OptIn(CoreColorToken::class) -val SemanticColors.badgeInfoContentColor - get() = if (isLight) LightColorTokens.colorBlue1100 else DarkColorTokens.colorBlue1100 - @OptIn(CoreColorToken::class) val SemanticColors.pinnedMessageBannerIndicator get() = if (isLight) LightColorTokens.colorAlphaGray600 else DarkColorTokens.colorAlphaGray600 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_1_en.png index ecd3fa6368..635e8b6f9b 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.screens.createaccount_CreateAccountView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:705f53f174aeaa0173b618adbb718d86b7d1a25767aa2801866a154f365acf9a -size 13361 +oid sha256:e7818e342a7550aa0c0a2375c84e7911ccea44371366e07efe17a5fdca688216 +size 13360 diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_2_en.png index 00205ae669..33ced2e5b0 100644 --- a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fac219396f825debaace2abd3ca00cae6fc7452b4b8f5c5c7e43568a2ded41d -size 26494 +oid sha256:e184ee4a9687e98d24c6563319c9266cb5609db66d1fcbcdb02e9fca11504bee +size 26501 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en.png index dc5707034c..78d8d677b0 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e10183cfe96bd34339c29a1709a16b9a38f72235d484415b9f1c172d4456c798 -size 45704 +oid sha256:3e778a1a3590c849db350d2d801e600555fe46286d132833ae8243aa7cbaa70e +size 45696 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en.png index 8bc1bf8e42..4e58b49638 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ce5b2231af4331fb8d2d6b99778245b8d2972239a35fbdce6c35d7d6e53c1cd -size 47896 +oid sha256:dbf96dcc3c3e9b9cb6dc3300ebe00017d898515a07df85c0ac26a5cc452cab86 +size 47887 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en.png index a3f97b45e5..dda4ae9673 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09d954a08c15111f23012f37e9e8c7e2978660fb21c9bb4e1bb765086203725c -size 47898 +oid sha256:aeabb30b46e100487def9cedff50627d18a73371705dec42941db1bf9bfda5ec +size 47890 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en.png index 572a3dcc1f..df6dbe9e87 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline.components.event_TimelineItemPollView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa163abb68b57d6e123e5e58aacb1df194ded7f84ad56f813275d4ecd16ce131 -size 47979 +oid sha256:234750e0c8d262c520cea6b25866df2b23399643efb6ff9ab2c68e1edda4630c +size 47971 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_11_en.png index 2099de329d..c0fd6ef9db 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.timeline_TimelineView_Night_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c042981fb21b1bfd7e7f4f7857f1a84dce3e42e827f665e8d4faa7f1abec547 -size 86337 +oid sha256:09b245abbbc0164df2f2d6e88e5e02c66267ba50dfa20134241cb4df6d7c770e +size 86341 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en.png index ce00de709c..6e151cc94b 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedNotSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d96dff442cb398bdfbb12b597e368076d6ae1f0a45f0a581512d674d2affcf9 -size 21284 +oid sha256:6e7fb2de909096d9c88197d2c1360bf1998d7ea092b11719f3549722ed342c9d +size 21281 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en.png index 43c4d31bce..7b716ea37c 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewDisclosedSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a118fd6de3fec202a39728e2861272eabb72222f112dd4eac90733e2d265e51 -size 20983 +oid sha256:ce73d101556c4cd97b46a4ba720c03f0310bce96c5b88fc3544ad6e9efb00e10 +size 20982 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en.png index 34bfda7b5a..43a95660f5 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:43a6f9ce99a7f261697b566f1d6876a01803661648d0e7493169aae851bf8af0 -size 21048 +oid sha256:ceecaeaa2193d68066bc54f19d4c33087496d377fce3bc4b38241659adf201dc +size 21046 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en.png index 0f53144064..dab60b94f1 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerNotSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb84f215f779043c280cdef6af4976cc45483b2b1bb58d4da644c638dbb4cf1a -size 21258 +oid sha256:c37af705d8f682cd5278eb0e345b4c66a7d1dfd147b1f840f200707737e356bb +size 21253 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en.png index f63e5a99f6..f5cd59819b 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewEndedWinnerSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b74dfae753ea2d0e130ebac6dcd437db38f167a595e4d744ed6e9f5a11c0436 -size 21139 +oid sha256:b4456064b641b3accbb6779a52cfba3cb2b9281755b7102ecdf66ac137b57049 +size 21135 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en.png index 580fc18b9f..2112ce692e 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollAnswerViewUndisclosedNotSelected_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:843cae615c1bba130f6a233b1872ec4eac93bbab796679f0f4925569b2a4f0bd -size 19348 +oid sha256:224eb389d42d4f504f027d853570dcde1049c0dcdc58dfcbc42a12587de36311 +size 19352 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en.png index d9fa2df078..9b9aa5a28f 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEditable_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc3ce0418bf1ca1f0ee70cd972b2bda2ee1a4d30e3b8402311776e39906d7d10 +oid sha256:8c4fa353f7b79f1e38b41aad2611a5264770cd56e986119b13112d6f5fe32421 size 47968 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en.png index 829f4dec4b..7418f3b4c4 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreatorEnded_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27dc8abf63b27ab118dd866eba21d18f7a6d81c6bfa61ceea10805f62d84e42b -size 45892 +oid sha256:ce9b952da4924907bc245c96166fe4c4e14babe91accf6678de30b6be68de8c4 +size 45889 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Night_0_en.png index a3f97b45e5..dda4ae9673 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewCreator_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09d954a08c15111f23012f37e9e8c7e2978660fb21c9bb4e1bb765086203725c -size 47898 +oid sha256:aeabb30b46e100487def9cedff50627d18a73371705dec42941db1bf9bfda5ec +size 47890 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en.png index dc5707034c..78d8d677b0 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewDisclosed_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e10183cfe96bd34339c29a1709a16b9a38f72235d484415b9f1c172d4456c798 -size 45704 +oid sha256:3e778a1a3590c849db350d2d801e600555fe46286d132833ae8243aa7cbaa70e +size 45696 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Night_0_en.png index 829f4dec4b..7418f3b4c4 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewEnded_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27dc8abf63b27ab118dd866eba21d18f7a6d81c6bfa61ceea10805f62d84e42b -size 45892 +oid sha256:ce9b952da4924907bc245c96166fe4c4e14babe91accf6678de30b6be68de8c4 +size 45889 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en.png index 63f6c4696d..6111183d26 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.api.pollcontent_PollContentViewUndisclosed_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0fa1f068afa5135a9c91abd89ce843e5467fa40fe10347432b853b97050afac7 -size 43255 +oid sha256:4fb88c95ef66f80a6646b894d2bf17bbd25136e2ee17abb91b9278c97635bb6f +size 43253 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_0_en.png index 1baad77d32..3e71995267 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a04877f742eb3d0f4b19e8eec981910252c15abfa4cb35afb3abbee416b18d8 -size 55383 +oid sha256:057910d2a37c535b0f70929d6440150e0c2ca04978e61cbcf0ae160c364bdc48 +size 55377 diff --git a/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_1_en.png index cbc653bb77..accd1dffcd 100644 --- a/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.poll.impl.history_PollHistoryView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad165e733d9fe9b74c5f3fe3d91a2162a0c7e972390b683b025460843b2d94d7 -size 59167 +oid sha256:0fb361c628d6c279bef5841befb5ce860d1be7b1776465ffac5e0151ede10e90 +size 59162 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png index 7c27035fe3..40b2f015f3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb68bc3937183f353a87f193a34847676977cb2a366cc03fcede0e059e6f8f4f -size 42658 +oid sha256:43dd94d40380a5a667aee02d3ee002c137a68a7d10ba9d3ffe09015b505a6d44 +size 42594 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png index 32c18698c2..9b16567953 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a863908ebec818d64c4b8511667b192e09094c09cbfa6dd372538c831520bb2 -size 41295 +oid sha256:c6b667d57c0cf7147a8b713535738487f88ace48d7deb9ba338f7e26eea0b643 +size 41233 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png index aaa4e9efe3..7159edfbf0 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7bb6ca06a5faef9a2c1dd6a648488da2d6acc2c102d5abe5ea6c8ec2bb235b66 -size 40172 +oid sha256:96bda111da271692bb83a6049a65ab62ee706282806026882757b63c12a5629f +size 40143 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png index 8c38559e8e..772b2f04a5 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05b48264399d0ae93be25361ff04cb01b9d9dc7168da72d266bbc58a781428cf -size 43445 +oid sha256:bcb0a066e02486d81040d7a1089ae2e4baf20e483e661fb513579494769f1461 +size 43381 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png index 7694db2dda..ffa68efd51 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21df4f150516a7113b890f3da79c96b141245384dd6b74af7376ebb5bb9054cb -size 41555 +oid sha256:4d3ea582081948929abb7229b5d2e7fd87c631963340a506072bcc7be4843e49 +size 41493 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png index 02d3026a57..6cbc436046 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b4cb0e83e6e48d650350be4338a99eb9f82fede2829a8dc5d71d8f8cc2ecd66 -size 42366 +oid sha256:32b57de3b1128a3a17ddc1cff7c96d708f4ac4ef9efa6a6d3978b9cfda4b6a0b +size 42301 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 5fb86225c0..3818826788 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:5b0075df788b47714d60f58aa5de5db2cf5beda4777bf54cd48769b4df6f5ae2 -size 42944 +oid sha256:8201ab8637db30a33b16a1336705f1777fff946832e9f10ac45987eaa44a20b4 +size 42884 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png index 82512cde13..fd91a368d0 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f28b78dccc4eace6d8aeb897f1eef1d00fe9e73dddf4ae4c62305f7063add2d5 -size 41868 +oid sha256:92e08b157e0b3091e136160cdb399926cf96ba48bf1de40ea84e57c5f9f2f0f7 +size 41804 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png index fbfb4d1992..4e7871b133 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ba55e0d3271f81d8bcbd6f0a956f50c8e4ed082b23f565357c0c732f2bd7395 -size 38805 +oid sha256:60571dc08867db9ad2f6528e95cc65df0eb57b9840bf8e96e6e1fbd802ad3a26 +size 38778 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png index f15bd024a4..fcb6f77177 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:659e2f942ff1ba3aee9e63ec329aac2386e755c04324c3865dae892f67f5ade5 -size 38762 +oid sha256:69d9aaf46305802861df8be0341abd73068376893bfd7aef43d7b8f3251350dd +size 38735 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 b0b1fcbc5b..943d018b45 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:a51d96a3e531140c918de3bef60b437dfd9e8f7a4cdd162b87077d96babafda9 -size 32438 +oid sha256:59c09f612209f3550e3b3a7488347b139422c821a3c47723e44d18b8d2d59593 +size 32366 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png index d8bb680572..506a73e964 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c89d28aeacb8cf19e76ebdc784176152991ad2a2067df4adbc4e40afa315e821 -size 34581 +oid sha256:aa41d32745e495b9b9bb18ee9aa089674ddb5263da29feeb7362fea4e17f8617 +size 34524 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png index 05b8c466fd..2c8e4e9e81 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:91265422162edaf2b2e6c8474db8a94aec7db30427d67a7adcf7e9a30966d7f1 -size 41805 +oid sha256:a334db0766538dbfbfda746b84af6e81b0cc3beee927c45d0e72368d25167ade +size 41722 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png index 6527c3f104..fd822b4361 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5029ca41d5043331cb59741433c5f9232105ee5d1f65d8f6aa2570e842ece45 -size 40644 +oid sha256:dbd0ba4fc6221bf4048bc355fbb7ec2bd4059c8baa8596ebec5f83388e1f8e8a +size 40592 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png index 726667ed5b..1130fa23f4 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f1a69af9c184578a355345037ec34016c4b4ab26a2719bfaffafa1027365a678 -size 38453 +oid sha256:7c823d58a58b9adbd3894c4d53754439da3533d72639f7181764ac1bad449bf5 +size 38417 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png index 18bd760421..adf133ac79 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e9ebe7fe8e19809489798a996f888642159200486b129cd34aa333685e0ef56 -size 41854 +oid sha256:3444349d7e07f7da2db5cd71b7334447a5d218445d626fdf8793ef224d07b731 +size 41821 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png index 19c68e34aa..1dfa6994cc 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b1be379fac2defa3ba11db1c9ab9d0847c8245b3820648315d41e3013c0dd9d -size 42642 +oid sha256:47431534c2a84619c74fae1b2c4acda8c7d3310ca31e002ad55b89b5c54ca7ec +size 42567 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png index 8f5791e8ec..e563f552b8 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1127cde21edf3ebb251dda7ddf54a4c83ecdd0e4f7fa17c84743cbc6b35d4000 -size 41570 +oid sha256:47f8d0b06c9aaea4ef5c45bb38614c174870ab0c2f22dc03e54c24f1f5ba2952 +size 41507 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png index 53677bc33c..cb57d31474 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2013a7c30aac9d4921bf2187b3a9d1d1329842fbee6a020d98a4cd82a9e0c5a8 -size 41619 +oid sha256:3d50b32ab9b3fd6d7145a04676fb491c8ce31af655c54b9a369c3a946036ae12 +size 41552 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png index 24ec736f13..8008eab180 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7b8b61cdbe5ec0657f4f1852d8e371a5ab4db49e30574ef701165cd52a654fa -size 43511 +oid sha256:5054000865a6eeed597c898c75cfdbf5dc1d0c8b49d301fac9dcd636e17f16b2 +size 43450 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png index 94e96eb7c5..92299d3e4d 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d282617bd3bb1db22842c23036e1637ae18bf66d135caca644f045dbfd2f9c8f -size 42048 +oid sha256:e86fbb58436a583df74d60e410e625865036d908d792eb9fb1fd506c875c3067 +size 41995 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png index 042e601b4c..bfb8b3ff0b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9fe7ba5dc42a45576b884be75b39698087d8634769fc5c522c4f94b318d60699 -size 41016 +oid sha256:64cd6474f7fdca9dec9d4a0c9c82089e1445c49835afaf1d33469f325174098c +size 41000 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png index dc6a9fc76c..b767349cd8 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5db679b0fdb9fe6b7ca92ba6feec63c56075f2526d61648e323a3b96671cf34a -size 43895 +oid sha256:202cd1054d5177cc8e7fa0ce00c3338cbed0c7a1eda693589bd3d537bfa6a044 +size 43838 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png index 9051449570..5d1f0c5cc5 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3e12057777bc343396543ea3fca1352ddd33e65ec7baaa1c672a040b86b27a20 -size 42391 +oid sha256:0369d8fda8eea52848f520751a295fccaf9d7bf9d9e65161f5e1d10df03347d0 +size 42321 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png index ec56f8f188..6a5be52a90 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:304074b1f15761b9a0fc2529d61ca56505e5c59d9a74ea3cea6db6dd5416783f -size 43205 +oid sha256:b67e13e498cc4b0709d74faa02f78692e717f3274c2f28ba77450819c2ddebb1 +size 43140 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png index 70b89260c6..181ad2bfa3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2dad2ff77ed440ab76deb90b2aa1287767f7078b4f0fd9b721d78661b891786e -size 43813 +oid sha256:f2925c650f266a5b39ec77489e2658a70761e8332cc759e418cf733b86572914 +size 43755 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png index f07e6d441c..ace46aa6ee 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d19188df2e2b6a66be9b76edcada4dce831d8b0fb5b3e76ac2185723ccc6ec34 -size 42730 +oid sha256:433e2d955156019aa6ef906418fcb23ed26f7c357ca91b526f941a8fdd9c7161 +size 42664 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png index 1d721d5c87..e60ef55c42 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a67e601d851d95f73fe7f6165b91703e87f6c1f71fc6c1d9c614d46ee35623ee -size 39515 +oid sha256:cabfc7c5bf6f9b612e933cad211b8261b236cd981488cfa081e0226940626339 +size 39499 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png index 552e6b96c8..2e3298b2ff 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:533db6c347770157ef484b53218885a04f12f732775a94da8b915d700d356256 -size 39399 +oid sha256:cf96db08ac0382185c34863b38603fe55eb3aab691fa3c42b6d73e4167ce8f82 +size 39383 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 bedda822e9..84360a0028 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:c301ada1436b647871471716eb3bde5afe63b3c8375fecf065821b24b8d2bfdb -size 33118 +oid sha256:43c94f11c9275eca4386cb5771d62808e7de53d4fe8f0923f73474bd97e933c8 +size 33100 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png index f505e9178d..05eabd23a4 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:568a9220be25d55e801611ff7e2be2b9cb5fb4da8018d280d4c9173526e2a6bf -size 35331 +oid sha256:fe5aade89a3afa13f2d9e0eea8a94c133e1e50f91a35d28d42a92c4e4d3baaf0 +size 35285 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png index bc995c30a9..af030ef6ef 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:122c7b535de6136219b6864bc72db43d093c10ac2991b7427a5fa1fd8a27c7ae -size 42543 +oid sha256:9eef5ef526837a00762336f1df6d900500b7956dc70d95b4619f80c4f158b0ee +size 42459 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png index 39d29992e4..ad155142c2 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01e1ffd408352b307274768528095cacb54863b2ec54f6ca912b51c030acc90a -size 41481 +oid sha256:f038763501f54386b7751684d0aa1402320e9d913bb231cb422da06a02fce300 +size 41427 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png index a51874b64b..1bdd63796d 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e99e06f6281be006fb12e0a56e7523c8144256562464474cb2aa918f6576d636 -size 39091 +oid sha256:d254f940a7ef821c2a3a731e60fd23bccb61827bd00859d97139b9f93a5c8c3b +size 39075 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png index 47301b8b4f..ef1dcb04b0 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89b759add6d46fed97f7acae8f8366bb247632090b9520e50b6dde9f8fd64921 -size 42681 +oid sha256:4277e9d618880a9d3be5d672ba7b7081af99f36f34f4678bb160b98cac9fefcf +size 42630 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png index 80d9ff59fb..0c8f52659d 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61057d174a52244f032b823dc38dd2752e0ca07ae45acc185a49bc3f1808509f -size 43588 +oid sha256:cc543c855b813e48a2e0140555ab9d34ca3c30aa5f9afdc56bafdaae4eb2b476 +size 43529 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png index 789f9dbadf..cb41bda82b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5476f3210bbd833b5f0b836e5942cb78fec6055c1cc43b35625397cc34973306 -size 42481 +oid sha256:a1370d804e4f71194ce4a07f449fbe1c21bb6e3f4de7d42f92ff17b653d1f554 +size 42409 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png index d4a9658f5a..8418b73ae1 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aaa0c1addbc1df1fcbd03f961a4da66a2f1663f4aa2ff35ad65165eb3befee9a -size 42462 +oid sha256:0cab876c15147e3745112d63154d8097b685cc5d4abb76c2b6600f9334bd449f +size 42395 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png index 9d2dfee0e8..0912c0fa57 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab8f38a4b9b0be906a39296f253286aeb03b6976d9918c0bc5867d5cb2b64f7d -size 15253 +oid sha256:f4fdb9a9167e7088c7568b067ba2e02c5d5d953c5868f864c0c83c1bed485138 +size 15184 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png index dcec11f43b..ed871cda83 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:586a299c444ceefb9d84336d8520fa083cbfb23c6c535425455deb780d6e454f -size 15277 +oid sha256:28bb644a494d60947b4d66b859ce0cc678f31f93fee4f88aa28cb8e8d17dafd1 +size 15231 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png index 9145f70274..a78a122bd4 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b89fd42f16b90496e182f78e25254ebcd963b1eff706d3e821b869277fd5a51c -size 24189 +oid sha256:204a2f11595cbd3fe467d6ced7d1999139d87f88bafe0fe80becba7deafcab3c +size 24127 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png index c19cd50098..c4fe92d160 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:064b9d499901d7780672159784a84c8674e4cac8562c26e3b883bf504fb57102 -size 23295 +oid sha256:3f0dbe3e9ded805f3cd4356abb5ce4c892a57cfdeff35a450607c493294f9080 +size 23261 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en.png index 616e4d902c..66519c4bf9 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b75d304c696b92209bfe9c3564165833dd74b13ad78a33ab5d875aee94b1ed0f -size 7044 +oid sha256:19afe8458f9146aa4256e3ede12fc673e8605782db5522760ede31f1f81ddd9f +size 6969 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en.png index faac7f9106..876f53004f 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomInfo_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85aabf48fd622093cf07a3810b8267ddc373a6f002a225d1f7a0e785566ece51 -size 7054 +oid sha256:38a0beda65338d6486ab5e6c8afeea1b8871bce396d900a184769d9a2da495cd +size 7026 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en.png index 768278c042..fa5bc467ae 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a022f780c01ca2c2f7ce2b9990c7347c336c9f5cd40bfe1e8afb597c571f6948 -size 6081 +oid sha256:6df8ee3c6c8303c0b4626af59578ad9c3e432162c8adee963b15deffd2d8223e +size 6035 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en.png index 6e7f0f12f4..331f7b3066 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.atomic.atoms_MatrixBadgeAtomPositive_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a4c2a60758bb05c4c152adc7a88027bc636aef0dfbd1731b7643b1aa81cf2d8b -size 5885 +oid sha256:a2e9aca91645e401a475e5eddc64f958cd24964cb2d87dd820c299646d5457c4 +size 5847 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Day_0_en.png index 768278c042..fa5bc467ae 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a022f780c01ca2c2f7ce2b9990c7347c336c9f5cd40bfe1e8afb597c571f6948 -size 6081 +oid sha256:6df8ee3c6c8303c0b4626af59578ad9c3e432162c8adee963b15deffd2d8223e +size 6035 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Night_0_en.png index 6e7f0f12f4..331f7b3066 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.components_Badge_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a4c2a60758bb05c4c152adc7a88027bc636aef0dfbd1731b7643b1aa81cf2d8b -size 5885 +oid sha256:a2e9aca91645e401a475e5eddc64f958cd24964cb2d87dd820c299646d5457c4 +size 5847 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Night_0_en.png index e85bdfdf43..73f665c052 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme_ColorAliases_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b8b117d33e87b6f1dfb545429f6949f5362c42be957bbae7e987db5202e1b2f2 -size 66324 +oid sha256:eaf36257945e77a17ce3412e5d52a45eff114fb0b53e8158186ba2192aef5f71 +size 66325 From b3c0332eacb5ea30093dca1e972d615301d0362e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 7 Apr 2025 11:48:40 +0200 Subject: [PATCH 44/54] Update app icon (#4534) * Update application icon. * Update icon preview code. * Update screenshots * Also update the icon on fastlane config. --------- Co-authored-by: ElementBot --- .../src/main/ic_launcher-playstore.png | Bin 269176 -> 100546 bytes .../android/appicon/element/IconPreview.kt | 31 +++++++++++------- .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 4054 -> 2558 bytes .../mipmap-hdpi/ic_launcher_background.webp | Bin 10400 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 8282 -> 6494 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 5626 -> 4112 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 2642 -> 1612 bytes .../mipmap-mdpi/ic_launcher_background.webp | Bin 4836 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 4780 -> 3482 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 3312 -> 2590 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 6118 -> 3700 bytes .../mipmap-xhdpi/ic_launcher_background.webp | Bin 19754 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 12914 -> 10464 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 8254 -> 6018 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 10474 -> 6746 bytes .../mipmap-xxhdpi/ic_launcher_background.webp | Bin 46592 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 26546 -> 19448 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 14150 -> 10530 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 16062 -> 10000 bytes .../ic_launcher_background.webp | Bin 86550 -> 0 bytes .../ic_launcher_foreground.webp | Bin 46002 -> 31880 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 22012 -> 15374 bytes .../res/drawable/ic_launcher_background.xml | 12 +++++-- .../metadata/android/en-US/images/icon.png | Bin 226280 -> 100546 bytes .../images/appicon.element_Icon_en.png | 4 +-- .../images/appicon.element_RoundIcon_en.png | 4 +-- 26 files changed, 33 insertions(+), 18 deletions(-) delete mode 100644 appicon/element/src/main/res/mipmap-hdpi/ic_launcher_background.webp delete mode 100644 appicon/element/src/main/res/mipmap-mdpi/ic_launcher_background.webp delete mode 100644 appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_background.webp delete mode 100644 appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp delete mode 100644 appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp diff --git a/appicon/element/src/main/ic_launcher-playstore.png b/appicon/element/src/main/ic_launcher-playstore.png index 62af9cf4b27ba2ec8414b7ed803d22f84fa8d0ba..325bf570f53b0caef40c45fcf76951a119e25e64 100644 GIT binary patch literal 100546 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

ijLs)m_DcJO|5H0w@aCe?rNdNDh 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 I|B<(-00C9Lga7~l diff --git a/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_background.webp b/appicon/element/src/main/res/mipmap-hdpi/ic_launcher_background.webp deleted file mode 100644 index f051ae3c8182f854f9f54015821d7140788a3f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10400 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 E1bts>^Z)<= literal 8282 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 z z1EBx{5{n&aC;XsDkjty_plkIJ;@@_8h6Mgk!c;oP AApigX diff --git a/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_background.webp b/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_background.webp deleted file mode 100644 index 27d9d1db19f2da70780ef99ddae8213ad6d34bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4836 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 KA#fWzH1Yw8p&!Tq diff --git a/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp index f411c1016c845e57cb912385a1764bf51b6f8258..ac2361f8b03215a39d73004bce34eb913c71c3d5 100644 GIT binary patch literal 3482 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 I7!KbW0D60ub^rhX literal 4780 zcmV;d5>xF`Nk&Gb5&!^KMM6+kP&iDO5&!@%Yrq;1O)zLANl|)dA7{_MV0usx(f8~qp?&2!UEG)H6h)pX~znVGFM?>S%0%*@Oz^X?LmDUVsQP8KuEI%Z~A zhQXfcHfB~(J+7YTCzfKEBz7|qttpm9DfIIwh0Wls$>Vi4fOTK1j80)JWx)RcCW5;p zE)cm)2}lvNclK@uYjqywY!a{aCb8BeAoC4H%&@`eD27Wx_F4TrN0Y#z#eO@2LzCM2 z2cQhjZ@ZPrn0jQ%QUprjEKz%cwG@KX^aK$9VINOo^>z?4vil!J|y;}KMdC@KIZKv4)& zzbL`NXc##r44vyEZ=Mly+$4w`lHHyC(MceLw3Z@V3N}dJXA2bopvb~(ESt@KHVXA9 zA`pVMt|W3Ca{@qj=K(XIRYd;RT1#-P_GDjcpTPvm8nUU3P08Z3@X+?U&h8{)K8GX@ zs6f|5IzHRVDJ@yZD3R8Bigty$9r{dBRx~Ke)yE&xf&EIdsLcQJFW2k?@bK;fI)NO= z7SMT2Ejp~Do+v^j_hi@z%QL+&>;l#I@;N*6r*8JNiGHuKCI1bHwj!$|R^oP_s(z^U zno<4^7@lvdkI&o17I}8prH4j~QVV7P820XC(2dwmb{_zAyeyrL5(4O8p_dtOz58q3 zd~dUM`JTAssa}O-vU#g}IcqHu}l#een|DDAPeK4@^ z>DQktUwcnLiu|zxH~`7mI#Kw3dbCAs5zdY%clU$y;mktLo`ZN;0gSbDBqo~IY>oLn zex1#Ztu3%xGw=MGH`E%#h z|GRIpcE7Ml)2@IJz~9?rfzb{?fg#u}jnL!M|Gd&KdyL~ygqeXQ4E15+c`cS&wfA0W zYfrdZFas?BKu#lId$a&x);w9Y!?eFMq5gN`Xaj=4l3Kz<)5`iQdSSBvjWsg>g&zY2 zrxk!7x9p+_07pYhEBzuB5KX|i`Li1U<>OFV>lY0H08+aE+r!~hX#YDVC=dY^gAP`m zBvuy^@p#F{QgRI5Dxtb3NyYFOK%^8}{*D4U3)>%tjkDRTp*pKq6rcPO-!+pD1t4|9-J?%a2hY2QiQWm|fRBxoPL8 zX7K1chzLLl07?K*de^w@ZmYDMsA5zGm9TZ%!E*Y^!D?+F0tE_H0IC20yEoJ?n!gu2 zFgw?u+!mYe5D5!`*L8iJ9faf)+aQ>E&w-~OxGT#yW+d&{5Q*$w{kZV_Z?!gqo+^4R zGwPdBuP_T#mfl2b4lN8enM?p+Wj%q?VOU|!9KXVT2i|PcqqPuHR=^ks$?gLH=?krU zoquS!s41tgOprH%EVkL&0~Uj$)vEQnpxSx}qKz3*=v*qT1bNFQ%Wk~uu=PO${b|!J zAaPV`8hkl$4ljb>D-b|{wXff$3%p%@qcAb#k0BvqyC=l2)A}QqMHj+~wu;gVS&<_& zD6BQmtCu)Ddn~#Fz}v;^+=d;4WKZ-Pkj%`>-+1^o)!$5rVkYzGbx`ju)i%&LW;mZ+bica;N)hgP_u=alwSJK@$V{ESIA@DA+L&NAj>QI!`Ni$oV`jgYFyU0U zZnwp3Sk^v$?Sig{2hZBhBPCZmh3xF7Dd&%(F zwT@o5+L$6DHK87oa40Ve^FayH>PLx2M~R1@nT3(6`iL+FT@?x`cKXKVR4pIpwD-~n zJ77@^fe)RkzjOqE?-o9ZQyfglf&TCkv6h2sa*yDB_~>-n|7;jN22Rb5nG~56muc56 z?loWO%nv63juL=yk`UMtnK7-l7gI}+*BW9m5W829YQ^wTy8Mr7Q_&hXIcW|qt>MO) z$Vmx+gR*!*<72PA_Hxs{s6!wf0-z)1r;EkCrfp4(7Q_L71DK8?vSo|1Ldg~s3Bnhh z+{1Uss6lL}F;hSU%*Nm+Y>F$Nyt?Ayt5c5%fRY2i$2y-y*G;GW4)jDkr*wX|1lV=c zt~+UGR01RAM-?G75<@c+rdJng7bXcZ`=Rhcr=V=}f~Ob}q4lO?bE`K20h%O0x~KA0 zEJlf3?TcEpGv^eXDB1UQdg9W!yfpxWuXZonmMvu((m-_pCpx_Ua(*X~3>0VouVY%tr_b=i9A zq2HjzDv(q_p#TVIetGc9L!~7=N3mjel%vsZQX7lzO+!ftC=lXr#!vcc?XoY9f@6;v zDkZbl<%CEHA3;(Tv9R7qz|yD7)Pvi8V@&>LviykANkWRmtQ~^dp@uEv+XWMH_)E^r z0C1R-8Vz@>vgrN@(!<)gI<3^(%YNHs+-m=qfX>5gKRBPa9JS_KSPrG>*6CK7V@?c! zOrX&!?GE=dG=7ZZ(7$NLU;{{N-gf$!=9J^@=QkAMSIEzxidc<-?41sA$z;O;y;eD4 zT>BFl`zFl*Q3FR4h=?{UYTy2mG&m5Of2So69rJ02;~SzH6!N93GRdIo4RHEEoYdJi z4-%3_GsF!-N+}zQ1{)-`L<9w3BHTd)JDd#BO6}oC7e)`N-vD42U3npiP1!tQCYWN> zhy-DBd}p*8!{lf;l12mDBSWLbHI11;cx*?;x`fsEVW`m%4#yt0h36SV#yqh3|597x zA4%{Msaovnoey@-T8L&R4CmU1_aZTvi;E^emy1{?79u->SaZu4Clpb_WNKrz;`g_| z7-I}&ZM+0W58Npe<6E?mG5LIcm9Fg@=x>0R00&B5!oc*_qdV7+*o+?>uiZc1!VpkS zv_{RXSp2GO`TH>0g6hqVonFFkQPlQ;a}NIO__O2B#wS)u+w*y23@Q8=jt$`+?6A%A zc2q;`D3@&d{9U_{&cOlq-_tv9ary#TU7P+Uk1j58dGOtDK7aTq@QWo6#6lq2N6LTi zTc_FRq2YMi!vS#cIO2%c21~??ALaj-|6ew%cEKXJQ~q8B5!~}gMsZ-VP4nsu_bfCa zG9Ag%ZDrSAc+nkvV>TYv=CknRrdUh|w#{+V>fy_{N-73w2m?UQL6YA^pIVea5Jezm z>)$=6%z*cWOdF90(E3v+>2-E}X@Ur{hk!n8y876u+55_BGEl`f-noaj)7tDeFjFwj zI$@d8r|Z*cQGg*?hwuPSH9e43V2ccS$|K;8TaJ$|mY5ij!!nr$PoOg9uPb((nmw*6 zEhdfI8lpH{fAdS)%h!MT`0bLfpA>h9dlva-42I-j==M%QazShh<7GTWo?KSyM zhw*sTw8@Tqd;n!AZMV}b0Egmq}XS=OELnSWZGUGNe_C6Hh{!u~^yq-79FkJ5$V_9c5FVC3xmEG#d3K~0|Npo@LkGdo zFU<)B$I!xXQy2hU&7NSNxmYZgYFr+@;lOA@dDGsd#BOn~;lqamP!Z&q3K#(=&w#!E zb)SXD;G*kl%Se@E;e^D>(j@AFgSG3r#bPl^AO+Qi8DWf*+Bbs!$hbOGkf$5?kwWSU zHcHy6Om#dZbSRAzM4m(~1>pJ2 zj8G3EVXH*#6tp{oTx<|f0vshcP$K^9IG!B`;y^X@mX1}Dx=1*{to^jBm4Y0IY%>N< zHec)qHL%6IJ(1yt0GS3OGbL(!6Js`n!W9zamxlI)h5!b$fSe3}^9XhrT?WRE8VJqr_5?sg zCO?FL1OtiB|A_@rjS)R^BFJ6|_fCVG#}SpjaIV2f>QI0}0Y?1ShgXy&eS3DtMy7e~ z^xqQv+8{bNixm0zP>V#tuZF$6#W6XayD%^1X}@Q7fP0V&R;+D_bHvLqD2b#*bW-avZ|qnB9z@b^mPV=KJ6i)S4LY8_qfj>1y4XSEG!EGfNBIW$+;x(ZV-sF zL_{7*hGI8DaJ2@*`Za+8q@YeD0Vx7DMyUopkz`B&XzvC*kFsQlVBir2v{zbd%>WZv zwLt&@SVL!t8bK~r8rI_($`EC}8K4cp!iwAp^NB2f_cpJ0%>x&8N|n5|JT8WQd6H Gn6Lrm`ufWN diff --git a/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 5380a9e86174c94e0a8a25dc55e1c434db6d8c4e..3cd52b2182f60118c999a6e112e6a2f9368b9812 100644 GIT binary patch literal 2590 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 AmH+?% literal 3312 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 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher.webp index b31de82585477655c739f672fca5007ef456677c..527b23880ad055355eb090f984d78cb49c720815 100644 GIT binary patch literal 3700 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 S{zdP$J&VBum^i3$=@I}iJqbGi literal 6118 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 diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_background.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_background.webp deleted file mode 100644 index 4dbc6db06628700b9c37d152664356391afb3c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19754 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 J-$krb!vRUVJc|GT diff --git a/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/appicon/element/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp index 5e6654b50c3769f13ce90a6a0a4a070873e66141..f8c5c5f218aa78397390b774cf878ca8ba5fcab0 100644 GIT binary patch literal 10464 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 WON*Jv{gZeQte&m#{|f(~igo~&e(Dqe literal 12914 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

c{zJT*3HcQc!JVC6-k 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 diff --git a/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp b/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp deleted file mode 100644 index b635d5cbb567e87a807086c15ed36d916e80ac85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46592 zcmWh!cQhN`7muKnuhEKCTL)F6ORb2Yb`fforl_{|76h?cqbSko1Fx7kO|N2V0T`<5| z<2RRHdS5bey2+e-dg`w-40sldKgYmCr{Dfj*xY?~_e!Twu%%G*A9zqK{m-X2-{T?7SKGK2!6+i}=WEwab%q#=VY3psu5& zf-X?~(^o+7#<$Os8M+=gyOQoRGjW&fYynk2;xt@-$3I+*X7A51lxspw3&37JI8PcH zVY0aHcqcZ9XYg%)9&M(r@F?y7}j8 zjs)8E`Vhz1k4@eY`~SVzHc(-IHr=${a*KCBf*`pY1(XH??nWnCa=19f2%pcAysjq% zInU%2D)M}HeiO7e!X83I1_3&bQsC4D{{0ixOWp_0jfcuC0* z($eh5u1-nw>MXZ_y&p^@ZK|XJyZ~N1F3A}7UBKNZ@9m-!nWNdyN&;9W5&_Z7+=&iO z9Dr}i-14sfM^Zq>#047EQm?ZOn5#~ z#dzNR_Bok-RvwuqiNJ|2EStk=a zFT_N%061R0e4#8Y00qF3K<8LxnJxo>Op?;Tb1}M-0GGOCDDS`hUcT3p2Ds>h!N_Pp zVj>&M&L)rru(ELO-`Fhx&nwm@q zE)OhQLZLw3M0VRQrk8-C*X-;p07K|P;A03^Gf0DRbd4c#spr5B~%jv5=) z2s~w%eheJ!pybq?80DIEoYvGH8xePN>&+452;SVEJ*Q)WJd3WjiJF#m~6A#!e@Hd0*G>PT~ za?f!Bmq8zyzZ*vgynk8vZ3QTGOY6y{XH0jTk6C^;crUJBi2ACW-ef9xI#IKFgDLXi zOq0U*rreN^r?=-6LLZ+0sXfj-k z7JmBE@m^=tVfb%}wY0D*t!atuNrzPk6xV>0XPr|9QDw}LOCqSMxoGM2eHubN)Aj5y(Vy-(r{5~6lcFk5y z!lBHC2X-1JquRka-@A$2RNvY8mBaQ?$p~|pA0?-u@%`fW zRL2&V{U@JqVX15txl13{!Ec|)d`#J26*WI^zUws_Y>xkV>x#u&63M)yUA+E{Ql{~Q zZRq`8;d=u)snmNp$t*+ix3OELWxsG-1pq-gILKWopJT$o+Nh&>9=Jg<5=<4qVb#{D zRg4^&Q}wC&PfTJJ(ZNzf+^s1|$a$^JOoKOv7b5Ex2W=Nx&N zHaht*j|NN|k@yUy2P6>bACCi8QbfWpx1WQWs%9&-eRarPJ6z7JRGyVQ|Dt$5A-eF0 zy-aj@SZgsGD5*)~4NrmNT=YRYG~voVd9PNo6%RMR@{FdRS=^#YsC@n!EZ=Y zYFC)zZk?SQCI9+@DN9#1enW9Ru+OhwY%vS~dW&?l-|67B(9X94Rbp|M)qLkom%RCV z8cFBx%q>4^!)bwM?K2IwZLaMOH*Rj~?7k~)Y0a;6#_RjG4v$Rlz7#+Q?LDVm+yNsF zzrW7CHM@NqC_Fyib0#5@%(Z65}uTN-mNPbuFZ!flI zks^YM1w1!9-sZI7KjCgImLYwgwck9{DZjKW^D@sh?iJDN7cyeaT?~Q5ZB8c-K!U-C;PLZoeGM*Rw+V8>j+Y{r=oT76*!*=*i^}IAiT!Q6JvrLr3N=L_G_G!kYHxY;tqGR7T zWct$Usk7gn?xftn;bl^9Krq)TwBAk;>)ZuJS8f}Kj!#@r)_#9uz@A)naOKVI4~Fjg z7B3G@h>Pjdp>Ku+PSC#0P&P|y zz~T7W&AQOrz&A@0$R|5Lztk7vKm7b>#@i27 z9|QZ=g@!L_V2j~KKYcbIM#>cEUpD$<5q&AF>5x2+lsfXOm52HTu4JG7iN4uGk1|s)m(LzuX?eZ ztUfCzQ9aRHfp;mb%wkhGw#~J~rBkaC6kjO1ao`I!vVE@N_NNH%*d}gX^6ytuv&k8| z_`3F%HvQ1`2z~FKT(E(V#Lt%ZuV2W-qmi?VLU&u=e|j4HEq$FI@2Zo^w1S=UI0Gjr zaZ6B~Ds= zT3)Z`6mz8kvVm7$hs6gmb9=w01O|C`7OuV45x;cfO4<#Vdqb@f_jVd5CMgsCJLnJm z*UMgB!3K{#aDMvvJe=d}z@3*_;b%4?S%_+HY2Q>7?rHc3IXAN>al~rf&7_osUvRnw zm@y2oZR3YMWq#G!VU{{k&=u?}VqC_Vgzw82P=(35L1p)%&ApdY>0A-w0(X8Zd=V4f z&iRmYUG4nGCssR|7mKlxuZ5@e`g%BeFCF%1fqPx5uQ*Z@brXDICKsQH4maLKs!{ab zd?bd#f@L0fKJAS8WDzV`fpI+0WkE2nlPo&Xl&!2Us*ybHWwSH~F#@hbYdi8TxkU|^ zHa#>8o!mPuPz4Ob6>mEmEM0L8{jcBEK;)6bbkF)DTwJYBvwES$I zeE4WZ%L&v_?OH`#yY|vRM!!))4fC8anR7oKoR+w$F`p0{dHU@mTIq`79=6hf1v|qj z2D5rwyi>Br%05r`j9JgDuOKU1s8+-jK2x`%nOf8CUAuk4DNdqB*jNY*0ZeZpE~8Ea zl^#=-rpaNju+BKP=cmtHJO!H;>GWe9a@t{X&ZP(3zgnH9dd(wt{@b7LXyGdlt|`1E zftfwPeJ;G_6A$@xc`csH%F@bmZY@^brTm=Qn{*s+Vux77S#D2%_*R&yl5e7_uZQC# zG09$dB4~h!D%fp?PBjsALogUSD_<;*6MM>P+6Ohp}W=h)Qw(@ zsSQh|I}yPOW=`M24K;tCaotruNx76ccy=kkG!_krMaQ|ey?oN9N@-E+QlnJ(lR$-K zFgw*v-OS_7y7o*D1i?%)YR>!~b~(320`hZ6Lg*$9MPob5&# zB&Fli(Du-TGIVTO*J;cpCRJUwcdlY_rXv#J@H#EjZ$|UU8#cL1ACH?a-O%XeyY6Y= zKX#Y@&C;Wn)0QWyKS}q1DTLEa&t8m**^VKiGPpeNXq4s~OEF^E%JP}5oDHFY$dz%; z6}ZM^NE(H@i;qbu%}3YcFvRtG@q`4;_RV?+w!SHu5frdYIy5N6-81S=TL-<)fgT~g z+u1<@%9h2vLH!pQA?C*({{3;vZ(;r76>6i} zDr}Iuu~f>DH!YxXI?E}&vxvH#T*z%drMnb!MD|G$4{TkfoGcxJR#v4LN~8{4mP+Fq zZwH1*&pU>wamD~;hy1y!!Z<20ScpWNNZQ}>VdmCPt~A-{x77Wubgg7xOhNkkWwopu z>Z>WwB-8WNj+~YyV!Rkc$MgFXE4nTUzAa=WwoR!f!%paQDZZls^q9@TSFencHsHw1lR4- zWo-;RXKQz6dJ*ilW}&$zD=RFyY#oFMxw?^8oL$4VKB7}x<3KhH5foOAFZdQG8t&f; zyqEac?xveGNl+8I`Y5(L<*b$!*Lt^TU{ha&u~xX^{a2&=%Up>H92y*FfBXPg;Ts@! zZ?eUI4Ifuk)ReB)gpK6>L`hiDdKjW;6k3Ms)HwMLDste#Br$53xiLJaq^pMSYIMO= z8cZ-YPQb}lqH{hduQ@@}Dyv)Wo<@6j@OZy0=sh$Qe(NdzVrl%1l~SVd-+|SJ=xRKL zZC{@GPT5Jyrc0XcTC4kVz>)0MexA~U1KnNM5Su?!`mDT4$l5Z3n{UAQYjgfbpe-Ba zY>LmO-0?b}8lAf8llgg-!lsF(uT$~CZl0P7%cG!%X%DTjixIKY-Qt1?+;KZB33Ah# zs$jaUuTrrcP?WD7JlJ@QyO$UPaPJI1m%3!vaa~Z;NFc0|?XrB}60}gsCyiRavZJ}g z$K($?UTe7c=daLG=jBbX323ipeh zcor#$rUkl4G-ke`K)}A>ffDy2{3gvJfD{_N-Dgdk*I)nJ8ggpeSvm70#&5Sv=Na2W z_HTZWHpO(1YCwS8_k7v=4lSoK(#UT-{|rZnO9jB{3f@DK+pTu-DKErvn- zj(}rao0lKB@KxtBO}GF$F_5FOgF*-2^jNS*K2<_V%SwQk7q4$syw?jm7UWnrfCiw zogy1C_D=rlPzHEfoCmc_7?ZLVwUgi)Tetz`RE_O+VYu6#YVOX(e1XKdbh?BM`ePYW z_k z4qd4>jc6k*N0M4mL~6YQwhrkwQ;E&*(^c`*N-RS=jA1QOcHe|3=xXGRuAQ;8^P zy)?z3Xy90*CjAaW$wCv9I@x^V#Dn`UOUz{`ucV-wD}k27dgW50N&Q{ZH*I5qZ}=CW zKK*tdehN;PMMv@N^p{VqSspwD6x5|vO!Q2RZtks?uG+h2nT|W~kHdE{mb=5vImAQc zZr(pvYD_+Z?fTk5=dx=e(&d6enhO?56zU5qAk2;S{NQ_A0$cYGV``c>6~x>+tsbP( zwVlG-$@Ac0;4U`x(P)!fnD^(x#|jc|>3ed6bW=SBcEvh*U%W5e+|keRywzP+KbcjK z#^1SY3AxrUJZ?c&Wdu<+aH{J~c1!6Qm~i%IKJU}!yF2I+P|kyE3OvLrADkF ze_6VuaAR2Jh06TCeARI08fL4`dS%paZ?t2GuTK@n^5Zr$KQievfntPjd{ihSp!UN7 zaVk?=s1E*3%zhv`A)#9H1V#h+DJA0LZ*$Hk_ii8`_*fg#gCcMI7gP zV2*clP@&TriI3xCig2nKCGJqT6K_MS?5m?Q8Y~0-ZsDpqc~c)5oB8HRuA**I2k%H;#^Ra*TCW!O z+EL62zD*`iwX~WeSAM2j4yfPM|1_7wue#F1S^>Db>LeEW#2m-}t3T?O)PHQhElj>hkt2nJlo^FaQ z(Bp5E6{bd<_KPMwZpJ|zJ^iaAG^rg|-sC>64o(vX=9o{?i?Rl#NT>(iy-M%%=ijb@ z>CrPTf~L9L2FS6$tiYkf^Zb0dXH{K}T3|A_sJT~!^Ruw1iEPZ`JZ2lD|81S2RWF$VUI2gw zW0=X&O0pp>g(iMR`(n$mZAGUTCUV32GCGHnTjrP1u76EX!aV-hw&-36t}<`Vym?@u zgb)}hj^H4?YFs;9_i3RNItChfZiHn84>jWk6h+G6kk^QHDU^W-DxjK432GVAvK_K^C zWp#x&ChMF-m#&Hv53gE=o^Xw|7k@M8$ahfS_Zik1q=a=yoNfcfI*S=sWhYee_|oz7 z9Ho^()LzO`*9T9e!jOu0(|H-*ddjN#Q}8NtC*-)c$eNd(qYTJdV$Bqn%bDKxyMIm< zKymld!c$y*&c8@O+P$MWI`H+`Q@a3RQ4FPTKvxs|fy1HLRn!ub`;v&70&3MrXbnsTG=h zsQw}f9H0qI0z^iimFsJ@R(iUUdQRVdJN;`B_h8`M{0i?oMX72> zqYFwu-lG45$3Zc-6XFv5GD4;NY&bL6o_~GQR|8J~jig1Z{3Yz>4bzZh85rJl?)upC zjfhYz&Q%xw2OXDXZ8P<#)mPZoW!6vQX2YRmv6{EZXm^=pKfT9BK-gwUcw;cjrkHj8 ztHA3Joe6zCCTuJAHEN&nO?=r}^i?S#nQ73f+gYpfKwbj3w(6tB#194ZjiQ)VTgfTr=Twkqv-+wv2aTer$xPR>4QjUIl{l-1q$+%AXLz>t36RjkBRt z-JMiw-RsDz^lt?YtAPN_5bLkstf&l`zWJfQhgGp9c|xM*3vNC~zU9xG@;6J}&P-3U z!fO0izzaFYqnGV|(Jy+uQ~nmC+Y}YTLk^rfx~>RIy?%Y~UZ~?MVHhs_(U9Y3ndK{kOqbZWLNwsRxT;nY(wb#y~Ofac} z!}B7~knofmU7<2JBaOlPV#nV8C*IqWw#_4i4=3N()GrX?kk7@oP8}y4qTpmoa>)O9tX>Pm9wfd>R@%oZ9b>r89Upeoz3N_Cf(AwELiTO&LWmLk? z51V;qJ^pd3xj%{&C{vcr=Ry9^La z(hf)qG>+$%gNBueMn-%?FKP*amkoX_0*z$z5H=BqZhd0#Y@ z(b~0ecqUh7qe(}j8}U<1y~k4tr>1IBDMI;J`PxJrPGxJgo zA2?J!1TQY6gPFpy^siJfeI0U20Tx%J9%cF*`#zs$v@b=6g#|>8H1hugdGVH##n5Iu z;^7%=xD!2IWza^G$?Qa4Q29TD6qm>Une!}yW3>F97y7SDm!(Y~xh~E}|NQw)w`{<3 z1EH30oWBM@T=POci=xeLCQ3T|gDGpp(l*p?E=xQzDsl%Br6Sr`txiVhV#aDlcHGK< z!NaRa=`q9zcPf+4%TTLk`1`RFFSAPLAP2mK?E*CB2Sg%KaM#25}e36kZGaW~B0 zI&n<8c(E_i@5$1a+163etBi~l=$_9(DR%6k-m9E6uYhXhmdcK2rq7-QnK`$vnfU7= z0Juhpx#rk81ju01{OL=3LCIPUf$UQJ;`~m*?z87Z_vg#m6XQDL-D#tzQ71k3qirxl z4Xg;|?){|&_o|vw@uXgrjdrt*wCwboY3IGg-zZS|9Jed?!~x8v}=ti=b>=l;u}0Lrv~-E2(+4eeTdAwP5b zn{fnoRk0_GqEL?rT!gk6%8zQF7-!})8NUst3?wdBv%)$r%c{5@$_%0I%#&(}1WoV} zSgRQCQ5^}IZJjwO{f=W-AEV^|{Hu4rzE{Z4sQ`yBK^z>)-fwifx@Ar<71d|oonFi9 zJa?0=p;a*bOQ_HM;Wzr7OxmL}fQ`;WaSpt55GD@-cq%d5i%@FVLI4$5IBYsROcemGkhLo0!Nm;JH@L)t7t+&@zmf}nP4?Xf$8QLuht)J+DqxR97 zb$I6+=r?3Gg<|}>3sCLMrvE&7#254%aBE;K6>iPCycub>jOrhwJ6DAk2lmz|c=LGQ zVFzQlm+hd%*9UbF`#qb6lJF9dPB~a!DXUdzLo)v!N)bv4+-jV9{Ci^yqi|bf>cqC2mPd@w z>2Y7R07yoZd`1iiYQ>K|`WJ4vvkGz8nF*Hhuxay5pe#47!0CdA_NpGYvrgglTX$cy z-SzTgI=5dpsXs{WeWiyX66XelW|IoH>jTlWn$1#tcX(R&<^pbudKEnDx4*6b0bi_I zGw@Qy&dC8xM2;FLgMb^+Bg~t4iXzV@1fT7{i`<-nr`|}J*gPSB3XZ2#=IyjUwlWoF zF1}jjLHe9QTTu{)V*(KGX>f;*+6;Bvsjw(>S@hfHh)1b$%@^v@nD}jW>9Ynw(BmP4 zPDYHYRJI$fD=u~4ntnzV^UlNmIMU3Q1%LAM>{HD`9tC}q zss9>kfMq_@^*Evm;m!%c9&GP0c2L=d#ruzk+IG}di1mD_74I)wAdh&a$6}M5GDB78 z5sizGG77~u#60AerNNIEmQH==?I(XGZm~;8|NTj3($fpAjM#Z}U=t&F=V65B#)X~- z$9Ct8MR2(N2UbR_4{`|JG0awM!5CJDPYKoI6Bp-43GgPuzMG8eeblZDoDhWJu){jS z{v%NIy9%D&NWEe23=`*6_yf%~(b_1)(Rnj;23)k`fI+b!*-bqO3lJxZwqO!)-2u#T zyfrTJC|iQVp#HGt1~xUea9%cg`VT$NNZG4s|0P1%Nzf912+4xjmqW-c*&FycK`s!6NM}sBa6u+1;F|1I5W&-3V{nRyeLdR2PL$ zt)aSDIr+=3?X_`K9hje~lR1X9oblt^HwHZltp1UapeH3F|BSmL42+2ik*I*QN6Q2w zwG`SV@^D#&Odixyd>}ds>d6cWcsJIg3)i7BYjSr2Ibu#;zavJhLvTmn%_cmP8L1Ld ztL^R0m9~fCzmigx>;K=w4>yyfkwyHI; zwtK;|@LDF(kiTv6OuFZ2@o9nffcWy~S0z21Sqo46tX>Rr(N(A&+O4^+pP`cz*y zK#JyD#^j6d=ELgkp1=7N|8V>$b*<+Dqu3|k5800!i~@J<`zKntY zs{rpEZ~MYJIeiy^tR+Ouf$K%+5oplYO`MahCjOvT&N6#)`VQm!)MMmQ4u14kps^Re zW+ey`C1|SIpqc0WEzGA8jP0Dpq*TUj2ZfZIZUB9Fe2d0nDigkT7I0i86;NuFVWP4H zOXPRrn95qpf*>ThWf(bOeS+6EfUmul%pwOFCVM11AHS+=3dCPSa9_-Mx?gKJ+ z>x|LK@9v2AS6%ovE`A>-%WmA4034()$@9z-%HM<|bL(*$uuxq^$)n4xEIHwx-@FiI zqE35fbVIcw;IqxST=RU&gVbX-Fp@64gh^ng^A)Rx+)$%Oa&)9ktGw$gG|&tkN|D>H zv#MOpVkIz>&o!j4XwL>=G>_!V71I>=VG4fiAiW3Omei_vDxp;=sv)bzN?)nW=6QvP zu}wbpLEd1Xl&@>rW3C%=M1>yQHS$EcYu0(!)eGFdXD=55e&+eDpS!5b3bVjnX!7@Z zy%@IITT$Wb6zH(sr%!*%IfWQd6WizZ~#`(U0%Uo_1+^tRv#tLA)5HY7VN@@T&( z&q8ldy=b1k@4L3y)6(5eJ>9T&pCpngo)-#xzi?y@C&yRhlp7Q)d?NW6U@NbJ;P)9T z_!0jbcW$~z4ut13OD15gpr2e-75lY$L%rvimDr!xGs&GMHz_&b6vRl6N8>6IYmM!d&Z&y*fKZanC_^>0G{ zkFZC-y!`{HISB~gf_NwEBSvhr(wt}| zN54&7LUK{N-=|nzyL6wA55b4>P??q1_c2b*at%YMQ3Rs0d4#B7KM~)Z7K~c?sfE`3 z28q9MCJNqc{A;nkafDoGRbzpjEX6C5vr4a4SKoW#9-?PDJ^?^%bKgZZ*hAfmgPnAI zuEAFGy#5x)YCdr~UglByAaH>t>AF$@y6}l8D+X6r|07d7z2!JBU%P#$d!_l_v?l2eROcXBMl*@ltj=R z+rW-X!6F~(5^_EHwls|%5zO+A`ONY%K|!bQSVKYKJud|Fv_8

GA2@yrOJA=j2|%La6;(4CV73<~(jO9kGCG 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 XtN3$912~w^`8-zOr#RFOHDt8_j*wy` diff --git a/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp index 9aebd17d213e8bc5351c45d6d166aa8edfad4074..bb401bcb377aec48a159b33de69fd0a77b5f0e81 100644 GIT binary patch literal 19448 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

P{=BoG5v7KaF-F^8IF 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 diff --git a/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/appicon/element/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index af59382417679652fe19ded730dba4962fab00b3..a6b0547ed07f39e969c6d1b508a334987e5a6de4 100644 GIT binary patch literal 10530 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 literal 14150 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 diff --git a/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index 97afc844cb5908ad7d1759e3d92ebb29dcdf0f30..359e3921a11eafaa9803ae03c12c8f02eb78b83b 100644 GIT binary patch literal 10000 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 z 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 F`vFW&FYy2X diff --git a/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/appicon/element/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp index 92e763d12f9d073991393089c7c93eb48663acb5..f0f9a633249527f3b3dc4882399e12738b423524 100644 GIT binary patch literal 31880 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 T{vY=Lu>XhsKkWZu{}0a-nX7-8 literal 46002 zcmV)8K*qmPNk&Ghvj6~BMM6+kP&iDUvj6}uufb~&jlhy*wQg1CZ~`Kr{V&)KN^&3H z5&fS4{5$J?X7-9F9Jq@bm0j;7sV2M-1qUICqs(-mTSBb0$XCV8fOYRhM$AYOX@fBqR?=E@B7Usa3k4v6?Ft?$Un4WqBZQ-?p+U;LEA`Ixj&t0|03;2KnOwKHLa#KG{om| z?ARy-)HFpQOkNY`*{=wZzO<4b&f`4a@B3GNt*`T3{Gdv53+g;q>uquaeec6@Om#<9 zI=A?oVYN`)K!Zhhz9y&8QBi)@<$(R9{8lW`3xcZ17zSA0U(H!_{x@A%0WuX0AxwPF z^?u&E3h_ye(JCY(fWe>D;1&S;P}w8|a0d{=Ta8Gwk9`_CIwM2BqFNjWaN9P5ae(%p zS#n8zN5lk-e-wBKzy=aH_R2H*gNAm86(UkZNhA1}-_$(VgNOQ)(-q;Ny-g8B{j?RwShgS)??a?YuK4vn;Qdc$19BM48U6$53(OWT5q)f z&Lv6CvveZkBp(g4P43!Ga0M z<@LlA|625*(1AA6PIBlmRIt;y92ZNIK9S9DOBlAgxFp zDHnvYAjNUuDp!p#khaZo|C-+k;M4#AtVxoc$k}JCyLgvBwd?Ntm3qQB=Xs*;0^m(a zV1DM`4hlaWS^)^bgFvepGLIc7t}8(01_rs0I~asQ*K8i`wp$nu4-wkh4L413IF#g$ zDSO;}$@<#D(3C_W>`UPfNDRc~*iB(j2#nn1pk09hjwDHnq=;ISnE9*wSdj3TFCDmT z8%C1b-QBnM@spXhZQQdee~e=>O@N%*wx&s`Zsr;P#*l!5d4|8LG#nr3df|=R!VOU{ zJ1KPhX{VIqKScpHNx!wQM_OW@7%cta^FfNq&lg@u+X2c@GHYPlNRpyCm%%<=448jj zk4+$H%GiPk+F{&Ak|HnD-Q^!By-rIYX$$@Cux%SjlCt;o zU+>|p3E=De|8u#qr7f?f#3orHH+LP7-3?)z}UlH1k`qsQ`|rW3W*9T(Cj*J6%Y&+6wvW@(HIrL zfWeB!RH9qh1A~UltdUv+ot{fTV5vstF-;AW!o8JLU*rT zy_gO&Gcz-(6LQgPb7{=X%&^zt&AhOC&M}9Wz4->dFu848Mx~-=Ma6F)oMu*^N0tfz8N3AK39X1ueXoBV$S8RvVH_$$C3w;IQbU0ZR*K(M!W{%yra7cxjKACN|?eNfn z*3riWIyZ3SthjRrsokkMOfpQ@ktvo9*%9^(Bb;Rqw4r5d+wn-dUnF1jrEHs{>k&kq zYTLGZ3jdLgY#U)!P+va1@AFWoZQFL+thKLsSky{Hp8}E2RaiECchkD9?T{p$_X|g) z*|ssZjcen_`pP!S$SkG85#KifdZlf5ZAn(foNMj9Gk5ChQr%UJ)>>=07Veec0`QJj zElYG&R_fe)tvQUf_Ri*9!E4sh!aT=BgQc|w^9XC0GccFi=5XsE+dC23LaTN+8r+lU zQQnyW)}H7#Nwn6Q@{!hYSE9GO<9G?)M3WI%8amOQ)>>J3w7bzHfwe3m3h&Gdz}Bi= zOl4J|F*DJu46HO0tyK*dc>$POOEb+vQyGD^%pVP9qQ$-fqAX15VYYe7Ot;c4b69BA z9vWQLH_(`csa1Qq(BwjEt+m$j3Z$jlqujO-ZLSEc!aKINeKI85`bA_G+N0I8Y;*hA zwr!ttZ`*h0T%Ifc58JlAm)DxT#%@<-Muex@wq;wJBx#JX&-eXhDN0QsNJ#+v7zBU_ z5|N^?$Z%x8K+3c4o;@Miwr$#(_dfmDwyXKY6x06(uw>hLoB%x9{;RfSWywCa%k{du zOLT!Y(*k#QmvVbf9Y1wypRH@IV6A=XJhb3TaY?VW0f(L9Q0WLqJi`hZxHLek1+<`^ zXU904a7O2OW`sZ|!X~|PI)HYeQbzkCK8lZ!cp{#Nli+1>O>H;b z1K=zc#3Cx<8%A+Y?2U~|WEj;K4ruGe{v@EQi$pvD#1m9L$uY$f#32!fUUNVZQTs5e zeOSGSanEb1dhBAga1U+7eq&z|35X~72wp}hdGt4zWK1bpO2(n9i$uJui`ZU!U95B! zi?Q~-tfg4QqUJG^vZ2gk5ov$5W!D5ik) zyjN1m1--#c9==sG?IV*XGp~;i;kD(7%>adBs%X8j-mEuFq%6r&PC4awi>MuOk7nty zRZeDPY$ulv55ErQ_s#+H_QI8SZf_I_JiOo~Tn4n9YB|MQ+%mCDo(#}_bAOI|HYQiD zw-Y3@y>^r+?#-a0HMAzD=hs^}d%foT{v1B_KU@2t^(s%%a;oK3zR9zTLZUDVqY$Dn zsw|8`xNrf0H_qC>|MN>PZ{Ys)wIhcxk#e$oPA}r#%W|f~sy)J# zbdQaDCWf)<7OQ3^W6RO|ryiWU!(aQ4`zP!>A%f9PE}MJyazBvQ!L9|st_28}PznJp z^Yv&L2}(#V3pt+shacLX`LkcP&)vMd;hvBF!)r&kuC5`$Vx-c=JrZ|M8{FIWUJ?m_ z5_Pq8)b1N3T_Bx@00JVy2(kdrE&wDVcFtAmnVB_d+<(iMjUu}9yPERh1zK;oZk z?fcOH5oC$VyIgr&t}zOU5Pj3Blr=^D>wht%Ku8c0Kzb&=D5Q`ADZ!i-A-d}zN-29Bv;n;z?LP%^fTPDtq@a0_uj-k%R1&3SWZ66+M=0 zJTs+T3&Lk}=XE)RW39-;gI4wyNEaw3fl~75afk!Gw5iJ8#!YQ6J=)&>mr`lzcfAs% zNRuD2be@Df0H8t_uYbCg38B)<1&`Owe8 zldIQF3nfG$%#C)+B3>L^p11Rsi|c9cDNqDRmXb@l60oF;kF46WTrQW(YSk5QgRVrP zlEG98(&RIFTK_l$qHHb;bB~BJrXT_!0?4Kr0EodwTnRFS^jiGm^c;AtM+FHPB~Vaw z6pR0s$3mUd7(?J=t6|}z9+05`#X5L~*d<+{8%il%=?i@=j|g^fqly6n!<-cugv3+er7#6Z>s|k|&;f{N(6ita<;m5`jt2-) z!W@Kvherkq&4WcqQcA{2#J#GkVHkYu_7uueq4)e*ZF{1UQMd2IWiXvi=QH^LAc(RN zTN|U0NJbb%2LQz6VrF8Z2;C}jRRUOmM4&Tq{kbI2I)cBQQhM64ZJD|e-KMIbDB+*6 zpuBf)SjivOIQSl|eVKfwK#^3DWGNXZksGVkic%zqW~r_%taTq2)bwS0vmQ;g<~@Yc!dC00A%?-xI!Jj z;Mt7C^*2?z-f0enFIc9IvnPx!oEDmF;%WTbB(SD?wS&BJ(0b88e1rE_P zWbXa*`w8nX+z;Z$O%Cq~Qbs|^p4>k`LVY}U> z(v9{GGb<@)N|b78-jn{_uRYJHa-)cqcXUTWB*-IMMX-xpW*`^{CWe`_6|*r6BQ_k~ zW*vVPPg)+p78WW8A8UqZ%$cVjd0KwkPB<|ijWOk^#YxYjwOLeC@ z)G0XSU)-vw!aE6b1vDX(iC9l zA9Ljnjdir}Y|zMkLX6OV!&+g@BI#bV`-mBcu_C`B?N;P7d9(9d3JAd79huAUDf>!c zkL?7)656|Ycm)(!|7lK}^oVon)S);&ZU&BD_2g>hk{&?Au}m)X0FMmp;mjq(+Ei+v z}?dfUvj=obo#D)rBK?&IrtrihOwmmIIKg0M+%$l~`m98h>PksJ; zuf_lY!&tT1A7L3?JV5d6*(vuQlArZgJJ2-`D~C{2m5@Ip z_wI`D0=$+s^fQY5#bVm0H`(Zzb2`0SY zW?_QuKGJV1u(TP5!Si{;RxNeUFSU2i!2&4&^cj%|us_opFjM~l<_Q9IkomNNe7$o` zvs33d= zdvm@|Wn1t2hzB@p`~lz8`?aI3!F)jPi4In+6a-jCB^HTUp5ZZWjhMK({36NqqcTnE!)Mp8RDXzJ#(d8V`Y&fix-L_;H!0sLVLP_eDq)4Zubd0vTZO0){><9uHbMA>YFfbh$vahu5vV#C~ToFXjPN3uK8n(GqgA>g#x9 zb+ZQ`$&Mj{f=PumP}LztM*Fay-64L)GnliJ1m_w=F4urw5_I6V6)|09P$U!v1%U}b z&HUWV_i8=7UTa>R=ib{}Z&zavMtr7NHLF7 zJP|=7KsaAP;T zZtnnnpjOyV3Yu{k#efHe#Rn{%MIq><=SmfzRiXv6S(J!~p%O(H#j+7k=O0na>DLXc_tTi#$}+?39U=6Q=l|&`qz>=cK0`~pyqbfSg|TvcoKntdvX4|V zdoy0}6u{Q4rICv4KOp@Wi>mFr8>{fD1Svd@K0uWuJbFj~)#p9KVSl{(hyCT;-1X7A zIittj@gX-8!j^)Hkq3N*L<=S3gXRZ4Dw$9+f#?xrLeN1;fELYyIB@_GD@qZ0#0jDd zafUdbN(DbZ&hh=?D!v^~a862Pv8K~Mmvj5eGNb%+gRA^^-AkR$N~dSmM7Br(67bC(xba5+>(<+*yeJ_=Q~;-fagxtK(R#W}?U?$BtHx619tCgZ(@9Rg zW$QJ-i_Et|2)v#~c{L))CQOF8`zycu7W>r~pdi0@3F(o7^x!3cboX`)?X+#U*V<_x z`q$pxTfNUu^u1MM?Z%0Qii!?V0RsybWIRcAL%JuKK4fCijVyS+yl;U_6C6OZDfcUf zC_&^Dr-*A9nV3oomHPaeor)6ciFByb(p6e@zG`~?ezVi(v+G~w-2_5dmnlAt6Qa#xi-vZ~?h%vcY)L*AAJ=3Ep6r*<-r=C!R{$c?IqbI(BS71_jE z`U>0k(&u>)Z3W&2{WgP(goXy$a@UHqo#+DOs17W?j#p*&GjvmU&v3-=Gd#-o|39?* z7Eey{y~N4dM`RQ)K(`6eLC($fU(%67>UyiHTf_1gnp4K$;3?R?)3?NV#04OTFbi#$&sglUU&y83QGii_u zyEr7+;fa6Z*=HwN;q12@vY#O$0ERG*{pGG{F3#_89r&0D0_E;c~WclSqa)_9i5 zcx#K%yt-UktgR2hdgo z+E8o@5O>SDYQ{@qNJdnk5@fR>;>^yv9gZ2~=oaqG(d_Ehw58(!z;jUL(}8cknU4?K z43X7D6_QW&vBaY&OfA zY<_;TRq4@th7?fr_Vw>-UDc;PaPZ&#aBSqIgrx=R#eQ}EfA9ex=Av2O0)P=0*;&oE zbGALpiD)#Gz3fMY4Q0(I^lxcY|CB z)$A5SFpQ-pM$cpZE;hNhY{Hsnne2CV%zMC-cskoFB*kujhR zKo82rR1G6B)~$`x-%+1ljd|@H{pu{{RJVq0!N zll{B@>F!HBI)~ewGp+TpD)UE-UG>@P?U6O-{ssQ4Z{1a9R0gXR4F2BkMMp3*tN$-~ z-t2kXywg}cbH_n{N$;9ISfA{)3YxbT{L+G0 zR$>~8cM)fuY5iI&W!L7d-rO<3bH_Tse82}EsO~plen-s;!CyS?>q{_sbFBu7bf0l;DKUnUsy?(fde3Ev+&fj*ci=`?VVX)4NmF)H3p zCQ0md8P9`U1-mYR^d%C601g-g@YWvD2a*s&ti{)J+V-=xr{4TYe~iDIjbL=j(4Abw zS2Ap4534<{`KMWnaFvFRC?br2(NWNx<2v(r=4v;G_&NZqB*Hskg0DXX1%wbTiKv1s z1n}D0+qpBTU7PJ{oG0S&)CzWx+DDpvK___wW*r?gF{g=ZdO1w9$I3qgdt3#ts28V*D~bpaGzP{G^L?K=^iPhx z4hnXVRgV;~?O?-8fdP_E0iqmut>2jTp2yp7-^vTWt!7cn2XjOj7vu!RK>!aZ2lNEt zdqa9j3U3Mq93Ft6H^d>3M4h>;J=Fdi?5N8FG0xzB>3#OeRn@!b@Q}F;Jv;>Y0eVzc zdeBA>B~w}RDBrA7!`t}naci`rjt}nXzxL{kip-HDghv`~8{kb}OYrWz`4;+mdS2wE zKK_l5azNEqJ-(&P3&pBSn5>&AQ0YXGts?sFn5Ut`b)F2t!J|OnbNf6}40+ye8>@NH zpZe4UuQwIe)~e4wv51Lz?8bw)-eY}z5$v1Yw&;N#hix2h#~XUE+jtDl#a<_N8~sQ& z>-$Cz_U-*_$om!`ce>R7imU2WfIZ&##(w_n1AG1Vw8<1uqL(B{hssxYuz^P%&YsQ* zJ3vBsip)Irj%ssw=~#xLniD@L9gTFfc@1P>VF=o&FtWhMMm*P#VLCZPI2}L-xSRUb zo;dJq%n~fZPpYj-M>&rtLNoxBh|TUH$kt!6?Hh-SZwGI7*!FG5wr{(Oo89GY-|QRv zw%dr5_j43ULI{DPg&r0xira=e?)2`i>uL28=q5?5E9(%h8{?40pk#Rh_ELCQyS?Us z_I4}c9Iz~LKqKF>fq6kNfhZSo29>G8r=;@`;m%8uLtfP*ci5|YfZw<}dB8oDwJkj^ zsiX4ocb9-K0S^%ZJ>b4TosZxW-VQ(H{p;fC+iq2aK%=8C;?l>E>dMO%K4F5#)&2f; zu1)sp(DM>Nnz1jy_zDo7OJExcAW@FXXw3r~t`7VItb8yBL`GyOaps&pJjk9Mjb)&4 z1HmNj8B2h2OabM9M2*qf$>DWAVNOVeK{23(pj%-2U7Fq>lR)ME)f4O7-M`*_eFE-Z z*Y5kcaJP?z6Q(Rg1O-7iaI)vK{ybrgW^_H1w6S}^J`g@Tx!8oedte}OWrzY=9?;jC zzsHm`Z_s*Qmw`(}P->aXabGUrk zhg26XkEtynK*hx#R<~VcrDDCuqU6%Gl?z{c^iU$U!CDZ&0?(J~$;mEnB@E4J{a!iP zcW2z~fvi;S&qjiKtS=k{A$BDMeLpldc4WwHh%xwa-M5ZisPPK{Wb6`cy) zx$S-T1v_%6Fkx%g#56^raKi1;ymh1v4hR+6aPdLa@brp`l0~J09t%`lD@^SK3xzxi ziYecN0fn{deS4}vA!~|9L14cV2=fJBuyFv5ncU?(f%mx^yQb{;U@;ak?3SgjCUhH|S&cWUuyK|M9}upl4J($k3m$7j`i2eMhIQi4gXRdN;n%V_^>`2lx-{_t@0dKL=`S6p8y?Zy= zX4GdUGek71A8O+|3dd47SeJY`zW@LZ4M7SPEGeit*48U}pi)^eY8s0oZK$a9fW>+n zv;p9d1`8I$HvkwX{V>Z?S*3_5jRl}JGq4%mya89}`*n5>)6^Z%Q9wwgclVnkN7r&o zZ6)-p1k-f8!HInU1=X0JWteS@?M+;<#_htJa*Q+HYd2}_7OYGNnV@t6faQ~dgA`H+ zP@%_Kr42o-*SrPVphroiQlf$$*DWi$0TC>K1r(5-zjHl=MQ+?0PCP!H9d<8|w!vMz z4+fjV)*=RrLzwIT`~&v)_dj=G{r=gZlo%Caz|{`<^2)Ti|J+w+UkDN^@Nu^0O8<`C zN4UXlg9YLgDt|vVqNxe;fdM@h05ISqTfhPV9AVTnO3*z^!E#^I@Ai>ZnePp_$gX{JO|S!Vp?(ute&EQx3=`wmeyO} z^{Cu^t=RVMJ=@NgP5D2|+^N=3&@s z)umj@D7F@Z0t$+hMV6%ri-&?<^zySjVdgdJ3yDv2ZlyCiVL((H`Cen+g>(MuRX)x+ zC89u&SOFxHrx`4eX$b++mq_rl0CcE(n}Q&6=oTa~(ZjX&SaEd!%7d4dexM_JMeYv! z&VH2Mp@RGKpoboCU{jzgu7naGgT*;d^HvW|{JH5KKjyv<%|IJHzSeB32mSTV`y95z z;QYPSH^pkvepy-B_E?`r@rbaBO38@J)LZvH}rp<1#tU20v$!(hB*81MIz41P8=iYC} z(4)RI@O#V0@9)3z7tG+)D-D|i$cZ#C036V8m=u8Y?upM!V+iB%PUZI!yM!4f&}P$; zM4Z~wrvWbrsX&30a7u5=P2CiZ!_5ff*v;X%Rc1SxtE^jm8%Gf|!kdjv)TpD4d@_#P z?9pz~i_y1mX@vM9rPP2mLlaDxTbvQV(l~?k>|4ynkJ~h?x8>+TO?IB1jn$&Nae&e>=b=IZo;j1^Q5%u9rdc zU?EL#svfP*?6>!5gCTj zw01My(u2NDl3Jwj0>PM&hSb7LpfNQzm4(bPEqmcMtyi=gT6IhphsJHf-KGt3i?>Fa znWC0}VAn7lKp(c@cR=8~^I~u_Q&R}Z?0p;{nR4r^8e+@0Z)ug=af$!9*u1CJYl)aB zC@H-JC;=P_xJ>Y=b9XHqIGmfY(paO3CYH(ti$U~`p;K6N)#%Z;HjJj?Mh_Eg05p_> zqOn+KF&uUVhG$t(P zI<4RUz(sNZ5+DhV64U$hRmkx@^6mU#HAB{_9%8YpQbsMO2lobi3Fj>w8)r|G5)#M~ zBh+^hbfH40<)+uyT1LjS_9!xRA}k1&hZ(a*T0?uGhRMyeZUUqha0mfr0;DEDYK_2* zeqm1YB}_*3nDtRpoJuP$^YG_!TP*;b-d@gt1h+LwI05{s z6J`DxgdUk5zKy4m$1y;O!iZ2Ek`W=Id7SCmT8Xg!fIZNFEba?}^K|>3Bo!Cx8#cbjjq*`&QJq9wN1Ow+>Mb7s`pHOo_)5ymVKHd{GapKA_D{Ci zwm<3A`EJaT#kOyMy1&mo&)My}ec#`{ec!i(w*w``VowoU1eOlXih0+X6#DV*dYBF% z_xAxzN{Nm7BoYFg+Oiiud9pW8tpaW5onZhszUf*@nz#e8On`4$05wNN1W`m)!MDQZn|B!ZMLF41 z{a(-cG~pT9bv=#0%*vZnZRV8+n$KueGC-}TH@e|DoPQ5CK8M=URo|SCY*U$$x7lR- z^`ue)l@iE%B_f=M;`_H$DkXd$@PnRss^kY!%Je3-Tw@%-3f)#pQc~x`36vSF(=g^T zzQ?Ih_Kl)&(OzY->;ka2{7o@}OK1%FzN(GKHb0Uk?T-OxR z;J#xDEZ_ej6ey@7pnw30W#U0aMM$z!`5r1EqKfxoM~RYROt4S@toAJoMPOEP{e7897Ea41==2&1 zxGkl-NkW}domQyN64FAYsR`{RP0zL-3V0KEDEe4Jwk}`Jng&bvCb|V6lH`E5vC!4A zM)>nN6oOa+6d|ziELH%DpbDs3Vq{S z{+d>#2;vz5-~+G-Ru&Mbf*?W4#i-zMlHiJ_Ki0e+PU&cs>24EXdVe^7{r*^A+Vgi$ z_+P$&N=XvR6GJI7lqgY%N?BS~0q}kJf2T;WG&H-ueZFo~%REB6!3VSx_#@)BBpjV< z6;KUx6?q>_{(SxU9hXq6z-~F&ZXW)<7_ImHPc#KxR%pvSY3 z5@|0vMV-J9OHqzFLA#GOQFwHPW|=B@w1|WM&we07aZ>`8JGi zg-RwJ;Ak`gAQ&)t-&XQ|dOsHx&v!}6szU&QU#(R~Dnx!JGdb^I7X-;1J%D^`bieU} zj*brBP=*>mJ0(#7&B?a{bb(!4qANiclZ5mi;W&eZg7`y2|N45YQ^@uXS&rQ9+-udg z$qxH=+1H$5E6XEF8irCRry#AoJ(OlaWUQrAj$?FUw8sLnxVX5eEwZ?X>|R7fJOp+Z zH~W_ID5iV%?m6$z_k2K}i{!cYd=KTKVHijAyZ%pqrAw1nJg>K;0Rc%4w!k+t%#8mB zF}d64Me_Uk*5<=U0UzvIkw90R?T`XEaGO9G>kRX)d-p>R0R)&MlRzOlPu0v+_Ua~S z^9lw<(jujxG57$)oaw30nfReo=U$M4k)k;7>NQ%Qu^LY7OY@m_KJ>%X_Vb})*}kI8 z9|`#|Hw}QjY_x`v7JA19+F}5%Gc00^EH3`IW80;O(sz??%V~zJAFx=U=qVKnCeyl{ zTjAmyo=3p$jzSJWLL$~T%<5OzC?|^qeUKjfJvp8LYiq+o2uLL2RN8tOzWDz4o8pk~ z8*^wl*5vawjpCf)VUzw@n%a5?@G@wwfY^^Bt)b%aqlHD(0g< z;FH%Gr&IAzdL@e3CP9w2J*n;cVxImN?<<#ZB;o{ba7}`QWm_;l4ON)|)4dKbQm&4l zCbBiM^>#zZE!cpt-@Zj-6V_-?f7wY@znY}yd5j{C68KGbnfW(>F=XQuf_xrQlO#c` z3!~onN06YDB28c5=f>!(Zv&Wb!BB^_Xh0xg+Zd)D_Rc@pI%!zc2kHKo*yC~#1c+!5 zk+-ce@z&z%lu)O4NI{r9#)KHE>fGiWF6hovK8?kF8k6~%)SA?{OB1B%5V1NTaw?U= zfTWLfo=6C*u*{;tGrUCf9;}fb*Mlfj0byFeA^=+AUy$DTb zJNbk)+0qip&az(I2(k3%|GCnm8+bUzKzXFxQB2&P!7Z@kCb}*MbG3E5YG9 z(&_xEV61n~;s~e@Z)_p>W`HC)1bDRPpZwMJ;r*m8P8Z5ctC&(~8W%JDuu+R^g}pKK z)?(8GKR>sbLtM{ETeYN-YJ!>345Jkt$$IW9F@C;*8BUA_Lb zAOxQ!hihR^o`4OJ$rbhshM8?{%2>05HY=1|I?G|Gq|Ae~N466k8X=h_f_lyp5)SKG`^#uMR7(=EQQ_&nECmCuqD0=5mTdVZH_ znS=VE{rvmrAf}XQWRW#e*FC5~xiSS}%zVXEA&lC@mI_Vyye->Kpv^sO+|W6*S-Uu! z2de2*D?06q7}wl1r-HW9{Pnjw@2bxU2dOvoi^ zn0mo|qds6*AG%!W!Y*w|FtTY6Vt!ELf2sLcea#7fh%8)Xp7hgiog`hfT??|dmmYAu zcHiK26ALCl_JcA*&F}8!Sck#$k^tE3ZQk9poi!N72uCimNVD5#R+jsQREkuJ)Y{Sr zv=3GZ|Gq-1*hEN?YRc!eS?0G4vTjZ1E#Sdl*7++q{m7hpK&!V-VY+q054^(;EmDev zXE12SB7B)BJv4>sraUnMlUx94A`RBFNR_m9*mQi0kM;q{1P~B}v&yh0^D*#HFw%xn%?jcYakBz#LgYFVoe{n4l*$ zhSsH2EenLH1rL7nI=40Px~)9%5p34?Z3QtvQB*K7$<7rhWN%jN?H{K6$q)Q&&Rsy9 z;i=xD@dmPPr|Xn}Lj?;~ks4rMy*FECpo-VrwxrlMq*k8i-Sge^-E%H9=DE;ZCwUbk zK?F&1(pcRFGRgpmVdSdbl=FisKv_R0AEa}%uaT#D$6%2$#las+2^>ckaj0u1-@-)a z%E_A9fOU7{(`49xN!Ssh$c@BGm%s6hPTDc6s|p#=Id~7gc|Z6Ne*U^`bK`ZMUVEFH z-L^a5+4jx8?Y5oIdL*3h=R0Ixj8LR5Bbff@^%3%UBg(x#R195F&TUxNEzalu9-Zae z^;B-aiP^-^J)sFI;;3hUX_!fS^&vK2g@WAf#m3z{0?W;AdA`q{_h;_;h3CyPEaW)> zn?s)G#Q{r^@|sgR@s4%#yCAy>n5F2Ge0v@<-xL7u}cFJPU$Y7C{gvV&6& zZWvj*SQ_`uZaAMe(8kdCk=LF$G4GzYdj4^eg%Ah<2zkUJ11{e_P#@5pmvS=a^wj7t zJAlmbUs}~Cp_uvG0H26AKS_Y6F^0}fkVuf?9f23kH3A!8TgUm_c*kZl+iag?M>gTQ zwte$Y_wmG@CT{VA=X2YDEDHfbV48Ch+RvY~+1Ym2W&@Muh?h2b-yjBzz(R4wlUyHj zs+i0E%Evq#9~<@MOFW0>k)sO&%xKGXGh1e+wg#rT?blUo&5zGhPZJ@~m;qTv2%vDV zf;h$Bag*jPJ)T*GU@u`uRi6Z_Y_soJ|GaUtNHpgNg8Zd610;GWp>t2yHdYS8$8xvTj9p)Nyn< zPn<+_PdFRYuYUsw?c&%ed$fB0N0MC46oGbqWMX>q#GC^7`M8>7yqa!U{@Cq(?Wj0-f3Mv`|BqGGBilM4lX0uGE(w$p8dz^hKI^ycPTs?cEF@%2u zgiws;dMejVW$L4z4n!JoJd!6|o_WgEmtQ=Ru=q2Ms8+iC&Ri;hvTbs;%Fmr0a~SQ} z>=^`}flP-S&YRI z44SGf0WiD*!BZQe(F!p}e#}!Sn}RMP*a3Pa#0r+}X@Wn!fJJ9`HH_ zhAn3l2{=}cZogKZ#Huq`b0R$;s6h@fWhe&Kn%3MBO>^$U&{4${(2t?2X^G8J!&sd2 zF6W%9(w57WV7Al4Spz6i(T_PdJCN}muX-}VL-x$Z0AR%w7-K>QYq)N%d}#^?lBS8x zLzrO`No>v#*&5B&BY2UQno1F8H455ZiTy66(gb9Qc%dJfV&7MhNE&3&jqJ5;3EaYy z_u=@yS|u!1K!9f3@Wb{%i`5p8-3SrHrz)SNyKw5et`!F!wZ2?Xi(fgmd0)g>bv)-^ znTa_ZY-TM`TrmRurfS3mGg`lbdzjuX(|1LS#`)n`uG0^Xu3w3tZF{*C%pagLtOrYf zV{#9vw146iavM>_-!;3P1=cK>tbZG-fjz=KNQ4!Ghcg(<7Hd1_+U{Q`cLAyesxK{m?)#Gh(tVnVIh*$Zw zbnl$`af~&N9tt0U=^MZsI>!@{j<3-Pt(#TSRfP1JZhvnT8inGBwO3RqLDtD!-{$~| zG=HR$=*&Z?*FF+IXjYS~JOY=ywbkQ1&f|2P7kbTAv`Ce-qwR_I*E()A7YP9@I%6rnw!{oM-oO9w(p(py!QL)~=1vxBBSM1O$1B{1B`-u8B^3 zRW@d}N%lt&1;M=Z;J*0Fs&y=5z>qjfsg%wK0U(IQlo$*#L=$cFOJdIHT`x1c{u|?` zX{lN)073ENL!5g@61HQpzS(Wg5fU=ViMp>;TGy%X(kZv(A{4#}G&NAVL#1&TN+QV6 z<1SC8<0OJjYtn;>?bu6z5Rr14_P1A|7r3>9^~P5q-LGvrt|5f}+dg$ClG;l% z7__g=Zr^P?&N-(!w+Auj{61k?&ct*c#bOW?i%>NfNt@s{miy0~GgHHn$n!OdT|EdZ zKurTO9YKhw^mJl7Rlt_dtT=vnUy9fWM8tkA4>BSMBiu6JEO+aZteJN`VH=K&ydl=+ zhs$w&4-~7DU7c*X*+)^4hgbNoKvP5M%E)riERx^w4r4H6eB`*p0-2r*y{zsSH5nKz;cHPTM|r9kLC?U zN|20=nv^@ozPS_h5`>O^jv;kR^B}P*;l6D8cd>3l9ID45sHn^ehoK8)-J9 z)8|qITo-h2`t?l4`qY*xOMtc8S6tb{)#Cu~*_4LdqNs24_G+Mv{j{f!v^y4;lR7tSk?$-+6p|L$5TSimdWcSq5 zOFQ6e+iC6EU_0YtU(pvZ@|}e-A=Qn&-@CBiUFIwDoXeD7AwLQ1$WuUKBZvs{>Dn=M zWvvR=5ndh?UK;_o3UbAXJ)WXsBubpnMK}Po(#;%W`rrSPaa`j<`L(6d`YL+R0}KUF zdh_*Inr{Re4do$IF6@};m_sdXDSTE!JGb*zhv_7$Tb})DoHfd0n_+1x!uBV*e)A?0 z$x8^4j}~=Xtp*n6FFtizx^X3LV8Af0T4wg8s~dm;19?>!KVflZF5LgqOE>xfwQ?kT z5bHWSPSAkKBO+9qDs9JNh`}RB)V|lg!CijrvF@Z)?x=z_qIz7|zof68nrWAt(&FN$J|MUybTYRjY zd#tI?(E_jlwh0!7+ugcFj87oM9nl{O_5en}><&(MeoibkuIIW7-A>v2^Ozh%p*h81 z;lRR;-!4K9%x>=M!CwB(niNa@#HN9@G@SylWenBJ#JNUty%a6#YQUrb^Yg`MmQ_-W%g)^d=LP#U%(>XbHrIr7oJEZT{m6c=4Q9uh*7kPimCws48Tf5UwR2W zpojGWl$@x1VWsgihm=C;Bp4;?bzIBSN0Eku2vV#F8MHgjeyqt-XD@y6pl82xYC0<` z^Ww@vg{E7slBK#ta*DjO?S4~J)uVXwQdgxwTb~hIqnwQz=UMsv0 z6_M)ZwpdS>zXmjUu1KDtL~I%alPi3^jR5%zOX2ufEP=9&bRZ27F$xfo>v50~AIBn$ zbLDwT01ao&b5q{bet)VB39ZEeV8HNwdab*)2jg-xFar2HACGxhX?kX+s|4Dj6dEu- zT@bNH6p1iwZ7H#}z$8?QIyfm>-^a(?yqeRh*9t!s(wrb*8|)N71Qm8uUrQ%5QqOEc zqXZ^zK;{)|Wh<&SiN6?abQ|=Ai+!m_3ylU0BTEsYYADo3gg3FzPph8amE$NO(Lz!r zDFFyX(Od~g!`8t-*yfioV(s=&>y-)k7m%eTX zrz4%XFKYCl$G-Kj{%vIpx?`<9kPZePE#u$5uk5a)g?1rx0SIK(R7;w(wi90fbo&5hp-tj#&jH>-inTblZ)fGG&(Vg)r!=~M z*!%L&zUoHB5w4kXYFAYtyuQtBIKbI)PSLqRnn_z3!i0fLidP39BFx}Qz-I$ieI?g?w;_9bZyD+!Ch}+G~h80b8QGq_w6<5U2-eP$0iWm6r{1@}KKZy9W zZ^xXU{p#*@CimB0-v9isz2YygXN+SdvjPM|SXe%R^ZQCLF%ltI6u~!O0VMa)wLGPcth0=TPwJM3ZvHi4?wywF`H9o5k4vYylz5*6xBO*w)94Hjnk@PwS z%CM>ur2n5Fh(K>fz}DY1>|)!QuRinw^3TirJnhsM5YeOOd_IzjYo{cEdA?+yG%ANW zWK6RG&UF&QMR&Q!)%UpL)%V!6j)!>Rcy6~oHY}+U@w#8&3#<~VKn(5OJG4bRCLFxy zzu%onB5m74CWK$ie>M77y2ni%B(w7tz|N(bkL9gdHyVwhBtkSm^Aad&8X+Yh-X25c z?h#b(dxa8Dqs+SQnU1|BSbELf?C*b#`~20Js|(xPRX{M%h-d?(Ny$wYre%dZN!lUG zf=ojY69@#`u3Ry+@wMU7d!yYmiK5bHw7?`Llx9?V``V+oeYn`}$!x4+Ve>FsB03J! z&?bO0GfMEp$4_XTTA^E>Js$L_W8;Fp$!{7ZytNU`lUxx)MUh!WYNs~qUzIuQOijIs zWkrP_KmYardsT{vGY}gJAk#ddJ(?-;*Z~pZNnI#BsRawpY5+=)j}Xv+`(Bfw8I>-u z*uuhY4qGt{S07se{qXgl^PrpdZZ0+gR zXOCMvb8MQ+k~k~uT8T3l@6H~& zGE@7^+~M`FQev-ABDne(XPOD)5GG_Uhgaw!h#(RiX1jxL7@u4PpSiJJJ&*V2-X>Lw zqkjY4#%SJJ zl_o;SYzmecLJH}Gnp%%!d)3;{r>5)mAO1t77)d75h;1e=R9R7mUA_PdDGBDs-0aI3 zKRlyt=`v62?>g5nz|6o)OHozxfj9< z0N98iz-1KJK^w+EsmY~O8eq-|h#9g4wtc~7RpF|mHY!`(^nvH9LP7ez7$c>C7!7Ux zmL3vxcO%oaC)N$~HN2y#AWn?YDy8Vu3Y>N6IDbapWE?YY*KZobe5M$(sZDKaftiqE zS$0o7dUW?3H1lS5<(Gf{4}Op&Gv=h7$V_MeVxPxOXi6-prBv1H%{q;6-hxg2XFUBYubY1xZzl5S2lhw)Sh`u$Xtzm^?!Ha^@#2pgvsLHM zVzWUgFiz7fw66Urno(LH!IjirXM7%UmSMjLfDlHtppJP1K%;;^mNxA zvd;N2csuGHQHn9s5sF*$(HQ!X-02s_%bc_A_W83fom)yP%3}Z_g!v;85;+w+BOp;t z4pf1v(9sym0P92pSty6)5NH)NuQ`pH`xmjF^n>Y2W0L-t+oLm~c&>-S z!Kj~>2Q*N_wfx49(J9T}H8Az6(=&Qt9;dX{5e)mClF_&3qd^KDk{CdA1|lp^IM-HKyG(iH>{3&BQCNX#rSk$I-@9o>j-BIV^);;VZ1yJ-7Q-bi6J(Jj; zo?#msY+G?s0FhBnrhV%il(*VwwHM~B> zk%%IM2G?_16;zHo0q?y>gzeqj4!1P7zQKEZ5AfogKa-fFHfDGL(+c~7bowd~M4-$u zj^kAZocoqsg=wiA{kTCe0ip<@(#`Hez+nyG`(upXm&Q6(Kw=8&0=CCwQnKyVUp`{I z%(=~Z|L^|ZS-(5b2_;H_(C!ao(o1=JF(u|>M6zrO%3*PU&B-kx2SFJi4Mv(|c{XRh zkj^yqtW0D6eEMkgG>`vj(iGd}^M%wd9B{ax8N<8_eP1THjwy!Xv4N&(*X-MMX$g)l zjTNKaOp1>HK)m@L8d z+XOZ-HoG>aa_0Nfi=v1KN&#AmWo6q(Gg@VK0`28L{zo_MzuiSIcMU-~4P#2=Qb8i8 z3TZ|Eh*OXP4sz$5gBh_jW;uW|h|;0HPZgCHowtdKIs6}6qPnkppVu5%fPoAn%0@a= zl%+?i9b&JDGmHo{b3B93>#`p+xx6g*(iY&oQO-)HI6Cl%nW@A2?xe^Y{vJK zD}mwC$T>{_zGh6I`bu8diCw_ZObiUbNs3Y4f&QK`X8&zU*p zeE8GfJI?Qokun8n7dsE$^=(v~Dwb1MzEkm-g!VjCiqI&6gJ1-h2^a)SBr2mrNTg=L zXfwb0n`aYFHuy49X+j!V21g^LP^?MLRyvfW1pN1_)bh$ZiZN_(8Zb(6LPyktJb?2! zsaP#h!8)A9rC@rymcY?#);(rwdku|^i5YByh%Ds40Bsc}gFJoTXeAmg2*UwLL-2{^ zDLAXb?&;8VE*=Ae1#bZt^xQ-J!_E(C9mz8#^7|(}O*jr}dg^ z1^%z1m;DO@MnnLD^@?Rlh&fY12ub3t!?x8q=LW240wLvI%&^Ur?kZ7l~gakUPNKMYe-ECv`!uRXPT1&7!gWV1ce}IDH)(tx}Zz?Z@z6V zVQ6i06)?fXz-&g#1+Dijn7 znM9?6LMkva699woX`)7M`T^W$f3JyA5nb2qaP9?EtSuz;lq2@j;>p+&Z!3Nkq{n=mK~{24bD8+_o(#_aA3E76k*r34WQgd)_ULW~8(h{=`w zG)5V;$T2b0tsd6XdFxcGiWHh+1Oy{u#E3~PREi)9Nly_aR8T&eU&crzx^>h>f1R9X zltvp4?>pW~Y|a|agKb==6&M%Qcpj%z1X`nGsX9z{AE^rftw?pu%p9(f#wf>(0GKe^ zY6&P1lz;-N3D5nt#KzckI)JSJk+mX%5W)TZdMni+>D^?_!~hwo0P2JlVB46fF}B~6 ziz?(7ASlKyQGz0j7{nlm*J)0AJ*tiD?27{wrh8@AnC`8fI!@WCHM^%~Nf7`eG?hY> zs8lGck%S}^QFPd1Q$^Lewcyskw_3^QCqP|ieVhj!%!WSx_wty%HRvyhQfX59JZ!BC zj{}U+G{z{Kf1SvTxugd$V#K6ky+j281t6$N%JBLVd1y>WIIu6wY^(_c5F##vFTs&e z9Xj$s5ON6!M!z*#jm^mkVQK(_FK@cEX{A8~P`D-qv40W3h_=juk?RsmJbtXc4zY(~ zbpk+d?x(j+cS|Q1T)&Zs~ zssW=VUhYWH=lP%iBQ``xOMKrc#*Ux0az~!G66`(-V741&ml>>+>m>KZOyWgOmeZ$F zDWt$5bVShs_d~l%QB~5wu$lq}8z8T+W+u~t#t2URPwQvGw%mXP0%quL6R_>pBAa^M zAgGX@poj%zyp*UEF@P8r6Qs_^sx#W(ksB=FBbiid%+W1tnpoAT$L5743JqXk&Sr=~ zL=5NdVl3+WgZefpVt(tGo0jbr-Wpkm6|t$JsOV8qy~x9dBU38#K!49eopy^RRIg~{qS%7Mb_Q+$x)?yr7TG2ksmwJR za*n(RlDNPdUrVIMVxs8-|Ro^009ev2#u*w2+BD-L>3}%-5u#vXeffESU7x`VrXd0`T3{Z zgjxqDTmbM!*)`)MosABoQA_!u-6T%!#3wUi3_^+Ge2;>-0|Ek+7{R6r+dc>fwwWQ5 z#{iZiC!m~1@hE8(Bvv@51z;+mRG$Rs2Yd}|TdpwE|Ig&413@W;psYm^hUWRFS+Yl! zs*VI{VxIU=Fa6%WZ@)}Rdx`jvuMqypj;NbN9t3O?oMA(7@)BB* zRGE980!{!Ta-nvCc(dPyM#x|~?|N5ZT-8KMEJO?-z@BCMP^}{bYa4J~+~(D(sFrWj zop%W!f`|YjY-=i(xh6;|C2JrcMgRc;XxvZBh!?DzB{TtS6m9hg>`mgF&WotwKO4 zQKYR-KvM8T$gr>hlEKm#SF%h5paqj)%}#k9G$IJyvw)%V?E?hXcSaDkp4Zfv4F!Wz zq8LB5kP-}y;#I2ANrfOZcP>vi&d%~F#QAZs6o+ut==S6Ew;VUQA*+vQ+3t*O$wO_N z(U#?j1k$9erbv*GtVod%*9wRThyhyv`i%EtauctpM*y73_wA##nWaWp#kt?T#QENpB%{oMZQv4MOfbM~9Eb=Jp~u+{O{iS`Dm)@$ z1&|f>NT^){8ce6B*P$Krvmq#jfC8R3p0^c63}6s#@hZ*e7??3loY8cdk8C$DVcFJW zd)do!NwVXnZ^x zY1hqUUvm+s59;mTi|+mbae|Xiz1A-u7hKTqaGm=?HuZe&+re=hha-pMIO28Ajk6c> zIvf<*slW_|(jWtkYiy6seA^=l=nVl(&veR8-agl3)lkbh7vGzg3dAx8@^<>h?&RIJ zgT%`9+)X<`N?>*n<_UmJX7DAX3#HEL{( zfXZPlwE;|LOX{4C9K@YYyV&{u?V|x9SV$77YSxS&2V!^ZKh}qt6WIwmwPIpqq^?U9 z!MC@oJZEgnmflCLxN;iB5<8u~H@99z0`w38T(9SGcnL%cTCremw+)uiXpu#;$RgKW zw|L#+;&tXu^`6e2&y7lfX$ZrJ_3M7!k7wBw4on8+!3Q9C8}fPDKj*f0GeOjG_v}Ot zz@=kpmra#F4nY`bfD-|3#cp5#6eh6G*YZ;ntZT1=m5fwC;AE3I!+=`})d0b;{+$^? zSz>4d9f!k#@4eVUP9F;p6r+|V%Cu@cHYOc8(pNgc%*=FVTD75;G~?&HqcXNs9|XSS-}CWKq9;oZh1$L zG{={GFy02Hh6->5>aheg5O@$>3mC|;PB=}(_zfRt!-tP1h}=(Cw4$k)FpONXFjRIO zYDd36}3_)q~PcZc)Ujfaq(jjkR~8BY6Juf z^s*SU_7O~qT8^fny*-91tjpr$7_H&!)dG9~5Sqs2h6oUC5d?5wGEjLv3WR}P)4-_= z^{9z%8vs6#kbQPsYJu{#@hKnzQ6)AHU}zyxlUcB;JEUm}&}+8dXx9$3m(H;=N6`I}tO1-uw!m&-Ab{$Fbu4$zH8`Zn$KvUOB#F*6Ucs*`#At?_Q%EWX#rob$ zCJ#JDN|b62OQT#nXv?o?rA#f{{zDUCN&y4R&24#gHeM7{wiy<8k2o(s@>zo`G5n#7 zMrp9NVaiGtjVVp*3|Kh_MCKt<1E+ui+X4#c*meyRrnV3_}ah7taGHtFQ3}bfgtd4!rc^CM^QxfR_Y}1p#nw2!l<4reP02 zbUC69QewCWZ2(<)9r^6&?NGEv0P+#nmY10aOR z^ycQ-=HTOp*!CIGcGS8`3K>IVxROG)4OW^Jk0f*1Q5XN#gi2pQpFMP zcc>i2x|!Q)#|Zv)oX&6H%8@3K)QcfQ1bi{{?eML})20Mj-4PsvX(w#FhhW$cwNeee@@0^RBPLXet2CgXj zY-^K6u4;774eyGjd#CMymh~QuI>eh*&{0UZfiIiahw`5fl;@WO4-q@u)Eb}$v(Y*d z#=r=<^_3e3Mnhy^zc2Q4v7al#U@jYm4LHtEa#R0`Z8VKi%=NNCL>aDM(|H&0G~ak= zuRVtaO^7TLf)R%xSB54Ta^U^Vr$Xtc@Hp!qu%EElM{L8C22$*z#&PlJB%W=<=chIH!GA&lW7-S)YB9>HC zx54A=ET_8HxLqf-K^XqPTc6WeFX&l+L`%mqL8;p;QZC$SGcw9R<}=O70K$B>ELW6k zPY>|;#y;$y*>moF+T+|GDt+6xEcSuL5c(`GE-s>MdOoUZ&1+}*;n^uPRVFvUC>BE* zjtExykIAau!7zC5@jmz7+SFt2pZ1fvx;ck)v2!?g>Zz;W+YKyRePA*)g_aiFKgC&I zcngE?@7wg?QNhAmz-xpZATtFV#)!u;XeNO;!pYsI8y645y`y6stvr+IpB(9-ctlIn(CEs8AEA`&-MLdXt8 z1{VMc3stYB+pj%%z|+|E-j|B|$LGg=4}zUrlt2g}0HGgXaS^Gsj^#)3QUXnla3zYv z#o=IQgytl9C5@S^PCZ2*7zO|-eF%Osr#Yw9PcYzO98)PP+4hfWFC?HR0d6${F3903 z(Mte+akvVUw^}q`0&pvf5ik@7mRX}6L5pexqs%UyZ4GTY#R*M(;Pb9eJEznIGz330ZG%Ko# zW~9I;92;VwAwU4C1;jBC?4kxW z7+}Z2d+A_uW~PWrjFhHrwV{EvQxI8xT}2R!B2vbkA8OYQW`uFjG+#`n(S_$JeBdeM4?DKsZa6gRcjoB^Oqgg|Q~gF2i;K?yHmt|9yP z$bz(Z@0I{Kqo6b#aRB|1NIRE60w&9%a>Q;QCU z5$lmSxkf3HNeCG*rya7fwoZP_Xg_6x#agh?0~$SGQDpa`SBXa38rzle!&?11obo>0 z>@!$?XcYdaQbAzKnZ=pT?7kC^b!mCuL;I?7O|a@|2KOEax6k%uP1EUAAGN*yG~NMZ8M@TN)HGUD308&UHwScuW zwlLUR%dXZjGuRPSo7nUiF^GcyM>PcpO|SH=S|1-%Ff~) zwagtanoYNCrYv^hu+X~4xMDE;u;E$ZS3U|ivpc#E5oEeXNi8#!7_GVhW(Tu!4#HhI z`0{!GQPd!bF?r1+1Q-Dh7^-(5I$J=9ATn)hBWtZ$em7<6NkHp{V_W(5y$5=~4|=%R zR$J4gx6=}mPRQg8s8UoJmM#r~tZf4&nmza7Iq%-1ipK(2YiYDXqiq<(6L@ML!m52o z66N=^?Z$bdRNFhPeHw=`I-ql0YidO*ezau|d+;fwqsPF3c62-1SUIjUPf{~je&6&s ztN8+pFwjF1BjD4(h&?MN2mGwr>=39$PhR4A5HbxIW&;;eQxA;Rs1*{_@I+=SN4Bz> zuQ|G2>XQ0lrwL7xB#Eu}#l<_khx=&zb~w9_d7^vo*>Df@6->y&$Vjj>7*PvP0N@eL z;mHj=_9uW==d7qYe54jByVzH^U`9Np5`8%*`$59*2<*D5kmm2S{Y-!+-=^2wt zQsQzY*W?Hr*V2h0UwAwoZ|^>|!{J~Y?0qcX`Z$hb9L7A7y4;a@Ud>nUC`$lMBsCj! zFQFu@ryl2G;G6*Wrcj|iKl-kHt6B*|6j0}IH3-c%y4q-^BxTrHMr9Aue1t2xMc4`f z?#H<6|T&R_4FHm=#p4VY3 zi}31C5+2LF9OBZPAQA)+Led(ktHd@m-GVB>HNs`^B_6nHLN)DB$P7^dG8LVH!bzvP zJxXW;1d^Ue1aUuZDIND1^E=_r1i%bET-$>l&7h6@uF*Ygv$Zy)pH}kd^{N>8yo8iW z@kLh8>4^2OXv>A;ptY$bwboj2;>2=qUBl`vuf>BAMX~Y-QH&CwvY-jd(lY5nD_06k z?ovB%BSJ*UZ>hS?@K8l6(DnTVJSiT6v0Aqt9kigK4Gf^E3%EtdBhzoAe$HDeM<$XG zFk{w*E8(u*NEQNY$a@a>laiX z&OYjGdOYpJ4-e6xc|b6DnWHOcgT`nB-J^-7$16)|%!Q0e!lNSFPzq173?>OV_in`$ zo2C{^YOz)jOI~Ls*(_^L)hQGjh)DZ$7m7S}7^5i*8fvv&o-Q1SEQ%!&=b19WeaO9vk2Ojo`h!5hm|Om zj<$0G0UXi<>9V@!Qi;`(0M)YsxQ+JLNb2>-Bt6Ks+Fka??NWZuOWkwwBsGD-7^6p9 zj%LuKt&U!_9^JaTN4N3=;~XEQDR}3iRYczRBQzSfc@~>z5=jbdnqo<@7A*2E{?=%A zElGtTLNqYcEF;| zc%yYUg9bF5ah5)k{y&C0?x>C3YFRF&jUPVQ*g=vex2WeN;8dAh_gJ~0dw=OL1xn<~ zVNZrI2dJa7+9^WZIz_Ot+>oe^%kv%9u2u6m+&?wdjBo&G{Sc)ll}4GvV)U@0X-1FM z#taN!=4V4{HN0|O2jugHVJL+c4WJDlam$PVtTn+}QtLt*u9{HYxT+4Nqb&=X5L`O+ z=|V2XrtEG92_d2sHO3FWMbO6bxVaop!ySM6;wODHQm`q_B{f?&ZP48u1BR}?ff9or zCXzAKkFWpMsi_Ti)><-2vQCAhKCb4L`G1GQfM;{(SMI!D&t{?riJt9P7xEquDkE~t z0_T890@z?6A(*w+=8wQV4B}K5x7ZHQt{knV)zKJjbVKXW`Zjw2uiPe^SiZVO7KIK9 zm4*37Rq61!uPjX%e%)gcf(0-EOGqg~opJt1Crw-xf>!nRxin~?ATMkl(d_C(gb+d& zYCPwf&MGre=4SSI>c}`__@s4@xI$3eJ&hc54x{FFf-!lb5jv`J_1!Vol6RqR5N)JJP9O(Z2r z_9dC!YB^ZhQT#kG_1%Cwhpws83u>y#`}bzF!>@9d&rR$4h?n@{LT z=tz?!V&%ZI*w?LQUJQLuG5Q0-;|X(VQ%*PBQvuZ>u1 zv4Q6vyuPoIs~<*;CrJ>!?RSSdkB#?e+p&3{HPv~T=docPIgfmLWDEm=eBKRztlwRz zb2)cU9=3^rD9LwI9+UuOK^}+@Vkn|;%T6Yf>-6SSObM`{31ymUI?{4bwvMpXa=zj` z$tFona+)1a)wGf_LQ3mCb%$Cy7bhNdcU;C|Z?^_eP$+WBvJ54!$KKk}M<0iM+ruII zukF);>LvP=u!i;#yk7!2Yk$0Q#M+5^lR*y&v7;oNol}SWU=%iZw`9DgkIOJA+0k_R z$sUh!eIQd)X5g6boNhCb)GB@HmiB83o9~*n`RwD-W*K{ARMZ5})VVh`)%l2Qdt-Cp zB`-0}^L?Ij&YF|F)TN|x;kMaUT4VO0n1fE`@3&w0sLcojEf^V7oN9m%Arue@!Tyhm z9*N+=yT>|QXH3nCRHIJCpp#fMre>)b64B?}5^(REal_mOsC{oljQ|gF^Y2WRrLhF{$o z2_AnG6AqUjgYC_6VjlgLAPgHxAp3aq=P}&bTAS~(KaMmJ>Pq4&yCnf`4Ijswf8ecz z>R_@1GN&G50lFN(4b|})vWN82v@EqF%u-3%f}U2o$tvUb`J`?JicnqZeGn84swk8y zHHt>pSJ?JSg%V2(*gg0BG^_VuNmGh-_nI&|+5X#f+z32CkV znrwZurTss(kZ8NYC$#D3%=!9hPRpLKtQbM7%Brb{YuM<#QoVQsj02?taY=zAWwtO;j`xAn ztI}Dq9BmBoS}AvS;s{85r-&Y7tX!@+ElUFUd*i2)hG1G7e}x;9W`IzfvP!V76?^r9q|4BjE;DxoP;M3?0$v*v zb%htgJ>HiPW7Y%1{J{p*}wCI^XPEa@%* z5Y4C}ca0%zglJ5f;83^{*>8YN6()ea5f`}zq$aX9j3At*({SX<7m`*Yhh=;AnG0hCFgh;T$mi3SP{ znLI6h7g1SMtX5?qz9^K{q;i2WXGqLBCtqIJO<3I>)o9N?GeranG7@4@j+53Xrfz$j zvv&z+>Z*r%F=$!gz2`0TJ{Z_$U8r_iqM26Dqk?Js^Oqk|)t?pXEK5XG_F_*Fg2E2N zQpm>Y7)6pccywAd32%r9N&zAYX>w(S3Pn%>E`R{#js&x$g^CAC$8>$yd*d+;fZ?Gw z1w8oRI=`naL+NnXYia7l_0c8~r4pQCI4E&tjZ%d?Td&}n#Ck#%eDr-5KBUQUIrsGF zDq+$^cJd;p9E{`RNX;0h^VPu>aBBoyShMYM9YbaJE7rcZwFQ`h0(6d=gq6^6o{xP* zg(O1}xuU%6?ay+j|EzJGbS@<;LMbH(N+F;qp|YsBwo+CQnwGo%!~H&cB@JS1D>t+j zrUFcF1I@YuFa36X)k~e=TANyN;t=QN9gQVcE2vBY1yPcU5>yJR7OI3dR3RB9F~ZqF z&CW+d!bFwyya`c)2vL!UgHBzJ65@HSmpV92dJUG|fk`8_OcZw!7mu&HKuL*qW7%6S zVi`p!Q3z6srpgc}K+DX9nju4E`u1r@ds=R^((tCb6gO7$KENqGHH z79>@Pqf}PC!R3o}VVd(Zouw*+V0AF0SAr)JA|fJ@7#+@W_7n)qW$&vi?np@wlo$sM zqzZknvK&C*VYHv?@G_M!F0*V*N+g9zNP1PQetF^v{rD=deoD@v)1gBLL7XJEy+p;f zZ@fE|=W@R1KK45C9)TPw{f;|Fsp3T2TT;@^drHR}?{YI0;HVQObiQFtq*ZBBXtJAn zXVyN6^BzRKqX=;k!{I4-1RL+Cz0Q4Of3C=|KWDc;d)>UYhf;66Zm-*s*Vp{nd`(_o z9fwv#&}4{__SAM7bIwg>hJ+9_MTsJ{FHKHdCi-RK@KFDbi{qe-B&j(b1yXXZLktt5 z);L;h=E7C<;M9fdMyBAd!Uwc>vbbMD>@H9bAY4fk=;GWnQ_XUn)rCeqQ*lv%=&dBUUB1Cb^ZUXI5rRR&$-qAC+SLA9R1?cl=D4oy9yQcFFo(iCwqiLcStsR z+NRHAnn&xI*{7z>i1|-%Qw;$;@>II~ zm{3u*`0={anGeB>x|zP|p=&vOIAc3L#6&l*7f?pMV99k|L55=4TeF;eg#T+ZGp$lU z5P+gns1&3^$+mC1ZLdH{=}FJ@dh`LxbO$eL$9CU3VG@Hsp`uPG!ExgYMQRhK1%!yS zyV}ZA`ikP(Jiwn2X^uGQEo9p(ws)d%@+_W%XWQNpZyjcLN_vJQROLVJFN%@Qv=+@} zZ_ScG*c*lfbEaZjt`V$Zw_QY+0}lfYm+Rswg+L}lapp5ISbEP1YE$&JytuIdxI@|` z<~u|&F6);g_p&(2Tf-+R_L=5;6i7c0GKw^_tl(WYZ#fcxdTSwe? z*Ung@yt2-M;t31WOH*Z$n|=`IpT(y0M-0g!@eo9%QYopkx9pa?WrQ>g z4~3+~Z}3#BT>YeF7f^r*Ngy;6K-EBZA#N{XK7i}+aXNzQLvj^)Kb69rW8&#BhRbI< zCRy8DXq~jzk6p<~mw(*Fjrppj92L`~9h751MiEU{gdyxurYmEXSw1`c?&7U##FNAd zg#x9Npoo$ZRFss|X)lN%#t0b1m|~$4jyNVRkBz3=818v_VyH)4SP!_m9_BC9OT>Ka zd^F`1A^pChWQrt_Mz8{oRI8L>Vb78&EI)y>A54tn3hz>ZB9%%#f=W`B6%`2)LM}^H zgKuG1MXjm2j|ym9^!!pn=3 zDZyd@4AK__ESSHtw$2B3n?kX2y0xJa8W z4wZ+BR2z!!NjKo!7mf;PS6=}bGv~}60>~N>h)O6*$}$xtR8=KV|HHp3^7~~~PO|cq z$sh=t07y{MD@owASHd~)1x{6O=IoeQ1}6DWNogep%Q$9|K*swXJP4}Gi7`4Q(qu8n z7IBf=fCG{)1?h(J*uQ_%%AG5jo|!=@gyyMKil|VeM7h>rFc@P5AhHydsA_qPl#e7F zXN&&$q+&LaN#fk`j`d<z(qSHx6N(ZTk|4{XOoS5azW*|7`u6><%T&>$ zsn9efMJg0gmg%7Y2|snJ|o} z7<0qSH~#!7eqK#3Vp>k2>hO(!(ca#Ex~Kk~{h$?ECyArWSAFnNAHHh+kM*-JP4KM( zqJol&a-5_%&f`RmQ>;e-LL@l(u@jR%imt|g-(<|sOcYf(+-wead3`kZ7bCbvD+ZVFI1?`hE zdFdjfcUN2jE;)~19p`Z#=luR{o{5|!<~$vn9A_fQvE`WOx3-xSd3Ks&0L4N9(iB;}QiK9b^98(e3-Gz(bI=J`jvE#BGo zv`rkRUuE{Mj`MhP%()%EI?m(dRm6cy#Iq=}A?PUKiQx^|)E}Tx)(*76iiViUeiVDZ;j49|0hC=tgS}q-~BwTk~H$S(1 z?z-ZjVagOzmUDJHU;FHw=c_rTrq0xJN=O7E>Gcuk$Ue9~_x<0?Jc{LmaBhsjZA(5j zc?P}@B49!F47mxgx4l4;xZ0!8eJStSSIFGxk<}Bb;QQ7QJjXw{bZ3=)>9IiTIxjG; zQ;acdXBE;{-hI_ap^FxZNPq}&vE|H*Woy2e_I+9gzPA$$0jw~LD8r%%mntc!87?z6 zFLtu?mxeJ&rr_s~cf7@&r|Vp-NLVT`(|w}*>M$?%0q?ygmZwVEE||sVV{*PrNuBTT zy}uvMZ{O$nEl43{RdBHoMT^AE+yaG{sZaVYT{+r60b*_<#=e9xpKh(eNf-O#oa2lb zBZrhSru5)w@#vv=7#4jH11Eko`G)}nunWL90t-Xq`R=K03at^ca5;$p?nt@3 z3;O$ReD~kCHoQBCcN$XM7g~IPI;ei+$;4|NSOy?|sCSWq=yI%2(r@&E1UYovB~z zDG-gKkgJG^aUI2HI6ey9-d>;xdCz+=*H{LIufyz~Lts|rum2kpd@tx0R#|35mDR>L(3lzr#Pe_!yEqbum*`I%lp^l zAekzo6pY3JJ)M7oBk&vY)Hcf9{7xbZX3EkbM1n)MReNHOi zaYR}A9E|FAA9F~Yz3I#m)`iN-56+{oha{z=pS;i+tPM*1VGuhxec*b39sV5+t5Bb8 zm966Z9NJ!4mZDZI`RYS^Kha*y1?REJugaNkO(aO-%Dlw-3?XZ=z5)a>AQr*L*;}_h zdCNoGrzYe+|JXjcy>+X_Fg8?4Yjl=CW0+B>Vxno3iz)v&vmyed_ttk^i1+|E`W*ap z){Y9L88QS8%z2I5QEW0CV}z(768}Vs7{G@G=n%K{ z>|5(758>KdyRAI6d#^b9V~;KXVpyio1F4n1E-R@uAi85qRiF>lO@+_9jnAgNXIX63 zWmznU`4|fC&iX@eG}y#-e*qzrc1uqIh`-zfEo^p8B;v_p^OJi#!UuI~v-5q-Ut>Y~ z4F>+IPpTrWL7C`BEA$C`(!-4W~I- z9rq&G{=slR{RL-~7sp_8P5Y`gobZ-eCbJ_rd3r{&k-m?NfZ(g zz0Wpz?Uve6P%B6WJ#3S(Sju%a&@9L#*4Z;q@Kk=4RlG#xVCNc}OLX zC*q)n4(}yS{3tZHLl~<6Y5%%m+&GI4^J+c`>z6Tsy2}zQME5=M+-Aa0T*PR|Rfk2&Y&I7dH%c^-4l`DYIE#4%6D<~Z{ZhPkyN6cEUV2=a!X@A2DuWRL6t zGLJph7T?Ebki&)^_HEyGHpiSZb35LSQ;yAXew(Kpb34vsLb-#)T>N%}r|mQUo*tnZ zbH2*yj9ILSO$MZR_7zg7xzHm6%@7CrTMM2_k5e23$b}}OG&8@W_M|RlGVzk3B3IQ%iXN-%b}lgVPV#-ljQS3``ja+&+h-Ibd?8 zf6pViKPI@x)!RX^#roXu7>0Gp9_YSQ8$U7O{VQf|La4DLY606MJxDF2(dqWPe}JRr zfXw4R6F5p2*M?nNOdZXIj0ZVC^!=^a4Qo0M1nO0NlFseuGK3gGVsqx(na?IB@O}Zj zB}x{c!+-T#=%43Yiwj%Was?B%WM#UxkZJf9FmiT)QVb7iJGPvNW$-Urtry?TOO_y* z-aNtP37`24SQI_Ab(^nj=wo6#(BH;qywf{<6o?_!p4ZOrNixaX<6RJA@c6yGy-<7l zbg_`}K*YDECjaaFoyP`_yaAiqv_X+(;QmN{I1<M5 zuhm9nwi*wzydk+;=fuO|^vT#XHZfkI*9y51j~?EvPx!_N$*w2+9|C7Ygd48Zc9Ryf z9b9?W%{8v7u>FX0A3J+NUgcH()Tj3o{+_R<)oE=A6v76Z#ay|VtFCWj4eiPn>)i_j zUNtT_H$>wYjC=g<^-x?-{k&Zj-m>i#D|c3vec;Nw4{(*4eKoda_ipRH=-zZ9*`U+_)g{ifmF>)1g)zn|?jQd3 zi|5xfcbI8r3XCy&9MeF%zR|i{W9nFU{=%$8`$f#wHZ<6$ zt@uut(N(})<#s(Ke11HvD!bzCuvcuc2>uUN$w#}m3Az+8+Cb3&28>>`xuW%OWsfJ! z8kk5fwCh9bKnEmNicx@RrBH<*IQOKlm-C0{?N(shTgO9JCJd+5Rqpw_CzUUJKbn~# zYi&5Pe?Qy`F78dYTeCwD8T6E{{O}%5T?m3~6p082vC;Hff5oPa{d~;9&0A`}mUInhs{f5GrG@Jo9YxaBtu9B7_lw zO+VrLnfRSJvoCC$YI_p z12)I!Sh+YmjuSREk_2`)fYzYTax;Ahj(@M5^0tdAuQ*=401wT9?dRLUpTn-sE^Z)4 z`VreCNJO@r@$Bzk+;6sM7W%S;5S9F>%jt-3y5L7&eRRTV5iSl9xPfu^0d(uCIxyJB zK(WGTTo4TN-9a*Iy<()Ro!+_AIZ}Wgu87?^h3kRq^>H4j*>AoH)+I*2A%J z*pAI{I?nFVo$tq~7su(C=Q!q@qgrnQGO^mO;cyN&+A$Vr4X$FHic!wa&*!+%*%Utl8`#00iMiY_yqU;~w6M>6+vx$X|eT*SA+Y{4dvz8Aa zd*5g8VABf`gIRsy`+$3Qf^9n6rotF<3SpRcgJIh?M#vugX?q+F%#0HMb21J@kX}y= zAW}fsrb*aNvuPJ+4|?=)ZOrWuXsc~n?JYExng$)WS}-+4?3AEnU8RS&?c3Y=$`Pz_ z0nD*6Qw+?&Z*nri_#V>0HelTjiM|0(1p(&|9(9F23g?cL93c+@5%(>Ap$9esa^}Zg zny0eON#$Tqhfjp+z*KggyB@BJU{o;R+fe4oK%E0}wC<1s7%)Xo*zmZRGw6pP*kTL4 z9izuJ_-R111wGiZ1+jb*6OC557E?Rpxa4FARc!?D;4L73JE$M2hWM;Hs2mPFt18>P z{_E4-FE_~k)r*m5BMAP5d#>Np^DDs|BQH{xZuzD{hH@8XLzJzX0JAaB_t`EOJDW1K zfyyDviftCaZacEem(^wj73nYhPuepEpp_a-Lu>S+TMJasvF)y}Io8&jXsZz#*s!%5 z$kCL#^&O*O#(n3~Ss$L1rWQlM91nDiVQRaiyb z*>?ntF&Ho!dTKq|XsxZc9&OPE7R~6j)|Rc)Ll3%JGaik=5^lF(Fr3OuAG4bs{IMM- zW3kv^09zR49A`B{plRF&Z0w7$?dliU#7uN*KsEqg!OzWR`{q)!(4%lJVoUtLtqr6J zo|<#tl}JY_h#AHvRB#cn!;EQ5W;>JYt=iXKYV@CCn}sg(cCEkFQ8Ry^v|@BlT*$Er z17M7y!2^LFT92k_Xxi#%;~@yzXsw5auAsH8e(EXxoqN zdOSHUjE|iiP-A*KX|im3tLk^(z3KI#qnPSxV>{z1lK+ofMo|;X`D5T@iOMg##l!;U-&HFBc ziSn#W;Sm7{!H0gQ5oVJU1ID25FEDJiFi$YRHei0)ocFyt2VOT-1+COni67``gDFVo zr-|-1+UWh?VKUA8-Y4HnPbBPreRFIuO0L{0bc7`mtWBdRPm?T_kz7NPnpB?R= z9`IVWao~c^83w3@1&HqUt!%?uJ8$Q)mE+d^{%LDJf12~0;hx^8M9S5~rV8-`M%Ou{ zEK(c${GuA#KI_bRoO@2KHSG8Oer$F<+>i4(d(YX&+1l~oOyB!BT^y}pj6OfV_RoFb z+11~#U`N-{=8(_ZZS&iz55aF|4ok~ZJOxmf3)6W8?WbS}XCOO(9KkrbF3suJueVwX zFT8q1ZjRQ$?KY!$wQHjsJBI^}szJdZIz0q{IpW%T&|vL|;| zr#2!8i<*)+Ny5q-{*Hw}8)DJ|jZwWsLn{Go;t&JTJriOVlNy?r8U-kU*u@TF7n1fI~N3VP9ml9YU2XlPz|xB5w>e&z@8HU zVl28a+Oeiu^@4H~>Ok_KPCUn&7HlDL%^iy}%;3I&aEqFV`oHgRZFp$)o~ z7L2Qn#xPj`+R&&CfHso_XbflrFo_mUIX>L!79m6Id>B1GB>l6RRk@YMniu2$G!{y8 z#1FTOGFpRRDXTDK^K7WzO$?N7B?La$X_rn>A~h?-;97b?O2lE`o}PDjPci4v5CP1p z7a=wMh7mRqn0A?QummXCf;x~>mW${iBV2cQ)z(GOrKA=7;9aT| z$^uFZjBb&DHURgGLZdN^uQ6ytDF~AkfHq7PKLaEJm$XX z!@ED$vf5%nV+lYg7fTN;5YrAoY!&rZk2N&FHpdG^ga}%KOdgUTw?4)wxQiM=BJoX3 z4GuESfH?;OBcWf!HGmmT+(o~O4^C*WkwF=NVq^s|6lLK^h>($1zOmZnchZz3o^oV3 z*0&iWEofSrlEvybUX*boK^rKAg65F`+OQF|i5=r=3}}OrX5kRWI&h~iN%-^ST0DIF z_3>yoY$ngG4I(N!=17H5CW+RDrgze!?qymJdGafWUABp7h!V|ptX#(X^BGd5<4BTV z?{$V!EyZ-6AOeWw3ilIhI55090&QFcZ5#|>N?qbImI+9Ck;llamKm{}DR1VS`Q)=) zmeX5l)kOwz(ndyxJD$F~SnT*F9TkkL3gQG%g(_&S1SNoy$)Z6ClSLD4040nch>twZ zxYL(}`ukR5^$7Xx39ubin?r7GS98rL668ezAg%#)oZ2U+GnV4&Nt;q#Z zzMonEjzVezzLH5m9i-r?28cjFLCp*@uxByDfE$BK0VTz}tjm}exu7VMQj+sejb7>6 zJ5D8BP3jnq2?-Kb$4Pwp-~Q8!0z?QKsG-y$&Bj%N5+##Hm^9Ml1nN`Phe0vup%aEt z9C;oe$bI)Px2M&oz*YR51xQr2r2+lEw|W(=FztLtZNWzV^IQSBnHJ?WkHINAc;(Qn>EkB zv(-jDsq+^X@qNC8x)t+iop$p*91D#*wm5;>KqSqS&|C>9;RGuoy!!oKW=Pb8D~p=h z<10IYo*tNfd@NdydabqO)&^nL+OFoBESK}Sgb<)5ZF9g>Ru>*mR4&570id*i4M4t! z=1SrTJ>X`SBod{;+nIK7sv<@U2neu`?FJ z0e#;-4qL5PV{Kl7wYjYvvH7g+N(_{b=SUqQqhSLqZ<+wIq6x)p;{n*geIqXmWD1-n z#Uv96WN$?bwh9tm@e<9@%DEA(oE$_u1a2@;jqq97(%Vgx}# zNPq}^h3S2}xWY{bC7GCEmK#L>nU6I7$E|4N6cl6 z(D=O(Q8Pj%W7Z6_;%GK|82x@EZ@&hm&24UNK09Y~u9N2$DVu|8BzhJ-gqXS82Sm-M z4N>_fSxh*k&L{}-X;KvH>VSkqjKV%nBANWHBfYmZX!-oh$wtBy5td0e!i9Q!8)Lc% zgeftqGeKE|dO->sMA;=J33{LT?EI{MIp6)o@yYq|Zi(xOQN_nS-6F;ZEplA@G?Ex6 zs+T~#0Z!3_PS2?xF2=>U=~w;8XMWXD;w%cS29zCpTRdT&ADcHj#*Tq3b2hhg*4oOE zIr7QORU5Cr^yHfve}3rf2pLXeFnPXT^dEW7ra~& zz|l$80q=teK!~8Q4KPazAOl^u7}_$?W}+_ZF^d?23n}xj4(!v zsr0uLc0~0MS1xy}$8ir&z}Bl>vEG{8+T7;3otwQ*p6AwHC$~Gc{=|HOH2C4KB1B@N z2RjXbSyxPkVZxiu!PQspIG;|ZQ>ha1?Z8aXN1r8KB;YuybUU7R3b-!<5nHCSFyKZ4 z_PdFzpr)&a_Por2Ql$Y?kf0Q%T_#-_wSDF@-}r0iW!($c)dh5Yf&0DR57!GRj*}QL z3m6}J$J6flvDL8Y%oD${?4g9FvD-2=RpYq&)oVm8Tz%)$UOlBT8CAIgn`5v%0_!Kd zZI<~?W1Xv9#Ub)21<+;u0a(kWYZ8&`oJzYGas&6!wLK1{5)>Y%H2@;Y01yPHj=Q8!c^bOV6Uvu)vf5lo z!i*S#h{`rySGqFGCN@uR_TEply?@Hx74{>%cwJwZ-<$K?yWO4ZEmFJyQ59ZYw2~5o zR;vZA*qqp+LbRq*(o<7NQ>R@FF0PRoMKfI0V9rNv^TTL;(7nxiY6e_gGe?fivAJ!? z?QEXs_Bz()Wyy8yWTK^{Njp(zPXY^(#0~4&qz$uT4G2u__1v3XxzcL^DAsYbE3v(c zu0iE>_4cOzz8LOxhI_KXLUkY^t`o$L7#F+PX#>P2jd3Ha z9IW%|>{lUOKIy9Mcy!B_=J?-On_FzteDH`x2?_47JQ_>#qnE1dU~6?k#gyi%0WP?rRqE%CU=7|idErdm(s+BqIy z#j=(y%W+MwtjP}cnGt4x7i+P(wU(UR&YooF@{{tpx$ErOwWIp5bG9sJ=VtRAT8e>? zCTgxRDWUGZ_k9~~-++MQ3wX0x;8Z|6sY#N6E^fka6NSD2Z69&*`0=0cdva&0NKc+~ zBO)YXHONf=EWn{<-_a)Ojwy0FOVrB+QAOD`B|~9?j_uo7cANHXx|wgBXlK)H58mU! z<5|FYdr-K5{KcOCRsFZ1%qdEnDqX_Y46e4$7=~GwdI;ttz+$n%aFS)-{)KJKnLBCL zTAQCVXRkAtS0Ao6&R*xkDo1jg+u8_|$)A*Z2ni(6rbfC0cWwet0eG6&aBG+Y@bZ6z zP)8i#ue#|T%p4da`GE9O9UX4Wwm>E*mu$piTq7t_jWRoDWHQb<ZUO*nSw@HLMnY& z?~of-6!T&obIK`WU4%lKQx!258s#w=P*}UDA%@vxGU{R+>@1s@p0bh`j1z&KkAgElVZ*0MfFl&U7lY>^`5!FzG+Vu$E* z95@B6Kn+05>ainQsh8_K+Ad0lb!eWS2Z|!FZep=0wGipSBqEpuXqOG{kU=0U#)TMD zJj9TM3-X*o#^Zu4cFVDeLG{2gq=~N4MAF7Y0)$>b{ioqp0ty@gBElF>^<64(OKT}3 znirSe8ZSK07!#=!U&T&>*I2=Vu}$rI1jE5FoI5n61(!y3%<1MSszC_HFIPwSbMkX zp}-cdnyG=xy2T+(4rqCa`NCJln2yn-GDnE&g4D=7L-U@&9{M04i~!vPx=q(=wK+I! zvK%7yGAE7^Z`ZCA5f&K4LZIb%Au(CbPidPZZGr?$Vg+D2=Q$K(<}1w^tH|dXOYRO< zf2@bNYj28Dret;J77ZH?m~KydFSI*yPyfRPD<3 z0?{cg=8-5bm<^U5kEC6W%$zN9fCA8JKBgE`jOPdmiLq6ahaw*r#Q zk&+~BBYwRD(0&X_UayLDQqEXC_=5IAu?QSOHGh`g;rgJLw{RzLFjV;YaGM&ln(uH^ z25GMzOL>w+in0aNC3!n8LCazxB$W#(C6nmL4SFC*8!+>t%ICK7Vq92xAwXJYj0gvWs#!%)CG0r&Xdg;Z1W}uykF`f`4c}WV&%+}x_ebuW#mJ#U>VzOkPz77?lCcFayg15CYW$R1cDvkLR!&drOej6C3DFd&kQu zP204@T_n=ZK1m31=!W5b7BCzI%0QzW+}J|wou_Ldo@9%;gjWXgc1Td-G-)2s2i^o& zIodyCO1VEDaK$TAl-(Ffht1s)A_`7w%3~N?3sMxcV+pBTXo40V2$S|7_Vp8GvV~#h z<*|$mLa@w>@jORDh2DP!a|@_51G2t`Fw?CzH+Ho0UT#q@q`Cy9L7Fy6hb-Gv*iFR zBeILsSZ>u^!bS!n;Tj!qg!Z+^M4->9A0reU&LNb=CqA16SqM(i*WR2;6@jD26VgE) zM009<(OClVIESG~J3kfAs|etnas9uj13c`a`5iGuVuCn8j$jeHCa0a}DD_rjwYmN~ z(n4ejr$niRAWn(j=2i}#uP7jw87yI*Gan-%F&Tmkw9`R3OnAff#sQi>nN1I7GV$m# z`;em#5oq!X(z77_7@W);%Jmv*7>)(J53V)SL$L^@(o2cQ$<3&kQ%k9_jV`)?+I__o zkJEz}Kn{e(ss|3>KQQZq6E`vwleozG?^I**2;})eZiRGEY)EFg&LF{33kf3InDvDv z5CSBr9xMlRszT@WAha6?Q{jy+yY1;yU^ks`ONhI7;d6cf;?X~VZc_O9k3lXsxpD}C zzC42fV@e*S(o*LaVh2ccksx`RB0QdF%rRCNEgC97JavLZ+-V01VszHu-2yNX!&pLE z6lFq_g?iiR(CZ&WR=+b?XEw6jG0c{Oj(Pxkl}xp=r9qslY0DTU)5Ci$PVKG?O}Csa zZi~syUw`)%c=*R4UJ{m?C~I3(+UbcRQt zsEF)A80ljo%7>1g*PTUZ29N;ujx&-0!%2<>YR6uPlz@1KVOFY-M}jD|V3>iS&H(B` zoe2;UV$wDfLo}rh8a1tni)b&vq<%Rf`bkWPD|Amhi+&7=mjJ2q7if}*$b0nB7LR;8 z#kypYN(n0Cr=G^{hrGSnGM4^*cHgalF&Qtuk|_|jVUh~Af$ zCj61pi6%;#$Q`=>(4qUCYNtANfD+#PXM{Ndyot4DGGE{@T}>pp@*<8U&NalSuG&ma z4xJ5>&cly}Xtdq;ooS4a8vN(;{!Z>#v(S9stf`~E%4by-&sEt^bgpdg9(33~XzZag zI{?OHLooEFZF8_e&l~h;5F#P59Eh)}M$*oyl%&ayPWNveNq^*4k|s$GcZ<_Q)t~^^ z?*KVSIgE#ZK1f@8{+^WVUZVN8REtjfbh5P}l_o#VQ$P?sn_VEjtgFHDhTU);^YJ%h zO*MYUimLkcJYV&k8m??AbB3$tz*NTAb!H5PK-=(~69_~-Ktk$WBO#dw@dKPus3@EO9+^U+osDY;G@oAd9%C^N>3vnTT;&P-;5zaU z5JXub-xxAq@O_)ZPK*6JhVJUHDyn?`a@?2h2KWEIIl0PV2P$k+(SH7R!^S-~*vK-V zI+KM!pbnTwBK05u4^jwEp;9f`j~o&Ky&aH^_6Be5RP-rPKCq+DmMHFY#Q z7m3kqOHfLdNTu@`$P)w+W0|S%gN>jD+qT{}AKy9%@O{fv`Tp~{zfa{rMTKp137cSh z+8P4}4jQw5>kZLsS~j592%(+X5z@{~5)&nL9x)M0w{IRv965DsafcYFBvgS2T4?PV z9Hdy}D$(p3qi9YpypT1nj+c@pQfUfIyVkxS7|(69z!zUE?ZZ+qdHj4D$>)tXPD3cQ}NEDY^60uZ9<2~ZM3(#|R3kDO}%mPFD-9HDRdIio@Xp-0!tpRMXa`bI%Exllv40jJ^9wvcOSTWsv=KgVoE)z>O_`Lo*IT&Az9I(0A zvBDchmdPUWK|JmI`1trTFcau! zp^p!k@cQqB1C@NSNx;5vm|+6_QHKny!OZH;=yJ;bCfYxxI}=DqN&S&@S2yo|PLf`M zhm+Eec{C|0CCaAPYxvH0?h2bjuLbz2dzy>Q#oLKplIUV~G?&K@Vq|#lP4A6?5|ARj zypel;{@sz>-GE%;koY@>ZfjcqgY&*_+lkuzFU7_I8x!u_z&KpovfUpUFz(J+KO_Kk zPb~=qx3t&4g@icTyD6T+9!BY_J}i<*;y;m+K7hi(+yqbWU$Pw- ziF4Vm!|>jlZ2QsUKq(2O6vqhi0Uo(5AL!FZd|!sR#UH@|u$`#SKYE4(?g+;3bOTcX z?vDZ(+#g+xKxW5E3B)VQ>5P2mu1gf+VC@xF?Ap^DO!?Zz_^VC?)>l zm-uLm<=bjFxm@@q-grD(X)hFjw{nAM>UnA(B#pPdop7{PNy=lgot*Vbb1DU;E?5;x8#Ci-(^fLD!Nc zyd7{c#yx{*cF(rc<@?TY zCm>+q1R_Rzxk7{>>wX#XFaD`w&<_Y!-5}N9k7{Xv>hH(y`3B&OyHEafz>Wa-kv?+{4T%?2q1z#6N$nI zK>!i@8O{t40|9d;R9gN0cF(7}0Ys^8pt=)K9NnF3bS;2WK28rPBltg1P(n0>953!s zJTi9|?%Aw2)73R8TgeAapV?bn5=&jIx+=pTIel&IJf9&S00cy2BLpH*M37Af7&y>> z@L6QrGK20;iNUHHa8^wNG2qs$RbUOeOaX_YD5wHq3^_tP-rtu2_ZwLIW>T*?C;mYd z6>)E2b~&sTtHsJ}W;{W3%a!~og0jBQVYyMeVh zj5qI4QNZcI0nnTOk9CiMQpN+5N$#2)jOAeHffxMJd9NGkf(_Gl+8*6X&2hrJKa7!R z4{{m*O01ejYnhb)$R-78_FP9E#`zRu-9Q#1%DdcMpG^dUfZV(l8Ia`y!(DC+Cwdrg zhG->@f#t+13JS_&55SrK4#)wa2Y6)iKlO1anrx@5Yf^U5bcS)XceylJ^}&i=u70Fc z5vaQzzN&|L?}H(Djbw9KA^?d1Q4s(Egn{J(sKCI1fdiYC!>^*!b<Lw9Qtuz;&JlWE=F+=gXJ(9M#D-@^5reS;ac_$Li2U= z=nH^g;Y09eGOmddQD&nG(PR8b0O9(d59?N6|JVEBm?nuUw8ht`FwE-x4qiOESaUHb<#UleGaP7*YV(5lE+6 z#24=(A|Seeh-k=?-3t&F#T^JUd(74ZFcIJYyVEKX$K5P5{QxBLv^$lvd$%O%##?*V zlr+XT=N_gQeUq5lPmbeNXm0+S5I2&$E9-xn-;Xhy!b~ zCTl991dHs+#6JR-0PyUO{htL!DIt)sep!FU4tWL(0~qbU@hAaTJ|V(D0(b%0*eDz#c3r)A;DYIOx%o3! zuX=gT1tGpd2Ea($F@$hPuw9mmw=OT<`*YrQ-liY~A&BF&IQMGCj2R$q{5vfdZ(N>5 z0R}q^3w)%xbfYdn2@rBxP6FWr`{fiS5fQ<_aK#lN6fhQ)3$9S8v9UlV17tUp0u)>@ z3^2?{%S|StazQVbL@CAkO5_j=wAz6~nP{cS)Erru>=7C$TmuCcd9jeJKMHx z-@V4R?RmRuwvF0KQ$`b@wc7S|+O}ur!7wu_eme+ya#?XHGaZm8&52`tc*M+gJ%I-H z23{Ac;S{I&+cPBNactmc&JQO1__u~JBf`lqWWNsbHE@eC=k!@|Xc_)yR&3UY->CA>|C*J+qOLbr_2!2eq%^RkOA0r zYWAv}-?s5y4BEC4WFLvyvyU#f~(h*CeVYpysW?qG9op;L2OxKrb zP@~a^rE^aAzZauc_uN4-6}V=XGIXUn&>KSsX62}oT_#LZhBkCL)8P&?Y)RKu z3|e%UJ1@XtP7DfYp};@P%$%5gw9vwAcWA|E_RfW;QXN{kuENaBF-R*{Z^DdI*)kZ; zMxpCbn0E|j_Doq-(Z;hR$*OJJwq+hsYU_++^fBg~i?zqFy7YM8Tgd- z^_-5`5oE$p?_9=A&k%ScHD!5ohyP-}a(bV5#}f`jy%4eVIJ*KBqniWmKKSBC z{54ZQP=*th$E*f*4tN(l+joKwkww6Zvo^?KnmO>Ac>g%-o(lQk^uZ}bl@)+F_y+1M zJEfS>4~(I9mKHQjGkeVuBODk)z(OQ2%ojxj-RnS~C}`J?Qt)A+my`cTVD^-iA|zBH z3MEbnsg_byB1S0CV(1V;yfjlQYY2_314(pH3)UxPuR(`DTAlov!y51_S}=RbNhzzM zDya%{v4G8xS(qlJyb(9t&p6Y97(hj(>*=UoYT0tx0kv2nUohN;RM-oEp^o-r4@w{m zBV(97jL2NuI_$Ta&$f{TGS@HH6AS5>im8cxV#O57m`DR)L*QSCi7vz>F5Hn#T*J0n z)1KV!dW(g&sCqODU2Ql(sUizRhr)2nmlrBTX4l8%XaNrH4({FVu|GXFzGQ`r%ZT07 z_{A8{&%+Er^Ckj-f+aS`#Mr@wZov(>nFG%pAZ=q?fiBPXr1r47uqX&`!2=%xQM>qm zgv@SP6qTyULCaxiF74^>_kY{{ z>kk#kcuXS|zyr5s#$ zbh$gJu0@yL|J_e{|4*$!o(ysTIXIkyM^q+ zFPBV!u;Z7gutSGqaYw_fX=LH4g+-qYCvf&RCIUa_;u1Rw(^08DcO z=_k4ZT}i8ow~ZFkf78|T=3MUL8~Jl~T82Zq`z*)mSFxISkubN93PXdPO5j9>MNK^7mfb!J{{0~zB~ zB3BvlYK7D)#eg9E|L9VP7Yl2}?P8dY15frhb*=QpbE|ze+0a~DgUiVynF2U2PT=7L zkQL+rJRIl)Z~*Ik#;ND>P1DSoA=@r0J7g8iQp^-<3xenp2ufz@YL-SNeW%gBb$wsv z|K9s}pSN*Nj4claNp0E4a=H`6feS&=uf4K764@2D#%b%R&K^|v*k}y}+wfjX^lI|H zkFKuwP?lCosZ+9$Xz#R8-;C2m zv<08pD!ZGSFAkLDWLX!3u^O;g+@thrgx6D*4!!Iiwp{U026fhNCRwy^u<{)VB8bLr zOgFu1s>IO;pS}0BT~HH`?^ibD91Q2tCieR^{MvzVARGvC;^0qa@|eLcY7y;F2nC8D z0&r!A*mvo+YqH8LqH(^^=9iigv%=5&&(KgqdnRby0pHM`2N-&2D+PF%>>l6*n3BQ% z)WH^}^3kZUqgb(meWn9UM z9JY?+;Yuh-_A9ZIE_Q+h7(kAvDbh3;b)glrR=Vx!)0F{M=?g;S9%&(7{Cl{npo@lAtmZS@o$)CCL?4&eb#;1J*txGBI1oWQ{r zAIZKqh0_)em?{&;C2p-%zFw?5;W*PV6*x@+9ylb- z^1v}cWMK-(!EvJ?ui*qZ5KcIO6NZ5B0~dqI_*8awskKGXVy+@Uv2B4xV^6dwUjDGC z4SjE>`-aK?J8ylS15JQ|cx1~7zybj<19aNNgIOjX_8>p7XZB5dzH-xFe=W6Gm8=p> zS40c3smVoq!WsI)6oaOMYU9pD*t>7O4}O@pB&uV@3RDI-QAyh<{3hryV0!^ziVfJh zYF&iSTirF;4`+^*>La6a(5Zxxj0}8yu{gESX>n8u2EptZP3-6BfiLn8)07IHP`v`v z_j$})**MV7BLhkaV5q6pS}$tLsqL`koDdW1Oa#CfkU=Pi!8#ftU_vv3UTt}yYO$7EfGdvAR=pOx8~cG1PGqfA zdxcjZh2R(4iC0RHgqrU-O-#G%#O5`NTF}SdSz~;;sqvpcjSnvj$O-^8e9Qg1U*`g1 zqz;U0(A3r&fJ_(ygLN1{?y#IsCgb4K?ddi(HD#i)tmKlUgcf4+KD&0+bw*7{JA;;W zp~?5?Tq|U{Fsx@Q)XT^Nsy`uX0Gt5uV1EZX!1!BVX~b8X^k(j{0+TU&Ad{-S_25Tc?Z;mC-lyLC+)vrNb}GTc zgNKKA4p!$dGc^@DQb6)4Xra!VKflS{^y!SxRr*O961?nv{O0fVs$;b=3$Kl_ z!fg*WVgNF50EznHp+4b zUr+I)Q$RC?r|vuHQ$P*rV9?M@#LaOlq|IX@Jf%%7NTTRh$b!`fA6bCTqgM`%h6OXl zvmo2dCa1|W$@)W%mp>eZM^X`9eex$+pi^ZnDj z6Q8h?MGZ1dRLvFDHTL&oFBCxa)f5kg&&V#PbQqVw#uH$Z%#Cpokq3Z%?PtWtgx2H4 zepHM`fhZ69y)qoDl{v-CIBh}$ZO}rHUYusWfTGT>d)vKKbig$KVEX-Crp5P4#$K2Yv=Ld945;mV_TtIK1&{h zXiqQ0?G~TRFP3R$l7=T!q7u`0|Fp5=~z+*U|#Wa zu6puLNUlcMOoo0I~%gseXGTko58>3YZUd!k_jO``<& zapHJvj%F=A%b5;~dEj7TKm4J68Jd|aOaFJNvGvM;ef1~z+RyajT26ZFjpFcv$sFQt zA@U`#9NF&$G4*lLYIa$d=H#K9`Z-Q`G+Pu%Vsrd0GGqYqz`%oRtVVT! z$}*kUoo(M1(&Y`RYznlxX@yVN9w^XudK&-nPRum1j6*m;k>P{`;g!JHGJtRxouDq@ zU$pqHm$-+*+j{)iL6IE=M;AMcTkoP=U{u#I8FIRu?^E9=D%l?yl^h%wV36T(F_W1x zYu4`AvD?(j~wYnD6^O-4G+g`SClvgUR@Eo8m)c*!E~vvY04!$Gz;0e9N~iWCeXY zy}!T}E3)(oQaP}dN{XyQo+rC7Is^Iut`FA-;QBytjkCnE%FRl5R=!cux@&ZeFJG1u zeg38abRRhqWKn?W&_UBQnPOC}wUBm%ynslRMW-xrKx!kOxi$yfY><@SF7eC_kSM+GfXqL;ilE;euE`13+%Po77(&Y*G*}+BDPOANn1Fqev zj;yjS0mYU>GyrH|lxm2WG%3pgz`58utS?_T@8%V+>xwB%nihC>F`pftF=T)YC{l(D zssos+X>NMHioqjgQBD@3)b#;Vy@_x6mV{K{?c7G)EI7Z(bOQqeVTiys$}yS3F%(YV z0AT_M2iuBl#%=U z@FsIrri%`Dp_i3ssuZ8H$a4$(%(eOr)SwXch(~64!KqCl`ym6u0m9j+BZtF*aF$o1 zy`Jez@mmz#SBtlK(hU}7Tsvk+c6W22cts(@Z?DoiYo=d z8s~&%Ux*+#R6sI-3*1l^kRyj__L~0aYm{v`{D{-ZOG;fCP)2XyKo(L#Lk`=9If`8R z8DmO^;Q?d;$7hOz7A^zokO3fni?VGMJ8#*ZlC2dqlL5L|xM|MOiq-?kJix=*#18jb z@#_Yp{HA|v_=}D|zP15OLDYFK$nx;uL1UwU93HH%rQ46qWU_!Ng@MlVcJ>KXfgEqg zsY9{CPF!pgR;{dr9qRzX%2%ob<6t#a9Y=3`N6mp*S68?p+CZiopQ+fyG(K6+7%=^& z#HH$|k6nui5_sHYKdtuTi8TXf0GPf?fGbIn;{psP020PlUP(0DH&2si3OOf^rS?`< zFV{t6-)@E+q>3)_V?+UF0N{FN;TVFW0=x-=^?FH!Fp}a|KW0AU+pKHi4VxgJv+~`S znN3WP1As7>SmX$~j9Vv##(!_8H);KKfbHjBVdp)2;Dp;cVB@XB!xnOI_|Mi%9|w>B zCq!0H;#%F)+jR9hixAsyOQjwe(ToNEHml6Jk#J+O)ntn^@@Y)H<18UEQ+fCA<+qex z6=}IpaEOGlb72CozARHGftRxnwJSj+Ee-p2mAkUSd34R2qEvYZ7c_wB^SROj{;E_&nu(qTvaz)QLk1wAiGvLRsSnb> z?axb)EN8E#)bbYU{{cocqyNz4MXL z#!3^1E5jK;XB%-}sSl|nP;gYyoe%~%0N}F(lQ4|j2Ea%_QnmuLDFH_)5nG@lngUfM zL5Ane>{H}{0B`rb(@iY2wuGP-hmL_NIm~)u9Ex_Ec?Ud)t`4NnTlUp0{-ma#`Ek$f z{v4teTW$xm<>o>hcX$Q{#xw0p`q;G++|M%7iLL7N9~q*6j+Is!|N?@@7=U~8Eyaa2SQMldgJ4pLTURTm* zR{q3p?^6GrH~Ig>-Ufja;IJ434t>X1ES%8Ry_T$T^yLz-nYa_e03%S@R{TmO_qfu# z6IONnwWgnzIvMG(s^J7Ui$UOl-^bPFcrm3wfmMydvo`@(Bxt(=RM~6y5gphHr=-Y& zWWN$IPBSi4bDJv|-nad7DVjd9`}?=&2Q~lR*PHg1fC_pM8M=`a3D>1TS9>+CmKsx& zh^!YsGA>qdeXgl^;O4*7tY;V9Dod8P~e@D5S>PrP@H z&Xpwsso7j!-O3PK$7z~4AV8UdtE#~DDyXM~J72?SM{|`yln*U(8_q;pa z7}MFVtv-*YK6tQ+54q*GQCi?j?7j5UxDEV8a8PR2vgUdTMASJFHfaFd3`W8Pxbjvv21(Z);1~ z0=B=^(l30a&T?%x@H<0WUx7cvXpobwJ1=tTJBJ7BMzxwPfymlDQTyKmq8nyCU&RCL z4FGKGRy)6ck9s5iV!$h$p@8F(l}xs>v(=}AA6sFr0)N*x>o`V?w~L{ei1R!(4tucQ z^^*NpK=ri>^CfYE=-i4YF75fT@t4qfA3T1w;*sH7u6s=C7VIov%g3*)c+j2%o!5T9 zhkf&!{t#rYFPHORB9r~LDnPag1T%dTdk({+VO(mM$VBLj1mm+Lj|_*Q71P@!PYLOp zlYacN-9PN_sQaL$fPyqZ+4=~=NtTteGdcu5Vu#PZkSsV9-HF1`U{lWP%sMUr;{tTE zNik-DTB2PM6aWWOSKg~C7r}mF8zkbSgYbxY$IjZgLxk&g8owB7*DswU5&nW z0uh}86-K}{8@hA<>o#ypDd*7)`->p}Ta4H+)L>a{sn}Ads(E~b6Lmh}iY9Lh77h@A z6F7_Eup9|lTR!zB!C%(!+uHvNw!zJcK#KIp6dg1I6(F30fkP-Th{dc}{#;&x@keyu z7x-WQwSjfrr*txF&l6iWaj;YDCxc~&z7|s@zOMMTsvb&=Bi#E!GRVPx0!6=qiGx{$ zlhE4Qt=C9p!2+;h+4pYY=UZ#}0k?J0Bqhw_mpns5r&)DYRu%xu8;(!`L4H6B7&aT) z_wF??3UoQD>qihK2oqr}coXqjoJXEsl0mZk-pzcP*g+#BBOV?e-~nI@#|3bVWpCeY z0U>Tlv>n%s6694OYWS^3zP05)J=+Tr*}NE}Qs>fh)BtcjD;$fBM&J-wt2t5ISAm=7 zF`EbEn+8_g;H`Cf0lgrcc!D{U^E!XoQhPE;vT5cMmEE)VB|iVs;o+<^1RiP*5Lr0O z#*4eLB;~ePkZjM6?!NoY87lMMrLL>}VIBV~_r5^EPGxr#g@oDu&pM7re9!;_2T;zi z9D$*+aViHT7B;r$xdAl6WvC70;6XJ;0%~8qUjwAd?%vifTXdIy=@Fm(931vo%Q)-= zc_moOkUAvfH4nF=kBwBqgy{y?TEP2#5hSzi|CT(BqN^S}XuSfXBlZdk6eTY9Mx6SQ znsAQNOy2m2niB^<&#l!pi40eRdh4`@JY z_5grpK(pe9Ro;~pKiBq;F7Ii8xp?Oawtxq?VSzyXHU;Jre-fJ*Pz#RepcTx*U@ZfY zJMS4;&xEJeJhID5&_z_MNNZF~01#jlX278N3O6VQ0qeYVXJYbz+owKr%V&4)4 zIW|lk`m5dZOvVgod%}J49{IvsBocRjJOI0mT(+IqnebHTN)g0{QX!THP^ z2W4`&{F<*P8UQrlQEa=ZcfW^dsPS0YLZem;nG8UfPlw*wCDM`hFEMncF1E#A%`*W6 zz<8_-AYd8Kd66LRc#SrJAo<`1eyi*DT-S>Xa5eEV0}3}V?Sg$5lDJq$Becebw7A+v zEkGm!0K3UOfZrc{)Cd3c;p1uJ^F!6a0m7@}EQUj51!_EGw7ViX}*mv@#9o>$JBxqYiqVoZ_ z+t!OHbb9ISwC@t?-S3Cz2oD^3d9NJME1ZLoSF!-cyY07hv^JB}nc9J!y`OUoXmBZy zjZ1-=hsvvA1*#-IA8nF+egSGgFPlcz#}Q<;5^ixf0T@8mwj>~Ao5zOERj5vf&dr7S z^_}PLoi6|GXX+;low zCreS=$EO>!PUFd!V!{(FBY`2TdX0J3N|TU|?Kb~;%I}GZvO7E% zz0N0+kv0~{0@BCu#(&cks2iWmrm_Mz-p-H8%+MP)?wHzrUYiHHdA~PC|C-%99L?w6 z4dA8DJ!o115NSldU zyoOMDKGT^%4PUSTaa=G6vd_|C%gmQ$0++frA;45{VQn?>CUayme@hCIk!pZ$JT>mO z*W*l62jpse>j<|ZcWkvd2(dAY8Qsa6)Dst9O^5B;Hr8vOl7r)^>BfEnFchs-+tze2 zlmgPh=gfJU#BKSMQl0YW#vmCvvQ`6GkP~R*zfn1|K2piX(i!#uWV;?r*M7?d4**jD zBZ2C83`Jcr74|->DWzjN~CIQ0sAU{X8aH3t-EZreSLnH1TSr|6g9V?iTRQ za0#=}MRus@sKTSpLO91GPHkmgX8|n{Gs%RB4yLWvM`b}M7+93rK%~AZ)PlAnQ9@OQ z{tj?&cXBk;0RMP3=p8at1SWt!h*1i4MU@C^f2-oQTlkYq&-DU~gC1(IZo~cc^{>AY zVH@d{lRMv`Y5?wC6Q>AwvH!GXV(k%PS#y~V4J?QYPmU*(o4}X^u-4_s$ zGRiCsdp@&L%P&Y`8RW=8azp7+U@IeGu>ZAt_8kwN1Wx}b?`YAt%lS^XlQ4h;Fvdp3 zt}0emisVhAS-Dq+Y4Yh2iCBm(o9F!QOZ(niJ_RG3B(6X*fDFo(1dKO%{|JS$;8}jf z$;O&hpGms5@_x5QJK4hTt}*;$oQ42fJPQM5Ftg;q^p(o@ZC0Ktft@~XyZ4S?MVRCJ z$-vnXz}U&=RR?U_zZVw^y?K}OLddiPi?qJS>fZTW5e`IpTp_#(NOsf|Wcll+(PSV; zow}J3+M;LC$sq0R@Di1By;n#K#wdV9H!iw8L8DT)96WJ@d^5>63wal*_W!i~hgPfDy7eRn&5 z`W0489}Yw%W8;ak|1?|chq7)H(vlA2bdW{GB|LBj$$nHM&d1?&Dj;7LgnG`H4zK`c zbCLfaI*qpL{@w)rbUrRED#FA8@W7Xi2jLKahkyBEi{&XLke++wcW67#ak?+J6#}4@ zWLtZ~P*hM&v^-j=F+q&|L2MWh9!}r^4pA8%9)J&2;C($=qF@aiIkZjBx(v{@RT$M( zYHxBcrX4q*#=Ootk9B69*Krvfmo4Tc8Gxw|`=?7(N=Z#E{gJxgEIH@VkrXC77ozbN z87KeGohIQSxDMz2ap&JSoCSNB5SlT8%s%fWdy9Wx? z$v~-2gxX|s!jyAPV5Ds1DPd;aG1_J!?N{=XQi!n1^dQt)z8q$Vr!;_=9CYY#>&=V` zDcBRWSX<3*M_ zYw0=m6kAQXPIus=!IxaGltSN`(COlU$rQ)96F3kiJRD4jIZ>+)^V?JE>wFjh8PEE4RiTjN^0e_P=-bjb_+!mYCA^-Ki!u=`%#1CC4XSm5Er zQGiY8x`-f%spI>QMu>(bf5+2JbphiURDQ+{jE*?D2n7@K{AWYI@3xF zH`C>%knd1C;X%u;5g+&3Y6vl&*TxCK*2H|!3t$|8<-_vPD~5?2*p@L^iv*}N75ko- z$@to%Wl~V$8-mes6xwPqs?pQ6U5~xayWa5F1SV`cPichU<+EcV@XF?@K6bJjbJ-o^ z(4>G&ojokJYtJ$zm<`4QqZ8xs{UHn$p$0>Pp&6jA!$?exJGS7^WXSGuRP~qZ@YSw1 z9Q2e~8+=*ntflRmA+c4Cu})jy4G0aqjqj8XGP(yQ)47DL6z8!*6y&^Of*ap>j0_cM z^IeIBT>zeGQTupcTa-_;BA$&9YN#RrfL{0}ZUf{j6lG#R9iT9hiL9Jq&3G9d`AY8c zfjmco>ks|N6x&Lgre_K5q~(?o3%YM(cLGCz6JW>$hO=Dho5#k^H}=Bm%genV(WCh@u^OAvdv72MhT{N3F?=BRtweA zBA$9`)TLNjmx>d-Z)!(oi~&Y}@ z&RSZI{g`5F+nxH$AH6lSjL>wdLLOO8l2nt)rWE@&r2q<&If3cyZ9P+e1&ddH z&+TAr%?jjtz4|OVX&?X-cG_wtz{V38CoYC6aelGspQYv)rwCY8ve^EA_DeIjy{DV7 z5qMxgVu+o)Fr9?~V$VbkqFAm&9LUaIda3Ilki|5$!2!7Xeu`*;)1AKv`Q)V1>qKgENndE z8PN-zb_x~XW=f ze!^Z%Ya8m{#~o@$4G_WIqP){`nx@k@Ifg8Rn*zrWSh#553c?)ENv*8>TRVJlJABDw zI|=|KF9diKZY+57#qO|k7tzFJnAkglzKBOewMh@;i;~{@_qJiXk%7h4d}PiBNT9-` z)3QhcW4WLL2*3#pISqLrGD@lMx1ZYn%k6+&BSB?k*{xYm8DZb!GCXi&F~s~7>|X|Z z7@YpSr(K=O%lT*5|MP_#f!hE^>!S~CM=e--t52UsP186T@&LSn07L8nhD?sI7)z$JOzUgWzC?nr zQQapde4Qp=rMPEFL{Xe8SjF$4`|0kFR+1TTJZ&)x&c#Zdb)2#~*FHa2#tg*Ki5{o7 z|63B^2=X;Y!Pn;FuiSv$>b#C?{)g%buom#|mbG+$&;x-9Fkmf{p}@gF045Xr4ZRuf zYgYHC)vDYp3s-;d0t>z6VVCN@kR~-S5s(F#vN&i66BzVMi=;yjV(zV=WK!r{pFc;j z>paH#@_Nn|D92y`FE;^nsPHt+tCixoc$f=}xD)t!%F2qYXgSV+m=xpAu@H43ZE_7F zlriIaW)^FmHJqeO;nr0i9=1|1gzq~ez;)Ltk#m&vdR|?No&QRJoH@Ee|Ijul^(P zBmwWj9H-;i=4lmg&ld2lHxh_?ma-GJ0?bN=w>%v?lS6=QH3nQvwlhfQF@bS{L+)?vuD``3LU6!h?F#@6T2^ee|n?ADCw z!Fq79w~tFUv8?_Rekt|y`n+O-u#MIPhQPrTM^PkpC!D~e`2wg2(5D5!IIa-_^UyI| zO} z^pRyiOO>+xsBU#IwewI-sYU;P?FE&rDE# zBuJZHOuUelcVxQS;ubP;taG4?$)>bvrNnu9aq>uj;YlUjd`W=f1(c&t5RPZO^-w74 z455`f7In|_Z1&MeB9~apk(&Ut6-3vw(Fr)Jx#B#56ArdG;k2Y!j?0B{sW>W*g64pD zF%eDz)}E)FvPeB)9^4>xLq_Z047Yg6-*-sVLfSPwJ{2%E7CyPmu2o|U!@## zzjbth7&ih zj~j7Xz;Ys>tO@s#>V|&IoZQ-6C*M*a1#dnYo#J zH~ZcD;vSQYS^=U|L@~u7Z+SlM%Mzzr?L-1moMEY)m3!k{Tg^^zmW_3AR$v04`2b+$ zV4QG*rzY+fH7Kp8D`d`|d$-wVpX;-4!KmRQH?uSLH*w1K7jdeZ1emaU0GI#_VF(Oi zV&8-TG6aAc0M`@T<$tlgo+j=6BM}s~h~b?cw&#A%`vh|D-L9}}IPB85)_p|(D`9TW znyBKLG8xZB2U8{9rb`oGg?jbk#ncPP0vFT;sN+4$M_-bJ7hiKSrC=Rah2!3PH+yfp z_wLvFebf$gB+uDj)XIrc;`IC%|JZaE#yy-k#vQ_3?QVg*fxO`gw{X#%1uz25cmC!-+O_Xa zQ9-n3jSJ=b^LX}!`)6a@uz+`fpnguiO0R@1Hep`;UNO!B6LAc2La-Zqhi@@Uy3~`}I z3>ji1Hw2dfWuJSGPhcOEk``-_H=^idxr%u8w=tQ8%+FZLwt zR%Z1UDnQtV%Virx5GxbG+R4EW`}OI8Cw{B}{?+f@()BOBctxGNXp21{Q!)QsK472w zRigH*ZF+B%WZfGnJC=Vo3K&EY*j#P{NGhbNaX*Z`e8h+S`lsH+pZ?T+Oa1r$-nO1s z=svLGG=Hw<&)weB-nRd>8D?R zZ@yT)bDLgFAN}U(lb`=P!O6d*b;HUArwj|TT87zy7u945_$c-{V&le z_@a+KU?1TOej-(;#$Q$oNa@6 zTV=Rt9P7}@gvP6ktZ@HX4oPr8NJ+3tPm%fe?5RVh>|a{MvZ7l^O2h$`QkiMR8L86y zC>9+qExbr+`r{1CnW@x40i6qAbX<+8%*4YW4^zUImYIyLDM-o3bK<~C${aav{{tw_ zKrQB?9=h`Iq&lIVT3X|yPoEheIWl!{BrZCl5w$6nwx}^?@~|W`UmWR-+ISSlaRJg{ z0VL%ZV@$UpYK48pze0BerYjFeYUaNRy{qTn3ag$jK*ks&C2^3InbR1@@tGN?zr6e^ z^hFS6jsZGNW27V$7!x45_a$|@vY+nLNGekjaX3JuX)U2>5Z$mgf zxLdX@9XJeNu)KzN0)av#evQTJ$|&nA4m|v~3gfYK*3X`yy9G~Q?c~c)B6LG-emmB z2;k{>oa}C!E7Iox36|xi-vYO(aLZG$E+wTFtWmyr6;1)*ywt?z{3A<^e)6hX>N2_V zAE|dtJO|R7ssvWmy|Q#H}kCzLK@Sb zsUldtmDi5!8c`&(!2i@3)*4zsEs&PkXiQbm>y=Hu%U4wi$M_1t;_q5_*h@ks@kFTK z{s$k&9MhPlX-qkk;wmCb=ClmJ2hOj6hB zo>;c&?wG4vT$GqJe!AXgmT6dQYt5e-AdJiu>Ij4F?#|UODH8#h-ra4xy8|6aAeEAo zN)Ujt-EFM90gw_2aY6URU_hXY^8$=bw~e`L6p~1!?r!%BFc^WjAf*&G9ov|@OG}8v s=dq2AIWHt6AxWlVY;m_K5Fmpw2D1SIAq1GaSpnv}xzK>PP@ESB7gOPkFaQ7m literal 22012 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

    #XY#pK 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 + + + diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png index a3107af4b1d80929a7d05b35f11b16ca82ad0599..325bf570f53b0caef40c45fcf76951a119e25e64 100644 GIT binary patch literal 100546 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

    ijLs)m_DcJO|5H0w@aCe?rNdNDh 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 z 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 z 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 z

    riXwF@uPihLJ9!=o3vs8vza=)9_^SPgaL+J94F~LrXzOW`WV}D4>oJLc6tH&8J zgH$uki_~7uBztk%<-jY@1Y|gJ;H&ctf3$udAB>HfA-`$IN&;QVzA!hHCqU+$pu~*A zZp+QdFv%)CUjPPn%hs=H zd?MZ5CL2CEx1Cun3z6o$NykOTi8%`~^d;O)E#_IUWOiVI6P!5TbXxN9g&)Z9dB@(! z`JKFLUTeACdO)z8bmp>tVKHib9rQ&Ee;LoL0ex7crPlrWi?;AD>h`+Opd>br`FMt7 z(>V-wVD2xeD68{&{Pa7`toKN7Y-~o{YD1%{O{O`WRK|$XMBvt|E!F2|oiFDiGTouO zP!=xdm>KNpz$Am}0agJgHQ|x=CNNEo$5q6p!w?vFvA&!*O19fUr5h<0$=#PmVqfue zx?A`V8e0IMyNhFJ8y@j4LkOKe5C|Bgq)1g>fA2|b=a;qi`5Jq_4kEJgVBbV(%;&&X zreT2{13IJCfJTNar$UEx19Aio65>1pu&)h#$YioN%J|^HWkb zSq})B%V8~W4ef|X2XQ}Yn+ClF=c<51po@Vb=;~#VYm=w25itv*ZIh@~Zie{=$rm(Y zj*QXg0q?G}%keJTMhYJ9cy=_7d1w)ICe!!`3|@caNE_E;!^^^|7z7K(?|Zpmy8Iyb z9NX&_^~{3HTO_c#H_fl%=5VWS(&1h4V-8(RZ4JE>;t?uU2Zj&Cri!7PCO?$B>Gt?= z(&;QFbArX5_1PZoC!6}5K>+U-dh^xcfX{VOJ>fhs{6|};#}O91j0Z$}Hkz0ZAZ@k3 zQnZg6HxAPN4gs0}3`BP%n!Pjwu0f=TU5(o#4Ra7^M^kk^W}Y4r;2~y|H4xE(49{rT zRx-#Ll$tlR&X@(wY9}*x9m|~M^EDa8jP7#?jWiixR0s*sn_X3@mzktkW|TgEVQCGO zlC}g{Om>9tO0_x`*?X0r{65l@y%t|wqH3>=ZV&7P#<2tPmb<8de|}|zwHHx$1M=*bQbpQf$YIT~QI#=3 z8091YRVfUCK}A?E(la`$BQ;0k$Zh4zYS60Vq|T5hu>jcmLcA834A|STP^1xCJxMw; zicTjo#&>{FSn$Cqc!%q%Y^Nk7VM+&1(JV`QBusv{$PNVqlBqSbb+TMPw+WTBUOVWk zS`*4-ipqUn)V=3{Je2WxGm+5<@yqoEjvolh;IiLUc}7p`9u8Pa!{32XrvfJGTv!Hb zU@q{lV(jF{IXMx#hlZ||<82xSq+grlN5sQH`!Cp!s)Wyq!Ph-Y!Qwp#3TL0&YErK< zwg)Rl2Z{DTj1SU6U5a!S8+eFd+ONOPR*Kcrc4{&R^%;526VU!XW)cS&7#8hx#0#KK zFIW{by%Y<~kxE?-`V6J?Bq#t=7*iOvLWweC%qHIUqF=yL6a-rW#xu>_d^o#|+`tV| zH+m$kdMMCCAz&;_F68Ds0hl*&Q6>hn);3{9F2>JWN%Nhf*8 z!0+Ct1uGRwsiH;D{i8vqjERL`dvL79SE3Ayv}{|1h6P+#ZAAcvs`>+3v?PKy4AG=y3EOQ)G`B35e!-#myaU?a(VdWE zVKnLVC8{E~>-2Jhwz)scAaQUwNi!#jH;o=&LDj8O;%!qPzX;P?H{ z+KW3jK$_8P+t7^ov)x41rnT)EA~t?*ZEMD-P zb~+6v2zw$LCNzC98G&3VSWHXlLv=7&ZDe%rcC`~ukAUSQJ#|VUAL1d79~Rm`hB=L^ zx))}Fh4grXT@NnCV~WP{9)rq&gHQ9Ja5PSPOdU$oaTVL0Cez!Ndpccc=VARdq@0n~ zY+b_ch$kFM!jjy+6bwY`2EGdjaWvB zfNC>>30h)w22MZo@`~?>21F!yZlrDoGolRymGnD@6pt}Hd&{elo<5;DT#sM^jBIll z2cs!7cFi1}C9?5IgA>SX9)l}pS`=$E4OzlD1dK@09{Az@5zm3%^uh$+q9Zz*y{Kg1 z0%juZTc+}A@d$#PB@R~C`*-gOl@<49ASi&eV^dxf7ub@P=B36)13_U3=%AD4<}In7 zk0$9*n%alL=QyAjW?;O)q3g<0nhxO64m-r<#euh;DSo%Jql8Sgn;_|e7qBT1$-vx> zYbfLnK+qO{hkEC*SDnyG4WDI?jkl~dM%>OIhKn-WZOAuW1wVx!hrvQ`P90^4dx&Kpf4?xhwRl_+792W@+?JaMv=PI&=H~#^+Qejgd@McF zP!05UiCNhflvAwzkUn?AIV^>CTR@DXs_$?IfxbDk7`ADZnXCrbgf{JAW+CeFT!q+^ zh9P72TgYFmrqrB2Q2mr#bGUwvj znluV`C`qRQ3qzzuEmy=y;72d0m4ED*WzbXRq)```e@rGzNTDS#p0aIb-S1<}E6kWf zJ)&EYu86qlQ8d`bSv4Ijh6b!>1;ZalUxv^PU_>Vi1vaIPoWmtBhJ~9FY=ZACd{>|Z z130dWG@^u$ci~`1Hf0-{So)7N`2YwqeI~vtF=IQt*Kt@z!R^eMrk<1L1svq> zzAGYoyVlcM&fqi$)Dyu%ZCbs}>Y=d+=;oc=d6NTmzTt#L?f)QPYd^F?|F*vqb1sf8 zUEICX1qI8VkGGkLS?XZmdEYY!Pi(L}PpU^rM@pxKN8~7r8dM#_y%GPor$vgcG|N(^ zB2jg)NA1`IJqRhD&M8RYQW!pkIUNf=)>h0B99m`d%CJVnhF2L5$5F!UY8z9q5VSo6 zpOn3-5uEZyj`n&vOPB6<5fH>fvL8nHgKuP_S&tdpzcAi-&ReL<^L+M^kSC zEhvzdDTzLe0jE0=lZXeSX~2(*O4G`L31#SzywY&(jn8JzAQzAtQ1# zIJ_gHc>d;C+kr9vR1lIDjGzY#8HD7axdBNTVorljzY7{=xy%qmh9%}qUsewtVCpTq z0ML#jq*IV1rL$qHD>Sh%3C3vWx(ejV*pC^$zK?U>8AOSfIe;fAgKV(#gJqJ>-wAUD zFD;Oeu#CUNv{Vz1uCwWStmwc}F|-0sDr0Qb?1;2P^ER+#WR9A)v+d?C%VzAaUT^VP z@b|#Xzg9AC=F|1U8Thb(FL6bH7y~xfX@B<p3LI7aeQYjD$%ch8NG!D3BTt`50wsUm5LrZ?tg+O1`P4Z!zIL2k@6hQOKnBY#>PT3*0#{|vpfd>E58y$| zWs%O%jj8wh7mmP<*;5alwJB!?tSVz=@A*$Xfc<88tHjIsdcesm?GSW-2*!c4LETAq zj;iJD^QQ*flV@%h)p{Y&@?90x>n&kXIhLDKu0Al-aKu^`I#wFx%z(-R*>c~p`I1#& z+h#_15D;woG3gsjXuKLW1ZmjcvbIrn8RJ#rQBdbFA3(U;zYT-KN^xF$c9{B>$>+jU z4{V6Ba)B9uEkd)6O`s@ny4k%mALH>zG)fIk6Zn`|?BH$f^Ha|#Km*!<(WZb>0G1T| z{j21FEl!?>)c3|1b(j+S!|iOtdcJ|@Ig5NVDk?@%NaAbP)G2T|NpHIht|}e|c5kPP zNjy-dh%r_RkUw(n-_6AdoJ1w(+9=zL7*@MZQ^uRtOl=Y)5vtynQyKqwUEDFp**(Ft z40K!0fqK%0f-MLg`d5+_xQEGY_WbpXCg#;JnDt~(6}?Q1W=LV5eLMGj>QoomJK zBW~3rZ7wWDh-++uayET*!Aly8k%}#&X*DKRMy7+zLMG&F z$NV;Q-QuN|br5uGLlMu2ok%4&f!B~A7gJ0ylZMipW^6tFHl2BmX5xvx2L1{O4tZzEu~y5WPsTXY0T8x=T+ z7qwNj&H`{Sy?+M{ckH+aov|e~Nx>P2M$Bk!@@b12dqysvF~yXjiJ7Y{rikc40iaB< zqZiFtmolVqdU8sT2AFaTE)3Aq!|R0lbGHI2Ru?iN9-{@fuP=uT=uQPyZbmAZR5?G!TL8+~KvgtqlGOaMT07&TN0@dG-*k_nzp05U84i zz$t~IDFZueE*X>*5f|H@RNlJIc^H(bbToa!qZzEr5y7ql+t7~`uw^R?a74DoQpfsAoUpfy4r6JEtbu%(<{5-J%JOLgq1^(^IKy4Ji|{oloQv! z5Nt=kORx>;&V#?X%DU@>O&sl{z3t(mR$UIt8e+hbO9Y<^CK*t5Tl|#8HN+*py8hhu zd-KodXVh#v?3}U*!{AaGbh?JQVYuJ&hfKoC8y|KsW7O}3dKvRMgF|~o5U+P0RS&xT zZcWUNpfAao*-X|u_)t$`HW?de##TtsUQ~T>crZ8Eb)H!DOYfW%mzj9?9-G5-n$-)9 zR(e$2267njeSP$FolsTM<(Ew=%Mn0$&!2+vaUm*UyimgGtv;J=xkdC3##_3|_%P^l z`kaZO=0joH6~s#grSoa}3A)k|)C=%01MJ)V*vW3b`3oio&at)S(J=XF7)mOLQo1_m zWN$Dzlq#1(0vu7+8fyVCujE0JM+Dup>`E&2$+hXnF`bY_kI)tHd}W{x3nKK~B5CU` zG~LxYThI;Pe*wD$mT3agjy+U@o)2Yo%=sb}aBA3hpjy8U9hPLr1Ye)Sb;<0F+Z;pd z(B^I*gBJpX1=9`+{hm~C(W4=>w&U}h^EooTc*z|6DK8gKBK(vtA$_}om-SdBbiDQN zLe&NBd!Zqb z9?XP5vz^$zeQR%86Bd|VA1%G=p_+sa2K6;t@2-K9I}>xuG1;ag4sSV~U)8B0vjCqe z(#GkRBP!YhhGp0*FsDAwVn7gqK(3v9w6nOe;qBlmjQg$sx3VkCl3hoEf$Q#n$1mwu z7BQf_-RE?D)ReZw7$A`4pDF+S1|MPGBsa8`-=A|_@uOp7?b9zE4YfN2?&I$jK+4L@ zNd!LjpDKf_{C$#~vb?i}LFqC9&38)Zpq_Iw zS~KR`%CNN`-=Mt!%Qq$wFb5;8NWf2J@Tyv^s)WbnS^X4!Gs%zIGFOA=Y0MIt>yRp$ zTnP*PBuGr$#??j6|MA7ub!?*z=+H~vYG31}~`R^cr|GVZ8CUmOdlDOh-rE@?)KEMC5Kr0NM*Oz3Ln=HIwshi#v z;AChdux>$ZrVS$TStJmtAH*qXhsJVQnlA}i!mw2_fmq2Ll0Nsv5v$)*>W__4L7xMI zjYNQpOj7Lloq+IcJ?ZBtL{KJq%uvB+74TJ2365=jT(y^TvEM=O&52_rC3;&u&eMZz z1<`j12Gq~_T-75giLIkg*j(DjV}*?6eXa6edj9-4c$8P?2X||~u3Gob*zvTB_~dF5 zV+ZipTxeglSRLhNXk^M7TUdWp0|okyv_T*|BeGAH+>;Ig%mr^SygzINbVY8u)B?EZgk zQN{*OPr2uFT;7S&4ibBKw;X?u0tTI=)}k#ZKhFA?msklHbFP*C@9(*?bNV#$prKf@ z+PFg=l6i!qykpn;JjeOc#2#dl1K;1_Gqk0hP5?PCS|3;i&hloTbg(Sz02TyeXIo@ zIvUW_Y8zoE3{>5kf0f2x8*xc_(Pipm^+SEkYMR%-fpSXtdS>0wrUXdA4olX;rr%M+ z*$Lw3^u4qC)o%1B{l)?3*Y9?WH44%9elsv*;__S)`jmN4F&(P>N<2k zxl)~K*xQFM2f$CDF<;Z|DviI_7V6MeM~3i8RGW1rv6iwcgu|Ja1>wlDA| zei_T`|5{+6=268-?EAa)%XSP9rSm!Y?{5LahGRcdl|aRFh-l!LK3)E`vS3K$Nuy&?>T$&V3SH`M&NXnq3M`16=rX=7X<*&T>iut~J@pZnQ!zhnqBcM^g~2nM`?AL_ypWnt5F>W5qVPNy7RWXn z1P)Cw5Er~kA7#{SgR-YcekB|Sqx1GYSGGFLYWZ+f1%#6$V?_A<5Rxt;~MM%<()l;+uwz~oU|>}!r3i-83$p&$7M zyZJ0p_NM5ZPfmG8XSuh7$1Fn;2t-q++OQA*f|GhfVZjVK3fLCF099#)nZcCT>(Lkf zoa>o=-wDR5CJX`247u|P0YKYas!|W~t}vzn1YjE`33#St{`m(2y0ZR?*G3Y;q$zc^ z=jGZdZn*7SDu^SEoTC0ZU$q*`#Z;vc^^O| zoxOq~!p>kJ6idjs{$KVNIxE|bzpGuIRT08_`M|8k`Tz4C;GjQHDSReOW|aDw=cgdK3)Jfuf70K4rJG;l@67Q(o=(ih$j>|E ztMSHZhmVR&ea1Wk4#0PZ9~+n+ZCzz}J-_@}G;N-2uvQ&;;~sX zhk5t2^I3MlolD*`GHaKsvjz4m1HZT6v+Yghb&c_9_fnBSHTs^L6_e(*%>*rs{3&OH z#Rq(^`}-sUt7b9JTcV#;`1A9G%%CH!R}isdpLx|fV6c8>VQjEENkGR+!&Q+50Rx0G zBR+3G@>R0%6xN&GetCXA-wO)vaX|Q3Iwi%K=r|ip5y=4WIn~av3Vo~p8Y_`|PkQ&d z{S-uLUzPB8Y^}({=vP60u(zc5fA9GjI!(NEvy^rz@~w#6y>5_ayXBjNebN_&h_;!a zU`?xtMjQd5(6|W(A_l;YKdXMI>?Emxr+~-n@vAux#laF5=;DuMfxr%*X+VME>US(>x zd!I-UxZ@HkTP>?_zH$U?|8YuJT`C;>Ry_(?T{iwqtO%kJ87| zKBTDv(z#d>QfnIKS7y@N_wv+EZ#yaAzGtfeS;>$-v%(Nnm4p%G84Y3T%eKU)Wnlf< z2ii9ekJ}^ozll~0vOQ>}W5WbP<9GP2ye@T0I~s>t{ra>`wGB7T$=m(6d5?S0VK)l_ z;{PWo2qPnb6wPr?$T}#pa+b4 zjq|RapDbmzL{brayWs#*&!R1Zj4Mh#zkg&0wi(lKzZ>Gy9pgQ-7XXpV`uuxW0Kyp; zV3ll@wl4`&I81ceb?D$J?_lWO)JNrBdZ z{EzU zZ4=Y*n)#gw)BAy`p1{Hqwo{HY4ryb0kl160sGa0-D zz~#(If2?xnIwh?X`UtkJfaiW(yZ49vwV$b{pVoFXWx5?88&;cge-ojEuL2ma3BwbJeIn_SgPr@hQvBK<@W3bDf$~nh1z5d9je$4cE*FpaJijZO zKeGzX183SaO`_mesB$wKEQn}R$i_z2T=^;&i`CmNZO=S2Pu`Cj7+9Eic)IiXtS$#s zWnXCL-t+7^J=JZOXWNcu8UXuP_Tc!Wxk%AxC1|`ZR}HV7jjXa#Lw<^Ko61eieXsd) ze@Y#ncApn((O`ivA^3TNcnj=+TxF$dZMTtx6c0rjJoxyz02wsk__?o|~Rz3&Z-J6QJcN3lYN zJP1sVmQo>MV|_Hn`lOR%7_K$MIz~A9nvOX>HO&W}U^zD=oE{nE+%18B^+pOS`0z)b z4hQVgp^P!ht+tThHA|yG-($mE%;YxQacIsjvzpJ|O<(_f!pVAj4H=P><_C7{0$&w;^zk?_IsiCUO{_RPk+{*QD}AXQ z1Q>jZfz>l*P^fSi0UCpGJo1Go+w+AkdPaDTpS|}lY?+kgSmFFf?yXH?(AyA|HiR~_ z5<%K#)Opj=DD|C!xQu(DWq(?D{#D&P+;AgH2?3fw1cCI_Si5~n~vC9l)P4^pW(Z8##)%U zuz%YC<4Oj28Yi!F%YZQtvPIgJj>->;hynirP`*D)vB}pR00000NkvXXu0mjfiW3EJ diff --git a/tests/uitests/src/test/snapshots/images/appicon.element_Icon_en.png b/tests/uitests/src/test/snapshots/images/appicon.element_Icon_en.png index 97ef3ac651..243b33fecd 100644 --- a/tests/uitests/src/test/snapshots/images/appicon.element_Icon_en.png +++ b/tests/uitests/src/test/snapshots/images/appicon.element_Icon_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f43597d36fd123dc4ec478ed8ddc3160d383881623d613b8ab8045f042b80cb -size 44846 +oid sha256:96db51e34f64dc2fc5987b1b0ccfa94e866facb37821278cbd4d56247b2f63d2 +size 13785 diff --git a/tests/uitests/src/test/snapshots/images/appicon.element_RoundIcon_en.png b/tests/uitests/src/test/snapshots/images/appicon.element_RoundIcon_en.png index 5811dfb607..70625c9bbc 100644 --- a/tests/uitests/src/test/snapshots/images/appicon.element_RoundIcon_en.png +++ b/tests/uitests/src/test/snapshots/images/appicon.element_RoundIcon_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:74af6c3ed723f027bb38b2fd7c4b0441ff26149abb587058bd2bb5be9adbe63b -size 40692 +oid sha256:8526150ec60c72842c4354e5c1d5f240813af6110e9f32f515e14954136ba514 +size 16123 From 915699a265165932b00a3f95c6eb1018d5c968cc Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 7 Apr 2025 11:55:35 +0200 Subject: [PATCH 45/54] Allow using a hardware keyboard to unlock the app using a pin code (#4530) * Allow using a hardware keyboard to unlock the app using a pin code * Add UI tests to `PinKeypad` * Also take into account the numpad keys. Extract this to an extension property in `ui-utils`. Made `ui-utils` also a compose-compatible library (vs `android-utils`, which doesn't have compose dependencies). --- features/lockscreen/impl/build.gradle.kts | 10 ++ .../impl/unlock/keypad/PinKeypad.kt | 27 +++- .../impl/unlock/keypad/PinKeypadTest.kt | 131 ++++++++++++++++++ libraries/ui-utils/build.gradle.kts | 2 +- .../libraries/ui/utils/time/KeyEventExt.kt | 34 +++++ 5 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadTest.kt create mode 100644 libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/KeyEventExt.kt diff --git a/features/lockscreen/impl/build.gradle.kts b/features/lockscreen/impl/build.gradle.kts index 808abf9150..ad77b20e60 100644 --- a/features/lockscreen/impl/build.gradle.kts +++ b/features/lockscreen/impl/build.gradle.kts @@ -14,6 +14,10 @@ plugins { android { namespace = "io.element.android.features.lockscreen.impl" + + testOptions { + unitTests.isIncludeAndroidResources = true + } } setupAnvil() @@ -30,6 +34,8 @@ dependencies { implementation(projects.libraries.featureflag.api) implementation(projects.libraries.cryptography.api) implementation(projects.libraries.preferences.api) + implementation(projects.libraries.testtags) + implementation(projects.libraries.uiUtils) implementation(projects.features.logout.api) implementation(projects.libraries.uiStrings) implementation(projects.libraries.sessionStorage.api) @@ -42,6 +48,9 @@ dependencies { testImplementation(libs.molecule.runtime) testImplementation(libs.test.truth) testImplementation(libs.test.turbine) + testImplementation(libs.test.robolectric) + testImplementation(libs.androidx.compose.ui.test.junit) + testImplementation(libs.androidx.test.ext.junit) testImplementation(projects.libraries.matrix.test) testImplementation(projects.tests.testutils) testImplementation(projects.libraries.cryptography.test) @@ -50,4 +59,5 @@ dependencies { testImplementation(projects.libraries.sessionStorage.test) testImplementation(projects.services.appnavstate.test) testImplementation(projects.features.logout.test) + testReleaseImplementation(libs.androidx.compose.ui.test.manifest) } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypad.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypad.kt index 596c6b1b59..820b557423 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypad.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypad.kt @@ -27,6 +27,12 @@ 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.input.key.Key +import androidx.compose.ui.input.key.KeyEventType +import androidx.compose.ui.input.key.key +import androidx.compose.ui.input.key.onKeyEvent +import androidx.compose.ui.input.key.type +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.coerceIn import androidx.compose.ui.unit.dp @@ -37,6 +43,8 @@ import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toSp import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.ui.utils.time.digit import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -60,7 +68,22 @@ fun PinKeypad( val horizontalArrangement = spacedBy(spaceBetweenPinKey, Alignment.CenterHorizontally) val verticalArrangement = spacedBy(spaceBetweenPinKey, Alignment.CenterVertically) Column( - modifier = modifier, + modifier = modifier.onKeyEvent { event -> + if (event.type == KeyEventType.KeyUp) { + val digitChar = event.digit + if (digitChar != null) { + onClick(PinKeypadModel.Number(digitChar)) + true + } else if (event.key == Key.Backspace) { + onClick(PinKeypadModel.Back) + true + } else { + false + } + } else { + false + } + }, verticalArrangement = verticalArrangement, horizontalAlignment = horizontalAlignment, ) { @@ -183,7 +206,7 @@ private fun PinKeypadBackButton( ) { Icon( imageVector = Icons.AutoMirrored.Filled.Backspace, - contentDescription = null, + contentDescription = stringResource(CommonStrings.a11y_delete), ) } } diff --git a/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadTest.kt b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadTest.kt new file mode 100644 index 0000000000..e51b007312 --- /dev/null +++ b/features/lockscreen/impl/src/test/kotlin/io/element/android/features/lockscreen/impl/unlock/keypad/PinKeypadTest.kt @@ -0,0 +1,131 @@ +/* + * 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.lockscreen.impl.unlock.keypad + +import android.view.KeyEvent +import androidx.activity.ComponentActivity +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.hasContentDescription +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.isRoot +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performKeyInput +import androidx.compose.ui.test.pressKey +import androidx.compose.ui.test.requestFocus +import androidx.compose.ui.unit.dp +import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.tests.testutils.EnsureNeverCalledWithParam +import io.element.android.tests.testutils.EventsRecorder +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TestRule +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class PinKeypadTest { + @get:Rule + val rule = createAndroidComposeRule() + + @Test + fun `clicking on a number emits the expected event`() { + val eventsRecorder = EventsRecorder() + rule.setPinKeyPad(onClick = eventsRecorder) + rule.onNode(hasText("1")).performClick() + eventsRecorder.assertSingle(PinKeypadModel.Number('1')) + } + + @Test + fun `clicking on the delete previous character button emits the expected event`() { + val eventsRecorder = EventsRecorder() + rule.setPinKeyPad(onClick = eventsRecorder) + rule.onNode(hasContentDescription(rule.activity.getString(CommonStrings.a11y_delete))).performClick() + eventsRecorder.assertSingle(PinKeypadModel.Back) + } + + @OptIn(ExperimentalTestApi::class) + @Test + fun `typing using the hardware keyboard emits the expected events`() { + val eventsRecorder = EventsRecorder() + rule.setPinKeyPad(onClick = eventsRecorder) + rule.onNodeWithText("1").requestFocus() + rule.onAllNodes(isRoot())[0].performKeyInput { + val keys = listOf( + Key.A, + Key.NumPad1, + Key.NumPad2, + Key.NumPad3, + Key.NumPad4, + Key.NumPad5, + Key.NumPad6, + Key.NumPad7, + Key.NumPad8, + Key.NumPad9, + Key.NumPad0, + Key(KeyEvent.KEYCODE_1), + Key(KeyEvent.KEYCODE_2), + Key(KeyEvent.KEYCODE_3), + Key(KeyEvent.KEYCODE_4), + Key(KeyEvent.KEYCODE_5), + Key(KeyEvent.KEYCODE_6), + Key(KeyEvent.KEYCODE_7), + Key(KeyEvent.KEYCODE_8), + Key(KeyEvent.KEYCODE_9), + Key(KeyEvent.KEYCODE_0), + Key.Backspace, + ) + for (key in keys) { + pressKey(key) + } + } + eventsRecorder.assertList( + listOf( + // Note that the first key is not a number, but a letter so it's ignored as input + // Then we have the numpad keys + PinKeypadModel.Number('1'), + PinKeypadModel.Number('2'), + PinKeypadModel.Number('3'), + PinKeypadModel.Number('4'), + PinKeypadModel.Number('5'), + PinKeypadModel.Number('6'), + PinKeypadModel.Number('7'), + PinKeypadModel.Number('8'), + PinKeypadModel.Number('9'), + PinKeypadModel.Number('0'), + // And the normal keys from the number row in the keyboard + PinKeypadModel.Number('1'), + PinKeypadModel.Number('2'), + PinKeypadModel.Number('3'), + PinKeypadModel.Number('4'), + PinKeypadModel.Number('5'), + PinKeypadModel.Number('6'), + PinKeypadModel.Number('7'), + PinKeypadModel.Number('8'), + PinKeypadModel.Number('9'), + PinKeypadModel.Number('0'), + PinKeypadModel.Back, + ) + ) + } + + private fun AndroidComposeTestRule.setPinKeyPad( + onClick: (PinKeypadModel) -> Unit = EnsureNeverCalledWithParam(), + ) { + setContent { + PinKeypad( + onClick = onClick, + maxWidth = 1000.dp, + maxHeight = 1000.dp, + ) + } + } +} diff --git a/libraries/ui-utils/build.gradle.kts b/libraries/ui-utils/build.gradle.kts index ec75f6627b..40530645dc 100644 --- a/libraries/ui-utils/build.gradle.kts +++ b/libraries/ui-utils/build.gradle.kts @@ -6,7 +6,7 @@ */ plugins { - id("io.element.android-library") + id("io.element.android-compose-library") } android { diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/KeyEventExt.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/KeyEventExt.kt new file mode 100644 index 0000000000..580807f987 --- /dev/null +++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/KeyEventExt.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.ui.utils.time + +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.KeyEvent +import androidx.compose.ui.input.key.key + +/** + * Extension property to get the digit character from a KeyEvent. + * This handles both regular digit keys and numpad keys. + */ +val KeyEvent.digit: Char? get() { + val char = nativeKeyEvent.unicodeChar.toChar() + return when { + Character.isDigit(char) -> char + key == Key.NumPad0 -> '0' + key == Key.NumPad1 -> '1' + key == Key.NumPad2 -> '2' + key == Key.NumPad3 -> '3' + key == Key.NumPad4 -> '4' + key == Key.NumPad5 -> '5' + key == Key.NumPad6 -> '6' + key == Key.NumPad7 -> '7' + key == Key.NumPad8 -> '8' + key == Key.NumPad9 -> '9' + else -> null + } +} From f335eb1106c42b5f28734eeaaa0d42d70b5e8046 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 7 Apr 2025 11:56:25 +0200 Subject: [PATCH 46/54] Fix the share location URI (#4544) * Fix the share location URI Use `ENGLISH` locale to make sure the coordinates are formatted using the right decimal separator. Also, when no label parameter was added, the URI just centered the map on some coordinates, instead of adding a marker. --- .../common/actions/AndroidLocationActions.kt | 15 +++++++-------- .../actions/AndroidLocationActionsTest.kt | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt index b059a88dbb..304f8eb1aa 100644 --- a/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt +++ b/features/location/impl/src/main/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActions.kt @@ -11,12 +11,14 @@ import android.content.Context import android.content.Intent import android.net.Uri import androidx.annotation.VisibleForTesting +import androidx.core.net.toUri import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.location.api.Location import io.element.android.libraries.androidutils.system.openAppSettingsPage import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import timber.log.Timber +import java.util.Locale import javax.inject.Inject @ContributesBinding(AppScope::class) @@ -25,7 +27,7 @@ class AndroidLocationActions @Inject constructor( ) : LocationActions { override fun share(location: Location, label: String?) { runCatching { - val uri = Uri.parse(buildUrl(location, label)) + val uri = buildUrl(location, label).toUri() val showMapsIntent = Intent(Intent.ACTION_VIEW).setData(uri) val chooserIntent = Intent.createChooser(showMapsIntent, null) chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) @@ -42,17 +44,14 @@ class AndroidLocationActions @Inject constructor( } } +// Ref: https://developer.android.com/guide/components/intents-common#ViewMap @VisibleForTesting internal fun buildUrl( location: Location, label: String?, urlEncoder: (String) -> String = Uri::encode ): String { - // Ref: https://developer.android.com/guide/components/intents-common#ViewMap - val base = "geo:0,0?q=%.6f,%.6f".format(location.lat, location.lon) - return if (label == null) { - base - } else { - "%s (%s)".format(base, urlEncoder(label)) - } + // This is needed so the coordinates are formatted with a dot as decimal separator + val locale = Locale.ENGLISH + return "geo:0,0?q=%.6f,%.6f (%s)".format(locale, location.lat, location.lon, urlEncoder(label.orEmpty())) } diff --git a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt index 4a98e22167..5b584a39f8 100644 --- a/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt +++ b/features/location/impl/src/test/kotlin/io/element/android/features/location/impl/common/actions/AndroidLocationActionsTest.kt @@ -11,6 +11,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.location.api.Location import org.junit.Test import java.net.URLEncoder +import java.util.Locale internal class AndroidLocationActionsTest { // We use an Android-native encoder in the actual app, switch to an equivalent JVM one for the tests @@ -25,7 +26,7 @@ internal class AndroidLocationActionsTest { ) val actual = buildUrl(location, null, ::urlEncoder) - val expected = "geo:0,0?q=1.234568,123.456789" + val expected = "geo:0,0?q=1.234568,123.456789 ()" assertThat(actual).isEqualTo(expected) } @@ -57,4 +58,20 @@ internal class AndroidLocationActionsTest { assertThat(actual).isEqualTo(expected) } + + @Test + fun `buildUrl - URL encodes coordinates in locale with comma decimal separator`() { + val location = Location( + lat = 1.000001, + lon = 2.000001, + accuracy = 0f + ) + // Set a locale with comma as decimal separator + Locale.setDefault(Locale.Category.FORMAT, Locale("pt", "BR")) + + val actual = buildUrl(location, "(weird/stuff here)", ::urlEncoder) + val expected = "geo:0,0?q=1.000001,2.000001 (%28weird%2Fstuff+here%29)" + + assertThat(actual).isEqualTo(expected) + } } From b7abdb042ff88c08e69d0c1b52dfd934124a424a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 7 Apr 2025 11:58:02 +0200 Subject: [PATCH 47/54] Add a inderminate progress bar when loging out and in Waiting state. (#4538) * Add a check network connection when the Waiting state last too long. * Update screenshots --------- Co-authored-by: ElementBot --- .../features/logout/impl/LogoutPresenter.kt | 13 +++++ .../features/logout/impl/LogoutState.kt | 1 + .../logout/impl/LogoutStateProvider.kt | 11 ++++ .../features/logout/impl/LogoutView.kt | 51 ++++++++++++------- .../logout/impl/LogoutPresenterTest.kt | 29 +++++++++++ ...tures.logout.impl_LogoutView_Day_10_en.png | 3 ++ ...tures.logout.impl_LogoutView_Day_11_en.png | 3 ++ ...res.logout.impl_LogoutView_Night_10_en.png | 3 ++ ...res.logout.impl_LogoutView_Night_11_en.png | 3 ++ 9 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_11_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt index c26f3a7407..3d1cacd89c 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt @@ -15,6 +15,7 @@ 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.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter @@ -25,6 +26,7 @@ import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EncryptionService import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import javax.inject.Inject @@ -44,6 +46,16 @@ class LogoutPresenter @Inject constructor( } .collectAsState(initial = BackupUploadState.Unknown) + var waitingForALongTime by remember { mutableStateOf(false) } + LaunchedEffect(backupUploadState) { + if (backupUploadState is BackupUploadState.Waiting) { + delay(2_000) + waitingForALongTime = true + } else { + waitingForALongTime = false + } + } + val isLastDevice by encryptionService.isLastDevice.collectAsState() val backupState by encryptionService.backupStateStateFlow.collectAsState() val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState() @@ -79,6 +91,7 @@ class LogoutPresenter @Inject constructor( doesBackupExistOnServer = doesBackupExistOnServerAction.value.dataOrNull().orTrue(), recoveryState = recoveryState, backupUploadState = backupUploadState, + waitingForALongTime = waitingForALongTime, logoutAction = logoutAction.value, eventSink = ::handleEvents ) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt index 2f84c837c6..584d7a0ac9 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutState.kt @@ -18,6 +18,7 @@ data class LogoutState( val doesBackupExistOnServer: Boolean, val recoveryState: RecoveryState, val backupUploadState: BackupUploadState, + val waitingForALongTime: Boolean, val logoutAction: AsyncAction, val eventSink: (LogoutEvents) -> Unit, ) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt index 12e83fc713..a55a9afb96 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutStateProvider.kt @@ -29,6 +29,15 @@ open class LogoutStateProvider : PreviewParameterProvider { aLogoutState(isLastDevice = true, recoveryState = RecoveryState.DISABLED), // Last session no backup aLogoutState(isLastDevice = true, backupState = BackupState.UNKNOWN, doesBackupExistOnServer = false), + aLogoutState( + isLastDevice = false, + backupUploadState = BackupUploadState.Waiting, + ), + aLogoutState( + isLastDevice = false, + backupUploadState = BackupUploadState.Waiting, + waitingForALongTime = true, + ), ) } @@ -38,6 +47,7 @@ fun aLogoutState( doesBackupExistOnServer: Boolean = true, recoveryState: RecoveryState = RecoveryState.ENABLED, backupUploadState: BackupUploadState = BackupUploadState.Unknown, + waitingForALongTime: Boolean = false, logoutAction: AsyncAction = AsyncAction.Uninitialized, eventSink: (LogoutEvents) -> Unit = {}, ) = LogoutState( @@ -46,6 +56,7 @@ fun aLogoutState( doesBackupExistOnServer = doesBackupExistOnServer, recoveryState = recoveryState, backupUploadState = backupUploadState, + waitingForALongTime = waitingForALongTime, logoutAction = logoutAction, eventSink = eventSink, ) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt index f8e5a428c2..321879b009 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutView.kt @@ -143,24 +143,41 @@ private fun ColumnScope.Buttons( @Composable private fun Content( state: LogoutState, + modifier: Modifier = Modifier, ) { - if (state.backupUploadState is BackupUploadState.Uploading) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(top = 60.dp, start = 20.dp, end = 20.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - LinearProgressIndicator( - modifier = Modifier.fillMaxWidth(), - progress = { state.backupUploadState.backedUpCount.toFloat() / state.backupUploadState.totalCount.toFloat() }, - trackColor = ElementTheme.colors.progressIndicatorTrackColor, - ) - Text( - modifier = Modifier.align(Alignment.End), - text = "${state.backupUploadState.backedUpCount} / ${state.backupUploadState.totalCount}", - style = ElementTheme.typography.fontBodySmRegular, - ) + Column( + modifier = modifier + .fillMaxWidth() + .padding(top = 60.dp, start = 20.dp, end = 20.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + when (state.backupUploadState) { + is BackupUploadState.Uploading -> { + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth(), + progress = { state.backupUploadState.backedUpCount.toFloat() / state.backupUploadState.totalCount.toFloat() }, + trackColor = ElementTheme.colors.progressIndicatorTrackColor, + ) + Text( + modifier = Modifier.align(Alignment.End), + text = "${state.backupUploadState.backedUpCount} / ${state.backupUploadState.totalCount}", + style = ElementTheme.typography.fontBodySmRegular, + ) + } + BackupUploadState.Waiting -> { + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth(), + trackColor = ElementTheme.colors.progressIndicatorTrackColor, + ) + if (state.waitingForALongTime) { + Text( + modifier = Modifier.align(Alignment.CenterHorizontally), + text = stringResource(CommonStrings.common_please_check_internet_connection), + style = ElementTheme.typography.fontBodySmRegular, + ) + } + } + else -> Unit } } } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt index d054556f87..61a1f1371d 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt @@ -44,6 +44,7 @@ class LogoutPresenterTest { assertThat(initialState.doesBackupExistOnServer).isTrue() assertThat(initialState.recoveryState).isEqualTo(RecoveryState.UNKNOWN) assertThat(initialState.backupUploadState).isEqualTo(BackupUploadState.Unknown) + assertThat(initialState.waitingForALongTime).isFalse() assertThat(initialState.logoutAction).isEqualTo(AsyncAction.Uninitialized) } } @@ -66,6 +67,34 @@ class LogoutPresenterTest { } } + @Test + fun `present - initial state - waiting a long time`() = runTest { + val encryptionService = FakeEncryptionService() + encryptionService.givenWaitForBackupUploadSteadyStateFlow( + flow { + emit(BackupUploadState.Waiting) + delay(3_000) + } + ) + val presenter = createLogoutPresenter( + encryptionService = encryptionService + ) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + val initialState = awaitItem() + assertThat(initialState.waitingForALongTime).isFalse() + assertThat(initialState.backupUploadState).isEqualTo(BackupUploadState.Unknown) + val waitingState = awaitItem() + assertThat(waitingState.backupUploadState).isEqualTo(BackupUploadState.Waiting) + assertThat(initialState.waitingForALongTime).isFalse() + skipItems(1) + val waitingALongTimeState = awaitItem() + assertThat(waitingALongTimeState.backupUploadState).isEqualTo(BackupUploadState.Waiting) + assertThat(waitingALongTimeState.waitingForALongTime).isTrue() + } + } + @Test fun `present - initial state - backing up`() = runTest { val encryptionService = FakeEncryptionService() diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_10_en.png new file mode 100644 index 0000000000..b159547818 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b005a634331a485e2f80fb773a147207c782eaf2d923d1a87c5b45597309c658 +size 25794 diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_11_en.png new file mode 100644 index 0000000000..e6d14a0cd4 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Day_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d800ec0c02e8e2f8fff755d12d2e657d6fbae10a8b9f070bb627b3ccf9d3e159 +size 30566 diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png new file mode 100644 index 0000000000..9e60f85a51 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27587909106650e33d7bc7854c0f2dd7ca6e2dad0aaf6487bf266753288ec6f6 +size 24898 diff --git a/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png new file mode 100644 index 0000000000..960535f462 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.logout.impl_LogoutView_Night_11_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e65635400bfda5d242d07ebe31113e3ef2d039f21208421023f099997d5e4f9 +size 29603 From 606910e6254c09a77988776634b8fa208fb3f371 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 12:51:36 +0000 Subject: [PATCH 48/54] fix(deps): update appyx to v1.7.0 (#4547) 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 fe48fd3263..527c70164f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,7 +44,7 @@ serialization_json = "1.8.1" #other coil = "3.1.0" showkase = "1.0.3" -appyx = "1.6.0" +appyx = "1.7.0" sqldelight = "2.0.2" wysiwyg = "2.38.3" telephoto = "0.15.1" From ad9997b8ba5aa51a21343fc6dc88d69e8de4c432 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Apr 2025 09:23:02 +0200 Subject: [PATCH 49/54] Click on userId / room alias to copy value to clipboard. (#4549) --- .../roomdetails/impl/RoomDetailsEvent.kt | 1 + .../roomdetails/impl/RoomDetailsPresenter.kt | 14 ++++++++ .../roomdetails/impl/RoomDetailsState.kt | 2 ++ .../impl/RoomDetailsStateProvider.kt | 5 ++- .../roomdetails/impl/RoomDetailsView.kt | 36 ++++++++++++++----- .../roomdetails/impl/di/RoomMemberModule.kt | 3 ++ .../details/RoomMemberDetailsPresenter.kt | 23 +++++++----- .../impl/RoomDetailsPresenterTest.kt | 5 +++ .../details/RoomMemberDetailsPresenterTest.kt | 4 +++ features/userprofile/api/build.gradle.kts | 1 + .../userprofile/api/UserProfileEvents.kt | 1 + .../userprofile/api/UserProfileState.kt | 2 ++ .../impl/root/UserProfilePresenter.kt | 6 ++-- .../shared/UserProfileHeaderSection.kt | 5 +++ .../shared/UserProfileStateProvider.kt | 3 ++ .../userprofile/shared/UserProfileView.kt | 13 +++++-- .../designsystem/modifiers/Clickable.kt | 12 +++++++ 17 files changed, 114 insertions(+), 22 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt index 57d1cc6df0..93c93c345a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsEvent.kt @@ -11,5 +11,6 @@ sealed interface RoomDetailsEvent { data object LeaveRoom : RoomDetailsEvent data object MuteNotification : RoomDetailsEvent data object UnmuteNotification : RoomDetailsEvent + data class CopyToClipboard(val text: String) : RoomDetailsEvent data class SetFavorite(val isFavorite: Boolean) : RoomDetailsEvent } 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 bcbdb83e2d..5c6333a290 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 @@ -24,8 +24,12 @@ import io.element.android.features.messages.api.pinned.IsPinnedMessagesFeatureEn import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter import io.element.android.features.roomdetails.impl.securityandprivacy.permissions.securityAndPrivacyPermissionsAsState +import io.element.android.libraries.androidutils.clipboard.ClipboardHelper import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.designsystem.utils.snackbar.LocalSnackbarDispatcher +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage +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.matrix.api.MatrixClient @@ -45,6 +49,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.ui.strings.CommonStrings import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.toPersistentList @@ -65,6 +70,7 @@ class RoomDetailsPresenter @Inject constructor( private val dispatchers: CoroutineDispatchers, private val analyticsService: AnalyticsService, private val isPinnedMessagesFeatureEnabled: IsPinnedMessagesFeatureEnabled, + private val clipboardHelper: ClipboardHelper, ) : Presenter { @Composable override fun present(): RoomDetailsState { @@ -134,6 +140,9 @@ class RoomDetailsPresenter @Inject constructor( val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState() + val snackbarDispatcher = LocalSnackbarDispatcher.current + val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() + fun handleEvents(event: RoomDetailsEvent) { when (event) { RoomDetailsEvent.LeaveRoom -> @@ -149,6 +158,10 @@ class RoomDetailsPresenter @Inject constructor( } } is RoomDetailsEvent.SetFavorite -> scope.setFavorite(event.isFavorite) + is RoomDetailsEvent.CopyToClipboard -> { + clipboardHelper.copyPlainText(event.text) + snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_copied_to_clipboard)) + } } } @@ -190,6 +203,7 @@ class RoomDetailsPresenter @Inject constructor( canShowPinnedMessages = canShowPinnedMessages, canShowMediaGallery = canShowMediaGallery, pinnedMessagesCount = pinnedMessagesCount, + snackbarMessage = snackbarMessage, canShowKnockRequests = canShowKnockRequests, knockRequestsCount = knockRequestsCount, canShowSecurityAndPrivacy = canShowSecurityAndPrivacy, 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 5502d4e29a..8a0439b15d 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 @@ -11,6 +11,7 @@ import androidx.compose.runtime.Immutable import io.element.android.features.leaveroom.api.LeaveRoomState import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.userprofile.api.UserProfileState +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage 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.room.RoomMember @@ -42,6 +43,7 @@ data class RoomDetailsState( val canShowPinnedMessages: Boolean, val canShowMediaGallery: Boolean, val pinnedMessagesCount: Int?, + val snackbarMessage: SnackbarMessage?, val canShowKnockRequests: Boolean, val knockRequestsCount: Int?, val canShowSecurityAndPrivacy: Boolean, 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 b2db46115c..4304f151a3 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 @@ -17,6 +17,7 @@ import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState import io.element.android.features.userprofile.shared.aUserProfileState import io.element.android.libraries.architecture.AsyncData +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage 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.UserId @@ -111,6 +112,7 @@ fun aRoomDetailsState( canShowPinnedMessages: Boolean = true, canShowMediaGallery: Boolean = true, pinnedMessagesCount: Int? = null, + snackbarMessage: SnackbarMessage? = null, canShowKnockRequests: Boolean = false, knockRequestsCount: Int? = null, canShowSecurityAndPrivacy: Boolean = true, @@ -139,11 +141,12 @@ fun aRoomDetailsState( canShowPinnedMessages = canShowPinnedMessages, canShowMediaGallery = canShowMediaGallery, pinnedMessagesCount = pinnedMessagesCount, + snackbarMessage = snackbarMessage, canShowKnockRequests = canShowKnockRequests, knockRequestsCount = knockRequestsCount, canShowSecurityAndPrivacy = canShowSecurityAndPrivacy, hasMemberVerificationViolations = hasMemberVerificationViolations, - eventSink = eventSink + eventSink = eventSink, ) fun aRoomNotificationSettings( 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 33985c44ee..381f94ad26 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 @@ -55,6 +55,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.niceClickable import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight @@ -69,6 +70,8 @@ import io.element.android.libraries.designsystem.theme.components.ListItemStyle 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.designsystem.utils.snackbar.SnackbarHost +import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState 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.UserId @@ -106,6 +109,7 @@ fun RoomDetailsView( onProfileClick: (UserId) -> Unit, modifier: Modifier = Modifier, ) { + val snackbarHostState = rememberSnackbarHostState(snackbarMessage = state.snackbarMessage) Scaffold( modifier = modifier, topBar = { @@ -115,6 +119,7 @@ fun RoomDetailsView( onActionClick = onActionClick ) }, + snackbarHost = { SnackbarHost(snackbarHostState) }, ) { padding -> Column( modifier = Modifier @@ -135,6 +140,9 @@ fun RoomDetailsView( openAvatarPreview = { avatarUrl -> openAvatarPreview(state.roomName, avatarUrl) }, + onSubtitleClick = { subtitle -> + state.eventSink(RoomDetailsEvent.CopyToClipboard(subtitle)) + } ) } is RoomDetailsType.Dm -> { @@ -145,6 +153,9 @@ fun RoomDetailsView( openAvatarPreview = { name, avatarUrl -> openAvatarPreview(name, avatarUrl) }, + onSubtitleClick = { subtitle -> + state.eventSink(RoomDetailsEvent.CopyToClipboard(subtitle)) + } ) } } @@ -368,6 +379,7 @@ private fun RoomHeaderSection( roomAlias: RoomAlias?, heroes: ImmutableList, openAvatarPreview: (url: String) -> Unit, + onSubtitleClick: (String) -> Unit, ) { Column( modifier = Modifier @@ -384,7 +396,11 @@ private fun RoomHeaderSection( .clickable(enabled = avatarUrl != null) { openAvatarPreview(avatarUrl!!) } .testTag(TestTags.roomDetailAvatar) ) - TitleAndSubtitle(title = roomName, subtitle = roomAlias?.value) + TitleAndSubtitle( + title = roomName, + subtitle = roomAlias?.value, + onSubtitleClick = onSubtitleClick, + ) } } @@ -394,6 +410,7 @@ private fun DmHeaderSection( otherMember: RoomMember, roomName: String, openAvatarPreview: (name: String, url: String) -> Unit, + onSubtitleClick: (String) -> Unit, modifier: Modifier = Modifier ) { Column( @@ -411,6 +428,7 @@ private fun DmHeaderSection( TitleAndSubtitle( title = roomName, subtitle = otherMember.userId.value, + onSubtitleClick = onSubtitleClick, ) } } @@ -419,6 +437,7 @@ private fun DmHeaderSection( private fun TitleAndSubtitle( title: String, subtitle: String?, + onSubtitleClick: (String) -> Unit, ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Spacer(modifier = Modifier.height(24.dp)) @@ -430,6 +449,7 @@ private fun TitleAndSubtitle( if (subtitle != null) { Spacer(modifier = Modifier.height(6.dp)) Text( + modifier = Modifier.niceClickable { onSubtitleClick(subtitle) }, text = subtitle, style = ElementTheme.typography.fontBodyLgRegular, color = ElementTheme.colors.textSecondary, @@ -612,13 +632,13 @@ private fun PinnedMessagesItem( headlineContent = { Text(stringResource(R.string.screen_room_details_pinned_events_row_title)) }, leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Pin())), trailingContent = - if (pinnedMessagesCount == null) { - ListItemContent.Custom { - CircularProgressIndicator(strokeWidth = 2.dp, modifier = Modifier.size(24.dp)) - } - } else { - ListItemContent.Text(pinnedMessagesCount.toString()) - }, + if (pinnedMessagesCount == null) { + ListItemContent.Custom { + CircularProgressIndicator(strokeWidth = 2.dp, modifier = Modifier.size(24.dp)) + } + } else { + ListItemContent.Text(pinnedMessagesCount.toString()) + }, onClick = { analyticsService.captureInteraction(Interaction.Name.PinnedMessageRoomInfoButton) onPinnedMessagesClick() diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/di/RoomMemberModule.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/di/RoomMemberModule.kt index 4001eb7edb..e5f63332aa 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/di/RoomMemberModule.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/di/RoomMemberModule.kt @@ -12,6 +12,7 @@ import dagger.Module import dagger.Provides import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter import io.element.android.features.userprofile.api.UserProfilePresenterFactory +import io.element.android.libraries.androidutils.clipboard.ClipboardHelper import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -25,6 +26,7 @@ object RoomMemberModule { room: MatrixRoom, userProfilePresenterFactory: UserProfilePresenterFactory, encryptionService: EncryptionService, + clipboardHelper: ClipboardHelper, ): RoomMemberDetailsPresenter.Factory { return object : RoomMemberDetailsPresenter.Factory { override fun create(roomMemberId: UserId): RoomMemberDetailsPresenter { @@ -33,6 +35,7 @@ object RoomMemberModule { room = room, userProfilePresenterFactory = userProfilePresenterFactory, encryptionService = encryptionService, + clipboardHelper = clipboardHelper, ) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt index 9a5d456cbe..c5de24c603 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt @@ -19,7 +19,11 @@ import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfilePresenterFactory import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState +import io.element.android.libraries.androidutils.clipboard.ClipboardHelper import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.designsystem.utils.snackbar.LocalSnackbarDispatcher +import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage +import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.identity.IdentityState @@ -27,6 +31,7 @@ import io.element.android.libraries.matrix.api.encryption.identity.IdentityState import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.ui.room.getRoomMemberAsState import io.element.android.libraries.matrix.ui.room.roomMemberIdentityStateChange +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNotNull @@ -42,6 +47,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( @Assisted private val roomMemberId: UserId, private val room: MatrixRoom, private val encryptionService: EncryptionService, + private val clipboardHelper: ClipboardHelper, userProfilePresenterFactory: UserProfilePresenterFactory, ) : Presenter { interface Factory { @@ -55,6 +61,8 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( override fun present(): UserProfileState { val coroutineScope = rememberCoroutineScope() + val snackbarDispatcher = LocalSnackbarDispatcher.current + val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() val roomMember by room.getRoomMemberAsState(roomMemberId) LaunchedEffect(Unit) { // Update room member info when opening this screen @@ -111,7 +119,11 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( UserProfileEvents.WithdrawVerification -> coroutineScope.launch { encryptionService.withdrawVerification(roomMemberId) } - else -> Unit + is UserProfileEvents.CopyToClipboard -> { + clipboardHelper.copyPlainText(event.text) + snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_copied_to_clipboard)) + } + else -> userProfileState.eventSink(event) } } @@ -119,13 +131,8 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( userName = roomUserName ?: userProfileState.userName, avatarUrl = roomUserAvatar ?: userProfileState.avatarUrl, verificationState = verificationState, - eventSink = { event -> - if (event is UserProfileEvents.WithdrawVerification) { - eventSink(UserProfileEvents.WithdrawVerification) - } else { - userProfileState.eventSink(event) - } - } + snackbarMessage = snackbarMessage, + eventSink = ::eventSink ) } } 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 07d10ede63..6c88ce8c2b 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 @@ -17,6 +17,8 @@ import io.element.android.features.roomcall.api.aStandByCallState import io.element.android.features.roomdetails.impl.members.aRoomMember import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsPresenter import io.element.android.features.userprofile.shared.aUserProfileState +import io.element.android.libraries.androidutils.clipboard.ClipboardHelper +import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.featureflag.api.FeatureFlagService @@ -81,6 +83,7 @@ class RoomDetailsPresenterTest { ), isPinnedMessagesFeatureEnabled: Boolean = true, encryptionService: FakeEncryptionService = FakeEncryptionService(), + clipboardHelper: ClipboardHelper = FakeClipboardHelper(), ): RoomDetailsPresenter { val matrixClient = FakeMatrixClient(notificationSettingsService = notificationSettingsService) val roomMemberDetailsPresenterFactory = object : RoomMemberDetailsPresenter.Factory { @@ -92,6 +95,7 @@ class RoomDetailsPresenterTest { Presenter { aUserProfileState() } }, encryptionService = encryptionService, + clipboardHelper = clipboardHelper, ) } } @@ -106,6 +110,7 @@ class RoomDetailsPresenterTest { dispatchers = dispatchers, isPinnedMessagesFeatureEnabled = { isPinnedMessagesFeatureEnabled }, analyticsService = analyticsService, + clipboardHelper = clipboardHelper, ) } diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenterTest.kt index 1506f50f42..41ff8706ae 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenterTest.kt @@ -17,6 +17,8 @@ import io.element.android.features.userprofile.api.UserProfileEvents import io.element.android.features.userprofile.api.UserProfilePresenterFactory import io.element.android.features.userprofile.api.UserProfileVerificationState import io.element.android.features.userprofile.shared.aUserProfileState +import io.element.android.libraries.androidutils.clipboard.ClipboardHelper +import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.encryption.identity.IdentityState @@ -350,12 +352,14 @@ class RoomMemberDetailsPresenterTest { } }, encryptionService: FakeEncryptionService = FakeEncryptionService(getUserIdentityResult = { Result.success(null) }), + clipboardHelper: ClipboardHelper = FakeClipboardHelper(), ): RoomMemberDetailsPresenter { return RoomMemberDetailsPresenter( roomMemberId = UserId("@alice:server.org"), room = room, userProfilePresenterFactory = userProfilePresenterFactory, encryptionService = encryptionService, + clipboardHelper = clipboardHelper, ) } } diff --git a/features/userprofile/api/build.gradle.kts b/features/userprofile/api/build.gradle.kts index b2c1068556..8bdaa8d77e 100644 --- a/features/userprofile/api/build.gradle.kts +++ b/features/userprofile/api/build.gradle.kts @@ -16,5 +16,6 @@ android { dependencies { implementation(projects.libraries.architecture) + implementation(projects.libraries.designsystem) implementation(projects.libraries.matrix.api) } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEvents.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEvents.kt index b7b7ba2561..4a5f6bb415 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEvents.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileEvents.kt @@ -15,4 +15,5 @@ sealed interface UserProfileEvents { data object ClearBlockUserError : UserProfileEvents data object ClearConfirmationDialog : UserProfileEvents data object WithdrawVerification : UserProfileEvents + data class CopyToClipboard(val text: String) : UserProfileEvents } diff --git a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileState.kt b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileState.kt index f32033b0a7..b9f08a27f3 100644 --- a/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileState.kt +++ b/features/userprofile/api/src/main/kotlin/io/element/android/features/userprofile/api/UserProfileState.kt @@ -9,6 +9,7 @@ package io.element.android.features.userprofile.api import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData +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 @@ -23,6 +24,7 @@ data class UserProfileState( val isCurrentUser: Boolean, val dmRoomId: RoomId?, val canCall: Boolean, + val snackbarMessage: SnackbarMessage?, val eventSink: (UserProfileEvents) -> Unit ) { enum class ConfirmationDialog { 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 4216287a70..c098177529 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 @@ -120,8 +120,9 @@ class UserProfilePresenter @AssistedInject constructor( UserProfileEvents.ClearStartDMState -> { startDmActionState.value = AsyncAction.Uninitialized } - // Do nothing for withdrawing verification as it's handled by the RoomMemberDetailsPresenter if needed - UserProfileEvents.WithdrawVerification -> Unit + // Do nothing for other event as they are handled by the RoomMemberDetailsPresenter if needed + UserProfileEvents.WithdrawVerification, + is UserProfileEvents.CopyToClipboard -> Unit } } @@ -136,6 +137,7 @@ class UserProfilePresenter @AssistedInject constructor( isCurrentUser = isCurrentUser, dmRoomId = dmRoomId, canCall = canCall, + snackbarMessage = null, eventSink = ::handleEvents ) } 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 2681d7bfdf..da88c0f508 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.modifiers.niceClickable import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.ButtonSize @@ -48,6 +49,7 @@ fun UserProfileHeaderSection( userName: String?, verificationState: UserProfileVerificationState, openAvatarPreview: (url: String) -> Unit, + onUserIdClick: () -> Unit, withdrawVerificationClick: () -> Unit, modifier: Modifier = Modifier ) { @@ -75,6 +77,7 @@ fun UserProfileHeaderSection( Spacer(modifier = Modifier.height(6.dp)) } Text( + modifier = Modifier.niceClickable { onUserIdClick() }, text = userId.value, style = ElementTheme.typography.fontBodyLgRegular, color = ElementTheme.colors.textSecondary, @@ -125,6 +128,7 @@ internal fun UserProfileHeaderSectionPreview() = ElementPreview { userName = "Alice", verificationState = UserProfileVerificationState.VERIFIED, openAvatarPreview = {}, + onUserIdClick = {}, withdrawVerificationClick = {}, ) } @@ -138,6 +142,7 @@ internal fun UserProfileHeaderSectionWithVerificationViolationPreview() = Elemen userName = "Alice", verificationState = UserProfileVerificationState.VERIFICATION_VIOLATION, openAvatarPreview = {}, + onUserIdClick = {}, withdrawVerificationClick = {}, ) } diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt index be9fad9c94..7a5cc53239 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileStateProvider.kt @@ -14,6 +14,7 @@ import io.element.android.features.userprofile.api.UserProfileState import io.element.android.features.userprofile.api.UserProfileVerificationState import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData +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.ui.components.aMatrixUser @@ -45,6 +46,7 @@ fun aUserProfileState( isCurrentUser: Boolean = false, dmRoomId: RoomId? = null, canCall: Boolean = false, + snackbarMessage: SnackbarMessage? = null, eventSink: (UserProfileEvents) -> Unit = {}, ) = UserProfileState( userId = userId, @@ -57,5 +59,6 @@ fun aUserProfileState( isCurrentUser = isCurrentUser, dmRoomId = dmRoomId, canCall = canCall, + snackbarMessage = snackbarMessage, eventSink = eventSink, ) diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt index 0c544cf659..a43478e466 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileView.kt @@ -38,6 +38,8 @@ 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 +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 import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.ui.components.CreateDmConfirmationBottomSheet @@ -55,17 +57,19 @@ fun UserProfileView( onVerifyClick: (UserId) -> Unit, modifier: Modifier = Modifier, ) { + val snackbarHostState = rememberSnackbarHostState(snackbarMessage = state.snackbarMessage) Scaffold( modifier = modifier, topBar = { TopAppBar(title = { }, navigationIcon = { BackButton(onClick = goBack) }) }, + snackbarHost = { SnackbarHost(snackbarHostState) }, ) { padding -> Column( modifier = Modifier - .padding(padding) - .consumeWindowInsets(padding) - .verticalScroll(rememberScrollState()) + .padding(padding) + .consumeWindowInsets(padding) + .verticalScroll(rememberScrollState()) ) { UserProfileHeaderSection( avatarUrl = state.avatarUrl, @@ -75,6 +79,9 @@ fun UserProfileView( openAvatarPreview = { avatarUrl -> openAvatarPreview(state.userName ?: state.userId.value, avatarUrl) }, + onUserIdClick = { + state.eventSink(UserProfileEvents.CopyToClipboard(state.userId.value)) + }, withdrawVerificationClick = { state.eventSink(UserProfileEvents.WithdrawVerification) }, ) UserProfileMainActionsSection( 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 c8f71f16cc..3931d8d8d0 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 @@ -8,7 +8,11 @@ package io.element.android.libraries.designsystem.modifiers import androidx.compose.foundation.clickable +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.unit.dp fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = then( if (onClick != null) { @@ -17,3 +21,11 @@ fun Modifier.clickableIfNotNull(onClick: (() -> Unit)? = null): Modifier = then( Modifier } ) + +fun Modifier.niceClickable( + onClick: () -> Unit, +): Modifier { + return clip(RoundedCornerShape(4.dp)) + .clickable { onClick() } + .padding(horizontal = 4.dp) +} From 20ac0f90e4a585393df802f2d32554c73fdad904 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 8 Apr 2025 03:24:40 -0400 Subject: [PATCH 50/54] Run the 'prevent blocked' workflow even if PR has conflicts (#4432) See the description of pull_request versus pull_request_target documented at https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request. --- .github/workflows/pull_request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 72a4dfe0a7..929bcb5dcd 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,6 +1,6 @@ name: Pull Request on: - pull_request: + pull_request_target: types: [ opened, edited, labeled, unlabeled, synchronize ] workflow_call: secrets: From 7bcfb20268ca95ece5f22a76e147edef70d5b5ea Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Apr 2025 12:01:52 +0200 Subject: [PATCH 51/54] Update wording for push provider support test. (#4079) (#4553) --- .../libraries/push/impl/troubleshoot/PushProvidersTest.kt | 6 ++---- libraries/push/impl/src/main/res/values/localazy.xml | 7 ++++--- .../push/impl/troubleshoot/PushProvidersTestTest.kt | 1 - 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTest.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTest.kt index d75c4f4d59..5a30db6f59 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTest.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTest.kt @@ -38,10 +38,8 @@ class PushProvidersTest @Inject constructor( val result = sortedPushProvider.isNotEmpty() if (result) { delegate.updateState( - description = stringProvider.getQuantityString( - resId = R.plurals.troubleshoot_notifications_test_detect_push_provider_success, - quantity = sortedPushProvider.size, - sortedPushProvider.size, + description = stringProvider.getString( + resId = R.string.troubleshoot_notifications_test_detect_push_provider_success_2, sortedPushProvider.joinToString { it.name } ), status = NotificationTroubleshootTestState.Status.Success diff --git a/libraries/push/impl/src/main/res/values/localazy.xml b/libraries/push/impl/src/main/res/values/localazy.xml index 5c6c852f14..9860c8bef7 100644 --- a/libraries/push/impl/src/main/res/values/localazy.xml +++ b/libraries/push/impl/src/main/res/values/localazy.xml @@ -58,13 +58,14 @@ "No push providers selected." "Current push provider: %1$s." "Current push provider" - "Ensure that the application has at least one push provider." - "No push providers found." + "Ensure that the application supports at least one push provider." + "No push provider support found." "Found %1$d push provider: %2$s" "Found %1$d push providers: %2$s" - "Detect push providers" + "The application was built with support for: %1$s" + "Push provider support" "Check that the application can display notification." "The notification has not been clicked." "Cannot display the notification." diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTestTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTestTest.kt index cc4df51b55..8947b646a6 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTestTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/troubleshoot/PushProvidersTestTest.kt @@ -53,7 +53,6 @@ class PushProvidersTestTest { assertThat(awaitItem().status).isEqualTo(NotificationTroubleshootTestState.Status.InProgress) val lastItem = awaitItem() assertThat(lastItem.status).isEqualTo(NotificationTroubleshootTestState.Status.Success) - assertThat(lastItem.description).contains("2") assertThat(lastItem.description).contains("foo") assertThat(lastItem.description).contains("bar") } From b9385ce382662bf50cda18b185daed58ca45e1fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 14:21:49 +0200 Subject: [PATCH 52/54] fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.7 (#4548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): update dependency org.matrix.rustcomponents:sdk-android to v25.4.8 * Fix API breaks: - Add `ReplyParameters` class and parameters to send functions. - Remove outdated OIDC related values. - Stop pre-processing the timeline to add the timeline start item, this is already done by the SDK. * Use the new function to reply to messages in a quick reply from a notification, however: 1. We don't have the thread id value at the moment since the SDK does not provide it yet. 2. The replied to event id wasn't being passed from the notification info. * Remove also timeline start virtual item for DMs, since this wasn't present before either --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín --- .../preview/AttachmentsPreviewPresenter.kt | 6 +- .../MessageComposerPresenter.kt | 15 ++- .../AttachmentsPreviewPresenterTest.kt | 25 +++-- .../MessageComposerPresenterTest.kt | 5 +- .../VoiceMessageComposerPresenterTest.kt | 3 +- .../features/share/impl/SharePresenterTest.kt | 4 +- gradle/libs.versions.toml | 2 +- .../api/notification/NotificationData.kt | 2 + .../libraries/matrix/api/room/MatrixRoom.kt | 62 ++++++------ .../api/room/message/ReplyParameters.kt | 22 +++++ .../libraries/matrix/api/timeline/Timeline.kt | 44 +++++---- .../matrix/impl/RustMatrixClientFactory.kt | 2 +- .../impl/auth/OidcConfigurationProvider.kt | 6 +- .../auth/RustMatrixAuthenticationService.kt | 2 +- .../impl/notification/NotificationMapper.kt | 2 + .../matrix/impl/room/RustMatrixRoom.kt | 82 +++++++++++----- .../impl/room/message/ReplyParameters.kt | 16 ++++ .../matrix/impl/timeline/RustTimeline.kt | 67 ++++++++----- .../item/virtual/VirtualTimelineItemMapper.kt | 1 + .../RoomBeginningPostProcessor.kt | 50 +++++----- .../auth/OidcConfigurationProviderTest.kt | 3 +- .../RustMatrixAuthenticationServiceTest.kt | 2 +- .../fixtures/fakes/FakeRustClientBuilder.kt | 2 +- .../impl/timeline/postprocessor/Fixtures.kt | 4 + .../RoomBeginningPostProcessorTest.kt | 40 +------- .../test/notification/NotificationData.kt | 3 + .../matrix/test/room/FakeMatrixRoom.kt | 95 ++++++++++-------- .../matrix/test/timeline/FakeTimeline.kt | 96 +++++++++++-------- .../libraries/mediaupload/api/MediaSender.kt | 33 +++++-- .../mediaupload/api/MediaSenderTest.kt | 10 +- .../DefaultNotifiableEventResolver.kt | 1 + .../NotificationBroadcastReceiverHandler.kt | 11 ++- .../factories/NotificationCreator.kt | 3 +- .../action/QuickReplyActionFactory.kt | 11 ++- ...otificationBroadcastReceiverHandlerTest.kt | 18 +++- 35 files changed, 454 insertions(+), 296 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/message/ReplyParameters.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/message/ReplyParameters.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt index 2f560cd7ac..90bc3d0427 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt @@ -32,6 +32,7 @@ import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaupload.api.MediaUploadInfo import io.element.android.libraries.mediaupload.api.allFiles @@ -127,6 +128,7 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( caption = caption, sendActionState = sendActionState, dismissAfterSend = !useSendQueue, + replyParameters = null, ) } } @@ -237,6 +239,7 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( caption: String?, sendActionState: MutableState, dismissAfterSend: Boolean, + replyParameters: ReplyParameters?, ) = runCatching { val context = coroutineContext val progressCallback = object : ProgressCallback { @@ -251,7 +254,8 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( mediaUploadInfo = mediaUploadInfo, caption = caption, formattedCaption = null, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ).getOrThrow() }.fold( onSuccess = { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 95ea275278..32142734e1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -53,6 +53,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType import io.element.android.libraries.matrix.api.room.isDm +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails @@ -452,7 +453,19 @@ class MessageComposerPresenter @AssistedInject constructor( } is MessageComposerMode.Reply -> { timelineController.invokeOnCurrentTimeline { - replyMessage(capturedMode.eventId, message.markdown, message.html, message.intentionalMentions) + with(capturedMode) { + replyMessage( + body = message.markdown, + htmlBody = message.html, + intentionalMentions = message.intentionalMentions, + replyParameters = ReplyParameters( + inReplyToEventId = eventId, + enforceThreadReply = inThread, + // This should be false until we add a way to make a reply in a thread an explicit reply to the provided eventId + replyWithinThread = false, + ), + ) + } } } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt index 63a759bd67..d55ea7c7a0 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt @@ -30,6 +30,7 @@ import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.test.A_CAPTION import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.permalink.FakePermalinkBuilder @@ -105,7 +106,8 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media success scenario`() = runTest { - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeMatrixRoom( @@ -142,7 +144,8 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media after pre-processing success scenario`() = runTest { - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeMatrixRoom( @@ -177,7 +180,8 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media before pre-processing success scenario`() = runTest { - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeMatrixRoom( @@ -287,7 +291,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send image with caption success scenario`() = runTest { val sendImageResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: ReplyParameters? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -320,6 +324,7 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), + any(), ) onDoneListener.assertions().isCalledOnce() } @@ -328,7 +333,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send video with caption success scenario`() = runTest { val sendVideoResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder { _: File, _: File?, _: VideoInfo, _: String?, _: String?, _: ProgressCallback?, _: ReplyParameters? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -361,6 +366,7 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), + any(), ) onDoneListener.assertions().isCalledOnce() } @@ -369,7 +375,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send audio with caption success scenario`() = runTest { val sendAudioResult = - lambdaRecorder> { _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -399,6 +405,7 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), + any(), ) onDoneListener.assertions().isCalledOnce() } @@ -407,7 +414,8 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media failure scenario without media queue`() = runTest { val failure = MediaPreProcessor.Failure(null) - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.failure(failure) } val room = FakeMatrixRoom( @@ -435,7 +443,8 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media failure scenario with media queue`() = runTest { val failure = MediaPreProcessor.Failure(null) - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.failure(failure) } val onDoneListenerResult = lambdaRecorder {} diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt index 2f80c52369..a82df0f2aa 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt @@ -47,6 +47,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo @@ -611,7 +612,7 @@ class MessageComposerPresenterTest { @Test fun `present - reply message`() = runTest { - val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List, _: Boolean -> + val replyMessageLambda = lambdaRecorder { _: ReplyParameters, _: String, _: String?, _: List, _: Boolean -> Result.success(Unit) } val timeline = FakeTimeline().apply { @@ -1110,7 +1111,7 @@ class MessageComposerPresenterTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `present - send messages with intentional mentions`() = runTest { - val replyMessageLambda = lambdaRecorder { _: EventId, _: String, _: String?, _: List, _: Boolean -> + val replyMessageLambda = lambdaRecorder { _: ReplyParameters, _: String, _: String?, _: List, _: Boolean -> Result.success(Unit) } val editMessageLambda = lambdaRecorder { _: EventOrTransactionId, _: String, _: String?, _: List -> diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt index e9ffd00b23..5c3e694062 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt @@ -21,6 +21,7 @@ import io.element.android.features.messages.impl.messagecomposer.aReplyMode import io.element.android.features.messages.test.FakeMessageComposerContext import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.AudioInfo +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.mediaplayer.test.FakeMediaPlayer @@ -60,7 +61,7 @@ class VoiceMessageComposerPresenterTest { ) private val analyticsService = FakeAnalyticsService() private val sendVoiceMessageResult = - lambdaRecorder, ProgressCallback?, Result> { _, _, _, _ -> + lambdaRecorder, ProgressCallback?, ReplyParameters?, Result> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } private val matrixRoom = FakeMatrixRoom( diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt index 866170daa3..66cb147158 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt @@ -18,6 +18,7 @@ import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.test.A_MESSAGE import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.FakeMatrixClient @@ -116,7 +117,8 @@ class SharePresenterTest { @Test fun `present - send media ok`() = runTest { - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val matrixRoom = FakeMatrixRoom( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 527c70164f..c5bde3385a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -174,7 +174,7 @@ jsoup = "org.jsoup:jsoup:1.19.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.0.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.3.24" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.4.8" 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/notification/NotificationData.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt index 915e1584a9..2c77f70d0a 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/notification/NotificationData.kt @@ -9,12 +9,14 @@ package io.element.android.libraries.matrix.api.notification import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.api.timeline.item.event.MessageType data class NotificationData( val eventId: EventId, + val threadId: ThreadId?, val roomId: RoomId, // mxc url val senderAvatarUrl: String?, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index ec94ec0b92..a2a737a019 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -28,6 +28,7 @@ import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibilit 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.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility @@ -138,7 +139,8 @@ interface MatrixRoom : Closeable { imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result suspend fun sendVideo( @@ -147,7 +149,8 @@ interface MatrixRoom : Closeable { videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result suspend fun sendAudio( @@ -156,6 +159,7 @@ interface MatrixRoom : Closeable { caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result suspend fun sendFile( @@ -164,8 +168,36 @@ interface MatrixRoom : Closeable { caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result + suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result + + /** + * Share a location message in the room. + * + * @param body A human readable textual representation of the location. + * @param geoUri A geo URI (RFC 5870) representing the location e.g. `geo:51.5008,0.1247;u=35`. + * Respectively: latitude, longitude, and (optional) uncertainty. + * @param description Optional description of the location to display to the user. + * @param zoomLevel Optional zoom level to display the map at. + * @param assetType Optional type of the location asset. + * Set to SENDER if sharing own location. Set to PIN if sharing any location. + */ + suspend fun sendLocation( + body: String, + geoUri: String, + description: String? = null, + zoomLevel: Int? = null, + assetType: AssetType? = null, + ): Result + suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result suspend fun forwardEvent(eventId: EventId, roomIds: List): Result @@ -235,25 +267,6 @@ interface MatrixRoom : Closeable { */ suspend fun clearEventCacheStorage(): Result - /** - * Share a location message in the room. - * - * @param body A human readable textual representation of the location. - * @param geoUri A geo URI (RFC 5870) representing the location e.g. `geo:51.5008,0.1247;u=35`. - * Respectively: latitude, longitude, and (optional) uncertainty. - * @param description Optional description of the location to display to the user. - * @param zoomLevel Optional zoom level to display the map at. - * @param assetType Optional type of the location asset. - * Set to SENDER if sharing own location. Set to PIN if sharing any location. - */ - suspend fun sendLocation( - body: String, - geoUri: String, - description: String? = null, - zoomLevel: Int? = null, - assetType: AssetType? = null, - ): Result - /** * Create a poll in the room. * @@ -302,13 +315,6 @@ interface MatrixRoom : Closeable { */ suspend fun endPoll(pollStartId: EventId, text: String): Result - suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback? - ): Result - /** * Send a typing notification. * @param isTyping True if the user is typing, false otherwise. diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/message/ReplyParameters.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/message/ReplyParameters.kt new file mode 100644 index 0000000000..6157989a43 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/message/ReplyParameters.kt @@ -0,0 +1,22 @@ +/* + * 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.message + +import io.element.android.libraries.matrix.api.core.EventId + +data class ReplyParameters( + val inReplyToEventId: EventId, + val enforceThreadReply: Boolean, + val replyWithinThread: Boolean, +) + +fun replyInThread(eventId: EventId, explicitReply: Boolean = false) = ReplyParameters( + inReplyToEventId = eventId, + enforceThreadReply = true, + replyWithinThread = explicitReply, +) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt index 904aae0355..a940a0981f 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt @@ -19,6 +19,7 @@ import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.poll.PollKind import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.api.timeline.item.event.toEventOrTransactionId @@ -75,7 +76,7 @@ interface Timeline : AutoCloseable { ): Result suspend fun replyMessage( - eventId: EventId, + replyParameters: ReplyParameters, body: String, htmlBody: String?, intentionalMentions: List, @@ -88,7 +89,8 @@ interface Timeline : AutoCloseable { imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result suspend fun sendVideo( @@ -97,17 +99,17 @@ interface Timeline : AutoCloseable { videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result - suspend fun redactEvent(eventOrTransactionId: EventOrTransactionId, reason: String?): Result - suspend fun sendAudio( file: File, audioInfo: AudioInfo, caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result suspend fun sendFile( @@ -116,15 +118,9 @@ interface Timeline : AutoCloseable { caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result - suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result - - suspend fun forwardEvent(eventId: EventId, roomIds: List): Result - - suspend fun cancelSend(transactionId: TransactionId): Result = - redactEvent(transactionId.toEventOrTransactionId(), reason = null) - /** * Share a location message in the room. * @@ -144,6 +140,23 @@ interface Timeline : AutoCloseable { assetType: AssetType? = null, ): Result + suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result + + suspend fun redactEvent(eventOrTransactionId: EventOrTransactionId, reason: String?): Result + + suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result + + suspend fun forwardEvent(eventId: EventId, roomIds: List): Result + + suspend fun cancelSend(transactionId: TransactionId): Result = + redactEvent(transactionId.toEventOrTransactionId(), reason = null) + /** * Create a poll in the room. * @@ -192,13 +205,6 @@ interface Timeline : AutoCloseable { */ suspend fun endPoll(pollStartId: EventId, text: String): Result - suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback? - ): Result - suspend fun loadReplyDetails(eventId: EventId): InReplyTo /** 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 deca69e1e9..b302784528 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 @@ -105,7 +105,7 @@ class RustMatrixClientFactory @Inject constructor( cachePath = sessionPaths.cacheDirectory.absolutePath, ) .setSessionDelegate(sessionDelegate) - .passphrase(passphrase) + .sessionPassphrase(passphrase) .userAgent(userAgentProvider.provide()) .addRootCertificates(userCertificatesProvider.provides()) .autoEnableBackups(true) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt index b253985942..ec220112de 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProvider.kt @@ -9,12 +9,9 @@ package io.element.android.libraries.matrix.impl.auth import io.element.android.libraries.matrix.api.auth.OidcConfig import org.matrix.rustcomponents.sdk.OidcConfiguration -import java.io.File import javax.inject.Inject -class OidcConfigurationProvider @Inject constructor( - private val baseDirectory: File, -) { +class OidcConfigurationProvider @Inject constructor() { fun get(): OidcConfiguration = OidcConfiguration( clientName = "Element", redirectUri = OidcConfig.REDIRECT_URI, @@ -29,6 +26,5 @@ class OidcConfigurationProvider @Inject constructor( staticRegistrations = mapOf( "https://id.thirdroom.io/realms/thirdroom" to "elementx", ), - dynamicRegistrationsFile = File(baseDirectory, "oidc/registrations.json").absolutePath, ) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index 2549fc622a..33af371569 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -324,7 +324,7 @@ class RustMatrixAuthenticationService @Inject constructor( passphrase = pendingPassphrase, slidingSyncType = ClientBuilderSlidingSync.Discovered, ) - .passphrase(passphrase) + .sessionPassphrase(passphrase) .buildWithQrCode(qrCodeData, oidcConfiguration, progressListener) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt index 8b21648071..7fdb4a9fdc 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/notification/NotificationMapper.kt @@ -36,6 +36,8 @@ class NotificationMapper( ) NotificationData( eventId = eventId, + // FIXME once the `NotificationItem` in the SDK returns the thread id + threadId = null, roomId = roomId, senderAvatarUrl = item.senderInfo.avatarUrl, senderDisplayName = item.senderInfo.displayName, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 5b742e83f8..7ed2ad5eb6 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -43,6 +43,7 @@ import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibilit 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.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange import io.element.android.libraries.matrix.api.room.roomNotificationSettings @@ -497,8 +498,17 @@ class RustMatrixRoom( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { - return liveTimeline.sendImage(file, thumbnailFile, imageInfo, caption, formattedCaption, progressCallback) + return liveTimeline.sendImage( + file = file, + thumbnailFile = thumbnailFile, + imageInfo = imageInfo, + caption = caption, + formattedCaption = formattedCaption, + progressCallback = progressCallback, + replyParameters = replyParameters + ) } override suspend fun sendVideo( @@ -508,8 +518,17 @@ class RustMatrixRoom( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { - return liveTimeline.sendVideo(file, thumbnailFile, videoInfo, caption, formattedCaption, progressCallback) + return liveTimeline.sendVideo( + file = file, + thumbnailFile = thumbnailFile, + videoInfo = videoInfo, + caption = caption, + formattedCaption = formattedCaption, + progressCallback = progressCallback, + replyParameters = replyParameters + ) } override suspend fun sendAudio( @@ -518,6 +537,7 @@ class RustMatrixRoom( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { return liveTimeline.sendAudio( file = file, @@ -525,6 +545,7 @@ class RustMatrixRoom( caption = caption, formattedCaption = formattedCaption, progressCallback = progressCallback, + replyParameters = replyParameters, ) } @@ -534,16 +555,44 @@ class RustMatrixRoom( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { return liveTimeline.sendFile( - file, - fileInfo, - caption, - formattedCaption, - progressCallback, + file = file, + fileInfo = fileInfo, + caption = caption, + formattedCaption = formattedCaption, + progressCallback = progressCallback, + replyParameters = replyParameters, ) } + override suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result { + return liveTimeline.sendVoiceMessage( + file = file, + audioInfo = audioInfo, + waveform = waveform, + progressCallback = progressCallback, + replyParameters = replyParameters, + ) + } + + override suspend fun sendLocation( + body: String, + geoUri: String, + description: String?, + zoomLevel: Int?, + assetType: AssetType?, + ): Result { + return liveTimeline.sendLocation(body, geoUri, description, zoomLevel, assetType) + } + override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result { return liveTimeline.toggleReaction(emoji, eventOrTransactionId) } @@ -631,16 +680,6 @@ class RustMatrixRoom( } } - override suspend fun sendLocation( - body: String, - geoUri: String, - description: String?, - zoomLevel: Int?, - assetType: AssetType?, - ): Result { - return liveTimeline.sendLocation(body, geoUri, description, zoomLevel, assetType) - } - override suspend fun createPoll( question: String, answers: List, @@ -674,15 +713,6 @@ class RustMatrixRoom( return liveTimeline.endPoll(pollStartId, text) } - override suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback?, - ): Result { - return liveTimeline.sendVoiceMessage(file, audioInfo, waveform, progressCallback) - } - override suspend fun typingNotice(isTyping: Boolean) = withContext(roomDispatcher) { runCatching { innerRoom.typingNotice(isTyping) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/message/ReplyParameters.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/message/ReplyParameters.kt new file mode 100644 index 0000000000..415d493e7d --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/message/ReplyParameters.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.impl.room.message + +import io.element.android.libraries.matrix.api.room.message.ReplyParameters + +fun ReplyParameters.map() = org.matrix.rustcomponents.sdk.ReplyParameters( + eventId = inReplyToEventId.value, + enforceThread = enforceThreadReply, + replyWithinThread = replyWithinThread, +) 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 efe16f0073..f13b5465fb 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 @@ -22,6 +22,7 @@ import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.isDm import io.element.android.libraries.matrix.api.room.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.matrix.api.timeline.Timeline @@ -35,6 +36,7 @@ import io.element.android.libraries.matrix.impl.media.toMSC3246range import io.element.android.libraries.matrix.impl.poll.toInner import io.element.android.libraries.matrix.impl.room.RoomContentForwarder import io.element.android.libraries.matrix.impl.room.location.toInner +import io.element.android.libraries.matrix.impl.room.message.map import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelineItemMapper import io.element.android.libraries.matrix.impl.timeline.item.event.TimelineEventContentMapper import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper @@ -328,7 +330,7 @@ class RustTimeline( } override suspend fun replyMessage( - eventId: EventId, + replyParameters: ReplyParameters, body: String, htmlBody: String?, intentionalMentions: List, @@ -336,7 +338,10 @@ class RustTimeline( ): Result = withContext(dispatcher) { runCatching { val msg = MessageEventContent.from(body, htmlBody, intentionalMentions) - inner.sendReply(msg, eventId.value) + inner.sendReply( + msg = msg, + replyParams = replyParameters.map(), + ) } } @@ -347,6 +352,7 @@ class RustTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) return sendAttachment(listOfNotNull(file, thumbnailFile)) { @@ -359,6 +365,7 @@ class RustTimeline( }, useSendQueue = useSendQueue, mentions = null, + replyParams = replyParameters?.map(), ), thumbnailPath = thumbnailFile?.path, imageInfo = imageInfo.map(), @@ -374,6 +381,7 @@ class RustTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) return sendAttachment(listOfNotNull(file, thumbnailFile)) { @@ -386,6 +394,7 @@ class RustTimeline( }, useSendQueue = useSendQueue, mentions = null, + replyParams = replyParameters?.map(), ), thumbnailPath = thumbnailFile?.path, videoInfo = videoInfo.map(), @@ -400,6 +409,7 @@ class RustTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) return sendAttachment(listOf(file)) { @@ -412,6 +422,7 @@ class RustTimeline( }, useSendQueue = useSendQueue, mentions = null, + replyParams = replyParameters?.map(), ), audioInfo = audioInfo.map(), progressWatcher = progressCallback?.toProgressWatcher() @@ -425,6 +436,7 @@ class RustTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) return sendAttachment(listOf(file)) { @@ -437,6 +449,7 @@ class RustTimeline( }, useSendQueue = useSendQueue, mentions = null, + replyParams = replyParameters?.map(), ), fileInfo = fileInfo.map(), progressWatcher = progressCallback?.toProgressWatcher(), @@ -479,6 +492,32 @@ class RustTimeline( } } + override suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result { + val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) + return sendAttachment(listOf(file)) { + inner.sendVoiceMessage( + params = UploadParameters( + filename = file.path, + // Maybe allow a caption in the future? + caption = null, + formattedCaption = null, + useSendQueue = useSendQueue, + mentions = null, + replyParams = replyParameters?.map(), + ), + audioInfo = audioInfo.map(), + waveform = waveform.toMSC3246range(), + progressWatcher = progressCallback?.toProgressWatcher(), + ) + } + } + override suspend fun createPoll( question: String, answers: List, @@ -542,30 +581,6 @@ class RustTimeline( } } - override suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback?, - ): Result { - val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue) - return sendAttachment(listOf(file)) { - inner.sendVoiceMessage( - params = UploadParameters( - filename = file.path, - // Maybe allow a caption in the future? - caption = null, - formattedCaption = null, - useSendQueue = useSendQueue, - mentions = null, - ), - audioInfo = audioInfo.map(), - waveform = waveform.toMSC3246range(), - progressWatcher = progressCallback?.toProgressWatcher(), - ) - } - } - private fun sendAttachment(files: List, handle: () -> SendAttachmentJoinHandle): Result { return runCatching { MediaUploadHandlerImpl(files, handle()) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt index 8df231bbab..d60d88f168 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/virtual/VirtualTimelineItemMapper.kt @@ -15,6 +15,7 @@ class VirtualTimelineItemMapper { return when (virtualTimelineItem) { is RustVirtualTimelineItem.DateDivider -> VirtualTimelineItem.DayDivider(virtualTimelineItem.ts.toLong()) RustVirtualTimelineItem.ReadMarker -> VirtualTimelineItem.ReadMarker + RustVirtualTimelineItem.TimelineStart -> VirtualTimelineItem.RoomBeginning } } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt index cfc03e50b9..4dded4519d 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessor.kt @@ -7,8 +7,6 @@ package io.element.android.libraries.matrix.impl.timeline.postprocessor -import androidx.annotation.VisibleForTesting -import io.element.android.libraries.matrix.api.core.UniqueId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.Timeline @@ -32,55 +30,59 @@ class RoomBeginningPostProcessor(private val mode: Timeline.Mode) { return when { items.isEmpty() -> items mode == Timeline.Mode.PINNED_EVENTS -> items - isDm -> processForDM(items, roomCreator) + isDm -> processForDM(items, roomCreator, hasMoreToLoadBackwards) hasMoreToLoadBackwards -> items else -> processForRoom(items) } } private fun processForRoom(items: List): List { - val roomBeginningItem = createRoomBeginningItem() - return listOf(roomBeginningItem) + items + // No changes needed, timeline start item is already added by the SDK + return items } - private fun processForDM(items: List, roomCreator: UserId?): List { + private fun processForDM(items: List, roomCreator: UserId?, hasMoreToLoadBackwards: Boolean): List { + val roomBeginningItemIndex = if (!hasMoreToLoadBackwards) { + items.indexOfFirst { it is MatrixTimelineItem.Virtual && it.virtual is VirtualTimelineItem.RoomBeginning }.takeIf { it >= 0 } + } else { + null + } + // Find room creation event. // This is usually the first MatrixTimelineItem.Event (so index 1, index 0 is a date) val roomCreationEventIndex = items.indexOfFirst { val stateEventContent = (it as? MatrixTimelineItem.Event)?.event?.content as? StateContent stateEventContent?.content is OtherState.RoomCreate - } + }.takeIf { it >= 0 } // If the parameter roomCreator is null, the creator is the sender of the RoomCreate Event. - val roomCreatorUserId = roomCreator ?: (items.getOrNull(roomCreationEventIndex) as? MatrixTimelineItem.Event)?.event?.sender + val roomCreatorUserId = roomCreator ?: roomCreationEventIndex?.let { + (items.getOrNull(it) as? MatrixTimelineItem.Event)?.event?.sender + } // Find self-join event for the room creator. // This is usually the second MatrixTimelineItem.Event (so index 2) val selfUserJoinedEventIndex = roomCreatorUserId?.let { creatorUserId -> items.indexOfFirst { val stateEventContent = (it as? MatrixTimelineItem.Event)?.event?.content as? RoomMembershipContent stateEventContent?.change == MembershipChange.JOINED && stateEventContent.userId == creatorUserId - } - } ?: -1 + }.takeIf { it >= 0 } + } - if (roomCreationEventIndex == -1 && selfUserJoinedEventIndex == -1) { + val indicesToRemove = listOfNotNull( + roomBeginningItemIndex, + roomCreationEventIndex, + selfUserJoinedEventIndex, + ) + if (indicesToRemove.isEmpty()) { + // Nothing to do, return the list as is return items } + // Remove items at the indices we found val newItems = items.toMutableList() - if (selfUserJoinedEventIndex in newItems.indices) { - newItems.removeAt(selfUserJoinedEventIndex) - } - if (roomCreationEventIndex in newItems.indices) { - newItems.removeAt(roomCreationEventIndex) + indicesToRemove.sortedDescending().forEach { index -> + newItems.removeAt(index) } return newItems } - - @VisibleForTesting - fun createRoomBeginningItem(): MatrixTimelineItem.Virtual { - return MatrixTimelineItem.Virtual( - uniqueId = UniqueId("RoomBeginning"), - virtual = VirtualTimelineItem.RoomBeginning - ) - } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt index 0164cfeb20..01321fcdf6 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/OidcConfigurationProviderTest.kt @@ -10,12 +10,11 @@ package io.element.android.libraries.matrix.impl.auth import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.auth.OidcConfig import org.junit.Test -import java.io.File class OidcConfigurationProviderTest { @Test fun get() { - val result = OidcConfigurationProvider(File("/base")).get() + val result = OidcConfigurationProvider().get() assertThat(result.redirectUri).isEqualTo(OidcConfig.REDIRECT_URI) } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt index 61df8e6455..e2a9d883ee 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationServiceTest.kt @@ -48,7 +48,7 @@ class RustMatrixAuthenticationServiceTest { sessionStore = sessionStore, rustMatrixClientFactory = rustMatrixClientFactory, passphraseGenerator = FakePassphraseGenerator(), - oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory), + oidcConfigurationProvider = OidcConfigurationProvider(), ) } } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustClientBuilder.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustClientBuilder.kt index 21c62cf3eb..8852734a71 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustClientBuilder.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/fixtures/fakes/FakeRustClientBuilder.kt @@ -30,7 +30,7 @@ class FakeRustClientBuilder : ClientBuilder(NoPointer) { override fun roomDecryptionTrustRequirement(trustRequirement: TrustRequirement) = this override fun disableSslVerification() = this override fun homeserverUrl(url: String) = this - override fun passphrase(passphrase: String?) = this + override fun sessionPassphrase(passphrase: String?) = this override fun proxy(url: String) = this override fun requestConfig(config: RequestConfig) = this override fun roomKeyRecipientStrategy(strategy: CollectStrategy) = this diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/Fixtures.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/Fixtures.kt index 00e93e0e66..34cb1ac9e1 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/Fixtures.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/Fixtures.kt @@ -19,6 +19,10 @@ import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.timeline.aMessageContent import io.element.android.libraries.matrix.test.timeline.anEventTimelineItem +internal val timelineStartEvent = MatrixTimelineItem.Virtual( + uniqueId = UniqueId("timeline_start"), + virtual = VirtualTimelineItem.RoomBeginning, +) internal val roomCreateEvent = MatrixTimelineItem.Event( uniqueId = UniqueId("m.room.create"), event = anEventTimelineItem(sender = A_USER_ID, content = StateContent("", OtherState.RoomCreate)) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt index 5d72a68a68..bb1e4581a1 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/timeline/postprocessor/RoomBeginningPostProcessorTest.kt @@ -50,8 +50,9 @@ class RoomBeginningPostProcessorTest { } @Test - fun `processor removes room creation event and self-join event from DM timeline`() { + fun `processor removes timeline start, room creation event and self-join event from DM timeline`() { val timelineItems = listOf( + timelineStartEvent, roomCreateEvent, roomCreatorJoinEvent, ) @@ -98,43 +99,6 @@ class RoomBeginningPostProcessorTest { assertThat(processedItems).isEqualTo(expected) } - @Test - fun `processor will add beginning of room item if it's not a DM`() { - val timelineItems = listOf( - roomCreateEvent, - roomCreatorJoinEvent, - ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) - val processedItems = processor.process(timelineItems, isDm = false, roomCreator = A_USER_ID, hasMoreToLoadBackwards = false) - assertThat(processedItems).isEqualTo( - listOf(processor.createRoomBeginningItem()) + timelineItems - ) - } - - @Test - fun `processor will not add beginning of room item if it's not a DM but the room has more to load`() { - val timelineItems = listOf( - roomCreateEvent, - roomCreatorJoinEvent, - ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) - val processedItems = processor.process(timelineItems, isDm = false, roomCreator = A_USER_ID, hasMoreToLoadBackwards = true) - assertThat(processedItems).isEqualTo(timelineItems) - } - - @Test - fun `processor will add beginning of room item if it's not a DM, when the parameter roomCreator is null`() { - val timelineItems = listOf( - roomCreateEvent, - roomCreatorJoinEvent, - ) - val processor = RoomBeginningPostProcessor(Timeline.Mode.LIVE) - val processedItems = processor.process(timelineItems, isDm = false, roomCreator = null, hasMoreToLoadBackwards = false) - assertThat(processedItems).isEqualTo( - listOf(processor.createRoomBeginningItem()) + timelineItems - ) - } - @Test fun `processor removes items event it's not at the start of the timeline`() { val timelineItems = listOf( diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt index f99ff0e355..85473d9367 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/notification/NotificationData.kt @@ -7,6 +7,7 @@ package io.element.android.libraries.matrix.test.notification +import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.matrix.api.notification.NotificationContent import io.element.android.libraries.matrix.api.notification.NotificationData import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -19,6 +20,7 @@ fun aNotificationData( content: NotificationContent = NotificationContent.MessageLike.RoomEncrypted, isDirect: Boolean = false, hasMention: Boolean = false, + threadId: ThreadId? = null, timestamp: Long = A_TIMESTAMP, senderDisplayName: String? = A_USER_NAME_2, senderIsNameAmbiguous: Boolean = false, @@ -26,6 +28,7 @@ fun aNotificationData( ): NotificationData { return NotificationData( eventId = AN_EVENT_ID, + threadId = threadId, roomId = A_ROOM_ID, senderAvatarUrl = null, senderDisplayName = senderDisplayName, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index 7d9bbd1bfc..b7d226d499 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -39,6 +39,7 @@ import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibilit 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.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility @@ -87,16 +88,16 @@ class FakeMatrixRoom( private val canRedactOtherResult: (UserId) -> Result = { lambdaError() }, private val canSendStateResult: (UserId, StateEventType) -> Result = { _, _ -> lambdaError() }, private val canUserSendMessageResult: (UserId, MessageEventType) -> Result = { _, _ -> lambdaError() }, - private val sendImageResult: (File, File?, ImageInfo, String?, String?, ProgressCallback?) -> Result = + private val sendImageResult: (File, File?, ImageInfo, String?, String?, ProgressCallback?, ReplyParameters?) -> Result = + { _, _, _, _, _, _, _ -> lambdaError() }, + private val sendVideoResult: (File, File?, VideoInfo, String?, String?, ProgressCallback?, ReplyParameters?) -> Result = + { _, _, _, _, _, _, _ -> lambdaError() }, + private val sendFileResult: (File, FileInfo, String?, String?, ProgressCallback?, ReplyParameters?) -> Result = { _, _, _, _, _, _ -> lambdaError() }, - private val sendVideoResult: (File, File?, VideoInfo, String?, String?, ProgressCallback?) -> Result = + private val sendAudioResult: (File, AudioInfo, String?, String?, ProgressCallback?, ReplyParameters?) -> Result = { _, _, _, _, _, _ -> lambdaError() }, - private val sendFileResult: (File, FileInfo, String?, String?, ProgressCallback?) -> Result = + private val sendVoiceMessageResult: (File, AudioInfo, List, ProgressCallback?, ReplyParameters?) -> Result = { _, _, _, _, _ -> lambdaError() }, - private val sendAudioResult: (File, AudioInfo, String?, String?, ProgressCallback?) -> Result = - { _, _, _, _, _ -> lambdaError() }, - private val sendVoiceMessageResult: (File, AudioInfo, List, ProgressCallback?) -> Result = - { _, _, _, _ -> lambdaError() }, private val setNameResult: (String) -> Result = { lambdaError() }, private val setTopicResult: (String) -> Result = { lambdaError() }, private val updateAvatarResult: (String, ByteArray) -> Result = { _, _ -> lambdaError() }, @@ -332,7 +333,8 @@ class FakeMatrixRoom( imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = simulateLongTask { simulateSendMediaProgress(progressCallback) sendImageResult( @@ -342,6 +344,7 @@ class FakeMatrixRoom( caption, formattedCaption, progressCallback, + replyParameters, ) } @@ -351,7 +354,8 @@ class FakeMatrixRoom( videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = simulateLongTask { simulateSendMediaProgress(progressCallback) sendVideoResult( @@ -361,6 +365,7 @@ class FakeMatrixRoom( caption, formattedCaption, progressCallback, + replyParameters, ) } @@ -369,7 +374,8 @@ class FakeMatrixRoom( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = simulateLongTask { simulateSendMediaProgress(progressCallback) sendAudioResult( @@ -378,6 +384,7 @@ class FakeMatrixRoom( caption, formattedCaption, progressCallback, + replyParameters, ) } @@ -386,7 +393,8 @@ class FakeMatrixRoom( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback? + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = simulateLongTask { simulateSendMediaProgress(progressCallback) sendFileResult( @@ -395,6 +403,40 @@ class FakeMatrixRoom( caption, formattedCaption, progressCallback, + replyParameters, + ) + } + + override suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result = simulateLongTask { + simulateSendMediaProgress(progressCallback) + sendVoiceMessageResult( + file, + audioInfo, + waveform, + progressCallback, + replyParameters, + ) + } + + override suspend fun sendLocation( + body: String, + geoUri: String, + description: String?, + zoomLevel: Int?, + assetType: AssetType?, + ): Result = simulateLongTask { + return sendLocationResult( + body, + geoUri, + description, + zoomLevel, + assetType, ) } @@ -464,22 +506,6 @@ class FakeMatrixRoom( return Result.success(Unit) } - override suspend fun sendLocation( - body: String, - geoUri: String, - description: String?, - zoomLevel: Int?, - assetType: AssetType?, - ): Result = simulateLongTask { - return sendLocationResult( - body, - geoUri, - description, - zoomLevel, - assetType, - ) - } - override suspend fun createPoll( question: String, answers: List, @@ -524,21 +550,6 @@ class FakeMatrixRoom( return endPollResult(pollStartId, text) } - override suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback? - ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) - sendVoiceMessageResult( - file, - audioInfo, - waveform, - progressCallback, - ) - } - override suspend fun typingNotice(isTyping: Boolean): Result { return typingNoticeResult(isTyping) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt index f43c00c63a..859f81b5c3 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt @@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.poll.PollKind import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.location.AssetType +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.matrix.api.timeline.Timeline @@ -110,7 +111,7 @@ class FakeTimeline( ) var replyMessageLambda: ( - eventId: EventId, + replyParameters: ReplyParameters, body: String, htmlBody: String?, intentionalMentions: List, @@ -120,13 +121,13 @@ class FakeTimeline( } override suspend fun replyMessage( - eventId: EventId, + replyParameters: ReplyParameters, body: String, htmlBody: String?, intentionalMentions: List, fromNotification: Boolean, ): Result = replyMessageLambda( - eventId, + replyParameters, body, htmlBody, intentionalMentions, @@ -140,7 +141,8 @@ class FakeTimeline( body: String?, formattedBody: String?, progressCallback: ProgressCallback?, - ) -> Result = { _, _, _, _, _, _ -> + replyParameters: ReplyParameters?, + ) -> Result = { _, _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -151,13 +153,15 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = sendImageLambda( file, thumbnailFile, imageInfo, caption, formattedCaption, - progressCallback + progressCallback, + replyParameters, ) var sendVideoLambda: ( @@ -167,7 +171,8 @@ class FakeTimeline( body: String?, formattedBody: String?, progressCallback: ProgressCallback?, - ) -> Result = { _, _, _, _, _, _ -> + replyParameters: ReplyParameters?, + ) -> Result = { _, _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -178,13 +183,15 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = sendVideoLambda( file, thumbnailFile, videoInfo, caption, formattedCaption, - progressCallback + progressCallback, + replyParameters, ) var sendAudioLambda: ( @@ -193,7 +200,8 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, - ) -> Result = { _, _, _, _, _ -> + replyParameters: ReplyParameters?, + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -203,12 +211,14 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = sendAudioLambda( file, audioInfo, caption, formattedCaption, - progressCallback + progressCallback, + replyParameters, ) var sendFileLambda: ( @@ -217,7 +227,8 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, - ) -> Result = { _, _, _, _, _ -> + replyParameters: ReplyParameters?, + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -227,22 +238,39 @@ class FakeTimeline( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result = sendFileLambda( file, fileInfo, caption, formattedCaption, - progressCallback + progressCallback, + replyParameters, ) - var toggleReactionLambda: (emoji: String, eventOrTransactionId: EventOrTransactionId) -> Result = { _, _ -> Result.success(Unit) } - override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result = toggleReactionLambda( - emoji, - eventOrTransactionId - ) + var sendVoiceMessageLambda: ( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ) -> Result = { _, _, _, _, _ -> + Result.success(FakeMediaUploadHandler()) + } - var forwardEventLambda: (eventId: EventId, roomIds: List) -> Result = { _, _ -> Result.success(Unit) } - override suspend fun forwardEvent(eventId: EventId, roomIds: List): Result = forwardEventLambda(eventId, roomIds) + override suspend fun sendVoiceMessage( + file: File, + audioInfo: AudioInfo, + waveform: List, + progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, + ): Result = sendVoiceMessageLambda( + file, + audioInfo, + waveform, + progressCallback, + replyParameters, + ) var sendLocationLambda: ( body: String, @@ -268,6 +296,17 @@ class FakeTimeline( assetType ) + var toggleReactionLambda: (emoji: String, eventOrTransactionId: EventOrTransactionId) -> Result = { _, _ -> Result.success(Unit) } + + override suspend fun toggleReaction(emoji: String, eventOrTransactionId: EventOrTransactionId): Result = toggleReactionLambda( + emoji, + eventOrTransactionId + ) + + var forwardEventLambda: (eventId: EventId, roomIds: List) -> Result = { _, _ -> Result.success(Unit) } + + override suspend fun forwardEvent(eventId: EventId, roomIds: List): Result = forwardEventLambda(eventId, roomIds) + var createPollLambda: ( question: String, answers: List, @@ -337,27 +376,6 @@ class FakeTimeline( text: String, ): Result = endPollLambda(pollStartId, text) - var sendVoiceMessageLambda: ( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback?, - ) -> Result = { _, _, _, _ -> - Result.success(FakeMediaUploadHandler()) - } - - override suspend fun sendVoiceMessage( - file: File, - audioInfo: AudioInfo, - waveform: List, - progressCallback: ProgressCallback?, - ): Result = sendVoiceMessageLambda( - file, - audioInfo, - waveform, - progressCallback - ) - var sendReadReceiptLambda: ( eventId: EventId, receiptType: ReceiptType, diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt index 584539eacc..b68f077df9 100644 --- a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt @@ -12,6 +12,7 @@ import io.element.android.libraries.core.extensions.flatMapCatching import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.MediaUploadHandler import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.preferences.api.store.SessionPreferencesStore import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job @@ -46,12 +47,14 @@ class MediaSender @Inject constructor( caption: String?, formattedCaption: String?, progressCallback: ProgressCallback?, + replyParameters: ReplyParameters?, ): Result { return room.sendMedia( uploadInfo = mediaUploadInfo, progressCallback = progressCallback, caption = caption, - formattedCaption = formattedCaption + formattedCaption = formattedCaption, + replyParameters = replyParameters, ) .handleSendResult() } @@ -61,7 +64,8 @@ class MediaSender @Inject constructor( mimeType: String, caption: String? = null, formattedCaption: String? = null, - progressCallback: ProgressCallback? = null + progressCallback: ProgressCallback? = null, + replyParameters: ReplyParameters? = null, ): Result { val compressIfPossible = sessionPreferencesStore.doesCompressMedia().first() return preProcessor @@ -76,7 +80,8 @@ class MediaSender @Inject constructor( uploadInfo = info, progressCallback = progressCallback, caption = caption, - formattedCaption = formattedCaption + formattedCaption = formattedCaption, + replyParameters = replyParameters, ) } .handleSendResult() @@ -86,7 +91,8 @@ class MediaSender @Inject constructor( uri: Uri, mimeType: String, waveForm: List, - progressCallback: ProgressCallback? = null + progressCallback: ProgressCallback? = null, + replyParameters: ReplyParameters? = null, ): Result { return preProcessor .process( @@ -106,7 +112,8 @@ class MediaSender @Inject constructor( uploadInfo = newInfo, progressCallback = progressCallback, caption = null, - formattedCaption = null + formattedCaption = null, + replyParameters = replyParameters, ) } .handleSendResult() @@ -128,6 +135,7 @@ class MediaSender @Inject constructor( progressCallback: ProgressCallback?, caption: String?, formattedCaption: String?, + replyParameters: ReplyParameters?, ): Result { val handler = when (uploadInfo) { is MediaUploadInfo.Image -> { @@ -137,7 +145,8 @@ class MediaSender @Inject constructor( imageInfo = uploadInfo.imageInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ) } is MediaUploadInfo.Video -> { @@ -147,7 +156,8 @@ class MediaSender @Inject constructor( videoInfo = uploadInfo.videoInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ) } is MediaUploadInfo.Audio -> { @@ -156,7 +166,8 @@ class MediaSender @Inject constructor( audioInfo = uploadInfo.audioInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ) } is MediaUploadInfo.VoiceMessage -> { @@ -164,7 +175,8 @@ class MediaSender @Inject constructor( file = uploadInfo.file, audioInfo = uploadInfo.audioInfo, waveform = uploadInfo.waveform, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ) } is MediaUploadInfo.AnyFile -> { @@ -173,7 +185,8 @@ class MediaSender @Inject constructor( fileInfo = uploadInfo.fileInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback + progressCallback = progressCallback, + replyParameters = replyParameters, ) } } diff --git a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt index 48640da8ea..bd5795af51 100644 --- a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt +++ b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt @@ -14,6 +14,7 @@ import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.message.ReplyParameters import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.room.FakeMatrixRoom import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor @@ -46,7 +47,7 @@ class MediaSenderTest { @Test fun `given an attachment when sending it the MatrixRoom will call sendMedia`() = runTest { val sendImageResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: ReplyParameters? -> Result.success(FakeMediaUploadHandler()) } val room = FakeMatrixRoom( @@ -74,8 +75,8 @@ class MediaSenderTest { @Test fun `given a failure in the media upload when sending the whole process fails`() = runTest { val sendImageResult = - lambdaRecorder> { _, _, _, _, _, _ -> - Result.failure(Exception()) + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: ReplyParameters? -> + Result.failure(Exception()) } val room = FakeMatrixRoom( sendImageResult = sendImageResult @@ -91,7 +92,8 @@ class MediaSenderTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun `given a cancellation in the media upload when sending the job is cancelled`() = runTest(StandardTestDispatcher()) { - val sendFileResult = lambdaRecorder> { _, _, _, _, _ -> + val sendFileResult = + lambdaRecorder> { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeMatrixRoom( 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 c8e8ba4431..b84a13b4f2 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 @@ -102,6 +102,7 @@ class DefaultNotifiableEventResolver @Inject constructor( senderId = content.senderId, roomId = roomId, eventId = eventId, + threadId = threadId, noisy = isNoisy, timestamp = this.timestamp, senderDisambiguatedDisplayName = senderDisambiguatedDisplayName, diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt index aea52c8b78..90ed3a3d05 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandler.kt @@ -14,9 +14,9 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId -import io.element.android.libraries.matrix.api.core.asEventId import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.isDm +import io.element.android.libraries.matrix.api.room.message.replyInThread import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory import io.element.android.libraries.push.api.notifications.NotificationCleaner @@ -54,7 +54,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor( Timber.tag(loggerTag.value).d("onReceive: ${intent.action} ${intent.data} for: ${roomId?.value}/${eventId?.value}") when (intent.action) { actionIds.smartReply -> if (roomId != null) { - handleSmartReply(sessionId, roomId, threadId, intent) + handleSmartReply(sessionId, roomId, eventId, threadId, intent) } actionIds.dismissRoom -> if (roomId != null) { notificationCleaner.clearMessagesForRoom(sessionId, roomId) @@ -106,6 +106,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor( private fun handleSmartReply( sessionId: SessionId, roomId: RoomId, + replyToEventId: EventId?, threadId: ThreadId?, intent: Intent, ) = appCoroutineScope.launch { @@ -120,6 +121,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor( sendMatrixEvent( sessionId = sessionId, roomId = roomId, + replyToEventId = replyToEventId, threadId = threadId, room = room, message = message, @@ -131,6 +133,7 @@ class NotificationBroadcastReceiverHandler @Inject constructor( sessionId: SessionId, roomId: RoomId, threadId: ThreadId?, + replyToEventId: EventId?, room: MatrixRoom, message: String, ) { @@ -158,13 +161,13 @@ class NotificationBroadcastReceiverHandler @Inject constructor( ) onNotifiableEventReceived.onNotifiableEventReceived(notifiableMessageEvent) - if (threadId != null) { + if (threadId != null && replyToEventId != null) { room.liveTimeline.replyMessage( - eventId = threadId.asEventId(), body = message, htmlBody = null, intentionalMentions = emptyList(), fromNotification = true, + replyParameters = replyInThread(replyToEventId), ) } else { room.liveTimeline.sendMessage( diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt index f8cf2836b8..d462ebb5f6 100755 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt @@ -197,7 +197,8 @@ class DefaultNotificationCreator @Inject constructor( addAction(markAsReadActionFactory.create(roomInfo)) // Quick reply if (!roomInfo.hasSmartReplyError) { - addAction(quickReplyActionFactory.create(roomInfo, threadId)) + val latestEventId = events.lastOrNull()?.eventId + addAction(quickReplyActionFactory.create(roomInfo, latestEventId, threadId)) } if (openIntent != null) { setContentIntent(openIntent) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt index f8efa9b0e7..6a590aeda8 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt @@ -16,6 +16,7 @@ import androidx.core.app.RemoteInput import io.element.android.appconfig.NotificationConfig import io.element.android.libraries.androidutils.uri.createIgnoredUri import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId @@ -33,11 +34,11 @@ class QuickReplyActionFactory @Inject constructor( private val stringProvider: StringProvider, private val clock: SystemClock, ) { - fun create(roomInfo: RoomEventGroupInfo, threadId: ThreadId?): NotificationCompat.Action? { + fun create(roomInfo: RoomEventGroupInfo, eventId: EventId?, threadId: ThreadId?): NotificationCompat.Action? { if (!NotificationConfig.SHOW_QUICK_REPLY_ACTION) return null val sessionId = roomInfo.sessionId val roomId = roomInfo.roomId - val replyPendingIntent = buildQuickReplyIntent(sessionId, roomId, threadId) + val replyPendingIntent = buildQuickReplyIntent(sessionId, roomId, eventId, threadId) val remoteInput = RemoteInput.Builder(NotificationBroadcastReceiver.KEY_TEXT_REPLY) .setLabel(stringProvider.getString(R.string.notification_room_action_quick_reply)) .build() @@ -63,6 +64,7 @@ class QuickReplyActionFactory @Inject constructor( private fun buildQuickReplyIntent( sessionId: SessionId, roomId: RoomId, + eventId: EventId?, threadId: ThreadId?, ): PendingIntent { val intent = Intent(context, NotificationBroadcastReceiver::class.java) @@ -70,9 +72,8 @@ class QuickReplyActionFactory @Inject constructor( intent.data = createIgnoredUri("quickReply/$sessionId/$roomId" + threadId?.let { "/$it" }.orEmpty()) intent.putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId.value) intent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId.value) - threadId?.let { - intent.putExtra(NotificationBroadcastReceiver.KEY_THREAD_ID, it.value) - } + eventId?.let { intent.putExtra(NotificationBroadcastReceiver.KEY_EVENT_ID, it.value) } + threadId?.let { intent.putExtra(NotificationBroadcastReceiver.KEY_THREAD_ID, it.value) } return PendingIntent.getBroadcast( context, diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt index 0ce6038d79..9405e19464 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotificationBroadcastReceiverHandlerTest.kt @@ -14,8 +14,9 @@ import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId -import io.element.android.libraries.matrix.api.core.asEventId import io.element.android.libraries.matrix.api.room.IntentionalMention +import io.element.android.libraries.matrix.api.room.message.ReplyParameters +import io.element.android.libraries.matrix.api.room.message.replyInThread import io.element.android.libraries.matrix.api.roomlist.RoomSummary import io.element.android.libraries.matrix.api.timeline.ReceiptType import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -330,7 +331,8 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test send reply`() = runTest { val sendMessage = lambdaRecorder, Result> { _, _, _ -> Result.success(Unit) } - val replyMessage = lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } + val replyMessage = + lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } val liveTimeline = FakeTimeline().apply { sendMessageLambda = sendMessage replyMessageLambda = replyMessage @@ -396,7 +398,8 @@ class NotificationBroadcastReceiverHandlerTest { @Test fun `Test send reply to thread`() = runTest { val sendMessage = lambdaRecorder, Result> { _, _, _ -> Result.success(Unit) } - val replyMessage = lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } + val replyMessage = + lambdaRecorder, Boolean, Result> { _, _, _, _, _ -> Result.success(Unit) } val liveTimeline = FakeTimeline().apply { sendMessageLambda = sendMessage replyMessageLambda = replyMessage @@ -423,6 +426,7 @@ class NotificationBroadcastReceiverHandlerTest { createIntent( action = actionIds.smartReply, roomId = A_ROOM_ID, + eventId = AN_EVENT_ID, threadId = A_THREAD_ID, ), ) @@ -433,7 +437,13 @@ class NotificationBroadcastReceiverHandlerTest { .isCalledOnce() replyMessage.assertions() .isCalledOnce() - .with(value(A_THREAD_ID.asEventId()), value(A_MESSAGE), value(null), value(emptyList()), value(true)) + .with( + value(replyInThread(eventId = AN_EVENT_ID, explicitReply = false)), + value(A_MESSAGE), + value(null), + value(emptyList()), + value(true) + ) } private fun createIntent( From e138b5f2c3038e4ce0f47d07be569867e21e2a33 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Apr 2025 15:42:29 +0200 Subject: [PATCH 53/54] Setting version for the release 25.04.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 0e732137cf..b2c69fc1a3 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 = 3 +private const val versionMonth = 4 // Note: must be in [0,99] -private const val versionReleaseNumber = 4 +private const val versionReleaseNumber = 0 object Versions { const val VERSION_CODE = (2000 + versionYear) * 10_000 + versionMonth * 100 + versionReleaseNumber From e4661dbe85f94e5dcab760e812e957a507893cd1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 8 Apr 2025 15:49:33 +0200 Subject: [PATCH 54/54] Adding fastlane file for version 25.04.0 --- fastlane/metadata/android/en-US/changelogs/202504000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/202504000.txt diff --git a/fastlane/metadata/android/en-US/changelogs/202504000.txt b/fastlane/metadata/android/en-US/changelogs/202504000.txt new file mode 100644 index 0000000000..8955ade680 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/202504000.txt @@ -0,0 +1,2 @@ +Main changes in this version: bug fixes and improvements. +Full changelog: https://github.com/element-hq/element-x-android/releases